summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Lewis <mlewis@gitlab.com>2019-03-07 15:59:00 +0000
committerMike Lewis <mlewis@gitlab.com>2019-03-07 15:59:00 +0000
commitdbd7309a16bd3abc6c586b6c2df2beb317cfef95 (patch)
tree3fdd719c926ac80285f0dc93ef975625657d0fbb
parent7be248334b350091e83d0335bf0c263071c6a67f (diff)
parentb63efb09a5c864047924cd2d84527b47dd563d5f (diff)
downloadgitlab-ce-reply-to-comment-documentation.tar.gz
Merge branch 'master' into 'reply-to-comment-documentation'reply-to-comment-documentation
# Conflicts: # doc/user/discussions/index.md
-rw-r--r--.gitlab-ci.yml97
-rw-r--r--.gitlab/issue_templates/Feature proposal.md2
-rw-r--r--.rubocop.yml3
-rw-r--r--.stylelintrc133
-rw-r--r--CHANGELOG.md27
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--Gemfile20
-rw-r--r--Gemfile.lock61
-rw-r--r--app/assets/javascripts/api.js17
-rw-r--r--app/assets/javascripts/awards_handler.js16
-rw-r--r--app/assets/javascripts/behaviors/gl_emoji.js97
-rw-r--r--app/assets/javascripts/behaviors/markdown/copy_as_gfm.js4
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_mermaid.js19
-rw-r--r--app/assets/javascripts/blob_edit/blob_bundle.js2
-rw-r--r--app/assets/javascripts/boards/components/issue_due_date.vue2
-rw-r--r--app/assets/javascripts/boards/index.js2
-rw-r--r--app/assets/javascripts/boards/services/board_service.js3
-rw-r--r--app/assets/javascripts/clusters/clusters_bundle.js21
-rw-r--r--app/assets/javascripts/clusters/components/application_row.vue23
-rw-r--r--app/assets/javascripts/clusters/components/applications.vue184
-rw-r--r--app/assets/javascripts/clusters/services/clusters_service.js7
-rw-r--r--app/assets/javascripts/clusters/stores/clusters_store.js7
-rw-r--r--app/assets/javascripts/contextual_sidebar.js52
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue40
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue4
-rw-r--r--app/assets/javascripts/diffs/components/edit_button.vue27
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_view.vue9
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_view.vue10
-rw-r--r--app/assets/javascripts/diffs/constants.js5
-rw-r--r--app/assets/javascripts/diffs/mixins/draft_comments.js7
-rw-r--r--app/assets/javascripts/diffs/store/actions.js35
-rw-r--r--app/assets/javascripts/diffs/store/mutation_types.js4
-rw-r--r--app/assets/javascripts/diffs/store/mutations.js52
-rw-r--r--app/assets/javascripts/diffs/store/utils.js40
-rw-r--r--app/assets/javascripts/emoji/index.js72
-rw-r--r--app/assets/javascripts/emoji/support/index.js3
-rw-r--r--app/assets/javascripts/environments/components/confirm_rollback_modal.vue108
-rw-r--r--app/assets/javascripts/environments/components/environment_item.vue4
-rw-r--r--app/assets/javascripts/environments/components/environment_rollback.vue43
-rw-r--r--app/assets/javascripts/environments/components/environments_app.vue3
-rw-r--r--app/assets/javascripts/environments/mixins/environments_mixin.js21
-rw-r--r--app/assets/javascripts/error_tracking/components/error_tracking_list.vue26
-rw-r--r--app/assets/javascripts/error_tracking/store/actions.js15
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/app.vue129
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/error_tracking_form.vue91
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue82
-rw-r--r--app/assets/javascripts/error_tracking_settings/index.js27
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/actions.js91
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/getters.js44
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/index.js16
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/mutation_types.js11
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/mutations.js61
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/state.js12
-rw-r--r--app/assets/javascripts/error_tracking_settings/utils.js18
-rw-r--r--app/assets/javascripts/filtered_search/admin_runners_filtered_search_token_keys.js8
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_ajax_filter.js68
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_user.js83
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js14
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js24
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js12
-rw-r--r--app/assets/javascripts/gl_dropdown.js18
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/index.vue2
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/modal.vue56
-rw-r--r--app/assets/javascripts/ide/lib/files.js113
-rw-r--r--app/assets/javascripts/ide/services/index.js3
-rw-r--r--app/assets/javascripts/ide/stores/actions.js70
-rw-r--r--app/assets/javascripts/ide/stores/actions/merge_request.js32
-rw-r--r--app/assets/javascripts/ide/stores/actions/project.js29
-rw-r--r--app/assets/javascripts/ide/stores/actions/tree.js46
-rw-r--r--app/assets/javascripts/ide/stores/mutations.js16
-rw-r--r--app/assets/javascripts/ide/stores/utils.js5
-rw-r--r--app/assets/javascripts/ide/stores/workers/files_decorator_worker.js100
-rw-r--r--app/assets/javascripts/import_projects/index.js3
-rw-r--r--app/assets/javascripts/import_projects/store/index.js13
-rw-r--r--app/assets/javascripts/jobs/components/job_app.vue10
-rw-r--r--app/assets/javascripts/jobs/store/getters.js11
-rw-r--r--app/assets/javascripts/labels_select.js32
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js8
-rw-r--r--app/assets/javascripts/lib/utils/http_status.js1
-rw-r--r--app/assets/javascripts/lib/utils/number_utils.js19
-rw-r--r--app/assets/javascripts/members.js27
-rw-r--r--app/assets/javascripts/monitoring/components/charts/area.vue128
-rw-r--r--app/assets/javascripts/monitoring/constants.js10
-rw-r--r--app/assets/javascripts/mr_notes/index.js69
-rw-r--r--app/assets/javascripts/mr_notes/init_notes.js70
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue14
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue5
-rw-r--r--app/assets/javascripts/notes/mixins/diff_line_note_form.js10
-rw-r--r--app/assets/javascripts/notes/mixins/resolvable.js4
-rw-r--r--app/assets/javascripts/notes/stores/getters.js3
-rw-r--r--app/assets/javascripts/notes/stores/mutations.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/index/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/index.js3
-rw-r--r--app/assets/javascripts/pages/profiles/show/index.js48
-rw-r--r--app/assets/javascripts/pages/projects/clusters/index/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/issues/edit/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/issues/form.js2
-rw-r--r--app/assets/javascripts/pages/projects/issues/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js2
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/settings/operations/show/index.js5
-rw-r--r--app/assets/javascripts/pages/users/activity_calendar.js15
-rw-r--r--app/assets/javascripts/persistent_user_callout.js8
-rw-r--r--app/assets/javascripts/pipelines/mixins/pipelines.js6
-rw-r--r--app/assets/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown.vue2
-rw-r--r--app/assets/javascripts/releases/store/actions.js2
-rw-r--r--app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue28
-rw-r--r--app/assets/javascripts/users_select.js27
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue14
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue35
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js15
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/empty_component.js3
-rw-r--r--app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue116
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue29
-rw-r--r--app/assets/javascripts/vue_shared/components/table_pagination.vue33
-rw-r--r--app/assets/javascripts/vue_shared/mixins/is_ee.js10
-rw-r--r--app/assets/javascripts/vue_shared/mixins/related_issuable_mixin.js155
-rw-r--r--app/assets/stylesheets/components/related_items_list.scss3
-rw-r--r--app/assets/stylesheets/framework.scss1
-rw-r--r--app/assets/stylesheets/framework/animations.scss28
-rw-r--r--app/assets/stylesheets/framework/asciidoctor.scss2
-rw-r--r--app/assets/stylesheets/framework/avatar.scss64
-rw-r--r--app/assets/stylesheets/framework/awards.scss8
-rw-r--r--app/assets/stylesheets/framework/blocks.scss6
-rw-r--r--app/assets/stylesheets/framework/buttons.scss2
-rw-r--r--app/assets/stylesheets/framework/common.scss13
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar.scss133
-rw-r--r--app/assets/stylesheets/framework/emojis.scss2
-rw-r--r--app/assets/stylesheets/framework/filters.scss11
-rw-r--r--app/assets/stylesheets/framework/forms.scss5
-rw-r--r--app/assets/stylesheets/framework/gfm.scss2
-rw-r--r--app/assets/stylesheets/framework/header.scss14
-rw-r--r--app/assets/stylesheets/framework/lists.scss6
-rw-r--r--app/assets/stylesheets/framework/logo.scss35
-rw-r--r--app/assets/stylesheets/framework/mixins.scss23
-rw-r--r--app/assets/stylesheets/framework/selects.scss2
-rw-r--r--app/assets/stylesheets/framework/spinner.scss51
-rw-r--r--app/assets/stylesheets/framework/tables.scss1
-rw-r--r--app/assets/stylesheets/framework/terms.scss1
-rw-r--r--app/assets/stylesheets/framework/toggle.scss14
-rw-r--r--app/assets/stylesheets/framework/typography.scss10
-rw-r--r--app/assets/stylesheets/framework/variables.scss21
-rw-r--r--app/assets/stylesheets/framework/variables_overrides.scss2
-rw-r--r--app/assets/stylesheets/highlight/common.scss2
-rw-r--r--app/assets/stylesheets/highlight/embedded.scss2
-rw-r--r--app/assets/stylesheets/highlight/white_base.scss74
-rw-r--r--app/assets/stylesheets/mailers/highlighted_diff_email.scss67
-rw-r--r--app/assets/stylesheets/page_bundles/xterm.scss6
-rw-r--r--app/assets/stylesheets/pages/boards.scss17
-rw-r--r--app/assets/stylesheets/pages/commits.scss4
-rw-r--r--app/assets/stylesheets/pages/cycle_analytics.scss1
-rw-r--r--app/assets/stylesheets/pages/diff.scss102
-rw-r--r--app/assets/stylesheets/pages/graph.scss2
-rw-r--r--app/assets/stylesheets/pages/help.scss2
-rw-r--r--app/assets/stylesheets/pages/issuable.scss13
-rw-r--r--app/assets/stylesheets/pages/issues.scss2
-rw-r--r--app/assets/stylesheets/pages/labels.scss6
-rw-r--r--app/assets/stylesheets/pages/login.scss3
-rw-r--r--app/assets/stylesheets/pages/members.scss1
-rw-r--r--app/assets/stylesheets/pages/merge_conflicts.scss96
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss4
-rw-r--r--app/assets/stylesheets/pages/milestone.scss4
-rw-r--r--app/assets/stylesheets/pages/note_form.scss8
-rw-r--r--app/assets/stylesheets/pages/notes.scss18
-rw-r--r--app/assets/stylesheets/pages/pipelines.scss11
-rw-r--r--app/assets/stylesheets/pages/profile.scss2
-rw-r--r--app/assets/stylesheets/pages/projects.scss2
-rw-r--r--app/assets/stylesheets/pages/search.scss6
-rw-r--r--app/assets/stylesheets/pages/settings.scss4
-rw-r--r--app/assets/stylesheets/pages/status.scss4
-rw-r--r--app/assets/stylesheets/pages/todos.scss18
-rw-r--r--app/assets/stylesheets/pages/tree.scss20
-rw-r--r--app/assets/stylesheets/pages/ui_dev_kit.scss2
-rw-r--r--app/controllers/admin/appearances_controller.rb1
-rw-r--r--app/controllers/admin/runners_controller.rb8
-rw-r--r--app/controllers/clusters/applications_controller.rb29
-rw-r--r--app/controllers/concerns/continue_params.rb2
-rw-r--r--app/controllers/concerns/issuable_actions.rb2
-rw-r--r--app/controllers/concerns/milestone_actions.rb2
-rw-r--r--app/controllers/concerns/renders_notes.rb2
-rw-r--r--app/controllers/dashboard/projects_controller.rb8
-rw-r--r--app/controllers/google_api/authorizations_controller.rb32
-rw-r--r--app/controllers/graphql_controller.rb9
-rw-r--r--app/controllers/profiles/active_sessions_controller.rb11
-rw-r--r--app/controllers/projects/application_controller.rb2
-rw-r--r--app/controllers/projects/autocomplete_sources_controller.rb2
-rw-r--r--app/controllers/projects/blob_controller.rb56
-rw-r--r--app/controllers/projects/commit_controller.rb6
-rw-r--r--app/controllers/projects/group_links_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb4
-rw-r--r--app/controllers/projects/merge_requests_controller.rb1
-rw-r--r--app/controllers/projects/settings/operations_controller.rb38
-rw-r--r--app/controllers/uploads_controller.rb6
-rw-r--r--app/finders/admin/runners_finder.rb9
-rw-r--r--app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb44
-rw-r--r--app/finders/issuable_finder.rb40
-rw-r--r--app/finders/merge_requests_finder.rb9
-rw-r--r--app/finders/snippets_finder.rb2
-rw-r--r--app/graphql/resolvers/metadata_resolver.rb11
-rw-r--r--app/graphql/types/metadata_type.rb10
-rw-r--r--app/graphql/types/project_type.rb2
-rw-r--r--app/graphql/types/query_type.rb10
-rw-r--r--app/helpers/appearances_helper.rb8
-rw-r--r--app/helpers/blob_helper.rb2
-rw-r--r--app/helpers/ci_status_helper.rb17
-rw-r--r--app/helpers/emails_helper.rb38
-rw-r--r--app/helpers/issuables_helper.rb2
-rw-r--r--app/helpers/markup_helper.rb2
-rw-r--r--app/helpers/merge_requests_helper.rb6
-rw-r--r--app/helpers/notes_helper.rb2
-rw-r--r--app/helpers/preferences_helper.rb3
-rw-r--r--app/helpers/projects_helper.rb14
-rw-r--r--app/helpers/tree_helper.rb11
-rw-r--r--app/helpers/user_callouts_helper.rb3
-rw-r--r--app/mailers/abuse_report_mailer.rb4
-rw-r--r--app/mailers/email_rejection_mailer.rb4
-rw-r--r--app/mailers/emails/issues.rb1
-rw-r--r--app/mailers/emails/pipelines.rb2
-rw-r--r--app/mailers/repository_check_mailer.rb4
-rw-r--r--app/models/active_session.rb6
-rw-r--r--app/models/appearance.rb1
-rw-r--r--app/models/application_setting.rb2
-rw-r--r--app/models/board_group_recent_visit.rb9
-rw-r--r--app/models/board_project_recent_visit.rb9
-rw-r--r--app/models/ci/bridge.rb10
-rw-r--r--app/models/ci/build.rb201
-rw-r--r--app/models/ci/build_trace_chunk.rb2
-rw-r--r--app/models/ci/group_variable.rb1
-rw-r--r--app/models/ci/pipeline.rb26
-rw-r--r--app/models/ci/pipeline_enums.rb2
-rw-r--r--app/models/ci/runner.rb2
-rw-r--r--app/models/ci/variable.rb1
-rw-r--r--app/models/clusters/applications/jupyter.rb11
-rw-r--r--app/models/clusters/concerns/application_core.rb6
-rw-r--r--app/models/clusters/platforms/kubernetes.rb2
-rw-r--r--app/models/commit_range.rb8
-rw-r--r--app/models/concerns/blob_language_from_git_attributes.rb2
-rw-r--r--app/models/concerns/ci/contextable.rb108
-rw-r--r--app/models/concerns/ci/processable.rb4
-rw-r--r--app/models/concerns/feature_gate.rb2
-rw-r--r--app/models/concerns/has_ref.rb13
-rw-r--r--app/models/concerns/has_variable.rb6
-rw-r--r--app/models/concerns/issuable.rb11
-rw-r--r--app/models/concerns/maskable.rb22
-rw-r--r--app/models/concerns/milestoneish.rb23
-rw-r--r--app/models/concerns/mirror_authentication.rb2
-rw-r--r--app/models/concerns/reactive_caching.rb2
-rw-r--r--app/models/concerns/token_authenticatable_strategies/base.rb16
-rw-r--r--app/models/concerns/token_authenticatable_strategies/encrypted.rb52
-rw-r--r--app/models/diff_note.rb8
-rw-r--r--app/models/environment.rb4
-rw-r--r--app/models/error_tracking/project_error_tracking_setting.rb49
-rw-r--r--app/models/group.rb2
-rw-r--r--app/models/individual_note_discussion.rb2
-rw-r--r--app/models/issue.rb1
-rw-r--r--app/models/label_note.rb2
-rw-r--r--app/models/legacy_diff_note.rb2
-rw-r--r--app/models/merge_request.rb66
-rw-r--r--app/models/merge_request_diff.rb2
-rw-r--r--app/models/namespace.rb2
-rw-r--r--app/models/notification_recipient.rb4
-rw-r--r--app/models/project.rb20
-rw-r--r--app/models/project_feature.rb15
-rw-r--r--app/models/project_services/campfire_service.rb2
-rw-r--r--app/models/project_services/irker_service.rb2
-rw-r--r--app/models/project_services/jira_service.rb5
-rw-r--r--app/models/project_services/prometheus_service.rb6
-rw-r--r--app/models/protected_branch.rb14
-rw-r--r--app/models/repository.rb4
-rw-r--r--app/models/ssh_host_key.rb2
-rw-r--r--app/models/suggestion.rb5
-rw-r--r--app/models/todo.rb9
-rw-r--r--app/models/user.rb2
-rw-r--r--app/models/wiki_page.rb2
-rw-r--r--app/policies/global_policy.rb4
-rw-r--r--app/policies/group_policy.rb1
-rw-r--r--app/policies/project_policy.rb5
-rw-r--r--app/presenters/blobs/unfold_presenter.rb75
-rw-r--r--app/presenters/ci/build_runner_presenter.rb2
-rw-r--r--app/presenters/clusterable_presenter.rb4
-rw-r--r--app/presenters/group_clusterable_presenter.rb5
-rw-r--r--app/presenters/merge_request_presenter.rb6
-rw-r--r--app/presenters/project_clusterable_presenter.rb5
-rw-r--r--app/presenters/project_presenter.rb4
-rw-r--r--app/serializers/acts_as_taggable_on/tag_entity.rb6
-rw-r--r--app/serializers/acts_as_taggable_on/tag_serializer.rb5
-rw-r--r--app/serializers/concerns/user_status_tooltip.rb2
-rw-r--r--app/serializers/diff_file_base_entity.rb10
-rw-r--r--app/serializers/diff_file_entity.rb6
-rw-r--r--app/serializers/merge_request_for_pipeline_entity.rb17
-rw-r--r--app/serializers/pipeline_entity.rb14
-rw-r--r--app/serializers/pipeline_serializer.rb1
-rw-r--r--app/services/application_settings/update_service.rb2
-rw-r--r--app/services/boards/visits/latest_service.rb14
-rw-r--r--app/services/clusters/applications/base_helm_service.rb4
-rw-r--r--app/services/clusters/applications/base_service.rb76
-rw-r--r--app/services/clusters/applications/create_service.rb57
-rw-r--r--app/services/clusters/applications/install_service.rb22
-rw-r--r--app/services/clusters/applications/patch_service.rb24
-rw-r--r--app/services/clusters/applications/update_service.rb34
-rw-r--r--app/services/commits/create_service.rb13
-rw-r--r--app/services/error_tracking/list_projects_service.rb4
-rw-r--r--app/services/files/multi_service.rb3
-rw-r--r--app/services/groups/nested_create_service.rb2
-rw-r--r--app/services/groups/transfer_service.rb10
-rw-r--r--app/services/issuable_base_service.rb8
-rw-r--r--app/services/issues/build_service.rb4
-rw-r--r--app/services/merge_requests/base_service.rb2
-rw-r--r--app/services/merge_requests/build_service.rb1
-rw-r--r--app/services/merge_requests/merge_service.rb3
-rw-r--r--app/services/merge_requests/merge_to_ref_service.rb15
-rw-r--r--app/services/notes/create_service.rb11
-rw-r--r--app/services/notes/quick_actions_service.rb26
-rw-r--r--app/services/projects/download_service.rb2
-rw-r--r--app/services/projects/group_links/create_service.rb10
-rw-r--r--app/services/projects/hashed_storage/base_attachment_service.rb51
-rw-r--r--app/services/projects/hashed_storage/base_repository_service.rb22
-rw-r--r--app/services/projects/hashed_storage/migrate_attachments_service.rb49
-rw-r--r--app/services/projects/hashed_storage/migrate_repository_service.rb14
-rw-r--r--app/services/projects/hashed_storage/rollback_attachments_service.rb34
-rw-r--r--app/services/projects/hashed_storage/rollback_repository_service.rb40
-rw-r--r--app/services/projects/hashed_storage/rollback_service.rb37
-rw-r--r--app/services/projects/operations/update_service.rb23
-rw-r--r--app/services/push_event_payload_service.rb2
-rw-r--r--app/services/quick_actions/interpret_service.rb5
-rw-r--r--app/services/suggestions/apply_service.rb12
-rw-r--r--app/services/suggestions/create_service.rb10
-rw-r--r--app/services/upload_service.rb2
-rw-r--r--app/services/validate_new_branch_service.rb4
-rw-r--r--app/uploaders/file_mover.rb8
-rw-r--r--app/validators/sha_validator.rb9
-rw-r--r--app/views/admin/appearances/_system_header_footer_form.html.haml9
-rw-r--r--app/views/admin/runners/index.html.haml19
-rw-r--r--app/views/ci/status/_icon.html.haml16
-rw-r--r--app/views/clusters/clusters/show.html.haml1
-rw-r--r--app/views/groups/edit.html.haml2
-rw-r--r--app/views/layouts/_mailer.html.haml4
-rw-r--r--app/views/layouts/empty_mailer.html.haml5
-rw-r--r--app/views/layouts/empty_mailer.text.erb5
-rw-r--r--app/views/layouts/mailer.text.erb4
-rw-r--r--app/views/layouts/notify.html.haml2
-rw-r--r--app/views/layouts/notify.text.erb4
-rw-r--r--app/views/notify/issue_moved_email.html.haml11
-rw-r--r--app/views/notify/issue_moved_email.text.erb4
-rw-r--r--app/views/profiles/active_sessions/_active_session.html.haml6
-rw-r--r--app/views/projects/_home_panel.html.haml15
-rw-r--r--app/views/projects/_md_preview.html.haml4
-rw-r--r--app/views/projects/_merge_request_merge_settings.html.haml1
-rw-r--r--app/views/projects/blob/_markdown_buttons.html.haml20
-rw-r--r--app/views/projects/blob/viewers/_dependency_manager.html.haml5
-rw-r--r--app/views/projects/buttons/_clone.html.haml5
-rw-r--r--app/views/projects/cycle_analytics/show.html.haml2
-rw-r--r--app/views/projects/deployments/_actions.haml2
-rw-r--r--app/views/projects/deployments/_confirm_rollback_modal.html.haml23
-rw-r--r--app/views/projects/deployments/_rollback.haml3
-rw-r--r--app/views/projects/edit.html.haml48
-rw-r--r--app/views/projects/issues/_merge_requests.html.haml2
-rw-r--r--app/views/projects/issues/_related_branches.html.haml2
-rw-r--r--app/views/projects/merge_requests/_merge_request.html.haml2
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml2
-rw-r--r--app/views/projects/pipelines/_info.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_index.html.haml2
-rw-r--r--app/views/projects/settings/operations/_error_tracking.html.haml26
-rw-r--r--app/views/projects/tags/show.html.haml2
-rw-r--r--app/views/shared/_mobile_clone_panel.html.haml1
-rw-r--r--app/views/shared/deploy_keys/_form.html.haml2
-rw-r--r--app/views/shared/milestones/_milestone.html.haml2
-rw-r--r--app/views/shared/milestones/_tabs.html.haml6
-rw-r--r--app/views/shared/projects/_project.html.haml3
-rw-r--r--app/workers/all_queues.yml5
-rw-r--r--app/workers/cluster_patch_app_worker.rb13
-rw-r--r--app/workers/hashed_storage/base_worker.rb21
-rw-r--r--app/workers/hashed_storage/project_migrate_worker.rb26
-rw-r--r--app/workers/hashed_storage/project_rollback_worker.rb26
-rw-r--r--app/workers/hashed_storage/rollbacker_worker.rb16
-rw-r--r--app/workers/pipeline_metrics_worker.rb2
-rw-r--r--app/workers/project_migrate_hashed_storage_worker.rb43
-rw-r--r--babel.config.js8
-rwxr-xr-xbin/background_jobs9
-rw-r--r--changelogs/unreleased/10095-job-getters.yml5
-rw-r--r--changelogs/unreleased/10097-number-utils.yml5
-rw-r--r--changelogs/unreleased/13784-simple-masking-of-protected-variables-in-logs.yml5
-rw-r--r--changelogs/unreleased/20084-update-the-spinner-component.yml5
-rw-r--r--changelogs/unreleased/27333-re-deploy-rollback-button-should-ask-for-confirmation-before-executing.yml5
-rw-r--r--changelogs/unreleased/2802-security-add-public-internal-groups-as-members-to-your-project-idor.yml6
-rw-r--r--changelogs/unreleased/32714-copying-comment-with-ordered-list-includes-extraneous-newlines.yml5
-rw-r--r--changelogs/unreleased/37673-minor-issue-with-apostrophe-single-quote-when-clicking-assign-to-me.yml5
-rw-r--r--changelogs/unreleased/40396-sidekiq-in-process-group.yml5
-rw-r--r--changelogs/unreleased/40396-use-pgroups-for-background-jobs.yml5
-rw-r--r--changelogs/unreleased/41888-access-personal-snippets-by-api.yml5
-rw-r--r--changelogs/unreleased/45035-force-push-api.yml5
-rw-r--r--changelogs/unreleased/45305-ci-status-icon-mismatch-on-merge-requests-page-and-the-mr-itself.yml5
-rw-r--r--changelogs/unreleased/47869-jobs-tab-border-top-in-pipeline-s-page-is-1px-off.yml5
-rw-r--r--changelogs/unreleased/49397-move-files-in-ide.yml5
-rw-r--r--changelogs/unreleased/49663-branch-to-mr-connection.yml5
-rw-r--r--changelogs/unreleased/51971-milestones-visibility.yml5
-rw-r--r--changelogs/unreleased/52459-display-job-names-consistently-on-pipelines-and-environments-list.yml5
-rw-r--r--changelogs/unreleased/52792-align-mirror-repository-button.yml5
-rw-r--r--changelogs/unreleased/52877-ios-publishing-blog-post-and-gitlab-ci-yml-template.yml5
-rw-r--r--changelogs/unreleased/53336-improve-web-ide-launch-performance.yml5
-rw-r--r--changelogs/unreleased/53361-fresh-protected-branches.yml5
-rw-r--r--changelogs/unreleased/53413-externalize-markdown-toolbar-tooltips.yml5
-rw-r--r--changelogs/unreleased/53966-make-hashed-storage-migration-safer-and-more-inviting.yml5
-rw-r--r--changelogs/unreleased/54643-lower_issuable_finder_complexity.yml5
-rw-r--r--changelogs/unreleased/56251-fix-issue-board-weekday-shift.yml5
-rw-r--r--changelogs/unreleased/56809-graphql-version-api.yml5
-rw-r--r--changelogs/unreleased/56851-error-tracking-page-seems-broken.yml5
-rw-r--r--changelogs/unreleased/56863-system-messages-in-email.yml5
-rw-r--r--changelogs/unreleased/56937-edit-knative-domain.yml5
-rw-r--r--changelogs/unreleased/57085-introduce-zoom-and-scroll-functionality-on-metrics-charts.yml5
-rw-r--r--changelogs/unreleased/57534_filter_impersonated_sessions.yml6
-rw-r--r--changelogs/unreleased/57612-github-importer-ignores-milestone-due_date.yml5
-rw-r--r--changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml5
-rw-r--r--changelogs/unreleased/57788-project-labels-tooltip-missing.yml5
-rw-r--r--changelogs/unreleased/57829-issuable-meta-line-ui-broken-on-mobile.yml5
-rw-r--r--changelogs/unreleased/57991-frontend-pagination-needs-to-handle-cases-where-the-x-total-pages-header-isn-t-present.yml5
-rw-r--r--changelogs/unreleased/58023-add-Saturday-to-localization-first-day-of-the-week.yml5
-rw-r--r--changelogs/unreleased/58274-folder-icon-in-tags-page.yml5
-rw-r--r--changelogs/unreleased/58369-hide-squash-commit.yml5
-rw-r--r--changelogs/unreleased/58570-fix-running-pipline-that-is-imported-via-dotnetcore-template.yml5
-rw-r--r--changelogs/unreleased/8711-prep-frontend-single-repo.yml5
-rw-r--r--changelogs/unreleased/add-project-level-config-for-prospective-merge-pipelines-ce.yml5
-rw-r--r--changelogs/unreleased/add_ldap_tls_options.yml5
-rw-r--r--changelogs/unreleased/allow-to-recursively-include.yml5
-rw-r--r--changelogs/unreleased/auto-devops-tags.yml5
-rw-r--r--changelogs/unreleased/bvl-graphql-csrf.yml5
-rw-r--r--changelogs/unreleased/enable-markup-highlighting.yml5
-rw-r--r--changelogs/unreleased/expand-diff-to-full-file.yml5
-rw-r--r--changelogs/unreleased/expose-additional-merge-request-pipeline-variables.yml5
-rw-r--r--changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml5
-rw-r--r--changelogs/unreleased/feature-api-delete-job-artifacts.yml5
-rw-r--r--changelogs/unreleased/feature-gb-add-serverless-cicd-template.yml5
-rw-r--r--changelogs/unreleased/feature-runner-tag-filter-for-admin-view.yml5
-rw-r--r--changelogs/unreleased/fix-38010-sidebar-loads-and-collapses.yml5
-rw-r--r--changelogs/unreleased/fix-blob-editor-deleting-content.yml5
-rw-r--r--changelogs/unreleased/fix-gb-fix-bridge-jobs-variables-policy.yml5
-rw-r--r--changelogs/unreleased/fix-group-without-owner.yml5
-rw-r--r--changelogs/unreleased/gokhanap-master-patch-03762.yml5
-rw-r--r--changelogs/unreleased/gt-update-activity-filter-for-issues.yml5
-rw-r--r--changelogs/unreleased/jira-link-mention-compact.yml5
-rw-r--r--changelogs/unreleased/osw-fetch-latest-version-when-creating-suggestions.yml5
-rw-r--r--changelogs/unreleased/osw-merge-to-ref-changes-for-ci-team.yml5
-rw-r--r--changelogs/unreleased/refactor-merge-request-between-pipeline-and-build.yml5
-rw-r--r--changelogs/unreleased/restrict-jupyter-login.yml5
-rw-r--r--changelogs/unreleased/security-2774-milestones-detail.yml5
-rw-r--r--changelogs/unreleased/security-2797-milestone-mrs.yml5
-rw-r--r--changelogs/unreleased/security-2798-fix-boards-policy.yml5
-rw-r--r--changelogs/unreleased/security-2799-emails.yml5
-rw-r--r--changelogs/unreleased/security-50334.yml5
-rw-r--r--changelogs/unreleased/security-55468-check-validity-before-querying.yml5
-rw-r--r--changelogs/unreleased/security-56348.yml5
-rw-r--r--changelogs/unreleased/security-commit-private-related-mr.yml5
-rw-r--r--changelogs/unreleased/security-fj-diff-import-file-read-fix.yml5
-rw-r--r--changelogs/unreleased/security-id-fix-mr-visibility.yml5
-rw-r--r--changelogs/unreleased/security-id-restricted-access-to-private-repo.yml5
-rw-r--r--changelogs/unreleased/security-issue_54789_2.yml5
-rw-r--r--changelogs/unreleased/security-kubernetes-google-login-csrf.yml5
-rw-r--r--changelogs/unreleased/security-kubernetes-local-ssrf.yml5
-rw-r--r--changelogs/unreleased/security-mermaid.yml5
-rw-r--r--changelogs/unreleased/security-osw-stop-linking-to-packages.yml5
-rw-r--r--changelogs/unreleased/security-protect-private-repo-information.yml5
-rw-r--r--changelogs/unreleased/security-shared-project-private-group.yml5
-rw-r--r--changelogs/unreleased/security-tags-oracle.yml5
-rw-r--r--changelogs/unreleased/sh-bump-fog-gem.yml5
-rw-r--r--changelogs/unreleased/sh-optimize-calendar-activities.yml5
-rw-r--r--changelogs/unreleased/sh-optimize-todos-api.yml5
-rw-r--r--changelogs/unreleased/sh-rugged-commit-is-ancestor.yml5
-rw-r--r--changelogs/unreleased/sh-rugged-find-commit.yml5
-rw-r--r--changelogs/unreleased/sh-rugged-get-tree-entry.yml5
-rw-r--r--changelogs/unreleased/sh-rugged-tree-entries.yml5
-rw-r--r--changelogs/unreleased/sh-show-pre-receive-error-merge.yml5
-rw-r--r--changelogs/unreleased/shell-8-7.yml5
-rw-r--r--changelogs/unreleased/table-fix-scroll-and-block.yml5
-rw-r--r--changelogs/unreleased/tr-error-tracking-project-selection.yml5
-rw-r--r--changelogs/unreleased/use-encrypted-runner-tokens.yml5
-rw-r--r--changelogs/unreleased/winh-enable-reply_to_individual_notes.yml5
-rw-r--r--config/gitlab.yml.example67
-rw-r--r--config/initializers/1_settings.rb18
-rw-r--r--config/initializers/fog_core_patch.rb52
-rw-r--r--config/initializers/graphql.rb2
-rw-r--r--config/initializers/sidekiq.rb5
-rw-r--r--config/locales/en.yml4
-rw-r--r--config/routes.rb1
-rw-r--r--config/routes/admin.rb4
-rw-r--r--config/routes/git_http.rb2
-rw-r--r--config/routes/group.rb2
-rw-r--r--config/routes/project.rb3
-rw-r--r--config/sidekiq_queues.yml1
-rw-r--r--config/webpack.config.js11
-rw-r--r--db/migrate/20190206193120_add_index_to_tags.rb18
-rw-r--r--db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb11
-rw-r--r--db/migrate/20190218134158_add_masked_to_ci_variables.rb21
-rw-r--r--db/migrate/20190218134209_add_masked_to_ci_group_variables.rb21
-rw-r--r--db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb17
-rw-r--r--db/migrate/20190225160300_steal_encrypt_runners_tokens.rb19
-rw-r--r--db/migrate/20190225160301_add_runner_tokens_indexes.rb24
-rw-r--r--db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb17
-rw-r--r--db/schema.rb10
-rw-r--r--doc/README.md2
-rw-r--r--doc/administration/auth/how_to_configure_ldap_gitlab_ce/index.md4
-rw-r--r--doc/administration/auth/ldap.md59
-rw-r--r--doc/administration/auth/okta.md11
-rw-r--r--doc/administration/compliance.md10
-rw-r--r--doc/administration/gitaly/index.md31
-rw-r--r--doc/administration/high_availability/nfs.md22
-rw-r--r--doc/administration/index.md2
-rw-r--r--doc/administration/job_artifacts.md2
-rw-r--r--doc/administration/monitoring/prometheus/index.md2
-rw-r--r--doc/administration/operations/sidekiq_memory_killer.md5
-rw-r--r--doc/administration/pages/source.md2
-rw-r--r--doc/administration/raketasks/uploads/migrate.md2
-rw-r--r--doc/administration/repository_checks.md2
-rw-r--r--doc/administration/uploads.md3
-rw-r--r--doc/api/README.md2
-rw-r--r--doc/api/commits.md1
-rw-r--r--doc/api/jobs.md71
-rw-r--r--doc/api/runners.md38
-rw-r--r--doc/api/settings.md2
-rw-r--r--doc/articles/index.md4
-rw-r--r--doc/ci/docker/using_docker_build.md2
-rw-r--r--doc/ci/variables/README.md30
-rw-r--r--doc/ci/yaml/README.md75
-rw-r--r--doc/customization/system_header_and_footer_messages.md4
-rw-r--r--doc/customization/system_header_and_footer_messages/appearance.pngbin100302 -> 124214 bytes
-rw-r--r--doc/development/architecture.md4
-rw-r--r--doc/development/changelog.md22
-rw-r--r--doc/development/contributing/merge_request_workflow.md2
-rw-r--r--doc/development/distributed_tracing.md182
-rw-r--r--doc/development/documentation/index.md4
-rw-r--r--doc/development/documentation/site_architecture/global_nav.md2
-rw-r--r--doc/development/documentation/styleguide.md22
-rw-r--r--doc/development/ee_features.md98
-rw-r--r--doc/development/fe_guide/architecture.md7
-rw-r--r--doc/development/fe_guide/vue.md4
-rw-r--r--doc/development/feature_flags.md5
-rw-r--r--doc/development/gitaly.md43
-rw-r--r--doc/development/i18n/merging_translations.md3
-rw-r--r--doc/development/img/distributed_tracing_jaeger_ui.pngbin0 -> 1032713 bytes
-rw-r--r--doc/development/img/distributed_tracing_performance_bar.pngbin0 -> 108809 bytes
-rw-r--r--doc/development/performance.md1
-rw-r--r--doc/development/profiling.md10
-rw-r--r--doc/development/rolling_out_changes_using_feature_flags.md23
-rw-r--r--doc/development/testing_guide/best_practices.md14
-rw-r--r--doc/development/testing_guide/ci.md4
-rw-r--r--doc/development/testing_guide/frontend_testing.md60
-rw-r--r--doc/development/testing_guide/review_apps.md8
-rw-r--r--doc/development/testing_guide/testing_levels.md4
-rw-r--r--doc/gitlab-basics/create-project.md2
-rw-r--r--doc/gitlab-basics/create-your-ssh-keys.md11
-rw-r--r--doc/install/aws/index.md6
-rw-r--r--doc/install/docker.md2
-rw-r--r--doc/install/installation.md6
-rw-r--r--doc/install/kubernetes/preparation/tiller.md2
-rw-r--r--doc/install/openshift_and_gitlab/index.md2
-rw-r--r--doc/install/requirements.md2
-rw-r--r--doc/integration/omniauth.md2
-rw-r--r--doc/project_services/bamboo.md4
-rw-r--r--doc/project_services/bugzilla.md4
-rw-r--r--doc/project_services/emails_on_push.md4
-rw-r--r--doc/project_services/irker.md4
-rw-r--r--doc/project_services/jira.md4
-rw-r--r--doc/project_services/kubernetes.md4
-rw-r--r--doc/project_services/mattermost.md4
-rw-r--r--doc/project_services/mattermost_slash_commands.md4
-rw-r--r--doc/project_services/project_services.md4
-rw-r--r--doc/project_services/redmine.md4
-rw-r--r--doc/project_services/services_templates.md4
-rw-r--r--doc/project_services/slack.md4
-rw-r--r--doc/project_services/slack_slash_commands.md4
-rw-r--r--doc/topics/authentication/index.md2
-rw-r--r--doc/topics/autodevops/index.md2
-rw-r--r--doc/update/restore_after_failure.md2
-rw-r--r--doc/update/upgrading_from_source.md4
-rw-r--r--doc/user/account/security.md4
-rw-r--r--doc/user/account/two_factor_authentication.md4
-rw-r--r--doc/user/admin_area/monitoring/health_check.md24
-rw-r--r--doc/user/group/clusters/index.md4
-rw-r--r--doc/user/group/index.md3
-rw-r--r--doc/user/group/subgroups/index.md12
-rw-r--r--doc/user/index.md4
-rw-r--r--doc/user/instance_statistics/convdev.md23
-rw-r--r--doc/user/permissions.md4
-rw-r--r--doc/user/profile/account/index.md3
-rw-r--r--doc/user/profile/active_sessions.md8
-rw-r--r--doc/user/profile/img/active_sessions_list.pngbin22266 -> 19360 bytes
-rw-r--r--doc/user/profile/index.md2
-rw-r--r--doc/user/profile/preferences.md8
-rw-r--r--doc/user/project/builds/artifacts.md4
-rw-r--r--doc/user/project/clusters/index.md30
-rw-r--r--doc/user/project/clusters/runbooks/index.md6
-rw-r--r--doc/user/project/clusters/serverless/index.md93
-rw-r--r--doc/user/project/cycle_analytics.md37
-rw-r--r--doc/user/project/gpg_signed_commits/index.md4
-rw-r--r--doc/user/project/img/cycle_analytics_landing_page.pngbin42114 -> 184131 bytes
-rw-r--r--doc/user/project/img/issue_boards_multiple.pngbin22623 -> 68373 bytes
-rw-r--r--doc/user/project/import/svn.md2
-rw-r--r--doc/user/project/index.md2
-rw-r--r--doc/user/project/integrations/kubernetes.md4
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md2
-rw-r--r--doc/user/project/integrations/prometheus.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/metrics.md4
-rw-r--r--doc/user/project/issue_board.md10
-rw-r--r--doc/user/project/merge_requests.md4
-rw-r--r--doc/user/project/merge_requests/maintainer_access.md4
-rw-r--r--doc/user/project/merge_requests/merge_request_discussion_resolution.md4
-rw-r--r--doc/user/project/merge_requests/merge_when_build_succeeds.md8
-rw-r--r--doc/user/project/operations/error_tracking.md8
-rw-r--r--doc/user/project/pages/getting_started_part_one.md2
-rw-r--r--doc/user/project/pages/getting_started_part_three.md6
-rw-r--r--doc/user/project/pages/getting_started_part_two.md97
-rw-r--r--doc/user/project/pages/img/pages_project_templates_11-8.pngbin0 -> 69702 bytes
-rw-r--r--doc/user/project/pages/index.md65
-rw-r--r--doc/user/project/pages/introduction.md6
-rw-r--r--doc/user/project/pipelines/job_artifacts.md2
-rw-r--r--doc/user/project/protected_branches.md25
-rw-r--r--doc/user/project/releases.md4
-rw-r--r--doc/user/project/repository/branches/index.md2
-rw-r--r--doc/user/project/slash_commands.md4
-rw-r--r--doc/user/search/index.md2
-rw-r--r--doc/workflow/groups.md3
-rw-r--r--jest.config.js3
-rw-r--r--lib/api/commits.rb11
-rw-r--r--lib/api/entities.rb12
-rw-r--r--lib/api/environments.rb8
-rw-r--r--lib/api/helpers.rb4
-rw-r--r--lib/api/helpers/graphql_helpers.rb22
-rw-r--r--lib/api/helpers/notes_helpers.rb14
-rw-r--r--lib/api/helpers/pagination.rb2
-rw-r--r--lib/api/issues.rb6
-rw-r--r--lib/api/job_artifacts.rb16
-rw-r--r--lib/api/merge_requests.rb8
-rw-r--r--lib/api/projects.rb39
-rw-r--r--lib/api/release/links.rb2
-rw-r--r--lib/api/runners.rb6
-rw-r--r--lib/api/snippets.rb25
-rw-r--r--lib/api/todos.rb32
-rw-r--r--lib/api/validations/types/labels_list.rb24
-rw-r--r--lib/api/version.rb18
-rw-r--r--lib/banzai/pipeline/markup_pipeline.rb3
-rw-r--r--lib/bitbucket_server/collection.rb4
-rw-r--r--lib/constraints/project_url_constrainer.rb3
-rw-r--r--lib/declarative_policy/rule.rb6
-rw-r--r--lib/event_filter.rb2
-rw-r--r--lib/gitlab.rb4
-rw-r--r--lib/gitlab/auth/ldap/config.rb59
-rw-r--r--lib/gitlab/auth/ldap/person.rb2
-rw-r--r--lib/gitlab/auth/omniauth_identity_linker_base.rb6
-rw-r--r--lib/gitlab/auth/saml/auth_hash.rb4
-rw-r--r--lib/gitlab/background_migration/encrypt_columns.rb3
-rw-r--r--lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb2
-rw-r--r--lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb2
-rw-r--r--lib/gitlab/bare_repository_import/importer.rb2
-rw-r--r--lib/gitlab/bitbucket_import/importer.rb2
-rw-r--r--lib/gitlab/bitbucket_server_import/importer.rb2
-rw-r--r--lib/gitlab/checks/branch_check.rb36
-rw-r--r--lib/gitlab/ci/ansi2html.rb2
-rw-r--r--lib/gitlab/ci/build/artifacts/metadata.rb2
-rw-r--r--lib/gitlab/ci/build/artifacts/metadata/entry.rb2
-rw-r--r--lib/gitlab/ci/build/policy/refs.rb8
-rw-r--r--lib/gitlab/ci/config.rb3
-rw-r--r--lib/gitlab/ci/config/external/file/base.rb30
-rw-r--r--lib/gitlab/ci/config/external/file/local.rb7
-rw-r--r--lib/gitlab/ci/config/external/file/project.rb7
-rw-r--r--lib/gitlab/ci/config/external/mapper.rb36
-rw-r--r--lib/gitlab/ci/config/external/processor.rb6
-rw-r--r--lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml20
-rw-r--r--lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml44
-rw-r--r--lib/gitlab/ci/templates/Serverless.gitlab-ci.yml41
-rw-r--r--lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml28
-rw-r--r--lib/gitlab/ci/variables/collection.rb2
-rw-r--r--lib/gitlab/ci/variables/collection/item.rb10
-rw-r--r--lib/gitlab/contributions_calendar.rb1
-rw-r--r--lib/gitlab/cycle_analytics/plan_event_fetcher.rb4
-rw-r--r--lib/gitlab/danger/helper.rb1
-rw-r--r--lib/gitlab/database/count/tablesample_count_strategy.rb2
-rw-r--r--lib/gitlab/dependency_linker/base_linker.rb18
-rw-r--r--lib/gitlab/dependency_linker/composer_json_linker.rb4
-rw-r--r--lib/gitlab/dependency_linker/gemfile_linker.rb30
-rw-r--r--lib/gitlab/dependency_linker/gemspec_linker.rb2
-rw-r--r--lib/gitlab/dependency_linker/method_linker.rb10
-rw-r--r--lib/gitlab/dependency_linker/package.rb19
-rw-r--r--lib/gitlab/dependency_linker/package_json_linker.rb21
-rw-r--r--lib/gitlab/dependency_linker/parser/gemfile.rb40
-rw-r--r--lib/gitlab/dependency_linker/podfile_linker.rb11
-rw-r--r--lib/gitlab/dependency_linker/podspec_linker.rb2
-rw-r--r--lib/gitlab/diff/file.rb12
-rw-r--r--lib/gitlab/email/reply_parser.rb2
-rw-r--r--lib/gitlab/fogbugz_import/importer.rb2
-rw-r--r--lib/gitlab/git/blob.rb6
-rw-r--r--lib/gitlab/git/commit.rb21
-rw-r--r--lib/gitlab/git/ref.rb1
-rw-r--r--lib/gitlab/git/repository.rb10
-rw-r--r--lib/gitlab/git/rugged_impl/blob.rb106
-rw-r--r--lib/gitlab/git/rugged_impl/commit.rb65
-rw-r--r--lib/gitlab/git/rugged_impl/ref.rb20
-rw-r--r--lib/gitlab/git/rugged_impl/repository.rb78
-rw-r--r--lib/gitlab/git/rugged_impl/tree.rb105
-rw-r--r--lib/gitlab/git/tree.rb8
-rw-r--r--lib/gitlab/gitaly_client.rb35
-rw-r--r--lib/gitlab/gitaly_client/blob_service.rb2
-rw-r--r--lib/gitlab/gitaly_client/operation_service.rb16
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb21
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb8
-rw-r--r--lib/gitlab/github_import/importer/milestones_importer.rb1
-rw-r--r--lib/gitlab/gon_helper.rb1
-rw-r--r--lib/gitlab/hashed_storage/migrator.rb36
-rw-r--r--lib/gitlab/hashed_storage/rake_helper.rb12
-rw-r--r--lib/gitlab/highlight.rb2
-rw-r--r--lib/gitlab/i18n/metadata_entry.rb2
-rw-r--r--lib/gitlab/import_export/json_hash_builder.rb2
-rw-r--r--lib/gitlab/import_export/merge_request_parser.rb11
-rw-r--r--lib/gitlab/import_export/relation_factory.rb2
-rw-r--r--lib/gitlab/incoming_email.rb2
-rw-r--r--lib/gitlab/json_cache.rb16
-rw-r--r--lib/gitlab/kubernetes/helm/install_command.rb3
-rw-r--r--lib/gitlab/kubernetes/kube_client.rb8
-rw-r--r--lib/gitlab/legacy_github_import/client.rb2
-rw-r--r--lib/gitlab/legacy_github_import/user_formatter.rb4
-rw-r--r--lib/gitlab/quick_actions/command_definition.rb9
-rw-r--r--lib/gitlab/sidekiq_middleware/memory_killer.rb82
-rw-r--r--lib/gitlab/sidekiq_middleware/shutdown.rb135
-rw-r--r--lib/gitlab/sidekiq_signals.rb45
-rw-r--r--lib/gitlab/sql/pattern.rb2
-rw-r--r--lib/gitlab/template/gitlab_ci_yml_template.rb5
-rw-r--r--lib/gitlab/tracing/jaeger_factory.rb2
-rw-r--r--lib/gitlab/tree_summary.rb2
-rw-r--r--lib/gitlab/user_access.rb4
-rw-r--r--lib/system_check/app/git_user_default_ssh_config_check.rb2
-rw-r--r--lib/tasks/gemojione.rake15
-rw-r--r--lib/tasks/gitlab/backup.rake2
-rw-r--r--lib/tasks/gitlab/features.rake24
-rw-r--r--lib/tasks/gitlab/storage.rake50
-rw-r--r--lib/tasks/karma.rake2
-rw-r--r--lib/unfold_form.rb14
-rw-r--r--locale/ar_SA/gitlab.po660
-rw-r--r--locale/bg/gitlab.po624
-rw-r--r--locale/ca_ES/gitlab.po624
-rw-r--r--locale/cs_CZ/gitlab.po642
-rw-r--r--locale/cy_GB/gitlab.po660
-rw-r--r--locale/da_DK/gitlab.po624
-rw-r--r--locale/de/gitlab.po632
-rw-r--r--locale/el_GR/gitlab.po624
-rw-r--r--locale/eo/gitlab.po624
-rw-r--r--locale/es/gitlab.po830
-rw-r--r--locale/et_EE/gitlab.po624
-rw-r--r--locale/fil_PH/gitlab.po624
-rw-r--r--locale/fr/gitlab.po656
-rw-r--r--locale/gitlab.pot253
-rw-r--r--locale/gl_ES/gitlab.po624
-rw-r--r--locale/he_IL/gitlab.po642
-rw-r--r--locale/hi_IN/gitlab.po624
-rw-r--r--locale/hr_HR/gitlab.po633
-rw-r--r--locale/hu_HU/gitlab.po624
-rw-r--r--locale/id_ID/gitlab.po615
-rw-r--r--locale/it/gitlab.po624
-rw-r--r--locale/ja/gitlab.po1337
-rw-r--r--locale/ko/gitlab.po733
-rw-r--r--locale/mn_MN/gitlab.po624
-rw-r--r--locale/nb_NO/gitlab.po624
-rw-r--r--locale/nl_NL/gitlab.po624
-rw-r--r--locale/pa_IN/gitlab.po624
-rw-r--r--locale/pl_PL/gitlab.po646
-rw-r--r--locale/pt_BR/gitlab.po1248
-rw-r--r--locale/pt_PT/gitlab.po624
-rw-r--r--locale/ro_RO/gitlab.po633
-rw-r--r--locale/ru/gitlab.po648
-rw-r--r--locale/sk_SK/gitlab.po642
-rw-r--r--locale/sq_AL/gitlab.po624
-rw-r--r--locale/sr_CS/gitlab.po633
-rw-r--r--locale/sr_SP/gitlab.po633
-rw-r--r--locale/sv_SE/gitlab.po624
-rw-r--r--locale/sw_KE/gitlab.po624
-rw-r--r--locale/tr_TR/gitlab.po1706
-rw-r--r--locale/zh_CN/gitlab.po2113
-rw-r--r--locale/zh_HK/gitlab.po615
-rw-r--r--locale/zh_TW/gitlab.po623
-rw-r--r--package.json29
-rw-r--r--public/-/emojis/1/100.png (renamed from app/assets/images/emoji/100.png)bin793 -> 793 bytes
-rw-r--r--public/-/emojis/1/1234.png (renamed from app/assets/images/emoji/1234.png)bin676 -> 676 bytes
-rw-r--r--public/-/emojis/1/1F627.png (renamed from app/assets/images/emoji/1F627.png)bin821 -> 821 bytes
-rw-r--r--public/-/emojis/1/8ball.png (renamed from app/assets/images/emoji/8ball.png)bin810 -> 810 bytes
-rw-r--r--public/-/emojis/1/a.png (renamed from app/assets/images/emoji/a.png)bin469 -> 469 bytes
-rw-r--r--public/-/emojis/1/ab.png (renamed from app/assets/images/emoji/ab.png)bin505 -> 505 bytes
-rw-r--r--public/-/emojis/1/abc.png (renamed from app/assets/images/emoji/abc.png)bin646 -> 646 bytes
-rw-r--r--public/-/emojis/1/abcd.png (renamed from app/assets/images/emoji/abcd.png)bin670 -> 670 bytes
-rw-r--r--public/-/emojis/1/accept.png (renamed from app/assets/images/emoji/accept.png)bin491 -> 491 bytes
-rw-r--r--public/-/emojis/1/aerial_tramway.png (renamed from app/assets/images/emoji/aerial_tramway.png)bin759 -> 759 bytes
-rw-r--r--public/-/emojis/1/airplane.png (renamed from app/assets/images/emoji/airplane.png)bin1152 -> 1152 bytes
-rw-r--r--public/-/emojis/1/airplane_arriving.png (renamed from app/assets/images/emoji/airplane_arriving.png)bin1101 -> 1101 bytes
-rw-r--r--public/-/emojis/1/airplane_departure.png (renamed from app/assets/images/emoji/airplane_departure.png)bin1111 -> 1111 bytes
-rw-r--r--public/-/emojis/1/airplane_small.png (renamed from app/assets/images/emoji/airplane_small.png)bin1229 -> 1229 bytes
-rw-r--r--public/-/emojis/1/alarm_clock.png (renamed from app/assets/images/emoji/alarm_clock.png)bin1044 -> 1044 bytes
-rw-r--r--public/-/emojis/1/alembic.png (renamed from app/assets/images/emoji/alembic.png)bin953 -> 953 bytes
-rw-r--r--public/-/emojis/1/alien.png (renamed from app/assets/images/emoji/alien.png)bin839 -> 839 bytes
-rw-r--r--public/-/emojis/1/ambulance.png (renamed from app/assets/images/emoji/ambulance.png)bin1238 -> 1238 bytes
-rw-r--r--public/-/emojis/1/amphora.png (renamed from app/assets/images/emoji/amphora.png)bin1044 -> 1044 bytes
-rw-r--r--public/-/emojis/1/anchor.png (renamed from app/assets/images/emoji/anchor.png)bin779 -> 779 bytes
-rw-r--r--public/-/emojis/1/angel.png (renamed from app/assets/images/emoji/angel.png)bin2077 -> 2077 bytes
-rw-r--r--public/-/emojis/1/angel_tone1.png (renamed from app/assets/images/emoji/angel_tone1.png)bin2088 -> 2088 bytes
-rw-r--r--public/-/emojis/1/angel_tone2.png (renamed from app/assets/images/emoji/angel_tone2.png)bin2075 -> 2075 bytes
-rw-r--r--public/-/emojis/1/angel_tone3.png (renamed from app/assets/images/emoji/angel_tone3.png)bin2078 -> 2078 bytes
-rw-r--r--public/-/emojis/1/angel_tone4.png (renamed from app/assets/images/emoji/angel_tone4.png)bin2076 -> 2076 bytes
-rw-r--r--public/-/emojis/1/angel_tone5.png (renamed from app/assets/images/emoji/angel_tone5.png)bin2078 -> 2078 bytes
-rw-r--r--public/-/emojis/1/anger.png (renamed from app/assets/images/emoji/anger.png)bin594 -> 594 bytes
-rw-r--r--public/-/emojis/1/anger_right.png (renamed from app/assets/images/emoji/anger_right.png)bin551 -> 551 bytes
-rw-r--r--public/-/emojis/1/angry.png (renamed from app/assets/images/emoji/angry.png)bin845 -> 845 bytes
-rw-r--r--public/-/emojis/1/ant.png (renamed from app/assets/images/emoji/ant.png)bin1412 -> 1412 bytes
-rw-r--r--public/-/emojis/1/apple.png (renamed from app/assets/images/emoji/apple.png)bin655 -> 655 bytes
-rw-r--r--public/-/emojis/1/aquarius.png (renamed from app/assets/images/emoji/aquarius.png)bin648 -> 648 bytes
-rw-r--r--public/-/emojis/1/aries.png (renamed from app/assets/images/emoji/aries.png)bin711 -> 711 bytes
-rw-r--r--public/-/emojis/1/arrow_backward.png (renamed from app/assets/images/emoji/arrow_backward.png)bin429 -> 429 bytes
-rw-r--r--public/-/emojis/1/arrow_double_down.png (renamed from app/assets/images/emoji/arrow_double_down.png)bin543 -> 543 bytes
-rw-r--r--public/-/emojis/1/arrow_double_up.png (renamed from app/assets/images/emoji/arrow_double_up.png)bin535 -> 535 bytes
-rw-r--r--public/-/emojis/1/arrow_down.png (renamed from app/assets/images/emoji/arrow_down.png)bin512 -> 512 bytes
-rw-r--r--public/-/emojis/1/arrow_down_small.png (renamed from app/assets/images/emoji/arrow_down_small.png)bin455 -> 455 bytes
-rw-r--r--public/-/emojis/1/arrow_forward.png (renamed from app/assets/images/emoji/arrow_forward.png)bin429 -> 429 bytes
-rw-r--r--public/-/emojis/1/arrow_heading_down.png (renamed from app/assets/images/emoji/arrow_heading_down.png)bin563 -> 563 bytes
-rw-r--r--public/-/emojis/1/arrow_heading_up.png (renamed from app/assets/images/emoji/arrow_heading_up.png)bin559 -> 559 bytes
-rw-r--r--public/-/emojis/1/arrow_left.png (renamed from app/assets/images/emoji/arrow_left.png)bin471 -> 471 bytes
-rw-r--r--public/-/emojis/1/arrow_lower_left.png (renamed from app/assets/images/emoji/arrow_lower_left.png)bin520 -> 520 bytes
-rw-r--r--public/-/emojis/1/arrow_lower_right.png (renamed from app/assets/images/emoji/arrow_lower_right.png)bin526 -> 526 bytes
-rw-r--r--public/-/emojis/1/arrow_right.png (renamed from app/assets/images/emoji/arrow_right.png)bin468 -> 468 bytes
-rw-r--r--public/-/emojis/1/arrow_right_hook.png (renamed from app/assets/images/emoji/arrow_right_hook.png)bin644 -> 644 bytes
-rw-r--r--public/-/emojis/1/arrow_up.png (renamed from app/assets/images/emoji/arrow_up.png)bin507 -> 507 bytes
-rw-r--r--public/-/emojis/1/arrow_up_down.png (renamed from app/assets/images/emoji/arrow_up_down.png)bin474 -> 474 bytes
-rw-r--r--public/-/emojis/1/arrow_up_small.png (renamed from app/assets/images/emoji/arrow_up_small.png)bin454 -> 454 bytes
-rw-r--r--public/-/emojis/1/arrow_upper_left.png (renamed from app/assets/images/emoji/arrow_upper_left.png)bin521 -> 521 bytes
-rw-r--r--public/-/emojis/1/arrow_upper_right.png (renamed from app/assets/images/emoji/arrow_upper_right.png)bin524 -> 524 bytes
-rw-r--r--public/-/emojis/1/arrows_clockwise.png (renamed from app/assets/images/emoji/arrows_clockwise.png)bin519 -> 519 bytes
-rw-r--r--public/-/emojis/1/arrows_counterclockwise.png (renamed from app/assets/images/emoji/arrows_counterclockwise.png)bin693 -> 693 bytes
-rw-r--r--public/-/emojis/1/art.png (renamed from app/assets/images/emoji/art.png)bin1455 -> 1455 bytes
-rw-r--r--public/-/emojis/1/articulated_lorry.png (renamed from app/assets/images/emoji/articulated_lorry.png)bin1710 -> 1710 bytes
-rw-r--r--public/-/emojis/1/asterisk.png (renamed from app/assets/images/emoji/asterisk.png)bin627 -> 627 bytes
-rw-r--r--public/-/emojis/1/astonished.png (renamed from app/assets/images/emoji/astonished.png)bin862 -> 862 bytes
-rw-r--r--public/-/emojis/1/athletic_shoe.png (renamed from app/assets/images/emoji/athletic_shoe.png)bin1595 -> 1595 bytes
-rw-r--r--public/-/emojis/1/atm.png (renamed from app/assets/images/emoji/atm.png)bin1397 -> 1397 bytes
-rw-r--r--public/-/emojis/1/atom.png (renamed from app/assets/images/emoji/atom.png)bin912 -> 912 bytes
-rw-r--r--public/-/emojis/1/avocado.png (renamed from app/assets/images/emoji/avocado.png)bin1520 -> 1520 bytes
-rw-r--r--public/-/emojis/1/b.png (renamed from app/assets/images/emoji/b.png)bin391 -> 391 bytes
-rw-r--r--public/-/emojis/1/baby.png (renamed from app/assets/images/emoji/baby.png)bin1380 -> 1380 bytes
-rw-r--r--public/-/emojis/1/baby_bottle.png (renamed from app/assets/images/emoji/baby_bottle.png)bin818 -> 818 bytes
-rw-r--r--public/-/emojis/1/baby_chick.png (renamed from app/assets/images/emoji/baby_chick.png)bin1181 -> 1181 bytes
-rw-r--r--public/-/emojis/1/baby_symbol.png (renamed from app/assets/images/emoji/baby_symbol.png)bin665 -> 665 bytes
-rw-r--r--public/-/emojis/1/baby_tone1.png (renamed from app/assets/images/emoji/baby_tone1.png)bin1392 -> 1392 bytes
-rw-r--r--public/-/emojis/1/baby_tone2.png (renamed from app/assets/images/emoji/baby_tone2.png)bin1392 -> 1392 bytes
-rw-r--r--public/-/emojis/1/baby_tone3.png (renamed from app/assets/images/emoji/baby_tone3.png)bin1403 -> 1403 bytes
-rw-r--r--public/-/emojis/1/baby_tone4.png (renamed from app/assets/images/emoji/baby_tone4.png)bin1413 -> 1413 bytes
-rw-r--r--public/-/emojis/1/baby_tone5.png (renamed from app/assets/images/emoji/baby_tone5.png)bin1405 -> 1405 bytes
-rw-r--r--public/-/emojis/1/back.png (renamed from app/assets/images/emoji/back.png)bin562 -> 562 bytes
-rw-r--r--public/-/emojis/1/bacon.png (renamed from app/assets/images/emoji/bacon.png)bin2148 -> 2148 bytes
-rw-r--r--public/-/emojis/1/badminton.png (renamed from app/assets/images/emoji/badminton.png)bin1253 -> 1253 bytes
-rw-r--r--public/-/emojis/1/baggage_claim.png (renamed from app/assets/images/emoji/baggage_claim.png)bin490 -> 490 bytes
-rw-r--r--public/-/emojis/1/balloon.png (renamed from app/assets/images/emoji/balloon.png)bin501 -> 501 bytes
-rw-r--r--public/-/emojis/1/ballot_box.png (renamed from app/assets/images/emoji/ballot_box.png)bin1355 -> 1355 bytes
-rw-r--r--public/-/emojis/1/ballot_box_with_check.png (renamed from app/assets/images/emoji/ballot_box_with_check.png)bin639 -> 639 bytes
-rw-r--r--public/-/emojis/1/bamboo.png (renamed from app/assets/images/emoji/bamboo.png)bin1946 -> 1946 bytes
-rw-r--r--public/-/emojis/1/banana.png (renamed from app/assets/images/emoji/banana.png)bin1157 -> 1157 bytes
-rw-r--r--public/-/emojis/1/bangbang.png (renamed from app/assets/images/emoji/bangbang.png)bin390 -> 390 bytes
-rw-r--r--public/-/emojis/1/bank.png (renamed from app/assets/images/emoji/bank.png)bin1358 -> 1358 bytes
-rw-r--r--public/-/emojis/1/bar_chart.png (renamed from app/assets/images/emoji/bar_chart.png)bin408 -> 408 bytes
-rw-r--r--public/-/emojis/1/barber.png (renamed from app/assets/images/emoji/barber.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/baseball.png (renamed from app/assets/images/emoji/baseball.png)bin1185 -> 1185 bytes
-rw-r--r--public/-/emojis/1/basketball.png (renamed from app/assets/images/emoji/basketball.png)bin1546 -> 1546 bytes
-rw-r--r--public/-/emojis/1/basketball_player.png (renamed from app/assets/images/emoji/basketball_player.png)bin1491 -> 1491 bytes
-rw-r--r--public/-/emojis/1/basketball_player_tone1.png (renamed from app/assets/images/emoji/basketball_player_tone1.png)bin1492 -> 1492 bytes
-rw-r--r--public/-/emojis/1/basketball_player_tone2.png (renamed from app/assets/images/emoji/basketball_player_tone2.png)bin1493 -> 1493 bytes
-rw-r--r--public/-/emojis/1/basketball_player_tone3.png (renamed from app/assets/images/emoji/basketball_player_tone3.png)bin1492 -> 1492 bytes
-rw-r--r--public/-/emojis/1/basketball_player_tone4.png (renamed from app/assets/images/emoji/basketball_player_tone4.png)bin1491 -> 1491 bytes
-rw-r--r--public/-/emojis/1/basketball_player_tone5.png (renamed from app/assets/images/emoji/basketball_player_tone5.png)bin1474 -> 1474 bytes
-rw-r--r--public/-/emojis/1/bat.png (renamed from app/assets/images/emoji/bat.png)bin1190 -> 1190 bytes
-rw-r--r--public/-/emojis/1/bath.png (renamed from app/assets/images/emoji/bath.png)bin1238 -> 1238 bytes
-rw-r--r--public/-/emojis/1/bath_tone1.png (renamed from app/assets/images/emoji/bath_tone1.png)bin1235 -> 1235 bytes
-rw-r--r--public/-/emojis/1/bath_tone2.png (renamed from app/assets/images/emoji/bath_tone2.png)bin1231 -> 1231 bytes
-rw-r--r--public/-/emojis/1/bath_tone3.png (renamed from app/assets/images/emoji/bath_tone3.png)bin1236 -> 1236 bytes
-rw-r--r--public/-/emojis/1/bath_tone4.png (renamed from app/assets/images/emoji/bath_tone4.png)bin1252 -> 1252 bytes
-rw-r--r--public/-/emojis/1/bath_tone5.png (renamed from app/assets/images/emoji/bath_tone5.png)bin1239 -> 1239 bytes
-rw-r--r--public/-/emojis/1/bathtub.png (renamed from app/assets/images/emoji/bathtub.png)bin767 -> 767 bytes
-rw-r--r--public/-/emojis/1/battery.png (renamed from app/assets/images/emoji/battery.png)bin228 -> 228 bytes
-rw-r--r--public/-/emojis/1/beach.png (renamed from app/assets/images/emoji/beach.png)bin942 -> 942 bytes
-rw-r--r--public/-/emojis/1/beach_umbrella.png (renamed from app/assets/images/emoji/beach_umbrella.png)bin1486 -> 1486 bytes
-rw-r--r--public/-/emojis/1/bear.png (renamed from app/assets/images/emoji/bear.png)bin1023 -> 1023 bytes
-rw-r--r--public/-/emojis/1/bed.png (renamed from app/assets/images/emoji/bed.png)bin1572 -> 1572 bytes
-rw-r--r--public/-/emojis/1/bee.png (renamed from app/assets/images/emoji/bee.png)bin1378 -> 1378 bytes
-rw-r--r--public/-/emojis/1/beer.png (renamed from app/assets/images/emoji/beer.png)bin1338 -> 1338 bytes
-rw-r--r--public/-/emojis/1/beers.png (renamed from app/assets/images/emoji/beers.png)bin2100 -> 2100 bytes
-rw-r--r--public/-/emojis/1/beetle.png (renamed from app/assets/images/emoji/beetle.png)bin1288 -> 1288 bytes
-rw-r--r--public/-/emojis/1/beginner.png (renamed from app/assets/images/emoji/beginner.png)bin545 -> 545 bytes
-rw-r--r--public/-/emojis/1/bell.png (renamed from app/assets/images/emoji/bell.png)bin1496 -> 1496 bytes
-rw-r--r--public/-/emojis/1/bellhop.png (renamed from app/assets/images/emoji/bellhop.png)bin891 -> 891 bytes
-rw-r--r--public/-/emojis/1/bento.png (renamed from app/assets/images/emoji/bento.png)bin1127 -> 1127 bytes
-rw-r--r--public/-/emojis/1/bicyclist.png (renamed from app/assets/images/emoji/bicyclist.png)bin1911 -> 1911 bytes
-rw-r--r--public/-/emojis/1/bicyclist_tone1.png (renamed from app/assets/images/emoji/bicyclist_tone1.png)bin1860 -> 1860 bytes
-rw-r--r--public/-/emojis/1/bicyclist_tone2.png (renamed from app/assets/images/emoji/bicyclist_tone2.png)bin1866 -> 1866 bytes
-rw-r--r--public/-/emojis/1/bicyclist_tone3.png (renamed from app/assets/images/emoji/bicyclist_tone3.png)bin1851 -> 1851 bytes
-rw-r--r--public/-/emojis/1/bicyclist_tone4.png (renamed from app/assets/images/emoji/bicyclist_tone4.png)bin1852 -> 1852 bytes
-rw-r--r--public/-/emojis/1/bicyclist_tone5.png (renamed from app/assets/images/emoji/bicyclist_tone5.png)bin1840 -> 1840 bytes
-rw-r--r--public/-/emojis/1/bike.png (renamed from app/assets/images/emoji/bike.png)bin1505 -> 1505 bytes
-rw-r--r--public/-/emojis/1/bikini.png (renamed from app/assets/images/emoji/bikini.png)bin613 -> 613 bytes
-rw-r--r--public/-/emojis/1/biohazard.png (renamed from app/assets/images/emoji/biohazard.png)bin794 -> 794 bytes
-rw-r--r--public/-/emojis/1/bird.png (renamed from app/assets/images/emoji/bird.png)bin1068 -> 1068 bytes
-rw-r--r--public/-/emojis/1/birthday.png (renamed from app/assets/images/emoji/birthday.png)bin2219 -> 2219 bytes
-rw-r--r--public/-/emojis/1/black_circle.png (renamed from app/assets/images/emoji/black_circle.png)bin374 -> 374 bytes
-rw-r--r--public/-/emojis/1/black_heart.png (renamed from app/assets/images/emoji/black_heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/black_joker.png (renamed from app/assets/images/emoji/black_joker.png)bin1091 -> 1091 bytes
-rw-r--r--public/-/emojis/1/black_large_square.png (renamed from app/assets/images/emoji/black_large_square.png)bin110 -> 110 bytes
-rw-r--r--public/-/emojis/1/black_medium_small_square.png (renamed from app/assets/images/emoji/black_medium_small_square.png)bin110 -> 110 bytes
-rw-r--r--public/-/emojis/1/black_medium_square.png (renamed from app/assets/images/emoji/black_medium_square.png)bin108 -> 108 bytes
-rw-r--r--public/-/emojis/1/black_nib.png (renamed from app/assets/images/emoji/black_nib.png)bin620 -> 620 bytes
-rw-r--r--public/-/emojis/1/black_small_square.png (renamed from app/assets/images/emoji/black_small_square.png)bin108 -> 108 bytes
-rw-r--r--public/-/emojis/1/black_square_button.png (renamed from app/assets/images/emoji/black_square_button.png)bin122 -> 122 bytes
-rw-r--r--public/-/emojis/1/blossom.png (renamed from app/assets/images/emoji/blossom.png)bin867 -> 867 bytes
-rw-r--r--public/-/emojis/1/blowfish.png (renamed from app/assets/images/emoji/blowfish.png)bin1620 -> 1620 bytes
-rw-r--r--public/-/emojis/1/blue_book.png (renamed from app/assets/images/emoji/blue_book.png)bin1347 -> 1347 bytes
-rw-r--r--public/-/emojis/1/blue_car.png (renamed from app/assets/images/emoji/blue_car.png)bin1275 -> 1275 bytes
-rw-r--r--public/-/emojis/1/blue_heart.png (renamed from app/assets/images/emoji/blue_heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/blush.png (renamed from app/assets/images/emoji/blush.png)bin812 -> 812 bytes
-rw-r--r--public/-/emojis/1/boar.png (renamed from app/assets/images/emoji/boar.png)bin1366 -> 1366 bytes
-rw-r--r--public/-/emojis/1/bomb.png (renamed from app/assets/images/emoji/bomb.png)bin702 -> 702 bytes
-rw-r--r--public/-/emojis/1/book.png (renamed from app/assets/images/emoji/book.png)bin1716 -> 1716 bytes
-rw-r--r--public/-/emojis/1/bookmark.png (renamed from app/assets/images/emoji/bookmark.png)bin747 -> 747 bytes
-rw-r--r--public/-/emojis/1/bookmark_tabs.png (renamed from app/assets/images/emoji/bookmark_tabs.png)bin1395 -> 1395 bytes
-rw-r--r--public/-/emojis/1/books.png (renamed from app/assets/images/emoji/books.png)bin2474 -> 2474 bytes
-rw-r--r--public/-/emojis/1/boom.png (renamed from app/assets/images/emoji/boom.png)bin1110 -> 1110 bytes
-rw-r--r--public/-/emojis/1/boot.png (renamed from app/assets/images/emoji/boot.png)bin662 -> 662 bytes
-rw-r--r--public/-/emojis/1/bouquet.png (renamed from app/assets/images/emoji/bouquet.png)bin1662 -> 1662 bytes
-rw-r--r--public/-/emojis/1/bow.png (renamed from app/assets/images/emoji/bow.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bow_and_arrow.png (renamed from app/assets/images/emoji/bow_and_arrow.png)bin1402 -> 1402 bytes
-rw-r--r--public/-/emojis/1/bow_tone1.png (renamed from app/assets/images/emoji/bow_tone1.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bow_tone2.png (renamed from app/assets/images/emoji/bow_tone2.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bow_tone3.png (renamed from app/assets/images/emoji/bow_tone3.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bow_tone4.png (renamed from app/assets/images/emoji/bow_tone4.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bow_tone5.png (renamed from app/assets/images/emoji/bow_tone5.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/bowling.png (renamed from app/assets/images/emoji/bowling.png)bin1426 -> 1426 bytes
-rw-r--r--public/-/emojis/1/boxing_glove.png (renamed from app/assets/images/emoji/boxing_glove.png)bin1575 -> 1575 bytes
-rw-r--r--public/-/emojis/1/boy.png (renamed from app/assets/images/emoji/boy.png)bin881 -> 881 bytes
-rw-r--r--public/-/emojis/1/boy_tone1.png (renamed from app/assets/images/emoji/boy_tone1.png)bin876 -> 876 bytes
-rw-r--r--public/-/emojis/1/boy_tone2.png (renamed from app/assets/images/emoji/boy_tone2.png)bin876 -> 876 bytes
-rw-r--r--public/-/emojis/1/boy_tone3.png (renamed from app/assets/images/emoji/boy_tone3.png)bin876 -> 876 bytes
-rw-r--r--public/-/emojis/1/boy_tone4.png (renamed from app/assets/images/emoji/boy_tone4.png)bin870 -> 870 bytes
-rw-r--r--public/-/emojis/1/boy_tone5.png (renamed from app/assets/images/emoji/boy_tone5.png)bin873 -> 873 bytes
-rw-r--r--public/-/emojis/1/bread.png (renamed from app/assets/images/emoji/bread.png)bin1419 -> 1419 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil.png (renamed from app/assets/images/emoji/bride_with_veil.png)bin2452 -> 2452 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil_tone1.png (renamed from app/assets/images/emoji/bride_with_veil_tone1.png)bin2464 -> 2464 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil_tone2.png (renamed from app/assets/images/emoji/bride_with_veil_tone2.png)bin2457 -> 2457 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil_tone3.png (renamed from app/assets/images/emoji/bride_with_veil_tone3.png)bin2463 -> 2463 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil_tone4.png (renamed from app/assets/images/emoji/bride_with_veil_tone4.png)bin2463 -> 2463 bytes
-rw-r--r--public/-/emojis/1/bride_with_veil_tone5.png (renamed from app/assets/images/emoji/bride_with_veil_tone5.png)bin2462 -> 2462 bytes
-rw-r--r--public/-/emojis/1/bridge_at_night.png (renamed from app/assets/images/emoji/bridge_at_night.png)bin637 -> 637 bytes
-rw-r--r--public/-/emojis/1/briefcase.png (renamed from app/assets/images/emoji/briefcase.png)bin1275 -> 1275 bytes
-rw-r--r--public/-/emojis/1/broken_heart.png (renamed from app/assets/images/emoji/broken_heart.png)bin556 -> 556 bytes
-rw-r--r--public/-/emojis/1/bug.png (renamed from app/assets/images/emoji/bug.png)bin1599 -> 1599 bytes
-rw-r--r--public/-/emojis/1/bulb.png (renamed from app/assets/images/emoji/bulb.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/bullettrain_front.png (renamed from app/assets/images/emoji/bullettrain_front.png)bin1450 -> 1450 bytes
-rw-r--r--public/-/emojis/1/bullettrain_side.png (renamed from app/assets/images/emoji/bullettrain_side.png)bin1538 -> 1538 bytes
-rw-r--r--public/-/emojis/1/burrito.png (renamed from app/assets/images/emoji/burrito.png)bin2938 -> 2938 bytes
-rw-r--r--public/-/emojis/1/bus.png (renamed from app/assets/images/emoji/bus.png)bin1086 -> 1086 bytes
-rw-r--r--public/-/emojis/1/busstop.png (renamed from app/assets/images/emoji/busstop.png)bin626 -> 626 bytes
-rw-r--r--public/-/emojis/1/bust_in_silhouette.png (renamed from app/assets/images/emoji/bust_in_silhouette.png)bin426 -> 426 bytes
-rw-r--r--public/-/emojis/1/busts_in_silhouette.png (renamed from app/assets/images/emoji/busts_in_silhouette.png)bin526 -> 526 bytes
-rw-r--r--public/-/emojis/1/butterfly.png (renamed from app/assets/images/emoji/butterfly.png)bin1981 -> 1981 bytes
-rw-r--r--public/-/emojis/1/cactus.png (renamed from app/assets/images/emoji/cactus.png)bin628 -> 628 bytes
-rw-r--r--public/-/emojis/1/cake.png (renamed from app/assets/images/emoji/cake.png)bin2266 -> 2266 bytes
-rw-r--r--public/-/emojis/1/calendar.png (renamed from app/assets/images/emoji/calendar.png)bin2077 -> 2077 bytes
-rw-r--r--public/-/emojis/1/calendar_spiral.png (renamed from app/assets/images/emoji/calendar_spiral.png)bin1491 -> 1491 bytes
-rw-r--r--public/-/emojis/1/call_me.png (renamed from app/assets/images/emoji/call_me.png)bin894 -> 894 bytes
-rw-r--r--public/-/emojis/1/call_me_tone1.png (renamed from app/assets/images/emoji/call_me_tone1.png)bin893 -> 893 bytes
-rw-r--r--public/-/emojis/1/call_me_tone2.png (renamed from app/assets/images/emoji/call_me_tone2.png)bin891 -> 891 bytes
-rw-r--r--public/-/emojis/1/call_me_tone3.png (renamed from app/assets/images/emoji/call_me_tone3.png)bin891 -> 891 bytes
-rw-r--r--public/-/emojis/1/call_me_tone4.png (renamed from app/assets/images/emoji/call_me_tone4.png)bin891 -> 891 bytes
-rw-r--r--public/-/emojis/1/call_me_tone5.png (renamed from app/assets/images/emoji/call_me_tone5.png)bin893 -> 893 bytes
-rw-r--r--public/-/emojis/1/calling.png (renamed from app/assets/images/emoji/calling.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/camel.png (renamed from app/assets/images/emoji/camel.png)bin1190 -> 1190 bytes
-rw-r--r--public/-/emojis/1/camera.png (renamed from app/assets/images/emoji/camera.png)bin1783 -> 1783 bytes
-rw-r--r--public/-/emojis/1/camera_with_flash.png (renamed from app/assets/images/emoji/camera_with_flash.png)bin2097 -> 2097 bytes
-rw-r--r--public/-/emojis/1/camping.png (renamed from app/assets/images/emoji/camping.png)bin1513 -> 1513 bytes
-rw-r--r--public/-/emojis/1/cancer.png (renamed from app/assets/images/emoji/cancer.png)bin729 -> 729 bytes
-rw-r--r--public/-/emojis/1/candle.png (renamed from app/assets/images/emoji/candle.png)bin1250 -> 1250 bytes
-rw-r--r--public/-/emojis/1/candy.png (renamed from app/assets/images/emoji/candy.png)bin1054 -> 1054 bytes
-rw-r--r--public/-/emojis/1/canoe.png (renamed from app/assets/images/emoji/canoe.png)bin1244 -> 1244 bytes
-rw-r--r--public/-/emojis/1/capital_abcd.png (renamed from app/assets/images/emoji/capital_abcd.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/capricorn.png (renamed from app/assets/images/emoji/capricorn.png)bin688 -> 688 bytes
-rw-r--r--public/-/emojis/1/card_box.png (renamed from app/assets/images/emoji/card_box.png)bin1523 -> 1523 bytes
-rw-r--r--public/-/emojis/1/card_index.png (renamed from app/assets/images/emoji/card_index.png)bin1929 -> 1929 bytes
-rw-r--r--public/-/emojis/1/carousel_horse.png (renamed from app/assets/images/emoji/carousel_horse.png)bin1739 -> 1739 bytes
-rw-r--r--public/-/emojis/1/carrot.png (renamed from app/assets/images/emoji/carrot.png)bin1236 -> 1236 bytes
-rw-r--r--public/-/emojis/1/cartwheel.png (renamed from app/assets/images/emoji/cartwheel.png)bin1233 -> 1233 bytes
-rw-r--r--public/-/emojis/1/cartwheel_tone1.png (renamed from app/assets/images/emoji/cartwheel_tone1.png)bin1234 -> 1234 bytes
-rw-r--r--public/-/emojis/1/cartwheel_tone2.png (renamed from app/assets/images/emoji/cartwheel_tone2.png)bin1235 -> 1235 bytes
-rw-r--r--public/-/emojis/1/cartwheel_tone3.png (renamed from app/assets/images/emoji/cartwheel_tone3.png)bin1229 -> 1229 bytes
-rw-r--r--public/-/emojis/1/cartwheel_tone4.png (renamed from app/assets/images/emoji/cartwheel_tone4.png)bin1227 -> 1227 bytes
-rw-r--r--public/-/emojis/1/cartwheel_tone5.png (renamed from app/assets/images/emoji/cartwheel_tone5.png)bin1214 -> 1214 bytes
-rw-r--r--public/-/emojis/1/cat.png (renamed from app/assets/images/emoji/cat.png)bin1354 -> 1354 bytes
-rw-r--r--public/-/emojis/1/cat2.png (renamed from app/assets/images/emoji/cat2.png)bin1781 -> 1781 bytes
-rw-r--r--public/-/emojis/1/cd.png (renamed from app/assets/images/emoji/cd.png)bin908 -> 908 bytes
-rw-r--r--public/-/emojis/1/chains.png (renamed from app/assets/images/emoji/chains.png)bin708 -> 708 bytes
-rw-r--r--public/-/emojis/1/champagne.png (renamed from app/assets/images/emoji/champagne.png)bin1205 -> 1205 bytes
-rw-r--r--public/-/emojis/1/champagne_glass.png (renamed from app/assets/images/emoji/champagne_glass.png)bin1984 -> 1984 bytes
-rw-r--r--public/-/emojis/1/chart.png (renamed from app/assets/images/emoji/chart.png)bin724 -> 724 bytes
-rw-r--r--public/-/emojis/1/chart_with_downwards_trend.png (renamed from app/assets/images/emoji/chart_with_downwards_trend.png)bin709 -> 709 bytes
-rw-r--r--public/-/emojis/1/chart_with_upwards_trend.png (renamed from app/assets/images/emoji/chart_with_upwards_trend.png)bin688 -> 688 bytes
-rw-r--r--public/-/emojis/1/checkered_flag.png (renamed from app/assets/images/emoji/checkered_flag.png)bin787 -> 787 bytes
-rw-r--r--public/-/emojis/1/cheese.png (renamed from app/assets/images/emoji/cheese.png)bin1697 -> 1697 bytes
-rw-r--r--public/-/emojis/1/cherries.png (renamed from app/assets/images/emoji/cherries.png)bin1211 -> 1211 bytes
-rw-r--r--public/-/emojis/1/cherry_blossom.png (renamed from app/assets/images/emoji/cherry_blossom.png)bin1129 -> 1129 bytes
-rw-r--r--public/-/emojis/1/chestnut.png (renamed from app/assets/images/emoji/chestnut.png)bin1337 -> 1337 bytes
-rw-r--r--public/-/emojis/1/chicken.png (renamed from app/assets/images/emoji/chicken.png)bin1267 -> 1267 bytes
-rw-r--r--public/-/emojis/1/children_crossing.png (renamed from app/assets/images/emoji/children_crossing.png)bin778 -> 778 bytes
-rw-r--r--public/-/emojis/1/chipmunk.png (renamed from app/assets/images/emoji/chipmunk.png)bin1454 -> 1454 bytes
-rw-r--r--public/-/emojis/1/chocolate_bar.png (renamed from app/assets/images/emoji/chocolate_bar.png)bin771 -> 771 bytes
-rw-r--r--public/-/emojis/1/christmas_tree.png (renamed from app/assets/images/emoji/christmas_tree.png)bin1542 -> 1542 bytes
-rw-r--r--public/-/emojis/1/church.png (renamed from app/assets/images/emoji/church.png)bin1298 -> 1298 bytes
-rw-r--r--public/-/emojis/1/cinema.png (renamed from app/assets/images/emoji/cinema.png)bin585 -> 585 bytes
-rw-r--r--public/-/emojis/1/circus_tent.png (renamed from app/assets/images/emoji/circus_tent.png)bin1369 -> 1369 bytes
-rw-r--r--public/-/emojis/1/city_dusk.png (renamed from app/assets/images/emoji/city_dusk.png)bin431 -> 431 bytes
-rw-r--r--public/-/emojis/1/city_sunset.png (renamed from app/assets/images/emoji/city_sunset.png)bin997 -> 997 bytes
-rw-r--r--public/-/emojis/1/cityscape.png (renamed from app/assets/images/emoji/cityscape.png)bin599 -> 599 bytes
-rw-r--r--public/-/emojis/1/cl.png (renamed from app/assets/images/emoji/cl.png)bin393 -> 393 bytes
-rw-r--r--public/-/emojis/1/clap.png (renamed from app/assets/images/emoji/clap.png)bin1456 -> 1456 bytes
-rw-r--r--public/-/emojis/1/clap_tone1.png (renamed from app/assets/images/emoji/clap_tone1.png)bin1458 -> 1458 bytes
-rw-r--r--public/-/emojis/1/clap_tone2.png (renamed from app/assets/images/emoji/clap_tone2.png)bin1458 -> 1458 bytes
-rw-r--r--public/-/emojis/1/clap_tone3.png (renamed from app/assets/images/emoji/clap_tone3.png)bin1458 -> 1458 bytes
-rw-r--r--public/-/emojis/1/clap_tone4.png (renamed from app/assets/images/emoji/clap_tone4.png)bin1458 -> 1458 bytes
-rw-r--r--public/-/emojis/1/clap_tone5.png (renamed from app/assets/images/emoji/clap_tone5.png)bin1444 -> 1444 bytes
-rw-r--r--public/-/emojis/1/clapper.png (renamed from app/assets/images/emoji/clapper.png)bin1535 -> 1535 bytes
-rw-r--r--public/-/emojis/1/classical_building.png (renamed from app/assets/images/emoji/classical_building.png)bin1006 -> 1006 bytes
-rw-r--r--public/-/emojis/1/clipboard.png (renamed from app/assets/images/emoji/clipboard.png)bin1345 -> 1345 bytes
-rw-r--r--public/-/emojis/1/clock.png (renamed from app/assets/images/emoji/clock.png)bin592 -> 592 bytes
-rw-r--r--public/-/emojis/1/clock1.png (renamed from app/assets/images/emoji/clock1.png)bin586 -> 586 bytes
-rw-r--r--public/-/emojis/1/clock10.png (renamed from app/assets/images/emoji/clock10.png)bin593 -> 593 bytes
-rw-r--r--public/-/emojis/1/clock1030.png (renamed from app/assets/images/emoji/clock1030.png)bin530 -> 530 bytes
-rw-r--r--public/-/emojis/1/clock11.png (renamed from app/assets/images/emoji/clock11.png)bin590 -> 590 bytes
-rw-r--r--public/-/emojis/1/clock1130.png (renamed from app/assets/images/emoji/clock1130.png)bin583 -> 583 bytes
-rw-r--r--public/-/emojis/1/clock12.png (renamed from app/assets/images/emoji/clock12.png)bin480 -> 480 bytes
-rw-r--r--public/-/emojis/1/clock1230.png (renamed from app/assets/images/emoji/clock1230.png)bin579 -> 579 bytes
-rw-r--r--public/-/emojis/1/clock130.png (renamed from app/assets/images/emoji/clock130.png)bin526 -> 526 bytes
-rw-r--r--public/-/emojis/1/clock2.png (renamed from app/assets/images/emoji/clock2.png)bin591 -> 591 bytes
-rw-r--r--public/-/emojis/1/clock230.png (renamed from app/assets/images/emoji/clock230.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/clock3.png (renamed from app/assets/images/emoji/clock3.png)bin482 -> 482 bytes
-rw-r--r--public/-/emojis/1/clock330.png (renamed from app/assets/images/emoji/clock330.png)bin568 -> 568 bytes
-rw-r--r--public/-/emojis/1/clock4.png (renamed from app/assets/images/emoji/clock4.png)bin592 -> 592 bytes
-rw-r--r--public/-/emojis/1/clock430.png (renamed from app/assets/images/emoji/clock430.png)bin531 -> 531 bytes
-rw-r--r--public/-/emojis/1/clock5.png (renamed from app/assets/images/emoji/clock5.png)bin585 -> 585 bytes
-rw-r--r--public/-/emojis/1/clock530.png (renamed from app/assets/images/emoji/clock530.png)bin552 -> 552 bytes
-rw-r--r--public/-/emojis/1/clock6.png (renamed from app/assets/images/emoji/clock6.png)bin466 -> 466 bytes
-rw-r--r--public/-/emojis/1/clock630.png (renamed from app/assets/images/emoji/clock630.png)bin536 -> 536 bytes
-rw-r--r--public/-/emojis/1/clock7.png (renamed from app/assets/images/emoji/clock7.png)bin581 -> 581 bytes
-rw-r--r--public/-/emojis/1/clock730.png (renamed from app/assets/images/emoji/clock730.png)bin531 -> 531 bytes
-rw-r--r--public/-/emojis/1/clock8.png (renamed from app/assets/images/emoji/clock8.png)bin590 -> 590 bytes
-rw-r--r--public/-/emojis/1/clock830.png (renamed from app/assets/images/emoji/clock830.png)bin570 -> 570 bytes
-rw-r--r--public/-/emojis/1/clock9.png (renamed from app/assets/images/emoji/clock9.png)bin484 -> 484 bytes
-rw-r--r--public/-/emojis/1/clock930.png (renamed from app/assets/images/emoji/clock930.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/closed_book.png (renamed from app/assets/images/emoji/closed_book.png)bin1359 -> 1359 bytes
-rw-r--r--public/-/emojis/1/closed_lock_with_key.png (renamed from app/assets/images/emoji/closed_lock_with_key.png)bin1250 -> 1250 bytes
-rw-r--r--public/-/emojis/1/closed_umbrella.png (renamed from app/assets/images/emoji/closed_umbrella.png)bin1002 -> 1002 bytes
-rw-r--r--public/-/emojis/1/cloud.png (renamed from app/assets/images/emoji/cloud.png)bin626 -> 626 bytes
-rw-r--r--public/-/emojis/1/cloud_lightning.png (renamed from app/assets/images/emoji/cloud_lightning.png)bin767 -> 767 bytes
-rw-r--r--public/-/emojis/1/cloud_rain.png (renamed from app/assets/images/emoji/cloud_rain.png)bin876 -> 876 bytes
-rw-r--r--public/-/emojis/1/cloud_snow.png (renamed from app/assets/images/emoji/cloud_snow.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/cloud_tornado.png (renamed from app/assets/images/emoji/cloud_tornado.png)bin1519 -> 1519 bytes
-rw-r--r--public/-/emojis/1/clown.png (renamed from app/assets/images/emoji/clown.png)bin1818 -> 1818 bytes
-rw-r--r--public/-/emojis/1/clubs.png (renamed from app/assets/images/emoji/clubs.png)bin458 -> 458 bytes
-rw-r--r--public/-/emojis/1/cocktail.png (renamed from app/assets/images/emoji/cocktail.png)bin1027 -> 1027 bytes
-rw-r--r--public/-/emojis/1/coffee.png (renamed from app/assets/images/emoji/coffee.png)bin1679 -> 1679 bytes
-rw-r--r--public/-/emojis/1/coffin.png (renamed from app/assets/images/emoji/coffin.png)bin2195 -> 2195 bytes
-rw-r--r--public/-/emojis/1/cold_sweat.png (renamed from app/assets/images/emoji/cold_sweat.png)bin971 -> 971 bytes
-rw-r--r--public/-/emojis/1/comet.png (renamed from app/assets/images/emoji/comet.png)bin1819 -> 1819 bytes
-rw-r--r--public/-/emojis/1/compression.png (renamed from app/assets/images/emoji/compression.png)bin1612 -> 1612 bytes
-rw-r--r--public/-/emojis/1/computer.png (renamed from app/assets/images/emoji/computer.png)bin369 -> 369 bytes
-rw-r--r--public/-/emojis/1/confetti_ball.png (renamed from app/assets/images/emoji/confetti_ball.png)bin1703 -> 1703 bytes
-rw-r--r--public/-/emojis/1/confounded.png (renamed from app/assets/images/emoji/confounded.png)bin844 -> 844 bytes
-rw-r--r--public/-/emojis/1/confused.png (renamed from app/assets/images/emoji/confused.png)bin647 -> 647 bytes
-rw-r--r--public/-/emojis/1/congratulations.png (renamed from app/assets/images/emoji/congratulations.png)bin729 -> 729 bytes
-rw-r--r--public/-/emojis/1/construction.png (renamed from app/assets/images/emoji/construction.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/construction_site.png (renamed from app/assets/images/emoji/construction_site.png)bin668 -> 668 bytes
-rw-r--r--public/-/emojis/1/construction_worker.png (renamed from app/assets/images/emoji/construction_worker.png)bin1126 -> 1126 bytes
-rw-r--r--public/-/emojis/1/construction_worker_tone1.png (renamed from app/assets/images/emoji/construction_worker_tone1.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/construction_worker_tone2.png (renamed from app/assets/images/emoji/construction_worker_tone2.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/construction_worker_tone3.png (renamed from app/assets/images/emoji/construction_worker_tone3.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/construction_worker_tone4.png (renamed from app/assets/images/emoji/construction_worker_tone4.png)bin1095 -> 1095 bytes
-rw-r--r--public/-/emojis/1/construction_worker_tone5.png (renamed from app/assets/images/emoji/construction_worker_tone5.png)bin1119 -> 1119 bytes
-rw-r--r--public/-/emojis/1/control_knobs.png (renamed from app/assets/images/emoji/control_knobs.png)bin1104 -> 1104 bytes
-rw-r--r--public/-/emojis/1/convenience_store.png (renamed from app/assets/images/emoji/convenience_store.png)bin528 -> 528 bytes
-rw-r--r--public/-/emojis/1/cookie.png (renamed from app/assets/images/emoji/cookie.png)bin1351 -> 1351 bytes
-rw-r--r--public/-/emojis/1/cooking.png (renamed from app/assets/images/emoji/cooking.png)bin764 -> 764 bytes
-rw-r--r--public/-/emojis/1/cool.png (renamed from app/assets/images/emoji/cool.png)bin396 -> 396 bytes
-rw-r--r--public/-/emojis/1/cop.png (renamed from app/assets/images/emoji/cop.png)bin1440 -> 1440 bytes
-rw-r--r--public/-/emojis/1/cop_tone1.png (renamed from app/assets/images/emoji/cop_tone1.png)bin1421 -> 1421 bytes
-rw-r--r--public/-/emojis/1/cop_tone2.png (renamed from app/assets/images/emoji/cop_tone2.png)bin1424 -> 1424 bytes
-rw-r--r--public/-/emojis/1/cop_tone3.png (renamed from app/assets/images/emoji/cop_tone3.png)bin1419 -> 1419 bytes
-rw-r--r--public/-/emojis/1/cop_tone4.png (renamed from app/assets/images/emoji/cop_tone4.png)bin1417 -> 1417 bytes
-rw-r--r--public/-/emojis/1/cop_tone5.png (renamed from app/assets/images/emoji/cop_tone5.png)bin1433 -> 1433 bytes
-rw-r--r--public/-/emojis/1/copyright.png (renamed from app/assets/images/emoji/copyright.png)bin530 -> 530 bytes
-rw-r--r--public/-/emojis/1/corn.png (renamed from app/assets/images/emoji/corn.png)bin1547 -> 1547 bytes
-rw-r--r--public/-/emojis/1/couch.png (renamed from app/assets/images/emoji/couch.png)bin1362 -> 1362 bytes
-rw-r--r--public/-/emojis/1/couple.png (renamed from app/assets/images/emoji/couple.png)bin1537 -> 1537 bytes
-rw-r--r--public/-/emojis/1/couple_mm.png (renamed from app/assets/images/emoji/couple_mm.png)bin1091 -> 1091 bytes
-rw-r--r--public/-/emojis/1/couple_with_heart.png (renamed from app/assets/images/emoji/couple_with_heart.png)bin1285 -> 1285 bytes
-rw-r--r--public/-/emojis/1/couple_ww.png (renamed from app/assets/images/emoji/couple_ww.png)bin1034 -> 1034 bytes
-rw-r--r--public/-/emojis/1/couplekiss.png (renamed from app/assets/images/emoji/couplekiss.png)bin1380 -> 1380 bytes
-rw-r--r--public/-/emojis/1/cow.png (renamed from app/assets/images/emoji/cow.png)bin1640 -> 1640 bytes
-rw-r--r--public/-/emojis/1/cow2.png (renamed from app/assets/images/emoji/cow2.png)bin1810 -> 1810 bytes
-rw-r--r--public/-/emojis/1/cowboy.png (renamed from app/assets/images/emoji/cowboy.png)bin1353 -> 1353 bytes
-rw-r--r--public/-/emojis/1/crab.png (renamed from app/assets/images/emoji/crab.png)bin1475 -> 1475 bytes
-rw-r--r--public/-/emojis/1/crayon.png (renamed from app/assets/images/emoji/crayon.png)bin633 -> 633 bytes
-rw-r--r--public/-/emojis/1/credit_card.png (renamed from app/assets/images/emoji/credit_card.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/crescent_moon.png (renamed from app/assets/images/emoji/crescent_moon.png)bin446 -> 446 bytes
-rw-r--r--public/-/emojis/1/cricket.png (renamed from app/assets/images/emoji/cricket.png)bin1060 -> 1060 bytes
-rw-r--r--public/-/emojis/1/crocodile.png (renamed from app/assets/images/emoji/crocodile.png)bin2408 -> 2408 bytes
-rw-r--r--public/-/emojis/1/croissant.png (renamed from app/assets/images/emoji/croissant.png)bin1313 -> 1313 bytes
-rw-r--r--public/-/emojis/1/cross.png (renamed from app/assets/images/emoji/cross.png)bin408 -> 408 bytes
-rw-r--r--public/-/emojis/1/crossed_flags.png (renamed from app/assets/images/emoji/crossed_flags.png)bin1239 -> 1239 bytes
-rw-r--r--public/-/emojis/1/crossed_swords.png (renamed from app/assets/images/emoji/crossed_swords.png)bin1591 -> 1591 bytes
-rw-r--r--public/-/emojis/1/crown.png (renamed from app/assets/images/emoji/crown.png)bin1534 -> 1534 bytes
-rw-r--r--public/-/emojis/1/cruise_ship.png (renamed from app/assets/images/emoji/cruise_ship.png)bin2272 -> 2272 bytes
-rw-r--r--public/-/emojis/1/cry.png (renamed from app/assets/images/emoji/cry.png)bin1123 -> 1123 bytes
-rw-r--r--public/-/emojis/1/crying_cat_face.png (renamed from app/assets/images/emoji/crying_cat_face.png)bin1875 -> 1875 bytes
-rw-r--r--public/-/emojis/1/crystal_ball.png (renamed from app/assets/images/emoji/crystal_ball.png)bin1913 -> 1913 bytes
-rw-r--r--public/-/emojis/1/cucumber.png (renamed from app/assets/images/emoji/cucumber.png)bin1357 -> 1357 bytes
-rw-r--r--public/-/emojis/1/cupid.png (renamed from app/assets/images/emoji/cupid.png)bin846 -> 846 bytes
-rw-r--r--public/-/emojis/1/curly_loop.png (renamed from app/assets/images/emoji/curly_loop.png)bin545 -> 545 bytes
-rw-r--r--public/-/emojis/1/currency_exchange.png (renamed from app/assets/images/emoji/currency_exchange.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/curry.png (renamed from app/assets/images/emoji/curry.png)bin1754 -> 1754 bytes
-rw-r--r--public/-/emojis/1/custard.png (renamed from app/assets/images/emoji/custard.png)bin1273 -> 1273 bytes
-rw-r--r--public/-/emojis/1/customs.png (renamed from app/assets/images/emoji/customs.png)bin648 -> 648 bytes
-rw-r--r--public/-/emojis/1/cyclone.png (renamed from app/assets/images/emoji/cyclone.png)bin797 -> 797 bytes
-rw-r--r--public/-/emojis/1/dagger.png (renamed from app/assets/images/emoji/dagger.png)bin916 -> 916 bytes
-rw-r--r--public/-/emojis/1/dancer.png (renamed from app/assets/images/emoji/dancer.png)bin1405 -> 1405 bytes
-rw-r--r--public/-/emojis/1/dancer_tone1.png (renamed from app/assets/images/emoji/dancer_tone1.png)bin1420 -> 1420 bytes
-rw-r--r--public/-/emojis/1/dancer_tone2.png (renamed from app/assets/images/emoji/dancer_tone2.png)bin1423 -> 1423 bytes
-rw-r--r--public/-/emojis/1/dancer_tone3.png (renamed from app/assets/images/emoji/dancer_tone3.png)bin1429 -> 1429 bytes
-rw-r--r--public/-/emojis/1/dancer_tone4.png (renamed from app/assets/images/emoji/dancer_tone4.png)bin1428 -> 1428 bytes
-rw-r--r--public/-/emojis/1/dancer_tone5.png (renamed from app/assets/images/emoji/dancer_tone5.png)bin1418 -> 1418 bytes
-rw-r--r--public/-/emojis/1/dancers.png (renamed from app/assets/images/emoji/dancers.png)bin1872 -> 1872 bytes
-rw-r--r--public/-/emojis/1/dango.png (renamed from app/assets/images/emoji/dango.png)bin802 -> 802 bytes
-rw-r--r--public/-/emojis/1/dark_sunglasses.png (renamed from app/assets/images/emoji/dark_sunglasses.png)bin829 -> 829 bytes
-rw-r--r--public/-/emojis/1/dart.png (renamed from app/assets/images/emoji/dart.png)bin1374 -> 1374 bytes
-rw-r--r--public/-/emojis/1/dash.png (renamed from app/assets/images/emoji/dash.png)bin840 -> 840 bytes
-rw-r--r--public/-/emojis/1/date.png (renamed from app/assets/images/emoji/date.png)bin788 -> 788 bytes
-rw-r--r--public/-/emojis/1/deciduous_tree.png (renamed from app/assets/images/emoji/deciduous_tree.png)bin1267 -> 1267 bytes
-rw-r--r--public/-/emojis/1/deer.png (renamed from app/assets/images/emoji/deer.png)bin1606 -> 1606 bytes
-rw-r--r--public/-/emojis/1/department_store.png (renamed from app/assets/images/emoji/department_store.png)bin673 -> 673 bytes
-rw-r--r--public/-/emojis/1/desert.png (renamed from app/assets/images/emoji/desert.png)bin1443 -> 1443 bytes
-rw-r--r--public/-/emojis/1/desktop.png (renamed from app/assets/images/emoji/desktop.png)bin311 -> 311 bytes
-rw-r--r--public/-/emojis/1/diamond_shape_with_a_dot_inside.png (renamed from app/assets/images/emoji/diamond_shape_with_a_dot_inside.png)bin693 -> 693 bytes
-rw-r--r--public/-/emojis/1/diamonds.png (renamed from app/assets/images/emoji/diamonds.png)bin247 -> 247 bytes
-rw-r--r--public/-/emojis/1/disappointed.png (renamed from app/assets/images/emoji/disappointed.png)bin757 -> 757 bytes
-rw-r--r--public/-/emojis/1/disappointed_relieved.png (renamed from app/assets/images/emoji/disappointed_relieved.png)bin835 -> 835 bytes
-rw-r--r--public/-/emojis/1/dividers.png (renamed from app/assets/images/emoji/dividers.png)bin810 -> 810 bytes
-rw-r--r--public/-/emojis/1/dizzy.png (renamed from app/assets/images/emoji/dizzy.png)bin795 -> 795 bytes
-rw-r--r--public/-/emojis/1/dizzy_face.png (renamed from app/assets/images/emoji/dizzy_face.png)bin710 -> 710 bytes
-rw-r--r--public/-/emojis/1/do_not_litter.png (renamed from app/assets/images/emoji/do_not_litter.png)bin1010 -> 1010 bytes
-rw-r--r--public/-/emojis/1/dog.png (renamed from app/assets/images/emoji/dog.png)bin1674 -> 1674 bytes
-rw-r--r--public/-/emojis/1/dog2.png (renamed from app/assets/images/emoji/dog2.png)bin2085 -> 2085 bytes
-rw-r--r--public/-/emojis/1/dollar.png (renamed from app/assets/images/emoji/dollar.png)bin405 -> 405 bytes
-rw-r--r--public/-/emojis/1/dolls.png (renamed from app/assets/images/emoji/dolls.png)bin2249 -> 2249 bytes
-rw-r--r--public/-/emojis/1/dolphin.png (renamed from app/assets/images/emoji/dolphin.png)bin1697 -> 1697 bytes
-rw-r--r--public/-/emojis/1/door.png (renamed from app/assets/images/emoji/door.png)bin1105 -> 1105 bytes
-rw-r--r--public/-/emojis/1/doughnut.png (renamed from app/assets/images/emoji/doughnut.png)bin1322 -> 1322 bytes
-rw-r--r--public/-/emojis/1/dove.png (renamed from app/assets/images/emoji/dove.png)bin967 -> 967 bytes
-rw-r--r--public/-/emojis/1/dragon.png (renamed from app/assets/images/emoji/dragon.png)bin1574 -> 1574 bytes
-rw-r--r--public/-/emojis/1/dragon_face.png (renamed from app/assets/images/emoji/dragon_face.png)bin1769 -> 1769 bytes
-rw-r--r--public/-/emojis/1/dress.png (renamed from app/assets/images/emoji/dress.png)bin1001 -> 1001 bytes
-rw-r--r--public/-/emojis/1/dromedary_camel.png (renamed from app/assets/images/emoji/dromedary_camel.png)bin1515 -> 1515 bytes
-rw-r--r--public/-/emojis/1/drooling_face.png (renamed from app/assets/images/emoji/drooling_face.png)bin1049 -> 1049 bytes
-rw-r--r--public/-/emojis/1/droplet.png (renamed from app/assets/images/emoji/droplet.png)bin411 -> 411 bytes
-rw-r--r--public/-/emojis/1/drum.png (renamed from app/assets/images/emoji/drum.png)bin1870 -> 1870 bytes
-rw-r--r--public/-/emojis/1/duck.png (renamed from app/assets/images/emoji/duck.png)bin1729 -> 1729 bytes
-rw-r--r--public/-/emojis/1/dvd.png (renamed from app/assets/images/emoji/dvd.png)bin933 -> 933 bytes
-rw-r--r--public/-/emojis/1/e-mail.png (renamed from app/assets/images/emoji/e-mail.png)bin1196 -> 1196 bytes
-rw-r--r--public/-/emojis/1/eagle.png (renamed from app/assets/images/emoji/eagle.png)bin2222 -> 2222 bytes
-rw-r--r--public/-/emojis/1/ear.png (renamed from app/assets/images/emoji/ear.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/ear_of_rice.png (renamed from app/assets/images/emoji/ear_of_rice.png)bin1422 -> 1422 bytes
-rw-r--r--public/-/emojis/1/ear_tone1.png (renamed from app/assets/images/emoji/ear_tone1.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/ear_tone2.png (renamed from app/assets/images/emoji/ear_tone2.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/ear_tone3.png (renamed from app/assets/images/emoji/ear_tone3.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/ear_tone4.png (renamed from app/assets/images/emoji/ear_tone4.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/ear_tone5.png (renamed from app/assets/images/emoji/ear_tone5.png)bin860 -> 860 bytes
-rw-r--r--public/-/emojis/1/earth_africa.png (renamed from app/assets/images/emoji/earth_africa.png)bin978 -> 978 bytes
-rw-r--r--public/-/emojis/1/earth_americas.png (renamed from app/assets/images/emoji/earth_americas.png)bin1031 -> 1031 bytes
-rw-r--r--public/-/emojis/1/earth_asia.png (renamed from app/assets/images/emoji/earth_asia.png)bin966 -> 966 bytes
-rw-r--r--public/-/emojis/1/egg.png (renamed from app/assets/images/emoji/egg.png)bin710 -> 710 bytes
-rw-r--r--public/-/emojis/1/eggplant.png (renamed from app/assets/images/emoji/eggplant.png)bin773 -> 773 bytes
-rw-r--r--public/-/emojis/1/eight.png (renamed from app/assets/images/emoji/eight.png)bin608 -> 608 bytes
-rw-r--r--public/-/emojis/1/eight_pointed_black_star.png (renamed from app/assets/images/emoji/eight_pointed_black_star.png)bin493 -> 493 bytes
-rw-r--r--public/-/emojis/1/eight_spoked_asterisk.png (renamed from app/assets/images/emoji/eight_spoked_asterisk.png)bin493 -> 493 bytes
-rw-r--r--public/-/emojis/1/eject.png (renamed from app/assets/images/emoji/eject.png)bin548 -> 548 bytes
-rw-r--r--public/-/emojis/1/electric_plug.png (renamed from app/assets/images/emoji/electric_plug.png)bin548 -> 548 bytes
-rw-r--r--public/-/emojis/1/elephant.png (renamed from app/assets/images/emoji/elephant.png)bin1293 -> 1293 bytes
-rw-r--r--public/-/emojis/1/emojis.json10760
-rw-r--r--public/-/emojis/1/end.png (renamed from app/assets/images/emoji/end.png)bin393 -> 393 bytes
-rw-r--r--public/-/emojis/1/envelope.png (renamed from app/assets/images/emoji/envelope.png)bin916 -> 916 bytes
-rw-r--r--public/-/emojis/1/envelope_with_arrow.png (renamed from app/assets/images/emoji/envelope_with_arrow.png)bin1062 -> 1062 bytes
-rw-r--r--public/-/emojis/1/euro.png (renamed from app/assets/images/emoji/euro.png)bin460 -> 460 bytes
-rw-r--r--public/-/emojis/1/european_castle.png (renamed from app/assets/images/emoji/european_castle.png)bin965 -> 965 bytes
-rw-r--r--public/-/emojis/1/european_post_office.png (renamed from app/assets/images/emoji/european_post_office.png)bin551 -> 551 bytes
-rw-r--r--public/-/emojis/1/evergreen_tree.png (renamed from app/assets/images/emoji/evergreen_tree.png)bin719 -> 719 bytes
-rw-r--r--public/-/emojis/1/exclamation.png (renamed from app/assets/images/emoji/exclamation.png)bin354 -> 354 bytes
-rw-r--r--public/-/emojis/1/expressionless.png (renamed from app/assets/images/emoji/expressionless.png)bin438 -> 438 bytes
-rw-r--r--public/-/emojis/1/eye.png (renamed from app/assets/images/emoji/eye.png)bin664 -> 664 bytes
-rw-r--r--public/-/emojis/1/eye_in_speech_bubble.png (renamed from app/assets/images/emoji/eye_in_speech_bubble.png)bin698 -> 698 bytes
-rw-r--r--public/-/emojis/1/eyeglasses.png (renamed from app/assets/images/emoji/eyeglasses.png)bin577 -> 577 bytes
-rw-r--r--public/-/emojis/1/eyes.png (renamed from app/assets/images/emoji/eyes.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/face_palm.png (renamed from app/assets/images/emoji/face_palm.png)bin1523 -> 1523 bytes
-rw-r--r--public/-/emojis/1/face_palm_tone1.png (renamed from app/assets/images/emoji/face_palm_tone1.png)bin1563 -> 1563 bytes
-rw-r--r--public/-/emojis/1/face_palm_tone2.png (renamed from app/assets/images/emoji/face_palm_tone2.png)bin1547 -> 1547 bytes
-rw-r--r--public/-/emojis/1/face_palm_tone3.png (renamed from app/assets/images/emoji/face_palm_tone3.png)bin1550 -> 1550 bytes
-rw-r--r--public/-/emojis/1/face_palm_tone4.png (renamed from app/assets/images/emoji/face_palm_tone4.png)bin1553 -> 1553 bytes
-rw-r--r--public/-/emojis/1/face_palm_tone5.png (renamed from app/assets/images/emoji/face_palm_tone5.png)bin1532 -> 1532 bytes
-rw-r--r--public/-/emojis/1/factory.png (renamed from app/assets/images/emoji/factory.png)bin936 -> 936 bytes
-rw-r--r--public/-/emojis/1/fallen_leaf.png (renamed from app/assets/images/emoji/fallen_leaf.png)bin951 -> 951 bytes
-rw-r--r--public/-/emojis/1/family.png (renamed from app/assets/images/emoji/family.png)bin1433 -> 1433 bytes
-rw-r--r--public/-/emojis/1/family_mmb.png (renamed from app/assets/images/emoji/family_mmb.png)bin1206 -> 1206 bytes
-rw-r--r--public/-/emojis/1/family_mmbb.png (renamed from app/assets/images/emoji/family_mmbb.png)bin1349 -> 1349 bytes
-rw-r--r--public/-/emojis/1/family_mmg.png (renamed from app/assets/images/emoji/family_mmg.png)bin1361 -> 1361 bytes
-rw-r--r--public/-/emojis/1/family_mmgb.png (renamed from app/assets/images/emoji/family_mmgb.png)bin1626 -> 1626 bytes
-rw-r--r--public/-/emojis/1/family_mmgg.png (renamed from app/assets/images/emoji/family_mmgg.png)bin1448 -> 1448 bytes
-rw-r--r--public/-/emojis/1/family_mwbb.png (renamed from app/assets/images/emoji/family_mwbb.png)bin1638 -> 1638 bytes
-rw-r--r--public/-/emojis/1/family_mwg.png (renamed from app/assets/images/emoji/family_mwg.png)bin1554 -> 1554 bytes
-rw-r--r--public/-/emojis/1/family_mwgb.png (renamed from app/assets/images/emoji/family_mwgb.png)bin1837 -> 1837 bytes
-rw-r--r--public/-/emojis/1/family_mwgg.png (renamed from app/assets/images/emoji/family_mwgg.png)bin1738 -> 1738 bytes
-rw-r--r--public/-/emojis/1/family_wwb.png (renamed from app/assets/images/emoji/family_wwb.png)bin1155 -> 1155 bytes
-rw-r--r--public/-/emojis/1/family_wwbb.png (renamed from app/assets/images/emoji/family_wwbb.png)bin1289 -> 1289 bytes
-rw-r--r--public/-/emojis/1/family_wwg.png (renamed from app/assets/images/emoji/family_wwg.png)bin1286 -> 1286 bytes
-rw-r--r--public/-/emojis/1/family_wwgb.png (renamed from app/assets/images/emoji/family_wwgb.png)bin1550 -> 1550 bytes
-rw-r--r--public/-/emojis/1/family_wwgg.png (renamed from app/assets/images/emoji/family_wwgg.png)bin1374 -> 1374 bytes
-rw-r--r--public/-/emojis/1/fast_forward.png (renamed from app/assets/images/emoji/fast_forward.png)bin523 -> 523 bytes
-rw-r--r--public/-/emojis/1/fax.png (renamed from app/assets/images/emoji/fax.png)bin1188 -> 1188 bytes
-rw-r--r--public/-/emojis/1/fearful.png (renamed from app/assets/images/emoji/fearful.png)bin1002 -> 1002 bytes
-rw-r--r--public/-/emojis/1/feet.png (renamed from app/assets/images/emoji/feet.png)bin603 -> 603 bytes
-rw-r--r--public/-/emojis/1/fencer.png (renamed from app/assets/images/emoji/fencer.png)bin1342 -> 1342 bytes
-rw-r--r--public/-/emojis/1/ferris_wheel.png (renamed from app/assets/images/emoji/ferris_wheel.png)bin2185 -> 2185 bytes
-rw-r--r--public/-/emojis/1/ferry.png (renamed from app/assets/images/emoji/ferry.png)bin528 -> 528 bytes
-rw-r--r--public/-/emojis/1/field_hockey.png (renamed from app/assets/images/emoji/field_hockey.png)bin947 -> 947 bytes
-rw-r--r--public/-/emojis/1/file_cabinet.png (renamed from app/assets/images/emoji/file_cabinet.png)bin1420 -> 1420 bytes
-rw-r--r--public/-/emojis/1/file_folder.png (renamed from app/assets/images/emoji/file_folder.png)bin1445 -> 1445 bytes
-rw-r--r--public/-/emojis/1/film_frames.png (renamed from app/assets/images/emoji/film_frames.png)bin560 -> 560 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed.png (renamed from app/assets/images/emoji/fingers_crossed.png)bin1050 -> 1050 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed_tone1.png (renamed from app/assets/images/emoji/fingers_crossed_tone1.png)bin1047 -> 1047 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed_tone2.png (renamed from app/assets/images/emoji/fingers_crossed_tone2.png)bin1050 -> 1050 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed_tone3.png (renamed from app/assets/images/emoji/fingers_crossed_tone3.png)bin1050 -> 1050 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed_tone4.png (renamed from app/assets/images/emoji/fingers_crossed_tone4.png)bin1046 -> 1046 bytes
-rw-r--r--public/-/emojis/1/fingers_crossed_tone5.png (renamed from app/assets/images/emoji/fingers_crossed_tone5.png)bin1050 -> 1050 bytes
-rw-r--r--public/-/emojis/1/fire.png (renamed from app/assets/images/emoji/fire.png)bin1020 -> 1020 bytes
-rw-r--r--public/-/emojis/1/fire_engine.png (renamed from app/assets/images/emoji/fire_engine.png)bin1656 -> 1656 bytes
-rw-r--r--public/-/emojis/1/fireworks.png (renamed from app/assets/images/emoji/fireworks.png)bin1364 -> 1364 bytes
-rw-r--r--public/-/emojis/1/first_place.png (renamed from app/assets/images/emoji/first_place.png)bin1419 -> 1419 bytes
-rw-r--r--public/-/emojis/1/first_quarter_moon.png (renamed from app/assets/images/emoji/first_quarter_moon.png)bin1152 -> 1152 bytes
-rw-r--r--public/-/emojis/1/first_quarter_moon_with_face.png (renamed from app/assets/images/emoji/first_quarter_moon_with_face.png)bin1068 -> 1068 bytes
-rw-r--r--public/-/emojis/1/fish.png (renamed from app/assets/images/emoji/fish.png)bin1080 -> 1080 bytes
-rw-r--r--public/-/emojis/1/fish_cake.png (renamed from app/assets/images/emoji/fish_cake.png)bin1245 -> 1245 bytes
-rw-r--r--public/-/emojis/1/fishing_pole_and_fish.png (renamed from app/assets/images/emoji/fishing_pole_and_fish.png)bin1442 -> 1442 bytes
-rw-r--r--public/-/emojis/1/fist.png (renamed from app/assets/images/emoji/fist.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/fist_tone1.png (renamed from app/assets/images/emoji/fist_tone1.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/fist_tone2.png (renamed from app/assets/images/emoji/fist_tone2.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/fist_tone3.png (renamed from app/assets/images/emoji/fist_tone3.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/fist_tone4.png (renamed from app/assets/images/emoji/fist_tone4.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/fist_tone5.png (renamed from app/assets/images/emoji/fist_tone5.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/five.png (renamed from app/assets/images/emoji/five.png)bin577 -> 577 bytes
-rw-r--r--public/-/emojis/1/flag_ac.png (renamed from app/assets/images/emoji/flag_ac.png)bin1934 -> 1934 bytes
-rw-r--r--public/-/emojis/1/flag_ad.png (renamed from app/assets/images/emoji/flag_ad.png)bin1285 -> 1285 bytes
-rw-r--r--public/-/emojis/1/flag_ae.png (renamed from app/assets/images/emoji/flag_ae.png)bin544 -> 544 bytes
-rw-r--r--public/-/emojis/1/flag_af.png (renamed from app/assets/images/emoji/flag_af.png)bin942 -> 942 bytes
-rw-r--r--public/-/emojis/1/flag_ag.png (renamed from app/assets/images/emoji/flag_ag.png)bin913 -> 913 bytes
-rw-r--r--public/-/emojis/1/flag_ai.png (renamed from app/assets/images/emoji/flag_ai.png)bin1056 -> 1056 bytes
-rw-r--r--public/-/emojis/1/flag_al.png (renamed from app/assets/images/emoji/flag_al.png)bin905 -> 905 bytes
-rw-r--r--public/-/emojis/1/flag_am.png (renamed from app/assets/images/emoji/flag_am.png)bin514 -> 514 bytes
-rw-r--r--public/-/emojis/1/flag_ao.png (renamed from app/assets/images/emoji/flag_ao.png)bin997 -> 997 bytes
-rw-r--r--public/-/emojis/1/flag_aq.png (renamed from app/assets/images/emoji/flag_aq.png)bin657 -> 657 bytes
-rw-r--r--public/-/emojis/1/flag_ar.png (renamed from app/assets/images/emoji/flag_ar.png)bin975 -> 975 bytes
-rw-r--r--public/-/emojis/1/flag_as.png (renamed from app/assets/images/emoji/flag_as.png)bin1489 -> 1489 bytes
-rw-r--r--public/-/emojis/1/flag_at.png (renamed from app/assets/images/emoji/flag_at.png)bin430 -> 430 bytes
-rw-r--r--public/-/emojis/1/flag_au.png (renamed from app/assets/images/emoji/flag_au.png)bin962 -> 962 bytes
-rw-r--r--public/-/emojis/1/flag_aw.png (renamed from app/assets/images/emoji/flag_aw.png)bin709 -> 709 bytes
-rw-r--r--public/-/emojis/1/flag_ax.png (renamed from app/assets/images/emoji/flag_ax.png)bin496 -> 496 bytes
-rw-r--r--public/-/emojis/1/flag_az.png (renamed from app/assets/images/emoji/flag_az.png)bin709 -> 709 bytes
-rw-r--r--public/-/emojis/1/flag_ba.png (renamed from app/assets/images/emoji/flag_ba.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/flag_bb.png (renamed from app/assets/images/emoji/flag_bb.png)bin789 -> 789 bytes
-rw-r--r--public/-/emojis/1/flag_bd.png (renamed from app/assets/images/emoji/flag_bd.png)bin490 -> 490 bytes
-rw-r--r--public/-/emojis/1/flag_be.png (renamed from app/assets/images/emoji/flag_be.png)bin444 -> 444 bytes
-rw-r--r--public/-/emojis/1/flag_bf.png (renamed from app/assets/images/emoji/flag_bf.png)bin717 -> 717 bytes
-rw-r--r--public/-/emojis/1/flag_bg.png (renamed from app/assets/images/emoji/flag_bg.png)bin513 -> 513 bytes
-rw-r--r--public/-/emojis/1/flag_bh.png (renamed from app/assets/images/emoji/flag_bh.png)bin593 -> 593 bytes
-rw-r--r--public/-/emojis/1/flag_bi.png (renamed from app/assets/images/emoji/flag_bi.png)bin795 -> 795 bytes
-rw-r--r--public/-/emojis/1/flag_bj.png (renamed from app/assets/images/emoji/flag_bj.png)bin554 -> 554 bytes
-rw-r--r--public/-/emojis/1/flag_bl.png (renamed from app/assets/images/emoji/flag_bl.png)bin1691 -> 1691 bytes
-rw-r--r--public/-/emojis/1/flag_black.png (renamed from app/assets/images/emoji/flag_black.png)bin702 -> 702 bytes
-rw-r--r--public/-/emojis/1/flag_bm.png (renamed from app/assets/images/emoji/flag_bm.png)bin1374 -> 1374 bytes
-rw-r--r--public/-/emojis/1/flag_bn.png (renamed from app/assets/images/emoji/flag_bn.png)bin1355 -> 1355 bytes
-rw-r--r--public/-/emojis/1/flag_bo.png (renamed from app/assets/images/emoji/flag_bo.png)bin1132 -> 1132 bytes
-rw-r--r--public/-/emojis/1/flag_bq.png (renamed from app/assets/images/emoji/flag_bq.png)bin1144 -> 1144 bytes
-rw-r--r--public/-/emojis/1/flag_br.png (renamed from app/assets/images/emoji/flag_br.png)bin819 -> 819 bytes
-rw-r--r--public/-/emojis/1/flag_bs.png (renamed from app/assets/images/emoji/flag_bs.png)bin448 -> 448 bytes
-rw-r--r--public/-/emojis/1/flag_bt.png (renamed from app/assets/images/emoji/flag_bt.png)bin1213 -> 1213 bytes
-rw-r--r--public/-/emojis/1/flag_bv.png (renamed from app/assets/images/emoji/flag_bv.png)bin495 -> 495 bytes
-rw-r--r--public/-/emojis/1/flag_bw.png (renamed from app/assets/images/emoji/flag_bw.png)bin391 -> 391 bytes
-rw-r--r--public/-/emojis/1/flag_by.png (renamed from app/assets/images/emoji/flag_by.png)bin1120 -> 1120 bytes
-rw-r--r--public/-/emojis/1/flag_bz.png (renamed from app/assets/images/emoji/flag_bz.png)bin1595 -> 1595 bytes
-rw-r--r--public/-/emojis/1/flag_ca.png (renamed from app/assets/images/emoji/flag_ca.png)bin755 -> 755 bytes
-rw-r--r--public/-/emojis/1/flag_cc.png (renamed from app/assets/images/emoji/flag_cc.png)bin851 -> 851 bytes
-rw-r--r--public/-/emojis/1/flag_cd.png (renamed from app/assets/images/emoji/flag_cd.png)bin707 -> 707 bytes
-rw-r--r--public/-/emojis/1/flag_cf.png (renamed from app/assets/images/emoji/flag_cf.png)bin673 -> 673 bytes
-rw-r--r--public/-/emojis/1/flag_cg.png (renamed from app/assets/images/emoji/flag_cg.png)bin586 -> 586 bytes
-rw-r--r--public/-/emojis/1/flag_ch.png (renamed from app/assets/images/emoji/flag_ch.png)bin390 -> 390 bytes
-rw-r--r--public/-/emojis/1/flag_ci.png (renamed from app/assets/images/emoji/flag_ci.png)bin440 -> 440 bytes
-rw-r--r--public/-/emojis/1/flag_ck.png (renamed from app/assets/images/emoji/flag_ck.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/flag_cl.png (renamed from app/assets/images/emoji/flag_cl.png)bin748 -> 748 bytes
-rw-r--r--public/-/emojis/1/flag_cm.png (renamed from app/assets/images/emoji/flag_cm.png)bin627 -> 627 bytes
-rw-r--r--public/-/emojis/1/flag_cn.png (renamed from app/assets/images/emoji/flag_cn.png)bin676 -> 676 bytes
-rw-r--r--public/-/emojis/1/flag_co.png (renamed from app/assets/images/emoji/flag_co.png)bin524 -> 524 bytes
-rw-r--r--public/-/emojis/1/flag_cp.png (renamed from app/assets/images/emoji/flag_cp.png)bin443 -> 443 bytes
-rw-r--r--public/-/emojis/1/flag_cr.png (renamed from app/assets/images/emoji/flag_cr.png)bin419 -> 419 bytes
-rw-r--r--public/-/emojis/1/flag_cu.png (renamed from app/assets/images/emoji/flag_cu.png)bin586 -> 586 bytes
-rw-r--r--public/-/emojis/1/flag_cv.png (renamed from app/assets/images/emoji/flag_cv.png)bin642 -> 642 bytes
-rw-r--r--public/-/emojis/1/flag_cw.png (renamed from app/assets/images/emoji/flag_cw.png)bin665 -> 665 bytes
-rw-r--r--public/-/emojis/1/flag_cx.png (renamed from app/assets/images/emoji/flag_cx.png)bin1142 -> 1142 bytes
-rw-r--r--public/-/emojis/1/flag_cy.png (renamed from app/assets/images/emoji/flag_cy.png)bin830 -> 830 bytes
-rw-r--r--public/-/emojis/1/flag_cz.png (renamed from app/assets/images/emoji/flag_cz.png)bin600 -> 600 bytes
-rw-r--r--public/-/emojis/1/flag_de.png (renamed from app/assets/images/emoji/flag_de.png)bin502 -> 502 bytes
-rw-r--r--public/-/emojis/1/flag_dg.png (renamed from app/assets/images/emoji/flag_dg.png)bin1911 -> 1911 bytes
-rw-r--r--public/-/emojis/1/flag_dj.png (renamed from app/assets/images/emoji/flag_dj.png)bin753 -> 753 bytes
-rw-r--r--public/-/emojis/1/flag_dk.png (renamed from app/assets/images/emoji/flag_dk.png)bin450 -> 450 bytes
-rw-r--r--public/-/emojis/1/flag_dm.png (renamed from app/assets/images/emoji/flag_dm.png)bin1075 -> 1075 bytes
-rw-r--r--public/-/emojis/1/flag_do.png (renamed from app/assets/images/emoji/flag_do.png)bin1135 -> 1135 bytes
-rw-r--r--public/-/emojis/1/flag_dz.png (renamed from app/assets/images/emoji/flag_dz.png)bin734 -> 734 bytes
-rw-r--r--public/-/emojis/1/flag_ea.png (renamed from app/assets/images/emoji/flag_ea.png)bin1337 -> 1337 bytes
-rw-r--r--public/-/emojis/1/flag_ec.png (renamed from app/assets/images/emoji/flag_ec.png)bin1431 -> 1431 bytes
-rw-r--r--public/-/emojis/1/flag_ee.png (renamed from app/assets/images/emoji/flag_ee.png)bin512 -> 512 bytes
-rw-r--r--public/-/emojis/1/flag_eg.png (renamed from app/assets/images/emoji/flag_eg.png)bin818 -> 818 bytes
-rw-r--r--public/-/emojis/1/flag_eh.png (renamed from app/assets/images/emoji/flag_eh.png)bin742 -> 742 bytes
-rw-r--r--public/-/emojis/1/flag_er.png (renamed from app/assets/images/emoji/flag_er.png)bin1218 -> 1218 bytes
-rw-r--r--public/-/emojis/1/flag_es.png (renamed from app/assets/images/emoji/flag_es.png)bin1337 -> 1337 bytes
-rw-r--r--public/-/emojis/1/flag_et.png (renamed from app/assets/images/emoji/flag_et.png)bin947 -> 947 bytes
-rw-r--r--public/-/emojis/1/flag_eu.png (renamed from app/assets/images/emoji/flag_eu.png)bin760 -> 760 bytes
-rw-r--r--public/-/emojis/1/flag_fi.png (renamed from app/assets/images/emoji/flag_fi.png)bin487 -> 487 bytes
-rw-r--r--public/-/emojis/1/flag_fj.png (renamed from app/assets/images/emoji/flag_fj.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/flag_fk.png (renamed from app/assets/images/emoji/flag_fk.png)bin1558 -> 1558 bytes
-rw-r--r--public/-/emojis/1/flag_fm.png (renamed from app/assets/images/emoji/flag_fm.png)bin554 -> 554 bytes
-rw-r--r--public/-/emojis/1/flag_fo.png (renamed from app/assets/images/emoji/flag_fo.png)bin495 -> 495 bytes
-rw-r--r--public/-/emojis/1/flag_fr.png (renamed from app/assets/images/emoji/flag_fr.png)bin443 -> 443 bytes
-rw-r--r--public/-/emojis/1/flag_ga.png (renamed from app/assets/images/emoji/flag_ga.png)bin512 -> 512 bytes
-rw-r--r--public/-/emojis/1/flag_gb.png (renamed from app/assets/images/emoji/flag_gb.png)bin919 -> 919 bytes
-rw-r--r--public/-/emojis/1/flag_gd.png (renamed from app/assets/images/emoji/flag_gd.png)bin1017 -> 1017 bytes
-rw-r--r--public/-/emojis/1/flag_ge.png (renamed from app/assets/images/emoji/flag_ge.png)bin583 -> 583 bytes
-rw-r--r--public/-/emojis/1/flag_gf.png (renamed from app/assets/images/emoji/flag_gf.png)bin865 -> 865 bytes
-rw-r--r--public/-/emojis/1/flag_gg.png (renamed from app/assets/images/emoji/flag_gg.png)bin521 -> 521 bytes
-rw-r--r--public/-/emojis/1/flag_gh.png (renamed from app/assets/images/emoji/flag_gh.png)bin723 -> 723 bytes
-rw-r--r--public/-/emojis/1/flag_gi.png (renamed from app/assets/images/emoji/flag_gi.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/flag_gl.png (renamed from app/assets/images/emoji/flag_gl.png)bin700 -> 700 bytes
-rw-r--r--public/-/emojis/1/flag_gm.png (renamed from app/assets/images/emoji/flag_gm.png)bin501 -> 501 bytes
-rw-r--r--public/-/emojis/1/flag_gn.png (renamed from app/assets/images/emoji/flag_gn.png)bin434 -> 434 bytes
-rw-r--r--public/-/emojis/1/flag_gp.png (renamed from app/assets/images/emoji/flag_gp.png)bin1587 -> 1587 bytes
-rw-r--r--public/-/emojis/1/flag_gq.png (renamed from app/assets/images/emoji/flag_gq.png)bin1132 -> 1132 bytes
-rw-r--r--public/-/emojis/1/flag_gr.png (renamed from app/assets/images/emoji/flag_gr.png)bin549 -> 549 bytes
-rw-r--r--public/-/emojis/1/flag_gs.png (renamed from app/assets/images/emoji/flag_gs.png)bin2115 -> 2115 bytes
-rw-r--r--public/-/emojis/1/flag_gt.png (renamed from app/assets/images/emoji/flag_gt.png)bin1087 -> 1087 bytes
-rw-r--r--public/-/emojis/1/flag_gu.png (renamed from app/assets/images/emoji/flag_gu.png)bin1045 -> 1045 bytes
-rw-r--r--public/-/emojis/1/flag_gw.png (renamed from app/assets/images/emoji/flag_gw.png)bin705 -> 705 bytes
-rw-r--r--public/-/emojis/1/flag_gy.png (renamed from app/assets/images/emoji/flag_gy.png)bin690 -> 690 bytes
-rw-r--r--public/-/emojis/1/flag_hk.png (renamed from app/assets/images/emoji/flag_hk.png)bin759 -> 759 bytes
-rw-r--r--public/-/emojis/1/flag_hm.png (renamed from app/assets/images/emoji/flag_hm.png)bin1036 -> 1036 bytes
-rw-r--r--public/-/emojis/1/flag_hn.png (renamed from app/assets/images/emoji/flag_hn.png)bin513 -> 513 bytes
-rw-r--r--public/-/emojis/1/flag_hr.png (renamed from app/assets/images/emoji/flag_hr.png)bin1411 -> 1411 bytes
-rw-r--r--public/-/emojis/1/flag_ht.png (renamed from app/assets/images/emoji/flag_ht.png)bin1205 -> 1205 bytes
-rw-r--r--public/-/emojis/1/flag_hu.png (renamed from app/assets/images/emoji/flag_hu.png)bin513 -> 513 bytes
-rw-r--r--public/-/emojis/1/flag_ic.png (renamed from app/assets/images/emoji/flag_ic.png)bin1330 -> 1330 bytes
-rw-r--r--public/-/emojis/1/flag_id.png (renamed from app/assets/images/emoji/flag_id.png)bin498 -> 498 bytes
-rw-r--r--public/-/emojis/1/flag_ie.png (renamed from app/assets/images/emoji/flag_ie.png)bin478 -> 478 bytes
-rw-r--r--public/-/emojis/1/flag_il.png (renamed from app/assets/images/emoji/flag_il.png)bin658 -> 658 bytes
-rw-r--r--public/-/emojis/1/flag_im.png (renamed from app/assets/images/emoji/flag_im.png)bin976 -> 976 bytes
-rw-r--r--public/-/emojis/1/flag_in.png (renamed from app/assets/images/emoji/flag_in.png)bin773 -> 773 bytes
-rw-r--r--public/-/emojis/1/flag_io.png (renamed from app/assets/images/emoji/flag_io.png)bin1911 -> 1911 bytes
-rw-r--r--public/-/emojis/1/flag_iq.png (renamed from app/assets/images/emoji/flag_iq.png)bin811 -> 811 bytes
-rw-r--r--public/-/emojis/1/flag_ir.png (renamed from app/assets/images/emoji/flag_ir.png)bin1036 -> 1036 bytes
-rw-r--r--public/-/emojis/1/flag_is.png (renamed from app/assets/images/emoji/flag_is.png)bin491 -> 491 bytes
-rw-r--r--public/-/emojis/1/flag_it.png (renamed from app/assets/images/emoji/flag_it.png)bin472 -> 472 bytes
-rw-r--r--public/-/emojis/1/flag_je.png (renamed from app/assets/images/emoji/flag_je.png)bin956 -> 956 bytes
-rw-r--r--public/-/emojis/1/flag_jm.png (renamed from app/assets/images/emoji/flag_jm.png)bin837 -> 837 bytes
-rw-r--r--public/-/emojis/1/flag_jo.png (renamed from app/assets/images/emoji/flag_jo.png)bin740 -> 740 bytes
-rw-r--r--public/-/emojis/1/flag_jp.png (renamed from app/assets/images/emoji/flag_jp.png)bin455 -> 455 bytes
-rw-r--r--public/-/emojis/1/flag_ke.png (renamed from app/assets/images/emoji/flag_ke.png)bin1160 -> 1160 bytes
-rw-r--r--public/-/emojis/1/flag_kg.png (renamed from app/assets/images/emoji/flag_kg.png)bin1080 -> 1080 bytes
-rw-r--r--public/-/emojis/1/flag_kh.png (renamed from app/assets/images/emoji/flag_kh.png)bin872 -> 872 bytes
-rw-r--r--public/-/emojis/1/flag_ki.png (renamed from app/assets/images/emoji/flag_ki.png)bin1369 -> 1369 bytes
-rw-r--r--public/-/emojis/1/flag_km.png (renamed from app/assets/images/emoji/flag_km.png)bin783 -> 783 bytes
-rw-r--r--public/-/emojis/1/flag_kn.png (renamed from app/assets/images/emoji/flag_kn.png)bin1316 -> 1316 bytes
-rw-r--r--public/-/emojis/1/flag_kp.png (renamed from app/assets/images/emoji/flag_kp.png)bin696 -> 696 bytes
-rw-r--r--public/-/emojis/1/flag_kr.png (renamed from app/assets/images/emoji/flag_kr.png)bin967 -> 967 bytes
-rw-r--r--public/-/emojis/1/flag_kw.png (renamed from app/assets/images/emoji/flag_kw.png)bin560 -> 560 bytes
-rw-r--r--public/-/emojis/1/flag_ky.png (renamed from app/assets/images/emoji/flag_ky.png)bin1671 -> 1671 bytes
-rw-r--r--public/-/emojis/1/flag_kz.png (renamed from app/assets/images/emoji/flag_kz.png)bin1136 -> 1136 bytes
-rw-r--r--public/-/emojis/1/flag_la.png (renamed from app/assets/images/emoji/flag_la.png)bin479 -> 479 bytes
-rw-r--r--public/-/emojis/1/flag_lb.png (renamed from app/assets/images/emoji/flag_lb.png)bin740 -> 740 bytes
-rw-r--r--public/-/emojis/1/flag_lc.png (renamed from app/assets/images/emoji/flag_lc.png)bin561 -> 561 bytes
-rw-r--r--public/-/emojis/1/flag_li.png (renamed from app/assets/images/emoji/flag_li.png)bin946 -> 946 bytes
-rw-r--r--public/-/emojis/1/flag_lk.png (renamed from app/assets/images/emoji/flag_lk.png)bin974 -> 974 bytes
-rw-r--r--public/-/emojis/1/flag_lr.png (renamed from app/assets/images/emoji/flag_lr.png)bin772 -> 772 bytes
-rw-r--r--public/-/emojis/1/flag_ls.png (renamed from app/assets/images/emoji/flag_ls.png)bin775 -> 775 bytes
-rw-r--r--public/-/emojis/1/flag_lt.png (renamed from app/assets/images/emoji/flag_lt.png)bin510 -> 510 bytes
-rw-r--r--public/-/emojis/1/flag_lu.png (renamed from app/assets/images/emoji/flag_lu.png)bin512 -> 512 bytes
-rw-r--r--public/-/emojis/1/flag_lv.png (renamed from app/assets/images/emoji/flag_lv.png)bin388 -> 388 bytes
-rw-r--r--public/-/emojis/1/flag_ly.png (renamed from app/assets/images/emoji/flag_ly.png)bin685 -> 685 bytes
-rw-r--r--public/-/emojis/1/flag_ma.png (renamed from app/assets/images/emoji/flag_ma.png)bin626 -> 626 bytes
-rw-r--r--public/-/emojis/1/flag_mc.png (renamed from app/assets/images/emoji/flag_mc.png)bin528 -> 528 bytes
-rw-r--r--public/-/emojis/1/flag_md.png (renamed from app/assets/images/emoji/flag_md.png)bin1170 -> 1170 bytes
-rw-r--r--public/-/emojis/1/flag_me.png (renamed from app/assets/images/emoji/flag_me.png)bin1074 -> 1074 bytes
-rw-r--r--public/-/emojis/1/flag_mf.png (renamed from app/assets/images/emoji/flag_mf.png)bin443 -> 443 bytes
-rw-r--r--public/-/emojis/1/flag_mg.png (renamed from app/assets/images/emoji/flag_mg.png)bin556 -> 556 bytes
-rw-r--r--public/-/emojis/1/flag_mh.png (renamed from app/assets/images/emoji/flag_mh.png)bin1138 -> 1138 bytes
-rw-r--r--public/-/emojis/1/flag_mk.png (renamed from app/assets/images/emoji/flag_mk.png)bin1023 -> 1023 bytes
-rw-r--r--public/-/emojis/1/flag_ml.png (renamed from app/assets/images/emoji/flag_ml.png)bin440 -> 440 bytes
-rw-r--r--public/-/emojis/1/flag_mm.png (renamed from app/assets/images/emoji/flag_mm.png)bin937 -> 937 bytes
-rw-r--r--public/-/emojis/1/flag_mn.png (renamed from app/assets/images/emoji/flag_mn.png)bin698 -> 698 bytes
-rw-r--r--public/-/emojis/1/flag_mo.png (renamed from app/assets/images/emoji/flag_mo.png)bin792 -> 792 bytes
-rw-r--r--public/-/emojis/1/flag_mp.png (renamed from app/assets/images/emoji/flag_mp.png)bin1797 -> 1797 bytes
-rw-r--r--public/-/emojis/1/flag_mq.png (renamed from app/assets/images/emoji/flag_mq.png)bin780 -> 780 bytes
-rw-r--r--public/-/emojis/1/flag_mr.png (renamed from app/assets/images/emoji/flag_mr.png)bin657 -> 657 bytes
-rw-r--r--public/-/emojis/1/flag_ms.png (renamed from app/assets/images/emoji/flag_ms.png)bin1477 -> 1477 bytes
-rw-r--r--public/-/emojis/1/flag_mt.png (renamed from app/assets/images/emoji/flag_mt.png)bin799 -> 799 bytes
-rw-r--r--public/-/emojis/1/flag_mu.png (renamed from app/assets/images/emoji/flag_mu.png)bin544 -> 544 bytes
-rw-r--r--public/-/emojis/1/flag_mv.png (renamed from app/assets/images/emoji/flag_mv.png)bin598 -> 598 bytes
-rw-r--r--public/-/emojis/1/flag_mw.png (renamed from app/assets/images/emoji/flag_mw.png)bin825 -> 825 bytes
-rw-r--r--public/-/emojis/1/flag_mx.png (renamed from app/assets/images/emoji/flag_mx.png)bin951 -> 951 bytes
-rw-r--r--public/-/emojis/1/flag_my.png (renamed from app/assets/images/emoji/flag_my.png)bin775 -> 775 bytes
-rw-r--r--public/-/emojis/1/flag_mz.png (renamed from app/assets/images/emoji/flag_mz.png)bin1159 -> 1159 bytes
-rw-r--r--public/-/emojis/1/flag_na.png (renamed from app/assets/images/emoji/flag_na.png)bin1249 -> 1249 bytes
-rw-r--r--public/-/emojis/1/flag_nc.png (renamed from app/assets/images/emoji/flag_nc.png)bin1148 -> 1148 bytes
-rw-r--r--public/-/emojis/1/flag_ne.png (renamed from app/assets/images/emoji/flag_ne.png)bin593 -> 593 bytes
-rw-r--r--public/-/emojis/1/flag_nf.png (renamed from app/assets/images/emoji/flag_nf.png)bin877 -> 877 bytes
-rw-r--r--public/-/emojis/1/flag_ng.png (renamed from app/assets/images/emoji/flag_ng.png)bin438 -> 438 bytes
-rw-r--r--public/-/emojis/1/flag_ni.png (renamed from app/assets/images/emoji/flag_ni.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/flag_nl.png (renamed from app/assets/images/emoji/flag_nl.png)bin499 -> 499 bytes
-rw-r--r--public/-/emojis/1/flag_no.png (renamed from app/assets/images/emoji/flag_no.png)bin484 -> 484 bytes
-rw-r--r--public/-/emojis/1/flag_np.png (renamed from app/assets/images/emoji/flag_np.png)bin802 -> 802 bytes
-rw-r--r--public/-/emojis/1/flag_nr.png (renamed from app/assets/images/emoji/flag_nr.png)bin529 -> 529 bytes
-rw-r--r--public/-/emojis/1/flag_nu.png (renamed from app/assets/images/emoji/flag_nu.png)bin1128 -> 1128 bytes
-rw-r--r--public/-/emojis/1/flag_nz.png (renamed from app/assets/images/emoji/flag_nz.png)bin1099 -> 1099 bytes
-rw-r--r--public/-/emojis/1/flag_om.png (renamed from app/assets/images/emoji/flag_om.png)bin754 -> 754 bytes
-rw-r--r--public/-/emojis/1/flag_pa.png (renamed from app/assets/images/emoji/flag_pa.png)bin830 -> 830 bytes
-rw-r--r--public/-/emojis/1/flag_pe.png (renamed from app/assets/images/emoji/flag_pe.png)bin439 -> 439 bytes
-rw-r--r--public/-/emojis/1/flag_pf.png (renamed from app/assets/images/emoji/flag_pf.png)bin1091 -> 1091 bytes
-rw-r--r--public/-/emojis/1/flag_pg.png (renamed from app/assets/images/emoji/flag_pg.png)bin1076 -> 1076 bytes
-rw-r--r--public/-/emojis/1/flag_ph.png (renamed from app/assets/images/emoji/flag_ph.png)bin867 -> 867 bytes
-rw-r--r--public/-/emojis/1/flag_pk.png (renamed from app/assets/images/emoji/flag_pk.png)bin753 -> 753 bytes
-rw-r--r--public/-/emojis/1/flag_pl.png (renamed from app/assets/images/emoji/flag_pl.png)bin522 -> 522 bytes
-rw-r--r--public/-/emojis/1/flag_pm.png (renamed from app/assets/images/emoji/flag_pm.png)bin2314 -> 2314 bytes
-rw-r--r--public/-/emojis/1/flag_pn.png (renamed from app/assets/images/emoji/flag_pn.png)bin1895 -> 1895 bytes
-rw-r--r--public/-/emojis/1/flag_pr.png (renamed from app/assets/images/emoji/flag_pr.png)bin605 -> 605 bytes
-rw-r--r--public/-/emojis/1/flag_ps.png (renamed from app/assets/images/emoji/flag_ps.png)bin574 -> 574 bytes
-rw-r--r--public/-/emojis/1/flag_pt.png (renamed from app/assets/images/emoji/flag_pt.png)bin1055 -> 1055 bytes
-rw-r--r--public/-/emojis/1/flag_pw.png (renamed from app/assets/images/emoji/flag_pw.png)bin475 -> 475 bytes
-rw-r--r--public/-/emojis/1/flag_py.png (renamed from app/assets/images/emoji/flag_py.png)bin1085 -> 1085 bytes
-rw-r--r--public/-/emojis/1/flag_qa.png (renamed from app/assets/images/emoji/flag_qa.png)bin657 -> 657 bytes
-rw-r--r--public/-/emojis/1/flag_re.png (renamed from app/assets/images/emoji/flag_re.png)bin837 -> 837 bytes
-rw-r--r--public/-/emojis/1/flag_ro.png (renamed from app/assets/images/emoji/flag_ro.png)bin441 -> 441 bytes
-rw-r--r--public/-/emojis/1/flag_rs.png (renamed from app/assets/images/emoji/flag_rs.png)bin1237 -> 1237 bytes
-rw-r--r--public/-/emojis/1/flag_ru.png (renamed from app/assets/images/emoji/flag_ru.png)bin496 -> 496 bytes
-rw-r--r--public/-/emojis/1/flag_rw.png (renamed from app/assets/images/emoji/flag_rw.png)bin940 -> 940 bytes
-rw-r--r--public/-/emojis/1/flag_sa.png (renamed from app/assets/images/emoji/flag_sa.png)bin781 -> 781 bytes
-rw-r--r--public/-/emojis/1/flag_sb.png (renamed from app/assets/images/emoji/flag_sb.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/flag_sc.png (renamed from app/assets/images/emoji/flag_sc.png)bin1073 -> 1073 bytes
-rw-r--r--public/-/emojis/1/flag_sd.png (renamed from app/assets/images/emoji/flag_sd.png)bin578 -> 578 bytes
-rw-r--r--public/-/emojis/1/flag_se.png (renamed from app/assets/images/emoji/flag_se.png)bin455 -> 455 bytes
-rw-r--r--public/-/emojis/1/flag_sg.png (renamed from app/assets/images/emoji/flag_sg.png)bin730 -> 730 bytes
-rw-r--r--public/-/emojis/1/flag_sh.png (renamed from app/assets/images/emoji/flag_sh.png)bin1369 -> 1369 bytes
-rw-r--r--public/-/emojis/1/flag_si.png (renamed from app/assets/images/emoji/flag_si.png)bin1030 -> 1030 bytes
-rw-r--r--public/-/emojis/1/flag_sj.png (renamed from app/assets/images/emoji/flag_sj.png)bin495 -> 495 bytes
-rw-r--r--public/-/emojis/1/flag_sk.png (renamed from app/assets/images/emoji/flag_sk.png)bin780 -> 780 bytes
-rw-r--r--public/-/emojis/1/flag_sl.png (renamed from app/assets/images/emoji/flag_sl.png)bin510 -> 510 bytes
-rw-r--r--public/-/emojis/1/flag_sm.png (renamed from app/assets/images/emoji/flag_sm.png)bin2000 -> 2000 bytes
-rw-r--r--public/-/emojis/1/flag_sn.png (renamed from app/assets/images/emoji/flag_sn.png)bin621 -> 621 bytes
-rw-r--r--public/-/emojis/1/flag_so.png (renamed from app/assets/images/emoji/flag_so.png)bin609 -> 609 bytes
-rw-r--r--public/-/emojis/1/flag_sr.png (renamed from app/assets/images/emoji/flag_sr.png)bin650 -> 650 bytes
-rw-r--r--public/-/emojis/1/flag_ss.png (renamed from app/assets/images/emoji/flag_ss.png)bin722 -> 722 bytes
-rw-r--r--public/-/emojis/1/flag_st.png (renamed from app/assets/images/emoji/flag_st.png)bin562 -> 562 bytes
-rw-r--r--public/-/emojis/1/flag_sv.png (renamed from app/assets/images/emoji/flag_sv.png)bin1125 -> 1125 bytes
-rw-r--r--public/-/emojis/1/flag_sx.png (renamed from app/assets/images/emoji/flag_sx.png)bin1195 -> 1195 bytes
-rw-r--r--public/-/emojis/1/flag_sy.png (renamed from app/assets/images/emoji/flag_sy.png)bin696 -> 696 bytes
-rw-r--r--public/-/emojis/1/flag_sz.png (renamed from app/assets/images/emoji/flag_sz.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/flag_ta.png (renamed from app/assets/images/emoji/flag_ta.png)bin1907 -> 1907 bytes
-rw-r--r--public/-/emojis/1/flag_tc.png (renamed from app/assets/images/emoji/flag_tc.png)bin1538 -> 1538 bytes
-rw-r--r--public/-/emojis/1/flag_td.png (renamed from app/assets/images/emoji/flag_td.png)bin443 -> 443 bytes
-rw-r--r--public/-/emojis/1/flag_tf.png (renamed from app/assets/images/emoji/flag_tf.png)bin857 -> 857 bytes
-rw-r--r--public/-/emojis/1/flag_tg.png (renamed from app/assets/images/emoji/flag_tg.png)bin790 -> 790 bytes
-rw-r--r--public/-/emojis/1/flag_th.png (renamed from app/assets/images/emoji/flag_th.png)bin421 -> 421 bytes
-rw-r--r--public/-/emojis/1/flag_tj.png (renamed from app/assets/images/emoji/flag_tj.png)bin906 -> 906 bytes
-rw-r--r--public/-/emojis/1/flag_tk.png (renamed from app/assets/images/emoji/flag_tk.png)bin835 -> 835 bytes
-rw-r--r--public/-/emojis/1/flag_tl.png (renamed from app/assets/images/emoji/flag_tl.png)bin849 -> 849 bytes
-rw-r--r--public/-/emojis/1/flag_tm.png (renamed from app/assets/images/emoji/flag_tm.png)bin1178 -> 1178 bytes
-rw-r--r--public/-/emojis/1/flag_tn.png (renamed from app/assets/images/emoji/flag_tn.png)bin625 -> 625 bytes
-rw-r--r--public/-/emojis/1/flag_to.png (renamed from app/assets/images/emoji/flag_to.png)bin553 -> 553 bytes
-rw-r--r--public/-/emojis/1/flag_tr.png (renamed from app/assets/images/emoji/flag_tr.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/flag_tt.png (renamed from app/assets/images/emoji/flag_tt.png)bin604 -> 604 bytes
-rw-r--r--public/-/emojis/1/flag_tv.png (renamed from app/assets/images/emoji/flag_tv.png)bin1120 -> 1120 bytes
-rw-r--r--public/-/emojis/1/flag_tw.png (renamed from app/assets/images/emoji/flag_tw.png)bin761 -> 761 bytes
-rw-r--r--public/-/emojis/1/flag_tz.png (renamed from app/assets/images/emoji/flag_tz.png)bin1061 -> 1061 bytes
-rw-r--r--public/-/emojis/1/flag_ua.png (renamed from app/assets/images/emoji/flag_ua.png)bin528 -> 528 bytes
-rw-r--r--public/-/emojis/1/flag_ug.png (renamed from app/assets/images/emoji/flag_ug.png)bin887 -> 887 bytes
-rw-r--r--public/-/emojis/1/flag_um.png (renamed from app/assets/images/emoji/flag_um.png)bin776 -> 776 bytes
-rw-r--r--public/-/emojis/1/flag_us.png (renamed from app/assets/images/emoji/flag_us.png)bin776 -> 776 bytes
-rw-r--r--public/-/emojis/1/flag_uy.png (renamed from app/assets/images/emoji/flag_uy.png)bin966 -> 966 bytes
-rw-r--r--public/-/emojis/1/flag_uz.png (renamed from app/assets/images/emoji/flag_uz.png)bin750 -> 750 bytes
-rw-r--r--public/-/emojis/1/flag_va.png (renamed from app/assets/images/emoji/flag_va.png)bin1331 -> 1331 bytes
-rw-r--r--public/-/emojis/1/flag_vc.png (renamed from app/assets/images/emoji/flag_vc.png)bin897 -> 897 bytes
-rw-r--r--public/-/emojis/1/flag_ve.png (renamed from app/assets/images/emoji/flag_ve.png)bin748 -> 748 bytes
-rw-r--r--public/-/emojis/1/flag_vg.png (renamed from app/assets/images/emoji/flag_vg.png)bin1789 -> 1789 bytes
-rw-r--r--public/-/emojis/1/flag_vi.png (renamed from app/assets/images/emoji/flag_vi.png)bin1378 -> 1378 bytes
-rw-r--r--public/-/emojis/1/flag_vn.png (renamed from app/assets/images/emoji/flag_vn.png)bin583 -> 583 bytes
-rw-r--r--public/-/emojis/1/flag_vu.png (renamed from app/assets/images/emoji/flag_vu.png)bin844 -> 844 bytes
-rw-r--r--public/-/emojis/1/flag_wf.png (renamed from app/assets/images/emoji/flag_wf.png)bin443 -> 443 bytes
-rw-r--r--public/-/emojis/1/flag_white.png (renamed from app/assets/images/emoji/flag_white.png)bin699 -> 699 bytes
-rw-r--r--public/-/emojis/1/flag_ws.png (renamed from app/assets/images/emoji/flag_ws.png)bin634 -> 634 bytes
-rw-r--r--public/-/emojis/1/flag_xk.png (renamed from app/assets/images/emoji/flag_xk.png)bin722 -> 722 bytes
-rw-r--r--public/-/emojis/1/flag_ye.png (renamed from app/assets/images/emoji/flag_ye.png)bin507 -> 507 bytes
-rw-r--r--public/-/emojis/1/flag_yt.png (renamed from app/assets/images/emoji/flag_yt.png)bin1623 -> 1623 bytes
-rw-r--r--public/-/emojis/1/flag_za.png (renamed from app/assets/images/emoji/flag_za.png)bin676 -> 676 bytes
-rw-r--r--public/-/emojis/1/flag_zm.png (renamed from app/assets/images/emoji/flag_zm.png)bin881 -> 881 bytes
-rw-r--r--public/-/emojis/1/flag_zw.png (renamed from app/assets/images/emoji/flag_zw.png)bin993 -> 993 bytes
-rw-r--r--public/-/emojis/1/flags.png (renamed from app/assets/images/emoji/flags.png)bin1722 -> 1722 bytes
-rw-r--r--public/-/emojis/1/flashlight.png (renamed from app/assets/images/emoji/flashlight.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/fleur-de-lis.png (renamed from app/assets/images/emoji/fleur-de-lis.png)bin632 -> 632 bytes
-rw-r--r--public/-/emojis/1/floppy_disk.png (renamed from app/assets/images/emoji/floppy_disk.png)bin258 -> 258 bytes
-rw-r--r--public/-/emojis/1/flower_playing_cards.png (renamed from app/assets/images/emoji/flower_playing_cards.png)bin449 -> 449 bytes
-rw-r--r--public/-/emojis/1/flushed.png (renamed from app/assets/images/emoji/flushed.png)bin1127 -> 1127 bytes
-rw-r--r--public/-/emojis/1/fog.png (renamed from app/assets/images/emoji/fog.png)bin713 -> 713 bytes
-rw-r--r--public/-/emojis/1/foggy.png (renamed from app/assets/images/emoji/foggy.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/football.png (renamed from app/assets/images/emoji/football.png)bin956 -> 956 bytes
-rw-r--r--public/-/emojis/1/footprints.png (renamed from app/assets/images/emoji/footprints.png)bin621 -> 621 bytes
-rw-r--r--public/-/emojis/1/fork_and_knife.png (renamed from app/assets/images/emoji/fork_and_knife.png)bin668 -> 668 bytes
-rw-r--r--public/-/emojis/1/fork_knife_plate.png (renamed from app/assets/images/emoji/fork_knife_plate.png)bin976 -> 976 bytes
-rw-r--r--public/-/emojis/1/fountain.png (renamed from app/assets/images/emoji/fountain.png)bin1768 -> 1768 bytes
-rw-r--r--public/-/emojis/1/four.png (renamed from app/assets/images/emoji/four.png)bin497 -> 497 bytes
-rw-r--r--public/-/emojis/1/four_leaf_clover.png (renamed from app/assets/images/emoji/four_leaf_clover.png)bin1156 -> 1156 bytes
-rw-r--r--public/-/emojis/1/fox.png (renamed from app/assets/images/emoji/fox.png)bin1556 -> 1556 bytes
-rw-r--r--public/-/emojis/1/frame_photo.png (renamed from app/assets/images/emoji/frame_photo.png)bin514 -> 514 bytes
-rw-r--r--public/-/emojis/1/free.png (renamed from app/assets/images/emoji/free.png)bin370 -> 370 bytes
-rw-r--r--public/-/emojis/1/french_bread.png (renamed from app/assets/images/emoji/french_bread.png)bin1551 -> 1551 bytes
-rw-r--r--public/-/emojis/1/fried_shrimp.png (renamed from app/assets/images/emoji/fried_shrimp.png)bin1241 -> 1241 bytes
-rw-r--r--public/-/emojis/1/fries.png (renamed from app/assets/images/emoji/fries.png)bin1873 -> 1873 bytes
-rw-r--r--public/-/emojis/1/frog.png (renamed from app/assets/images/emoji/frog.png)bin897 -> 897 bytes
-rw-r--r--public/-/emojis/1/frowning.png (renamed from app/assets/images/emoji/frowning.png)bin633 -> 633 bytes
-rw-r--r--public/-/emojis/1/frowning2.png (renamed from app/assets/images/emoji/frowning2.png)bin589 -> 589 bytes
-rw-r--r--public/-/emojis/1/fuelpump.png (renamed from app/assets/images/emoji/fuelpump.png)bin864 -> 864 bytes
-rw-r--r--public/-/emojis/1/full_moon.png (renamed from app/assets/images/emoji/full_moon.png)bin841 -> 841 bytes
-rw-r--r--public/-/emojis/1/full_moon_with_face.png (renamed from app/assets/images/emoji/full_moon_with_face.png)bin1186 -> 1186 bytes
-rw-r--r--public/-/emojis/1/game_die.png (renamed from app/assets/images/emoji/game_die.png)bin1136 -> 1136 bytes
-rw-r--r--public/-/emojis/1/gay_pride_flag.png (renamed from app/assets/images/emoji/gay_pride_flag.png)bin2340 -> 2340 bytes
-rw-r--r--public/-/emojis/1/gear.png (renamed from app/assets/images/emoji/gear.png)bin747 -> 747 bytes
-rw-r--r--public/-/emojis/1/gem.png (renamed from app/assets/images/emoji/gem.png)bin715 -> 715 bytes
-rw-r--r--public/-/emojis/1/gemini.png (renamed from app/assets/images/emoji/gemini.png)bin547 -> 547 bytes
-rw-r--r--public/-/emojis/1/ghost.png (renamed from app/assets/images/emoji/ghost.png)bin1465 -> 1465 bytes
-rw-r--r--public/-/emojis/1/gift.png (renamed from app/assets/images/emoji/gift.png)bin1966 -> 1966 bytes
-rw-r--r--public/-/emojis/1/gift_heart.png (renamed from app/assets/images/emoji/gift_heart.png)bin1141 -> 1141 bytes
-rw-r--r--public/-/emojis/1/girl.png (renamed from app/assets/images/emoji/girl.png)bin1261 -> 1261 bytes
-rw-r--r--public/-/emojis/1/girl_tone1.png (renamed from app/assets/images/emoji/girl_tone1.png)bin1259 -> 1259 bytes
-rw-r--r--public/-/emojis/1/girl_tone2.png (renamed from app/assets/images/emoji/girl_tone2.png)bin1255 -> 1255 bytes
-rw-r--r--public/-/emojis/1/girl_tone3.png (renamed from app/assets/images/emoji/girl_tone3.png)bin1255 -> 1255 bytes
-rw-r--r--public/-/emojis/1/girl_tone4.png (renamed from app/assets/images/emoji/girl_tone4.png)bin1241 -> 1241 bytes
-rw-r--r--public/-/emojis/1/girl_tone5.png (renamed from app/assets/images/emoji/girl_tone5.png)bin1245 -> 1245 bytes
-rw-r--r--public/-/emojis/1/globe_with_meridians.png (renamed from app/assets/images/emoji/globe_with_meridians.png)bin796 -> 796 bytes
-rw-r--r--public/-/emojis/1/goal.png (renamed from app/assets/images/emoji/goal.png)bin1242 -> 1242 bytes
-rw-r--r--public/-/emojis/1/goat.png (renamed from app/assets/images/emoji/goat.png)bin981 -> 981 bytes
-rw-r--r--public/-/emojis/1/golf.png (renamed from app/assets/images/emoji/golf.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/golfer.png (renamed from app/assets/images/emoji/golfer.png)bin1189 -> 1189 bytes
-rw-r--r--public/-/emojis/1/gorilla.png (renamed from app/assets/images/emoji/gorilla.png)bin1090 -> 1090 bytes
-rw-r--r--public/-/emojis/1/grapes.png (renamed from app/assets/images/emoji/grapes.png)bin1552 -> 1552 bytes
-rw-r--r--public/-/emojis/1/green_apple.png (renamed from app/assets/images/emoji/green_apple.png)bin656 -> 656 bytes
-rw-r--r--public/-/emojis/1/green_book.png (renamed from app/assets/images/emoji/green_book.png)bin1366 -> 1366 bytes
-rw-r--r--public/-/emojis/1/green_heart.png (renamed from app/assets/images/emoji/green_heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/grey_exclamation.png (renamed from app/assets/images/emoji/grey_exclamation.png)bin354 -> 354 bytes
-rw-r--r--public/-/emojis/1/grey_question.png (renamed from app/assets/images/emoji/grey_question.png)bin449 -> 449 bytes
-rw-r--r--public/-/emojis/1/grimacing.png (renamed from app/assets/images/emoji/grimacing.png)bin694 -> 694 bytes
-rw-r--r--public/-/emojis/1/grin.png (renamed from app/assets/images/emoji/grin.png)bin767 -> 767 bytes
-rw-r--r--public/-/emojis/1/grinning.png (renamed from app/assets/images/emoji/grinning.png)bin810 -> 810 bytes
-rw-r--r--public/-/emojis/1/guardsman.png (renamed from app/assets/images/emoji/guardsman.png)bin1140 -> 1140 bytes
-rw-r--r--public/-/emojis/1/guardsman_tone1.png (renamed from app/assets/images/emoji/guardsman_tone1.png)bin1122 -> 1122 bytes
-rw-r--r--public/-/emojis/1/guardsman_tone2.png (renamed from app/assets/images/emoji/guardsman_tone2.png)bin1160 -> 1160 bytes
-rw-r--r--public/-/emojis/1/guardsman_tone3.png (renamed from app/assets/images/emoji/guardsman_tone3.png)bin1160 -> 1160 bytes
-rw-r--r--public/-/emojis/1/guardsman_tone4.png (renamed from app/assets/images/emoji/guardsman_tone4.png)bin1157 -> 1157 bytes
-rw-r--r--public/-/emojis/1/guardsman_tone5.png (renamed from app/assets/images/emoji/guardsman_tone5.png)bin1165 -> 1165 bytes
-rw-r--r--public/-/emojis/1/guitar.png (renamed from app/assets/images/emoji/guitar.png)bin1056 -> 1056 bytes
-rw-r--r--public/-/emojis/1/gun.png (renamed from app/assets/images/emoji/gun.png)bin1859 -> 1859 bytes
-rw-r--r--public/-/emojis/1/haircut.png (renamed from app/assets/images/emoji/haircut.png)bin1935 -> 1935 bytes
-rw-r--r--public/-/emojis/1/haircut_tone1.png (renamed from app/assets/images/emoji/haircut_tone1.png)bin1945 -> 1945 bytes
-rw-r--r--public/-/emojis/1/haircut_tone2.png (renamed from app/assets/images/emoji/haircut_tone2.png)bin1935 -> 1935 bytes
-rw-r--r--public/-/emojis/1/haircut_tone3.png (renamed from app/assets/images/emoji/haircut_tone3.png)bin1923 -> 1923 bytes
-rw-r--r--public/-/emojis/1/haircut_tone4.png (renamed from app/assets/images/emoji/haircut_tone4.png)bin1904 -> 1904 bytes
-rw-r--r--public/-/emojis/1/haircut_tone5.png (renamed from app/assets/images/emoji/haircut_tone5.png)bin1920 -> 1920 bytes
-rw-r--r--public/-/emojis/1/hamburger.png (renamed from app/assets/images/emoji/hamburger.png)bin1973 -> 1973 bytes
-rw-r--r--public/-/emojis/1/hammer.png (renamed from app/assets/images/emoji/hammer.png)bin834 -> 834 bytes
-rw-r--r--public/-/emojis/1/hammer_pick.png (renamed from app/assets/images/emoji/hammer_pick.png)bin1068 -> 1068 bytes
-rw-r--r--public/-/emojis/1/hamster.png (renamed from app/assets/images/emoji/hamster.png)bin1279 -> 1279 bytes
-rw-r--r--public/-/emojis/1/hand_splayed.png (renamed from app/assets/images/emoji/hand_splayed.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/hand_splayed_tone1.png (renamed from app/assets/images/emoji/hand_splayed_tone1.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/hand_splayed_tone2.png (renamed from app/assets/images/emoji/hand_splayed_tone2.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/hand_splayed_tone3.png (renamed from app/assets/images/emoji/hand_splayed_tone3.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/hand_splayed_tone4.png (renamed from app/assets/images/emoji/hand_splayed_tone4.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/hand_splayed_tone5.png (renamed from app/assets/images/emoji/hand_splayed_tone5.png)bin1081 -> 1081 bytes
-rw-r--r--public/-/emojis/1/handbag.png (renamed from app/assets/images/emoji/handbag.png)bin1285 -> 1285 bytes
-rw-r--r--public/-/emojis/1/handball.png (renamed from app/assets/images/emoji/handball.png)bin1634 -> 1634 bytes
-rw-r--r--public/-/emojis/1/handball_tone1.png (renamed from app/assets/images/emoji/handball_tone1.png)bin1645 -> 1645 bytes
-rw-r--r--public/-/emojis/1/handball_tone2.png (renamed from app/assets/images/emoji/handball_tone2.png)bin1628 -> 1628 bytes
-rw-r--r--public/-/emojis/1/handball_tone3.png (renamed from app/assets/images/emoji/handball_tone3.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/handball_tone4.png (renamed from app/assets/images/emoji/handball_tone4.png)bin1634 -> 1634 bytes
-rw-r--r--public/-/emojis/1/handball_tone5.png (renamed from app/assets/images/emoji/handball_tone5.png)bin1606 -> 1606 bytes
-rw-r--r--public/-/emojis/1/handshake.png (renamed from app/assets/images/emoji/handshake.png)bin1366 -> 1366 bytes
-rw-r--r--public/-/emojis/1/handshake_tone1.png (renamed from app/assets/images/emoji/handshake_tone1.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/handshake_tone2.png (renamed from app/assets/images/emoji/handshake_tone2.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/handshake_tone3.png (renamed from app/assets/images/emoji/handshake_tone3.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/handshake_tone4.png (renamed from app/assets/images/emoji/handshake_tone4.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/handshake_tone5.png (renamed from app/assets/images/emoji/handshake_tone5.png)bin1381 -> 1381 bytes
-rw-r--r--public/-/emojis/1/hash.png (renamed from app/assets/images/emoji/hash.png)bin604 -> 604 bytes
-rw-r--r--public/-/emojis/1/hatched_chick.png (renamed from app/assets/images/emoji/hatched_chick.png)bin1174 -> 1174 bytes
-rw-r--r--public/-/emojis/1/hatching_chick.png (renamed from app/assets/images/emoji/hatching_chick.png)bin1598 -> 1598 bytes
-rw-r--r--public/-/emojis/1/head_bandage.png (renamed from app/assets/images/emoji/head_bandage.png)bin1199 -> 1199 bytes
-rw-r--r--public/-/emojis/1/headphones.png (renamed from app/assets/images/emoji/headphones.png)bin1202 -> 1202 bytes
-rw-r--r--public/-/emojis/1/hear_no_evil.png (renamed from app/assets/images/emoji/hear_no_evil.png)bin1210 -> 1210 bytes
-rw-r--r--public/-/emojis/1/heart.png (renamed from app/assets/images/emoji/heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/heart_decoration.png (renamed from app/assets/images/emoji/heart_decoration.png)bin557 -> 557 bytes
-rw-r--r--public/-/emojis/1/heart_exclamation.png (renamed from app/assets/images/emoji/heart_exclamation.png)bin471 -> 471 bytes
-rw-r--r--public/-/emojis/1/heart_eyes.png (renamed from app/assets/images/emoji/heart_eyes.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/heart_eyes_cat.png (renamed from app/assets/images/emoji/heart_eyes_cat.png)bin1512 -> 1512 bytes
-rw-r--r--public/-/emojis/1/heartbeat.png (renamed from app/assets/images/emoji/heartbeat.png)bin699 -> 699 bytes
-rw-r--r--public/-/emojis/1/heartpulse.png (renamed from app/assets/images/emoji/heartpulse.png)bin675 -> 675 bytes
-rw-r--r--public/-/emojis/1/hearts.png (renamed from app/assets/images/emoji/hearts.png)bin449 -> 449 bytes
-rw-r--r--public/-/emojis/1/heavy_check_mark.png (renamed from app/assets/images/emoji/heavy_check_mark.png)bin438 -> 438 bytes
-rw-r--r--public/-/emojis/1/heavy_division_sign.png (renamed from app/assets/images/emoji/heavy_division_sign.png)bin204 -> 204 bytes
-rw-r--r--public/-/emojis/1/heavy_dollar_sign.png (renamed from app/assets/images/emoji/heavy_dollar_sign.png)bin429 -> 429 bytes
-rw-r--r--public/-/emojis/1/heavy_minus_sign.png (renamed from app/assets/images/emoji/heavy_minus_sign.png)bin108 -> 108 bytes
-rw-r--r--public/-/emojis/1/heavy_multiplication_x.png (renamed from app/assets/images/emoji/heavy_multiplication_x.png)bin298 -> 298 bytes
-rw-r--r--public/-/emojis/1/heavy_plus_sign.png (renamed from app/assets/images/emoji/heavy_plus_sign.png)bin115 -> 115 bytes
-rw-r--r--public/-/emojis/1/helicopter.png (renamed from app/assets/images/emoji/helicopter.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/helmet_with_cross.png (renamed from app/assets/images/emoji/helmet_with_cross.png)bin1014 -> 1014 bytes
-rw-r--r--public/-/emojis/1/herb.png (renamed from app/assets/images/emoji/herb.png)bin886 -> 886 bytes
-rw-r--r--public/-/emojis/1/hibiscus.png (renamed from app/assets/images/emoji/hibiscus.png)bin1815 -> 1815 bytes
-rw-r--r--public/-/emojis/1/high_brightness.png (renamed from app/assets/images/emoji/high_brightness.png)bin474 -> 474 bytes
-rw-r--r--public/-/emojis/1/high_heel.png (renamed from app/assets/images/emoji/high_heel.png)bin1008 -> 1008 bytes
-rw-r--r--public/-/emojis/1/hockey.png (renamed from app/assets/images/emoji/hockey.png)bin1010 -> 1010 bytes
-rw-r--r--public/-/emojis/1/hole.png (renamed from app/assets/images/emoji/hole.png)bin1390 -> 1390 bytes
-rw-r--r--public/-/emojis/1/homes.png (renamed from app/assets/images/emoji/homes.png)bin981 -> 981 bytes
-rw-r--r--public/-/emojis/1/honey_pot.png (renamed from app/assets/images/emoji/honey_pot.png)bin1217 -> 1217 bytes
-rw-r--r--public/-/emojis/1/horse.png (renamed from app/assets/images/emoji/horse.png)bin1694 -> 1694 bytes
-rw-r--r--public/-/emojis/1/horse_racing.png (renamed from app/assets/images/emoji/horse_racing.png)bin2096 -> 2096 bytes
-rw-r--r--public/-/emojis/1/horse_racing_tone1.png (renamed from app/assets/images/emoji/horse_racing_tone1.png)bin2099 -> 2099 bytes
-rw-r--r--public/-/emojis/1/horse_racing_tone2.png (renamed from app/assets/images/emoji/horse_racing_tone2.png)bin2103 -> 2103 bytes
-rw-r--r--public/-/emojis/1/horse_racing_tone3.png (renamed from app/assets/images/emoji/horse_racing_tone3.png)bin2090 -> 2090 bytes
-rw-r--r--public/-/emojis/1/horse_racing_tone4.png (renamed from app/assets/images/emoji/horse_racing_tone4.png)bin2090 -> 2090 bytes
-rw-r--r--public/-/emojis/1/horse_racing_tone5.png (renamed from app/assets/images/emoji/horse_racing_tone5.png)bin2085 -> 2085 bytes
-rw-r--r--public/-/emojis/1/hospital.png (renamed from app/assets/images/emoji/hospital.png)bin530 -> 530 bytes
-rw-r--r--public/-/emojis/1/hot_pepper.png (renamed from app/assets/images/emoji/hot_pepper.png)bin677 -> 677 bytes
-rw-r--r--public/-/emojis/1/hotdog.png (renamed from app/assets/images/emoji/hotdog.png)bin1770 -> 1770 bytes
-rw-r--r--public/-/emojis/1/hotel.png (renamed from app/assets/images/emoji/hotel.png)bin1322 -> 1322 bytes
-rw-r--r--public/-/emojis/1/hotsprings.png (renamed from app/assets/images/emoji/hotsprings.png)bin733 -> 733 bytes
-rw-r--r--public/-/emojis/1/hourglass.png (renamed from app/assets/images/emoji/hourglass.png)bin800 -> 800 bytes
-rw-r--r--public/-/emojis/1/hourglass_flowing_sand.png (renamed from app/assets/images/emoji/hourglass_flowing_sand.png)bin847 -> 847 bytes
-rw-r--r--public/-/emojis/1/house.png (renamed from app/assets/images/emoji/house.png)bin863 -> 863 bytes
-rw-r--r--public/-/emojis/1/house_abandoned.png (renamed from app/assets/images/emoji/house_abandoned.png)bin1606 -> 1606 bytes
-rw-r--r--public/-/emojis/1/house_with_garden.png (renamed from app/assets/images/emoji/house_with_garden.png)bin1613 -> 1613 bytes
-rw-r--r--public/-/emojis/1/hugging.png (renamed from app/assets/images/emoji/hugging.png)bin1425 -> 1425 bytes
-rw-r--r--public/-/emojis/1/hushed.png (renamed from app/assets/images/emoji/hushed.png)bin634 -> 634 bytes
-rw-r--r--public/-/emojis/1/ice_cream.png (renamed from app/assets/images/emoji/ice_cream.png)bin1779 -> 1779 bytes
-rw-r--r--public/-/emojis/1/ice_skate.png (renamed from app/assets/images/emoji/ice_skate.png)bin1574 -> 1574 bytes
-rw-r--r--public/-/emojis/1/icecream.png (renamed from app/assets/images/emoji/icecream.png)bin1496 -> 1496 bytes
-rw-r--r--public/-/emojis/1/id.png (renamed from app/assets/images/emoji/id.png)bin348 -> 348 bytes
-rw-r--r--public/-/emojis/1/ideograph_advantage.png (renamed from app/assets/images/emoji/ideograph_advantage.png)bin716 -> 716 bytes
-rw-r--r--public/-/emojis/1/imp.png (renamed from app/assets/images/emoji/imp.png)bin1988 -> 1988 bytes
-rw-r--r--public/-/emojis/1/inbox_tray.png (renamed from app/assets/images/emoji/inbox_tray.png)bin1029 -> 1029 bytes
-rw-r--r--public/-/emojis/1/incoming_envelope.png (renamed from app/assets/images/emoji/incoming_envelope.png)bin1129 -> 1129 bytes
-rw-r--r--public/-/emojis/1/information_desk_person.png (renamed from app/assets/images/emoji/information_desk_person.png)bin1580 -> 1580 bytes
-rw-r--r--public/-/emojis/1/information_desk_person_tone1.png (renamed from app/assets/images/emoji/information_desk_person_tone1.png)bin1597 -> 1597 bytes
-rw-r--r--public/-/emojis/1/information_desk_person_tone2.png (renamed from app/assets/images/emoji/information_desk_person_tone2.png)bin1590 -> 1590 bytes
-rw-r--r--public/-/emojis/1/information_desk_person_tone3.png (renamed from app/assets/images/emoji/information_desk_person_tone3.png)bin1580 -> 1580 bytes
-rw-r--r--public/-/emojis/1/information_desk_person_tone4.png (renamed from app/assets/images/emoji/information_desk_person_tone4.png)bin1572 -> 1572 bytes
-rw-r--r--public/-/emojis/1/information_desk_person_tone5.png (renamed from app/assets/images/emoji/information_desk_person_tone5.png)bin1588 -> 1588 bytes
-rw-r--r--public/-/emojis/1/information_source.png (renamed from app/assets/images/emoji/information_source.png)bin506 -> 506 bytes
-rw-r--r--public/-/emojis/1/innocent.png (renamed from app/assets/images/emoji/innocent.png)bin935 -> 935 bytes
-rw-r--r--public/-/emojis/1/interrobang.png (renamed from app/assets/images/emoji/interrobang.png)bin601 -> 601 bytes
-rw-r--r--public/-/emojis/1/iphone.png (renamed from app/assets/images/emoji/iphone.png)bin695 -> 695 bytes
-rw-r--r--public/-/emojis/1/island.png (renamed from app/assets/images/emoji/island.png)bin1273 -> 1273 bytes
-rw-r--r--public/-/emojis/1/izakaya_lantern.png (renamed from app/assets/images/emoji/izakaya_lantern.png)bin1227 -> 1227 bytes
-rw-r--r--public/-/emojis/1/jack_o_lantern.png (renamed from app/assets/images/emoji/jack_o_lantern.png)bin2289 -> 2289 bytes
-rw-r--r--public/-/emojis/1/japan.png (renamed from app/assets/images/emoji/japan.png)bin539 -> 539 bytes
-rw-r--r--public/-/emojis/1/japanese_castle.png (renamed from app/assets/images/emoji/japanese_castle.png)bin1404 -> 1404 bytes
-rw-r--r--public/-/emojis/1/japanese_goblin.png (renamed from app/assets/images/emoji/japanese_goblin.png)bin1561 -> 1561 bytes
-rw-r--r--public/-/emojis/1/japanese_ogre.png (renamed from app/assets/images/emoji/japanese_ogre.png)bin1864 -> 1864 bytes
-rw-r--r--public/-/emojis/1/jeans.png (renamed from app/assets/images/emoji/jeans.png)bin1158 -> 1158 bytes
-rw-r--r--public/-/emojis/1/joy.png (renamed from app/assets/images/emoji/joy.png)bin1136 -> 1136 bytes
-rw-r--r--public/-/emojis/1/joy_cat.png (renamed from app/assets/images/emoji/joy_cat.png)bin1633 -> 1633 bytes
-rw-r--r--public/-/emojis/1/joystick.png (renamed from app/assets/images/emoji/joystick.png)bin1039 -> 1039 bytes
-rw-r--r--public/-/emojis/1/juggling.png (renamed from app/assets/images/emoji/juggling.png)bin1165 -> 1165 bytes
-rw-r--r--public/-/emojis/1/juggling_tone1.png (renamed from app/assets/images/emoji/juggling_tone1.png)bin1171 -> 1171 bytes
-rw-r--r--public/-/emojis/1/juggling_tone2.png (renamed from app/assets/images/emoji/juggling_tone2.png)bin1160 -> 1160 bytes
-rw-r--r--public/-/emojis/1/juggling_tone3.png (renamed from app/assets/images/emoji/juggling_tone3.png)bin1170 -> 1170 bytes
-rw-r--r--public/-/emojis/1/juggling_tone4.png (renamed from app/assets/images/emoji/juggling_tone4.png)bin1167 -> 1167 bytes
-rw-r--r--public/-/emojis/1/juggling_tone5.png (renamed from app/assets/images/emoji/juggling_tone5.png)bin1161 -> 1161 bytes
-rw-r--r--public/-/emojis/1/kaaba.png (renamed from app/assets/images/emoji/kaaba.png)bin1251 -> 1251 bytes
-rw-r--r--public/-/emojis/1/key.png (renamed from app/assets/images/emoji/key.png)bin770 -> 770 bytes
-rw-r--r--public/-/emojis/1/key2.png (renamed from app/assets/images/emoji/key2.png)bin593 -> 593 bytes
-rw-r--r--public/-/emojis/1/keyboard.png (renamed from app/assets/images/emoji/keyboard.png)bin429 -> 429 bytes
-rw-r--r--public/-/emojis/1/kimono.png (renamed from app/assets/images/emoji/kimono.png)bin1527 -> 1527 bytes
-rw-r--r--public/-/emojis/1/kiss.png (renamed from app/assets/images/emoji/kiss.png)bin842 -> 842 bytes
-rw-r--r--public/-/emojis/1/kiss_mm.png (renamed from app/assets/images/emoji/kiss_mm.png)bin1269 -> 1269 bytes
-rw-r--r--public/-/emojis/1/kiss_ww.png (renamed from app/assets/images/emoji/kiss_ww.png)bin1149 -> 1149 bytes
-rw-r--r--public/-/emojis/1/kissing.png (renamed from app/assets/images/emoji/kissing.png)bin738 -> 738 bytes
-rw-r--r--public/-/emojis/1/kissing_cat.png (renamed from app/assets/images/emoji/kissing_cat.png)bin1468 -> 1468 bytes
-rw-r--r--public/-/emojis/1/kissing_closed_eyes.png (renamed from app/assets/images/emoji/kissing_closed_eyes.png)bin888 -> 888 bytes
-rw-r--r--public/-/emojis/1/kissing_heart.png (renamed from app/assets/images/emoji/kissing_heart.png)bin843 -> 843 bytes
-rw-r--r--public/-/emojis/1/kissing_smiling_eyes.png (renamed from app/assets/images/emoji/kissing_smiling_eyes.png)bin648 -> 648 bytes
-rw-r--r--public/-/emojis/1/kiwi.png (renamed from app/assets/images/emoji/kiwi.png)bin1892 -> 1892 bytes
-rw-r--r--public/-/emojis/1/knife.png (renamed from app/assets/images/emoji/knife.png)bin616 -> 616 bytes
-rw-r--r--public/-/emojis/1/koala.png (renamed from app/assets/images/emoji/koala.png)bin1428 -> 1428 bytes
-rw-r--r--public/-/emojis/1/koko.png (renamed from app/assets/images/emoji/koko.png)bin266 -> 266 bytes
-rw-r--r--public/-/emojis/1/label.png (renamed from app/assets/images/emoji/label.png)bin669 -> 669 bytes
-rw-r--r--public/-/emojis/1/large_blue_circle.png (renamed from app/assets/images/emoji/large_blue_circle.png)bin371 -> 371 bytes
-rw-r--r--public/-/emojis/1/large_blue_diamond.png (renamed from app/assets/images/emoji/large_blue_diamond.png)bin245 -> 245 bytes
-rw-r--r--public/-/emojis/1/large_orange_diamond.png (renamed from app/assets/images/emoji/large_orange_diamond.png)bin248 -> 248 bytes
-rw-r--r--public/-/emojis/1/last_quarter_moon.png (renamed from app/assets/images/emoji/last_quarter_moon.png)bin1180 -> 1180 bytes
-rw-r--r--public/-/emojis/1/last_quarter_moon_with_face.png (renamed from app/assets/images/emoji/last_quarter_moon_with_face.png)bin1030 -> 1030 bytes
-rw-r--r--public/-/emojis/1/laughing.png (renamed from app/assets/images/emoji/laughing.png)bin901 -> 901 bytes
-rw-r--r--public/-/emojis/1/leaves.png (renamed from app/assets/images/emoji/leaves.png)bin993 -> 993 bytes
-rw-r--r--public/-/emojis/1/ledger.png (renamed from app/assets/images/emoji/ledger.png)bin1528 -> 1528 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist.png (renamed from app/assets/images/emoji/left_facing_fist.png)bin972 -> 972 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist_tone1.png (renamed from app/assets/images/emoji/left_facing_fist_tone1.png)bin960 -> 960 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist_tone2.png (renamed from app/assets/images/emoji/left_facing_fist_tone2.png)bin972 -> 972 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist_tone3.png (renamed from app/assets/images/emoji/left_facing_fist_tone3.png)bin960 -> 960 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist_tone4.png (renamed from app/assets/images/emoji/left_facing_fist_tone4.png)bin960 -> 960 bytes
-rw-r--r--public/-/emojis/1/left_facing_fist_tone5.png (renamed from app/assets/images/emoji/left_facing_fist_tone5.png)bin976 -> 976 bytes
-rw-r--r--public/-/emojis/1/left_luggage.png (renamed from app/assets/images/emoji/left_luggage.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/left_right_arrow.png (renamed from app/assets/images/emoji/left_right_arrow.png)bin495 -> 495 bytes
-rw-r--r--public/-/emojis/1/leftwards_arrow_with_hook.png (renamed from app/assets/images/emoji/leftwards_arrow_with_hook.png)bin643 -> 643 bytes
-rw-r--r--public/-/emojis/1/lemon.png (renamed from app/assets/images/emoji/lemon.png)bin1033 -> 1033 bytes
-rw-r--r--public/-/emojis/1/leo.png (renamed from app/assets/images/emoji/leo.png)bin745 -> 745 bytes
-rw-r--r--public/-/emojis/1/leopard.png (renamed from app/assets/images/emoji/leopard.png)bin2222 -> 2222 bytes
-rw-r--r--public/-/emojis/1/level_slider.png (renamed from app/assets/images/emoji/level_slider.png)bin454 -> 454 bytes
-rw-r--r--public/-/emojis/1/levitate.png (renamed from app/assets/images/emoji/levitate.png)bin914 -> 914 bytes
-rw-r--r--public/-/emojis/1/libra.png (renamed from app/assets/images/emoji/libra.png)bin657 -> 657 bytes
-rw-r--r--public/-/emojis/1/lifter.png (renamed from app/assets/images/emoji/lifter.png)bin1356 -> 1356 bytes
-rw-r--r--public/-/emojis/1/lifter_tone1.png (renamed from app/assets/images/emoji/lifter_tone1.png)bin1346 -> 1346 bytes
-rw-r--r--public/-/emojis/1/lifter_tone2.png (renamed from app/assets/images/emoji/lifter_tone2.png)bin1347 -> 1347 bytes
-rw-r--r--public/-/emojis/1/lifter_tone3.png (renamed from app/assets/images/emoji/lifter_tone3.png)bin1339 -> 1339 bytes
-rw-r--r--public/-/emojis/1/lifter_tone4.png (renamed from app/assets/images/emoji/lifter_tone4.png)bin1343 -> 1343 bytes
-rw-r--r--public/-/emojis/1/lifter_tone5.png (renamed from app/assets/images/emoji/lifter_tone5.png)bin1337 -> 1337 bytes
-rw-r--r--public/-/emojis/1/light_rail.png (renamed from app/assets/images/emoji/light_rail.png)bin902 -> 902 bytes
-rw-r--r--public/-/emojis/1/link.png (renamed from app/assets/images/emoji/link.png)bin477 -> 477 bytes
-rw-r--r--public/-/emojis/1/lion_face.png (renamed from app/assets/images/emoji/lion_face.png)bin1728 -> 1728 bytes
-rw-r--r--public/-/emojis/1/lips.png (renamed from app/assets/images/emoji/lips.png)bin599 -> 599 bytes
-rw-r--r--public/-/emojis/1/lipstick.png (renamed from app/assets/images/emoji/lipstick.png)bin549 -> 549 bytes
-rw-r--r--public/-/emojis/1/lizard.png (renamed from app/assets/images/emoji/lizard.png)bin1709 -> 1709 bytes
-rw-r--r--public/-/emojis/1/lock.png (renamed from app/assets/images/emoji/lock.png)bin986 -> 986 bytes
-rw-r--r--public/-/emojis/1/lock_with_ink_pen.png (renamed from app/assets/images/emoji/lock_with_ink_pen.png)bin1123 -> 1123 bytes
-rw-r--r--public/-/emojis/1/lollipop.png (renamed from app/assets/images/emoji/lollipop.png)bin2164 -> 2164 bytes
-rw-r--r--public/-/emojis/1/loop.png (renamed from app/assets/images/emoji/loop.png)bin550 -> 550 bytes
-rw-r--r--public/-/emojis/1/loud_sound.png (renamed from app/assets/images/emoji/loud_sound.png)bin977 -> 977 bytes
-rw-r--r--public/-/emojis/1/loudspeaker.png (renamed from app/assets/images/emoji/loudspeaker.png)bin1316 -> 1316 bytes
-rw-r--r--public/-/emojis/1/love_hotel.png (renamed from app/assets/images/emoji/love_hotel.png)bin372 -> 372 bytes
-rw-r--r--public/-/emojis/1/love_letter.png (renamed from app/assets/images/emoji/love_letter.png)bin923 -> 923 bytes
-rw-r--r--public/-/emojis/1/low_brightness.png (renamed from app/assets/images/emoji/low_brightness.png)bin431 -> 431 bytes
-rw-r--r--public/-/emojis/1/lying_face.png (renamed from app/assets/images/emoji/lying_face.png)bin1103 -> 1103 bytes
-rw-r--r--public/-/emojis/1/m.png (renamed from app/assets/images/emoji/m.png)bin500 -> 500 bytes
-rw-r--r--public/-/emojis/1/mag.png (renamed from app/assets/images/emoji/mag.png)bin1240 -> 1240 bytes
-rw-r--r--public/-/emojis/1/mag_right.png (renamed from app/assets/images/emoji/mag_right.png)bin1251 -> 1251 bytes
-rw-r--r--public/-/emojis/1/mahjong.png (renamed from app/assets/images/emoji/mahjong.png)bin951 -> 951 bytes
-rw-r--r--public/-/emojis/1/mailbox.png (renamed from app/assets/images/emoji/mailbox.png)bin1166 -> 1166 bytes
-rw-r--r--public/-/emojis/1/mailbox_closed.png (renamed from app/assets/images/emoji/mailbox_closed.png)bin1192 -> 1192 bytes
-rw-r--r--public/-/emojis/1/mailbox_with_mail.png (renamed from app/assets/images/emoji/mailbox_with_mail.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/mailbox_with_no_mail.png (renamed from app/assets/images/emoji/mailbox_with_no_mail.png)bin960 -> 960 bytes
-rw-r--r--public/-/emojis/1/man.png (renamed from app/assets/images/emoji/man.png)bin1092 -> 1092 bytes
-rw-r--r--public/-/emojis/1/man_dancing.png (renamed from app/assets/images/emoji/man_dancing.png)bin1400 -> 1400 bytes
-rw-r--r--public/-/emojis/1/man_dancing_tone1.png (renamed from app/assets/images/emoji/man_dancing_tone1.png)bin1404 -> 1404 bytes
-rw-r--r--public/-/emojis/1/man_dancing_tone2.png (renamed from app/assets/images/emoji/man_dancing_tone2.png)bin1402 -> 1402 bytes
-rw-r--r--public/-/emojis/1/man_dancing_tone3.png (renamed from app/assets/images/emoji/man_dancing_tone3.png)bin1409 -> 1409 bytes
-rw-r--r--public/-/emojis/1/man_dancing_tone4.png (renamed from app/assets/images/emoji/man_dancing_tone4.png)bin1421 -> 1421 bytes
-rw-r--r--public/-/emojis/1/man_dancing_tone5.png (renamed from app/assets/images/emoji/man_dancing_tone5.png)bin1418 -> 1418 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo.png (renamed from app/assets/images/emoji/man_in_tuxedo.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo_tone1.png (renamed from app/assets/images/emoji/man_in_tuxedo_tone1.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo_tone2.png (renamed from app/assets/images/emoji/man_in_tuxedo_tone2.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo_tone3.png (renamed from app/assets/images/emoji/man_in_tuxedo_tone3.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo_tone4.png (renamed from app/assets/images/emoji/man_in_tuxedo_tone4.png)bin1307 -> 1307 bytes
-rw-r--r--public/-/emojis/1/man_in_tuxedo_tone5.png (renamed from app/assets/images/emoji/man_in_tuxedo_tone5.png)bin1302 -> 1302 bytes
-rw-r--r--public/-/emojis/1/man_tone1.png (renamed from app/assets/images/emoji/man_tone1.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/man_tone2.png (renamed from app/assets/images/emoji/man_tone2.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/man_tone3.png (renamed from app/assets/images/emoji/man_tone3.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/man_tone4.png (renamed from app/assets/images/emoji/man_tone4.png)bin1069 -> 1069 bytes
-rw-r--r--public/-/emojis/1/man_tone5.png (renamed from app/assets/images/emoji/man_tone5.png)bin1087 -> 1087 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao.png)bin1339 -> 1339 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao_tone1.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao_tone1.png)bin1328 -> 1328 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao_tone2.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao_tone2.png)bin1332 -> 1332 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao_tone3.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao_tone3.png)bin1329 -> 1329 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao_tone4.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao_tone4.png)bin1325 -> 1325 bytes
-rw-r--r--public/-/emojis/1/man_with_gua_pi_mao_tone5.png (renamed from app/assets/images/emoji/man_with_gua_pi_mao_tone5.png)bin1337 -> 1337 bytes
-rw-r--r--public/-/emojis/1/man_with_turban.png (renamed from app/assets/images/emoji/man_with_turban.png)bin1618 -> 1618 bytes
-rw-r--r--public/-/emojis/1/man_with_turban_tone1.png (renamed from app/assets/images/emoji/man_with_turban_tone1.png)bin1584 -> 1584 bytes
-rw-r--r--public/-/emojis/1/man_with_turban_tone2.png (renamed from app/assets/images/emoji/man_with_turban_tone2.png)bin1588 -> 1588 bytes
-rw-r--r--public/-/emojis/1/man_with_turban_tone3.png (renamed from app/assets/images/emoji/man_with_turban_tone3.png)bin1584 -> 1584 bytes
-rw-r--r--public/-/emojis/1/man_with_turban_tone4.png (renamed from app/assets/images/emoji/man_with_turban_tone4.png)bin1583 -> 1583 bytes
-rw-r--r--public/-/emojis/1/man_with_turban_tone5.png (renamed from app/assets/images/emoji/man_with_turban_tone5.png)bin1605 -> 1605 bytes
-rw-r--r--public/-/emojis/1/mans_shoe.png (renamed from app/assets/images/emoji/mans_shoe.png)bin1649 -> 1649 bytes
-rw-r--r--public/-/emojis/1/map.png (renamed from app/assets/images/emoji/map.png)bin2352 -> 2352 bytes
-rw-r--r--public/-/emojis/1/maple_leaf.png (renamed from app/assets/images/emoji/maple_leaf.png)bin1117 -> 1117 bytes
-rw-r--r--public/-/emojis/1/martial_arts_uniform.png (renamed from app/assets/images/emoji/martial_arts_uniform.png)bin1412 -> 1412 bytes
-rw-r--r--public/-/emojis/1/mask.png (renamed from app/assets/images/emoji/mask.png)bin1322 -> 1322 bytes
-rw-r--r--public/-/emojis/1/massage.png (renamed from app/assets/images/emoji/massage.png)bin1571 -> 1571 bytes
-rw-r--r--public/-/emojis/1/massage_tone1.png (renamed from app/assets/images/emoji/massage_tone1.png)bin1578 -> 1578 bytes
-rw-r--r--public/-/emojis/1/massage_tone2.png (renamed from app/assets/images/emoji/massage_tone2.png)bin1565 -> 1565 bytes
-rw-r--r--public/-/emojis/1/massage_tone3.png (renamed from app/assets/images/emoji/massage_tone3.png)bin1553 -> 1553 bytes
-rw-r--r--public/-/emojis/1/massage_tone4.png (renamed from app/assets/images/emoji/massage_tone4.png)bin1546 -> 1546 bytes
-rw-r--r--public/-/emojis/1/massage_tone5.png (renamed from app/assets/images/emoji/massage_tone5.png)bin1557 -> 1557 bytes
-rw-r--r--public/-/emojis/1/meat_on_bone.png (renamed from app/assets/images/emoji/meat_on_bone.png)bin1465 -> 1465 bytes
-rw-r--r--public/-/emojis/1/medal.png (renamed from app/assets/images/emoji/medal.png)bin1700 -> 1700 bytes
-rw-r--r--public/-/emojis/1/mega.png (renamed from app/assets/images/emoji/mega.png)bin1751 -> 1751 bytes
-rw-r--r--public/-/emojis/1/melon.png (renamed from app/assets/images/emoji/melon.png)bin2005 -> 2005 bytes
-rw-r--r--public/-/emojis/1/menorah.png (renamed from app/assets/images/emoji/menorah.png)bin1279 -> 1279 bytes
-rw-r--r--public/-/emojis/1/mens.png (renamed from app/assets/images/emoji/mens.png)bin561 -> 561 bytes
-rw-r--r--public/-/emojis/1/metal.png (renamed from app/assets/images/emoji/metal.png)bin894 -> 894 bytes
-rw-r--r--public/-/emojis/1/metal_tone1.png (renamed from app/assets/images/emoji/metal_tone1.png)bin894 -> 894 bytes
-rw-r--r--public/-/emojis/1/metal_tone2.png (renamed from app/assets/images/emoji/metal_tone2.png)bin888 -> 888 bytes
-rw-r--r--public/-/emojis/1/metal_tone3.png (renamed from app/assets/images/emoji/metal_tone3.png)bin894 -> 894 bytes
-rw-r--r--public/-/emojis/1/metal_tone4.png (renamed from app/assets/images/emoji/metal_tone4.png)bin888 -> 888 bytes
-rw-r--r--public/-/emojis/1/metal_tone5.png (renamed from app/assets/images/emoji/metal_tone5.png)bin894 -> 894 bytes
-rw-r--r--public/-/emojis/1/metro.png (renamed from app/assets/images/emoji/metro.png)bin1020 -> 1020 bytes
-rw-r--r--public/-/emojis/1/microphone.png (renamed from app/assets/images/emoji/microphone.png)bin1165 -> 1165 bytes
-rw-r--r--public/-/emojis/1/microphone2.png (renamed from app/assets/images/emoji/microphone2.png)bin839 -> 839 bytes
-rw-r--r--public/-/emojis/1/microscope.png (renamed from app/assets/images/emoji/microscope.png)bin1113 -> 1113 bytes
-rw-r--r--public/-/emojis/1/middle_finger.png (renamed from app/assets/images/emoji/middle_finger.png)bin893 -> 893 bytes
-rw-r--r--public/-/emojis/1/middle_finger_tone1.png (renamed from app/assets/images/emoji/middle_finger_tone1.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/middle_finger_tone2.png (renamed from app/assets/images/emoji/middle_finger_tone2.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/middle_finger_tone3.png (renamed from app/assets/images/emoji/middle_finger_tone3.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/middle_finger_tone4.png (renamed from app/assets/images/emoji/middle_finger_tone4.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/middle_finger_tone5.png (renamed from app/assets/images/emoji/middle_finger_tone5.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/military_medal.png (renamed from app/assets/images/emoji/military_medal.png)bin949 -> 949 bytes
-rw-r--r--public/-/emojis/1/milk.png (renamed from app/assets/images/emoji/milk.png)bin1224 -> 1224 bytes
-rw-r--r--public/-/emojis/1/milky_way.png (renamed from app/assets/images/emoji/milky_way.png)bin622 -> 622 bytes
-rw-r--r--public/-/emojis/1/minibus.png (renamed from app/assets/images/emoji/minibus.png)bin1256 -> 1256 bytes
-rw-r--r--public/-/emojis/1/minidisc.png (renamed from app/assets/images/emoji/minidisc.png)bin522 -> 522 bytes
-rw-r--r--public/-/emojis/1/mobile_phone_off.png (renamed from app/assets/images/emoji/mobile_phone_off.png)bin621 -> 621 bytes
-rw-r--r--public/-/emojis/1/money_mouth.png (renamed from app/assets/images/emoji/money_mouth.png)bin967 -> 967 bytes
-rw-r--r--public/-/emojis/1/money_with_wings.png (renamed from app/assets/images/emoji/money_with_wings.png)bin2327 -> 2327 bytes
-rw-r--r--public/-/emojis/1/moneybag.png (renamed from app/assets/images/emoji/moneybag.png)bin2310 -> 2310 bytes
-rw-r--r--public/-/emojis/1/monkey.png (renamed from app/assets/images/emoji/monkey.png)bin1348 -> 1348 bytes
-rw-r--r--public/-/emojis/1/monkey_face.png (renamed from app/assets/images/emoji/monkey_face.png)bin1022 -> 1022 bytes
-rw-r--r--public/-/emojis/1/monorail.png (renamed from app/assets/images/emoji/monorail.png)bin1068 -> 1068 bytes
-rw-r--r--public/-/emojis/1/mortar_board.png (renamed from app/assets/images/emoji/mortar_board.png)bin710 -> 710 bytes
-rw-r--r--public/-/emojis/1/mosque.png (renamed from app/assets/images/emoji/mosque.png)bin984 -> 984 bytes
-rw-r--r--public/-/emojis/1/motor_scooter.png (renamed from app/assets/images/emoji/motor_scooter.png)bin1207 -> 1207 bytes
-rw-r--r--public/-/emojis/1/motorboat.png (renamed from app/assets/images/emoji/motorboat.png)bin990 -> 990 bytes
-rw-r--r--public/-/emojis/1/motorcycle.png (renamed from app/assets/images/emoji/motorcycle.png)bin2081 -> 2081 bytes
-rw-r--r--public/-/emojis/1/motorway.png (renamed from app/assets/images/emoji/motorway.png)bin1102 -> 1102 bytes
-rw-r--r--public/-/emojis/1/mount_fuji.png (renamed from app/assets/images/emoji/mount_fuji.png)bin881 -> 881 bytes
-rw-r--r--public/-/emojis/1/mountain.png (renamed from app/assets/images/emoji/mountain.png)bin1409 -> 1409 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist.png (renamed from app/assets/images/emoji/mountain_bicyclist.png)bin2288 -> 2288 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist_tone1.png (renamed from app/assets/images/emoji/mountain_bicyclist_tone1.png)bin2294 -> 2294 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist_tone2.png (renamed from app/assets/images/emoji/mountain_bicyclist_tone2.png)bin2298 -> 2298 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist_tone3.png (renamed from app/assets/images/emoji/mountain_bicyclist_tone3.png)bin2284 -> 2284 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist_tone4.png (renamed from app/assets/images/emoji/mountain_bicyclist_tone4.png)bin2288 -> 2288 bytes
-rw-r--r--public/-/emojis/1/mountain_bicyclist_tone5.png (renamed from app/assets/images/emoji/mountain_bicyclist_tone5.png)bin2281 -> 2281 bytes
-rw-r--r--public/-/emojis/1/mountain_cableway.png (renamed from app/assets/images/emoji/mountain_cableway.png)bin811 -> 811 bytes
-rw-r--r--public/-/emojis/1/mountain_railway.png (renamed from app/assets/images/emoji/mountain_railway.png)bin1317 -> 1317 bytes
-rw-r--r--public/-/emojis/1/mountain_snow.png (renamed from app/assets/images/emoji/mountain_snow.png)bin1193 -> 1193 bytes
-rw-r--r--public/-/emojis/1/mouse.png (renamed from app/assets/images/emoji/mouse.png)bin1245 -> 1245 bytes
-rw-r--r--public/-/emojis/1/mouse2.png (renamed from app/assets/images/emoji/mouse2.png)bin1324 -> 1324 bytes
-rw-r--r--public/-/emojis/1/mouse_three_button.png (renamed from app/assets/images/emoji/mouse_three_button.png)bin934 -> 934 bytes
-rw-r--r--public/-/emojis/1/movie_camera.png (renamed from app/assets/images/emoji/movie_camera.png)bin576 -> 576 bytes
-rw-r--r--public/-/emojis/1/moyai.png (renamed from app/assets/images/emoji/moyai.png)bin1593 -> 1593 bytes
-rw-r--r--public/-/emojis/1/mrs_claus.png (renamed from app/assets/images/emoji/mrs_claus.png)bin3338 -> 3338 bytes
-rw-r--r--public/-/emojis/1/mrs_claus_tone1.png (renamed from app/assets/images/emoji/mrs_claus_tone1.png)bin1999 -> 1999 bytes
-rw-r--r--public/-/emojis/1/mrs_claus_tone2.png (renamed from app/assets/images/emoji/mrs_claus_tone2.png)bin2006 -> 2006 bytes
-rw-r--r--public/-/emojis/1/mrs_claus_tone3.png (renamed from app/assets/images/emoji/mrs_claus_tone3.png)bin2017 -> 2017 bytes
-rw-r--r--public/-/emojis/1/mrs_claus_tone4.png (renamed from app/assets/images/emoji/mrs_claus_tone4.png)bin2016 -> 2016 bytes
-rw-r--r--public/-/emojis/1/mrs_claus_tone5.png (renamed from app/assets/images/emoji/mrs_claus_tone5.png)bin2016 -> 2016 bytes
-rw-r--r--public/-/emojis/1/muscle.png (renamed from app/assets/images/emoji/muscle.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/muscle_tone1.png (renamed from app/assets/images/emoji/muscle_tone1.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/muscle_tone2.png (renamed from app/assets/images/emoji/muscle_tone2.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/muscle_tone3.png (renamed from app/assets/images/emoji/muscle_tone3.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/muscle_tone4.png (renamed from app/assets/images/emoji/muscle_tone4.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/muscle_tone5.png (renamed from app/assets/images/emoji/muscle_tone5.png)bin1012 -> 1012 bytes
-rw-r--r--public/-/emojis/1/mushroom.png (renamed from app/assets/images/emoji/mushroom.png)bin1024 -> 1024 bytes
-rw-r--r--public/-/emojis/1/musical_keyboard.png (renamed from app/assets/images/emoji/musical_keyboard.png)bin1695 -> 1695 bytes
-rw-r--r--public/-/emojis/1/musical_note.png (renamed from app/assets/images/emoji/musical_note.png)bin419 -> 419 bytes
-rw-r--r--public/-/emojis/1/musical_score.png (renamed from app/assets/images/emoji/musical_score.png)bin1289 -> 1289 bytes
-rw-r--r--public/-/emojis/1/mute.png (renamed from app/assets/images/emoji/mute.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/nail_care.png (renamed from app/assets/images/emoji/nail_care.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/nail_care_tone1.png (renamed from app/assets/images/emoji/nail_care_tone1.png)bin1712 -> 1712 bytes
-rw-r--r--public/-/emojis/1/nail_care_tone2.png (renamed from app/assets/images/emoji/nail_care_tone2.png)bin1711 -> 1711 bytes
-rw-r--r--public/-/emojis/1/nail_care_tone3.png (renamed from app/assets/images/emoji/nail_care_tone3.png)bin1727 -> 1727 bytes
-rw-r--r--public/-/emojis/1/nail_care_tone4.png (renamed from app/assets/images/emoji/nail_care_tone4.png)bin1728 -> 1728 bytes
-rw-r--r--public/-/emojis/1/nail_care_tone5.png (renamed from app/assets/images/emoji/nail_care_tone5.png)bin1716 -> 1716 bytes
-rw-r--r--public/-/emojis/1/name_badge.png (renamed from app/assets/images/emoji/name_badge.png)bin632 -> 632 bytes
-rw-r--r--public/-/emojis/1/nauseated_face.png (renamed from app/assets/images/emoji/nauseated_face.png)bin965 -> 965 bytes
-rw-r--r--public/-/emojis/1/necktie.png (renamed from app/assets/images/emoji/necktie.png)bin995 -> 995 bytes
-rw-r--r--public/-/emojis/1/negative_squared_cross_mark.png (renamed from app/assets/images/emoji/negative_squared_cross_mark.png)bin370 -> 370 bytes
-rw-r--r--public/-/emojis/1/nerd.png (renamed from app/assets/images/emoji/nerd.png)bin975 -> 975 bytes
-rw-r--r--public/-/emojis/1/neutral_face.png (renamed from app/assets/images/emoji/neutral_face.png)bin517 -> 517 bytes
-rw-r--r--public/-/emojis/1/new.png (renamed from app/assets/images/emoji/new.png)bin486 -> 486 bytes
-rw-r--r--public/-/emojis/1/new_moon.png (renamed from app/assets/images/emoji/new_moon.png)bin829 -> 829 bytes
-rw-r--r--public/-/emojis/1/new_moon_with_face.png (renamed from app/assets/images/emoji/new_moon_with_face.png)bin975 -> 975 bytes
-rw-r--r--public/-/emojis/1/newspaper.png (renamed from app/assets/images/emoji/newspaper.png)bin1178 -> 1178 bytes
-rw-r--r--public/-/emojis/1/newspaper2.png (renamed from app/assets/images/emoji/newspaper2.png)bin1046 -> 1046 bytes
-rw-r--r--public/-/emojis/1/ng.png (renamed from app/assets/images/emoji/ng.png)bin445 -> 445 bytes
-rw-r--r--public/-/emojis/1/night_with_stars.png (renamed from app/assets/images/emoji/night_with_stars.png)bin835 -> 835 bytes
-rw-r--r--public/-/emojis/1/nine.png (renamed from app/assets/images/emoji/nine.png)bin607 -> 607 bytes
-rw-r--r--public/-/emojis/1/no_bell.png (renamed from app/assets/images/emoji/no_bell.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/no_bicycles.png (renamed from app/assets/images/emoji/no_bicycles.png)bin998 -> 998 bytes
-rw-r--r--public/-/emojis/1/no_entry.png (renamed from app/assets/images/emoji/no_entry.png)bin377 -> 377 bytes
-rw-r--r--public/-/emojis/1/no_entry_sign.png (renamed from app/assets/images/emoji/no_entry_sign.png)bin555 -> 555 bytes
-rw-r--r--public/-/emojis/1/no_good.png (renamed from app/assets/images/emoji/no_good.png)bin1750 -> 1750 bytes
-rw-r--r--public/-/emojis/1/no_good_tone1.png (renamed from app/assets/images/emoji/no_good_tone1.png)bin1767 -> 1767 bytes
-rw-r--r--public/-/emojis/1/no_good_tone2.png (renamed from app/assets/images/emoji/no_good_tone2.png)bin1756 -> 1756 bytes
-rw-r--r--public/-/emojis/1/no_good_tone3.png (renamed from app/assets/images/emoji/no_good_tone3.png)bin1766 -> 1766 bytes
-rw-r--r--public/-/emojis/1/no_good_tone4.png (renamed from app/assets/images/emoji/no_good_tone4.png)bin1782 -> 1782 bytes
-rw-r--r--public/-/emojis/1/no_good_tone5.png (renamed from app/assets/images/emoji/no_good_tone5.png)bin1784 -> 1784 bytes
-rw-r--r--public/-/emojis/1/no_mobile_phones.png (renamed from app/assets/images/emoji/no_mobile_phones.png)bin790 -> 790 bytes
-rw-r--r--public/-/emojis/1/no_mouth.png (renamed from app/assets/images/emoji/no_mouth.png)bin465 -> 465 bytes
-rw-r--r--public/-/emojis/1/no_pedestrians.png (renamed from app/assets/images/emoji/no_pedestrians.png)bin875 -> 875 bytes
-rw-r--r--public/-/emojis/1/no_smoking.png (renamed from app/assets/images/emoji/no_smoking.png)bin1136 -> 1136 bytes
-rw-r--r--public/-/emojis/1/non-potable_water.png (renamed from app/assets/images/emoji/non-potable_water.png)bin827 -> 827 bytes
-rw-r--r--public/-/emojis/1/nose.png (renamed from app/assets/images/emoji/nose.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/nose_tone1.png (renamed from app/assets/images/emoji/nose_tone1.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/nose_tone2.png (renamed from app/assets/images/emoji/nose_tone2.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/nose_tone3.png (renamed from app/assets/images/emoji/nose_tone3.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/nose_tone4.png (renamed from app/assets/images/emoji/nose_tone4.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/nose_tone5.png (renamed from app/assets/images/emoji/nose_tone5.png)bin703 -> 703 bytes
-rw-r--r--public/-/emojis/1/notebook.png (renamed from app/assets/images/emoji/notebook.png)bin1215 -> 1215 bytes
-rw-r--r--public/-/emojis/1/notebook_with_decorative_cover.png (renamed from app/assets/images/emoji/notebook_with_decorative_cover.png)bin1782 -> 1782 bytes
-rw-r--r--public/-/emojis/1/notepad_spiral.png (renamed from app/assets/images/emoji/notepad_spiral.png)bin1377 -> 1377 bytes
-rw-r--r--public/-/emojis/1/notes.png (renamed from app/assets/images/emoji/notes.png)bin501 -> 501 bytes
-rw-r--r--public/-/emojis/1/nut_and_bolt.png (renamed from app/assets/images/emoji/nut_and_bolt.png)bin899 -> 899 bytes
-rw-r--r--public/-/emojis/1/o.png (renamed from app/assets/images/emoji/o.png)bin475 -> 475 bytes
-rw-r--r--public/-/emojis/1/o2.png (renamed from app/assets/images/emoji/o2.png)bin425 -> 425 bytes
-rw-r--r--public/-/emojis/1/ocean.png (renamed from app/assets/images/emoji/ocean.png)bin1018 -> 1018 bytes
-rw-r--r--public/-/emojis/1/octagonal_sign.png (renamed from app/assets/images/emoji/octagonal_sign.png)bin260 -> 260 bytes
-rw-r--r--public/-/emojis/1/octopus.png (renamed from app/assets/images/emoji/octopus.png)bin1188 -> 1188 bytes
-rw-r--r--public/-/emojis/1/oden.png (renamed from app/assets/images/emoji/oden.png)bin794 -> 794 bytes
-rw-r--r--public/-/emojis/1/office.png (renamed from app/assets/images/emoji/office.png)bin524 -> 524 bytes
-rw-r--r--public/-/emojis/1/oil.png (renamed from app/assets/images/emoji/oil.png)bin674 -> 674 bytes
-rw-r--r--public/-/emojis/1/ok.png (renamed from app/assets/images/emoji/ok.png)bin511 -> 511 bytes
-rw-r--r--public/-/emojis/1/ok_hand.png (renamed from app/assets/images/emoji/ok_hand.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_hand_tone1.png (renamed from app/assets/images/emoji/ok_hand_tone1.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_hand_tone2.png (renamed from app/assets/images/emoji/ok_hand_tone2.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_hand_tone3.png (renamed from app/assets/images/emoji/ok_hand_tone3.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_hand_tone4.png (renamed from app/assets/images/emoji/ok_hand_tone4.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_hand_tone5.png (renamed from app/assets/images/emoji/ok_hand_tone5.png)bin979 -> 979 bytes
-rw-r--r--public/-/emojis/1/ok_woman.png (renamed from app/assets/images/emoji/ok_woman.png)bin1696 -> 1696 bytes
-rw-r--r--public/-/emojis/1/ok_woman_tone1.png (renamed from app/assets/images/emoji/ok_woman_tone1.png)bin1696 -> 1696 bytes
-rw-r--r--public/-/emojis/1/ok_woman_tone2.png (renamed from app/assets/images/emoji/ok_woman_tone2.png)bin1694 -> 1694 bytes
-rw-r--r--public/-/emojis/1/ok_woman_tone3.png (renamed from app/assets/images/emoji/ok_woman_tone3.png)bin1675 -> 1675 bytes
-rw-r--r--public/-/emojis/1/ok_woman_tone4.png (renamed from app/assets/images/emoji/ok_woman_tone4.png)bin1684 -> 1684 bytes
-rw-r--r--public/-/emojis/1/ok_woman_tone5.png (renamed from app/assets/images/emoji/ok_woman_tone5.png)bin1696 -> 1696 bytes
-rw-r--r--public/-/emojis/1/older_man.png (renamed from app/assets/images/emoji/older_man.png)bin1253 -> 1253 bytes
-rw-r--r--public/-/emojis/1/older_man_tone1.png (renamed from app/assets/images/emoji/older_man_tone1.png)bin1253 -> 1253 bytes
-rw-r--r--public/-/emojis/1/older_man_tone2.png (renamed from app/assets/images/emoji/older_man_tone2.png)bin1253 -> 1253 bytes
-rw-r--r--public/-/emojis/1/older_man_tone3.png (renamed from app/assets/images/emoji/older_man_tone3.png)bin1253 -> 1253 bytes
-rw-r--r--public/-/emojis/1/older_man_tone4.png (renamed from app/assets/images/emoji/older_man_tone4.png)bin1254 -> 1254 bytes
-rw-r--r--public/-/emojis/1/older_man_tone5.png (renamed from app/assets/images/emoji/older_man_tone5.png)bin1254 -> 1254 bytes
-rw-r--r--public/-/emojis/1/older_woman.png (renamed from app/assets/images/emoji/older_woman.png)bin1472 -> 1472 bytes
-rw-r--r--public/-/emojis/1/older_woman_tone1.png (renamed from app/assets/images/emoji/older_woman_tone1.png)bin1562 -> 1562 bytes
-rw-r--r--public/-/emojis/1/older_woman_tone2.png (renamed from app/assets/images/emoji/older_woman_tone2.png)bin1564 -> 1564 bytes
-rw-r--r--public/-/emojis/1/older_woman_tone3.png (renamed from app/assets/images/emoji/older_woman_tone3.png)bin1555 -> 1555 bytes
-rw-r--r--public/-/emojis/1/older_woman_tone4.png (renamed from app/assets/images/emoji/older_woman_tone4.png)bin1562 -> 1562 bytes
-rw-r--r--public/-/emojis/1/older_woman_tone5.png (renamed from app/assets/images/emoji/older_woman_tone5.png)bin1544 -> 1544 bytes
-rw-r--r--public/-/emojis/1/om_symbol.png (renamed from app/assets/images/emoji/om_symbol.png)bin773 -> 773 bytes
-rw-r--r--public/-/emojis/1/on.png (renamed from app/assets/images/emoji/on.png)bin459 -> 459 bytes
-rw-r--r--public/-/emojis/1/oncoming_automobile.png (renamed from app/assets/images/emoji/oncoming_automobile.png)bin1238 -> 1238 bytes
-rw-r--r--public/-/emojis/1/oncoming_bus.png (renamed from app/assets/images/emoji/oncoming_bus.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/oncoming_police_car.png (renamed from app/assets/images/emoji/oncoming_police_car.png)bin1547 -> 1547 bytes
-rw-r--r--public/-/emojis/1/oncoming_taxi.png (renamed from app/assets/images/emoji/oncoming_taxi.png)bin1405 -> 1405 bytes
-rw-r--r--public/-/emojis/1/one.png (renamed from app/assets/images/emoji/one.png)bin442 -> 442 bytes
-rw-r--r--public/-/emojis/1/open_file_folder.png (renamed from app/assets/images/emoji/open_file_folder.png)bin755 -> 755 bytes
-rw-r--r--public/-/emojis/1/open_hands.png (renamed from app/assets/images/emoji/open_hands.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_hands_tone1.png (renamed from app/assets/images/emoji/open_hands_tone1.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_hands_tone2.png (renamed from app/assets/images/emoji/open_hands_tone2.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_hands_tone3.png (renamed from app/assets/images/emoji/open_hands_tone3.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_hands_tone4.png (renamed from app/assets/images/emoji/open_hands_tone4.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_hands_tone5.png (renamed from app/assets/images/emoji/open_hands_tone5.png)bin1053 -> 1053 bytes
-rw-r--r--public/-/emojis/1/open_mouth.png (renamed from app/assets/images/emoji/open_mouth.png)bin575 -> 575 bytes
-rw-r--r--public/-/emojis/1/ophiuchus.png (renamed from app/assets/images/emoji/ophiuchus.png)bin723 -> 723 bytes
-rw-r--r--public/-/emojis/1/orange_book.png (renamed from app/assets/images/emoji/orange_book.png)bin1329 -> 1329 bytes
-rw-r--r--public/-/emojis/1/orthodox_cross.png (renamed from app/assets/images/emoji/orthodox_cross.png)bin239 -> 239 bytes
-rw-r--r--public/-/emojis/1/outbox_tray.png (renamed from app/assets/images/emoji/outbox_tray.png)bin1002 -> 1002 bytes
-rw-r--r--public/-/emojis/1/owl.png (renamed from app/assets/images/emoji/owl.png)bin2045 -> 2045 bytes
-rw-r--r--public/-/emojis/1/ox.png (renamed from app/assets/images/emoji/ox.png)bin1436 -> 1436 bytes
-rw-r--r--public/-/emojis/1/package.png (renamed from app/assets/images/emoji/package.png)bin950 -> 950 bytes
-rw-r--r--public/-/emojis/1/page_facing_up.png (renamed from app/assets/images/emoji/page_facing_up.png)bin1110 -> 1110 bytes
-rw-r--r--public/-/emojis/1/page_with_curl.png (renamed from app/assets/images/emoji/page_with_curl.png)bin1157 -> 1157 bytes
-rw-r--r--public/-/emojis/1/pager.png (renamed from app/assets/images/emoji/pager.png)bin553 -> 553 bytes
-rw-r--r--public/-/emojis/1/paintbrush.png (renamed from app/assets/images/emoji/paintbrush.png)bin950 -> 950 bytes
-rw-r--r--public/-/emojis/1/palm_tree.png (renamed from app/assets/images/emoji/palm_tree.png)bin1450 -> 1450 bytes
-rw-r--r--public/-/emojis/1/pancakes.png (renamed from app/assets/images/emoji/pancakes.png)bin3661 -> 3661 bytes
-rw-r--r--public/-/emojis/1/panda_face.png (renamed from app/assets/images/emoji/panda_face.png)bin1478 -> 1478 bytes
-rw-r--r--public/-/emojis/1/paperclip.png (renamed from app/assets/images/emoji/paperclip.png)bin439 -> 439 bytes
-rw-r--r--public/-/emojis/1/paperclips.png (renamed from app/assets/images/emoji/paperclips.png)bin642 -> 642 bytes
-rw-r--r--public/-/emojis/1/park.png (renamed from app/assets/images/emoji/park.png)bin929 -> 929 bytes
-rw-r--r--public/-/emojis/1/parking.png (renamed from app/assets/images/emoji/parking.png)bin385 -> 385 bytes
-rw-r--r--public/-/emojis/1/part_alternation_mark.png (renamed from app/assets/images/emoji/part_alternation_mark.png)bin521 -> 521 bytes
-rw-r--r--public/-/emojis/1/partly_sunny.png (renamed from app/assets/images/emoji/partly_sunny.png)bin977 -> 977 bytes
-rw-r--r--public/-/emojis/1/passport_control.png (renamed from app/assets/images/emoji/passport_control.png)bin683 -> 683 bytes
-rw-r--r--public/-/emojis/1/pause_button.png (renamed from app/assets/images/emoji/pause_button.png)bin395 -> 395 bytes
-rw-r--r--public/-/emojis/1/peace.png (renamed from app/assets/images/emoji/peace.png)bin933 -> 933 bytes
-rw-r--r--public/-/emojis/1/peach.png (renamed from app/assets/images/emoji/peach.png)bin1189 -> 1189 bytes
-rw-r--r--public/-/emojis/1/peanuts.png (renamed from app/assets/images/emoji/peanuts.png)bin3266 -> 3266 bytes
-rw-r--r--public/-/emojis/1/pear.png (renamed from app/assets/images/emoji/pear.png)bin747 -> 747 bytes
-rw-r--r--public/-/emojis/1/pen_ballpoint.png (renamed from app/assets/images/emoji/pen_ballpoint.png)bin696 -> 696 bytes
-rw-r--r--public/-/emojis/1/pen_fountain.png (renamed from app/assets/images/emoji/pen_fountain.png)bin623 -> 623 bytes
-rw-r--r--public/-/emojis/1/pencil.png (renamed from app/assets/images/emoji/pencil.png)bin1624 -> 1624 bytes
-rw-r--r--public/-/emojis/1/pencil2.png (renamed from app/assets/images/emoji/pencil2.png)bin654 -> 654 bytes
-rw-r--r--public/-/emojis/1/penguin.png (renamed from app/assets/images/emoji/penguin.png)bin1034 -> 1034 bytes
-rw-r--r--public/-/emojis/1/pensive.png (renamed from app/assets/images/emoji/pensive.png)bin718 -> 718 bytes
-rw-r--r--public/-/emojis/1/performing_arts.png (renamed from app/assets/images/emoji/performing_arts.png)bin1971 -> 1971 bytes
-rw-r--r--public/-/emojis/1/persevere.png (renamed from app/assets/images/emoji/persevere.png)bin891 -> 891 bytes
-rw-r--r--public/-/emojis/1/person_frowning.png (renamed from app/assets/images/emoji/person_frowning.png)bin1148 -> 1148 bytes
-rw-r--r--public/-/emojis/1/person_frowning_tone1.png (renamed from app/assets/images/emoji/person_frowning_tone1.png)bin1141 -> 1141 bytes
-rw-r--r--public/-/emojis/1/person_frowning_tone2.png (renamed from app/assets/images/emoji/person_frowning_tone2.png)bin1141 -> 1141 bytes
-rw-r--r--public/-/emojis/1/person_frowning_tone3.png (renamed from app/assets/images/emoji/person_frowning_tone3.png)bin1141 -> 1141 bytes
-rw-r--r--public/-/emojis/1/person_frowning_tone4.png (renamed from app/assets/images/emoji/person_frowning_tone4.png)bin1109 -> 1109 bytes
-rw-r--r--public/-/emojis/1/person_frowning_tone5.png (renamed from app/assets/images/emoji/person_frowning_tone5.png)bin1114 -> 1114 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair.png (renamed from app/assets/images/emoji/person_with_blond_hair.png)bin1205 -> 1205 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair_tone1.png (renamed from app/assets/images/emoji/person_with_blond_hair_tone1.png)bin1181 -> 1181 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair_tone2.png (renamed from app/assets/images/emoji/person_with_blond_hair_tone2.png)bin1181 -> 1181 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair_tone3.png (renamed from app/assets/images/emoji/person_with_blond_hair_tone3.png)bin1181 -> 1181 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair_tone4.png (renamed from app/assets/images/emoji/person_with_blond_hair_tone4.png)bin1189 -> 1189 bytes
-rw-r--r--public/-/emojis/1/person_with_blond_hair_tone5.png (renamed from app/assets/images/emoji/person_with_blond_hair_tone5.png)bin1214 -> 1214 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face.png (renamed from app/assets/images/emoji/person_with_pouting_face.png)bin1297 -> 1297 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face_tone1.png (renamed from app/assets/images/emoji/person_with_pouting_face_tone1.png)bin1309 -> 1309 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face_tone2.png (renamed from app/assets/images/emoji/person_with_pouting_face_tone2.png)bin1292 -> 1292 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face_tone3.png (renamed from app/assets/images/emoji/person_with_pouting_face_tone3.png)bin1305 -> 1305 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face_tone4.png (renamed from app/assets/images/emoji/person_with_pouting_face_tone4.png)bin1296 -> 1296 bytes
-rw-r--r--public/-/emojis/1/person_with_pouting_face_tone5.png (renamed from app/assets/images/emoji/person_with_pouting_face_tone5.png)bin1303 -> 1303 bytes
-rw-r--r--public/-/emojis/1/pick.png (renamed from app/assets/images/emoji/pick.png)bin1023 -> 1023 bytes
-rw-r--r--public/-/emojis/1/pig.png (renamed from app/assets/images/emoji/pig.png)bin1138 -> 1138 bytes
-rw-r--r--public/-/emojis/1/pig2.png (renamed from app/assets/images/emoji/pig2.png)bin1548 -> 1548 bytes
-rw-r--r--public/-/emojis/1/pig_nose.png (renamed from app/assets/images/emoji/pig_nose.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/pill.png (renamed from app/assets/images/emoji/pill.png)bin442 -> 442 bytes
-rw-r--r--public/-/emojis/1/pineapple.png (renamed from app/assets/images/emoji/pineapple.png)bin1642 -> 1642 bytes
-rw-r--r--public/-/emojis/1/ping_pong.png (renamed from app/assets/images/emoji/ping_pong.png)bin823 -> 823 bytes
-rw-r--r--public/-/emojis/1/pisces.png (renamed from app/assets/images/emoji/pisces.png)bin678 -> 678 bytes
-rw-r--r--public/-/emojis/1/pizza.png (renamed from app/assets/images/emoji/pizza.png)bin2008 -> 2008 bytes
-rw-r--r--public/-/emojis/1/place_of_worship.png (renamed from app/assets/images/emoji/place_of_worship.png)bin487 -> 487 bytes
-rw-r--r--public/-/emojis/1/play_pause.png (renamed from app/assets/images/emoji/play_pause.png)bin509 -> 509 bytes
-rw-r--r--public/-/emojis/1/point_down.png (renamed from app/assets/images/emoji/point_down.png)bin853 -> 853 bytes
-rw-r--r--public/-/emojis/1/point_down_tone1.png (renamed from app/assets/images/emoji/point_down_tone1.png)bin856 -> 856 bytes
-rw-r--r--public/-/emojis/1/point_down_tone2.png (renamed from app/assets/images/emoji/point_down_tone2.png)bin856 -> 856 bytes
-rw-r--r--public/-/emojis/1/point_down_tone3.png (renamed from app/assets/images/emoji/point_down_tone3.png)bin858 -> 858 bytes
-rw-r--r--public/-/emojis/1/point_down_tone4.png (renamed from app/assets/images/emoji/point_down_tone4.png)bin856 -> 856 bytes
-rw-r--r--public/-/emojis/1/point_down_tone5.png (renamed from app/assets/images/emoji/point_down_tone5.png)bin856 -> 856 bytes
-rw-r--r--public/-/emojis/1/point_left.png (renamed from app/assets/images/emoji/point_left.png)bin825 -> 825 bytes
-rw-r--r--public/-/emojis/1/point_left_tone1.png (renamed from app/assets/images/emoji/point_left_tone1.png)bin832 -> 832 bytes
-rw-r--r--public/-/emojis/1/point_left_tone2.png (renamed from app/assets/images/emoji/point_left_tone2.png)bin830 -> 830 bytes
-rw-r--r--public/-/emojis/1/point_left_tone3.png (renamed from app/assets/images/emoji/point_left_tone3.png)bin830 -> 830 bytes
-rw-r--r--public/-/emojis/1/point_left_tone4.png (renamed from app/assets/images/emoji/point_left_tone4.png)bin830 -> 830 bytes
-rw-r--r--public/-/emojis/1/point_left_tone5.png (renamed from app/assets/images/emoji/point_left_tone5.png)bin832 -> 832 bytes
-rw-r--r--public/-/emojis/1/point_right.png (renamed from app/assets/images/emoji/point_right.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_right_tone1.png (renamed from app/assets/images/emoji/point_right_tone1.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_right_tone2.png (renamed from app/assets/images/emoji/point_right_tone2.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_right_tone3.png (renamed from app/assets/images/emoji/point_right_tone3.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_right_tone4.png (renamed from app/assets/images/emoji/point_right_tone4.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_right_tone5.png (renamed from app/assets/images/emoji/point_right_tone5.png)bin805 -> 805 bytes
-rw-r--r--public/-/emojis/1/point_up.png (renamed from app/assets/images/emoji/point_up.png)bin819 -> 819 bytes
-rw-r--r--public/-/emojis/1/point_up_2.png (renamed from app/assets/images/emoji/point_up_2.png)bin822 -> 822 bytes
-rw-r--r--public/-/emojis/1/point_up_2_tone1.png (renamed from app/assets/images/emoji/point_up_2_tone1.png)bin822 -> 822 bytes
-rw-r--r--public/-/emojis/1/point_up_2_tone2.png (renamed from app/assets/images/emoji/point_up_2_tone2.png)bin822 -> 822 bytes
-rw-r--r--public/-/emojis/1/point_up_2_tone3.png (renamed from app/assets/images/emoji/point_up_2_tone3.png)bin871 -> 871 bytes
-rw-r--r--public/-/emojis/1/point_up_2_tone4.png (renamed from app/assets/images/emoji/point_up_2_tone4.png)bin822 -> 822 bytes
-rw-r--r--public/-/emojis/1/point_up_2_tone5.png (renamed from app/assets/images/emoji/point_up_2_tone5.png)bin822 -> 822 bytes
-rw-r--r--public/-/emojis/1/point_up_tone1.png (renamed from app/assets/images/emoji/point_up_tone1.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/point_up_tone2.png (renamed from app/assets/images/emoji/point_up_tone2.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/point_up_tone3.png (renamed from app/assets/images/emoji/point_up_tone3.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/point_up_tone4.png (renamed from app/assets/images/emoji/point_up_tone4.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/point_up_tone5.png (renamed from app/assets/images/emoji/point_up_tone5.png)bin820 -> 820 bytes
-rw-r--r--public/-/emojis/1/police_car.png (renamed from app/assets/images/emoji/police_car.png)bin1431 -> 1431 bytes
-rw-r--r--public/-/emojis/1/poodle.png (renamed from app/assets/images/emoji/poodle.png)bin1531 -> 1531 bytes
-rw-r--r--public/-/emojis/1/poop.png (renamed from app/assets/images/emoji/poop.png)bin1273 -> 1273 bytes
-rw-r--r--public/-/emojis/1/popcorn.png (renamed from app/assets/images/emoji/popcorn.png)bin1843 -> 1843 bytes
-rw-r--r--public/-/emojis/1/post_office.png (renamed from app/assets/images/emoji/post_office.png)bin676 -> 676 bytes
-rw-r--r--public/-/emojis/1/postal_horn.png (renamed from app/assets/images/emoji/postal_horn.png)bin809 -> 809 bytes
-rw-r--r--public/-/emojis/1/postbox.png (renamed from app/assets/images/emoji/postbox.png)bin1077 -> 1077 bytes
-rw-r--r--public/-/emojis/1/potable_water.png (renamed from app/assets/images/emoji/potable_water.png)bin633 -> 633 bytes
-rw-r--r--public/-/emojis/1/potato.png (renamed from app/assets/images/emoji/potato.png)bin1246 -> 1246 bytes
-rw-r--r--public/-/emojis/1/pouch.png (renamed from app/assets/images/emoji/pouch.png)bin1259 -> 1259 bytes
-rw-r--r--public/-/emojis/1/poultry_leg.png (renamed from app/assets/images/emoji/poultry_leg.png)bin925 -> 925 bytes
-rw-r--r--public/-/emojis/1/pound.png (renamed from app/assets/images/emoji/pound.png)bin452 -> 452 bytes
-rw-r--r--public/-/emojis/1/pouting_cat.png (renamed from app/assets/images/emoji/pouting_cat.png)bin1675 -> 1675 bytes
-rw-r--r--public/-/emojis/1/pray.png (renamed from app/assets/images/emoji/pray.png)bin1122 -> 1122 bytes
-rw-r--r--public/-/emojis/1/pray_tone1.png (renamed from app/assets/images/emoji/pray_tone1.png)bin1131 -> 1131 bytes
-rw-r--r--public/-/emojis/1/pray_tone2.png (renamed from app/assets/images/emoji/pray_tone2.png)bin1134 -> 1134 bytes
-rw-r--r--public/-/emojis/1/pray_tone3.png (renamed from app/assets/images/emoji/pray_tone3.png)bin1137 -> 1137 bytes
-rw-r--r--public/-/emojis/1/pray_tone4.png (renamed from app/assets/images/emoji/pray_tone4.png)bin1126 -> 1126 bytes
-rw-r--r--public/-/emojis/1/pray_tone5.png (renamed from app/assets/images/emoji/pray_tone5.png)bin1117 -> 1117 bytes
-rw-r--r--public/-/emojis/1/prayer_beads.png (renamed from app/assets/images/emoji/prayer_beads.png)bin1059 -> 1059 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman.png (renamed from app/assets/images/emoji/pregnant_woman.png)bin1252 -> 1252 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman_tone1.png (renamed from app/assets/images/emoji/pregnant_woman_tone1.png)bin1255 -> 1255 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman_tone2.png (renamed from app/assets/images/emoji/pregnant_woman_tone2.png)bin1246 -> 1246 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman_tone3.png (renamed from app/assets/images/emoji/pregnant_woman_tone3.png)bin1237 -> 1237 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman_tone4.png (renamed from app/assets/images/emoji/pregnant_woman_tone4.png)bin1246 -> 1246 bytes
-rw-r--r--public/-/emojis/1/pregnant_woman_tone5.png (renamed from app/assets/images/emoji/pregnant_woman_tone5.png)bin1235 -> 1235 bytes
-rw-r--r--public/-/emojis/1/prince.png (renamed from app/assets/images/emoji/prince.png)bin1616 -> 1616 bytes
-rw-r--r--public/-/emojis/1/prince_tone1.png (renamed from app/assets/images/emoji/prince_tone1.png)bin1618 -> 1618 bytes
-rw-r--r--public/-/emojis/1/prince_tone2.png (renamed from app/assets/images/emoji/prince_tone2.png)bin1621 -> 1621 bytes
-rw-r--r--public/-/emojis/1/prince_tone3.png (renamed from app/assets/images/emoji/prince_tone3.png)bin1619 -> 1619 bytes
-rw-r--r--public/-/emojis/1/prince_tone4.png (renamed from app/assets/images/emoji/prince_tone4.png)bin1619 -> 1619 bytes
-rw-r--r--public/-/emojis/1/prince_tone5.png (renamed from app/assets/images/emoji/prince_tone5.png)bin1616 -> 1616 bytes
-rw-r--r--public/-/emojis/1/princess.png (renamed from app/assets/images/emoji/princess.png)bin1812 -> 1812 bytes
-rw-r--r--public/-/emojis/1/princess_tone1.png (renamed from app/assets/images/emoji/princess_tone1.png)bin1812 -> 1812 bytes
-rw-r--r--public/-/emojis/1/princess_tone2.png (renamed from app/assets/images/emoji/princess_tone2.png)bin1805 -> 1805 bytes
-rw-r--r--public/-/emojis/1/princess_tone3.png (renamed from app/assets/images/emoji/princess_tone3.png)bin1805 -> 1805 bytes
-rw-r--r--public/-/emojis/1/princess_tone4.png (renamed from app/assets/images/emoji/princess_tone4.png)bin1813 -> 1813 bytes
-rw-r--r--public/-/emojis/1/princess_tone5.png (renamed from app/assets/images/emoji/princess_tone5.png)bin1812 -> 1812 bytes
-rw-r--r--public/-/emojis/1/printer.png (renamed from app/assets/images/emoji/printer.png)bin926 -> 926 bytes
-rw-r--r--public/-/emojis/1/projector.png (renamed from app/assets/images/emoji/projector.png)bin943 -> 943 bytes
-rw-r--r--public/-/emojis/1/punch.png (renamed from app/assets/images/emoji/punch.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/punch_tone1.png (renamed from app/assets/images/emoji/punch_tone1.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/punch_tone2.png (renamed from app/assets/images/emoji/punch_tone2.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/punch_tone3.png (renamed from app/assets/images/emoji/punch_tone3.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/punch_tone4.png (renamed from app/assets/images/emoji/punch_tone4.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/punch_tone5.png (renamed from app/assets/images/emoji/punch_tone5.png)bin838 -> 838 bytes
-rw-r--r--public/-/emojis/1/purple_heart.png (renamed from app/assets/images/emoji/purple_heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/purse.png (renamed from app/assets/images/emoji/purse.png)bin1558 -> 1558 bytes
-rw-r--r--public/-/emojis/1/pushpin.png (renamed from app/assets/images/emoji/pushpin.png)bin640 -> 640 bytes
-rw-r--r--public/-/emojis/1/put_litter_in_its_place.png (renamed from app/assets/images/emoji/put_litter_in_its_place.png)bin650 -> 650 bytes
-rw-r--r--public/-/emojis/1/question.png (renamed from app/assets/images/emoji/question.png)bin449 -> 449 bytes
-rw-r--r--public/-/emojis/1/rabbit.png (renamed from app/assets/images/emoji/rabbit.png)bin1660 -> 1660 bytes
-rw-r--r--public/-/emojis/1/rabbit2.png (renamed from app/assets/images/emoji/rabbit2.png)bin1805 -> 1805 bytes
-rw-r--r--public/-/emojis/1/race_car.png (renamed from app/assets/images/emoji/race_car.png)bin2140 -> 2140 bytes
-rw-r--r--public/-/emojis/1/racehorse.png (renamed from app/assets/images/emoji/racehorse.png)bin1401 -> 1401 bytes
-rw-r--r--public/-/emojis/1/radio.png (renamed from app/assets/images/emoji/radio.png)bin851 -> 851 bytes
-rw-r--r--public/-/emojis/1/radio_button.png (renamed from app/assets/images/emoji/radio_button.png)bin674 -> 674 bytes
-rw-r--r--public/-/emojis/1/radioactive.png (renamed from app/assets/images/emoji/radioactive.png)bin858 -> 858 bytes
-rw-r--r--public/-/emojis/1/rage.png (renamed from app/assets/images/emoji/rage.png)bin845 -> 845 bytes
-rw-r--r--public/-/emojis/1/railway_car.png (renamed from app/assets/images/emoji/railway_car.png)bin847 -> 847 bytes
-rw-r--r--public/-/emojis/1/railway_track.png (renamed from app/assets/images/emoji/railway_track.png)bin1550 -> 1550 bytes
-rw-r--r--public/-/emojis/1/rainbow.png (renamed from app/assets/images/emoji/rainbow.png)bin1299 -> 1299 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand.png (renamed from app/assets/images/emoji/raised_back_of_hand.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand_tone1.png (renamed from app/assets/images/emoji/raised_back_of_hand_tone1.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand_tone2.png (renamed from app/assets/images/emoji/raised_back_of_hand_tone2.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand_tone3.png (renamed from app/assets/images/emoji/raised_back_of_hand_tone3.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand_tone4.png (renamed from app/assets/images/emoji/raised_back_of_hand_tone4.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_back_of_hand_tone5.png (renamed from app/assets/images/emoji/raised_back_of_hand_tone5.png)bin848 -> 848 bytes
-rw-r--r--public/-/emojis/1/raised_hand.png (renamed from app/assets/images/emoji/raised_hand.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hand_tone1.png (renamed from app/assets/images/emoji/raised_hand_tone1.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hand_tone2.png (renamed from app/assets/images/emoji/raised_hand_tone2.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hand_tone3.png (renamed from app/assets/images/emoji/raised_hand_tone3.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hand_tone4.png (renamed from app/assets/images/emoji/raised_hand_tone4.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hand_tone5.png (renamed from app/assets/images/emoji/raised_hand_tone5.png)bin791 -> 791 bytes
-rw-r--r--public/-/emojis/1/raised_hands.png (renamed from app/assets/images/emoji/raised_hands.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raised_hands_tone1.png (renamed from app/assets/images/emoji/raised_hands_tone1.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raised_hands_tone2.png (renamed from app/assets/images/emoji/raised_hands_tone2.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raised_hands_tone3.png (renamed from app/assets/images/emoji/raised_hands_tone3.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raised_hands_tone4.png (renamed from app/assets/images/emoji/raised_hands_tone4.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raised_hands_tone5.png (renamed from app/assets/images/emoji/raised_hands_tone5.png)bin1098 -> 1098 bytes
-rw-r--r--public/-/emojis/1/raising_hand.png (renamed from app/assets/images/emoji/raising_hand.png)bin1664 -> 1664 bytes
-rw-r--r--public/-/emojis/1/raising_hand_tone1.png (renamed from app/assets/images/emoji/raising_hand_tone1.png)bin1678 -> 1678 bytes
-rw-r--r--public/-/emojis/1/raising_hand_tone2.png (renamed from app/assets/images/emoji/raising_hand_tone2.png)bin1665 -> 1665 bytes
-rw-r--r--public/-/emojis/1/raising_hand_tone3.png (renamed from app/assets/images/emoji/raising_hand_tone3.png)bin1657 -> 1657 bytes
-rw-r--r--public/-/emojis/1/raising_hand_tone4.png (renamed from app/assets/images/emoji/raising_hand_tone4.png)bin1657 -> 1657 bytes
-rw-r--r--public/-/emojis/1/raising_hand_tone5.png (renamed from app/assets/images/emoji/raising_hand_tone5.png)bin1661 -> 1661 bytes
-rw-r--r--public/-/emojis/1/ram.png (renamed from app/assets/images/emoji/ram.png)bin1951 -> 1951 bytes
-rw-r--r--public/-/emojis/1/ramen.png (renamed from app/assets/images/emoji/ramen.png)bin1992 -> 1992 bytes
-rw-r--r--public/-/emojis/1/rat.png (renamed from app/assets/images/emoji/rat.png)bin1193 -> 1193 bytes
-rw-r--r--public/-/emojis/1/record_button.png (renamed from app/assets/images/emoji/record_button.png)bin475 -> 475 bytes
-rw-r--r--public/-/emojis/1/recycle.png (renamed from app/assets/images/emoji/recycle.png)bin914 -> 914 bytes
-rw-r--r--public/-/emojis/1/red_car.png (renamed from app/assets/images/emoji/red_car.png)bin1065 -> 1065 bytes
-rw-r--r--public/-/emojis/1/red_circle.png (renamed from app/assets/images/emoji/red_circle.png)bin374 -> 374 bytes
-rw-r--r--public/-/emojis/1/registered.png (renamed from app/assets/images/emoji/registered.png)bin547 -> 547 bytes
-rw-r--r--public/-/emojis/1/relaxed.png (renamed from app/assets/images/emoji/relaxed.png)bin636 -> 636 bytes
-rw-r--r--public/-/emojis/1/relieved.png (renamed from app/assets/images/emoji/relieved.png)bin785 -> 785 bytes
-rw-r--r--public/-/emojis/1/reminder_ribbon.png (renamed from app/assets/images/emoji/reminder_ribbon.png)bin921 -> 921 bytes
-rw-r--r--public/-/emojis/1/repeat.png (renamed from app/assets/images/emoji/repeat.png)bin644 -> 644 bytes
-rw-r--r--public/-/emojis/1/repeat_one.png (renamed from app/assets/images/emoji/repeat_one.png)bin688 -> 688 bytes
-rw-r--r--public/-/emojis/1/restroom.png (renamed from app/assets/images/emoji/restroom.png)bin676 -> 676 bytes
-rw-r--r--public/-/emojis/1/revolving_hearts.png (renamed from app/assets/images/emoji/revolving_hearts.png)bin920 -> 920 bytes
-rw-r--r--public/-/emojis/1/rewind.png (renamed from app/assets/images/emoji/rewind.png)bin523 -> 523 bytes
-rw-r--r--public/-/emojis/1/rhino.png (renamed from app/assets/images/emoji/rhino.png)bin1558 -> 1558 bytes
-rw-r--r--public/-/emojis/1/ribbon.png (renamed from app/assets/images/emoji/ribbon.png)bin968 -> 968 bytes
-rw-r--r--public/-/emojis/1/rice.png (renamed from app/assets/images/emoji/rice.png)bin1195 -> 1195 bytes
-rw-r--r--public/-/emojis/1/rice_ball.png (renamed from app/assets/images/emoji/rice_ball.png)bin1091 -> 1091 bytes
-rw-r--r--public/-/emojis/1/rice_cracker.png (renamed from app/assets/images/emoji/rice_cracker.png)bin1443 -> 1443 bytes
-rw-r--r--public/-/emojis/1/rice_scene.png (renamed from app/assets/images/emoji/rice_scene.png)bin1349 -> 1349 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist.png (renamed from app/assets/images/emoji/right_facing_fist.png)bin975 -> 975 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist_tone1.png (renamed from app/assets/images/emoji/right_facing_fist_tone1.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist_tone2.png (renamed from app/assets/images/emoji/right_facing_fist_tone2.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist_tone3.png (renamed from app/assets/images/emoji/right_facing_fist_tone3.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist_tone4.png (renamed from app/assets/images/emoji/right_facing_fist_tone4.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/right_facing_fist_tone5.png (renamed from app/assets/images/emoji/right_facing_fist_tone5.png)bin964 -> 964 bytes
-rw-r--r--public/-/emojis/1/ring.png (renamed from app/assets/images/emoji/ring.png)bin1113 -> 1113 bytes
-rw-r--r--public/-/emojis/1/robot.png (renamed from app/assets/images/emoji/robot.png)bin1228 -> 1228 bytes
-rw-r--r--public/-/emojis/1/rocket.png (renamed from app/assets/images/emoji/rocket.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/rofl.png (renamed from app/assets/images/emoji/rofl.png)bin1760 -> 1760 bytes
-rw-r--r--public/-/emojis/1/roller_coaster.png (renamed from app/assets/images/emoji/roller_coaster.png)bin1723 -> 1723 bytes
-rw-r--r--public/-/emojis/1/rolling_eyes.png (renamed from app/assets/images/emoji/rolling_eyes.png)bin743 -> 743 bytes
-rw-r--r--public/-/emojis/1/rooster.png (renamed from app/assets/images/emoji/rooster.png)bin1333 -> 1333 bytes
-rw-r--r--public/-/emojis/1/rose.png (renamed from app/assets/images/emoji/rose.png)bin1182 -> 1182 bytes
-rw-r--r--public/-/emojis/1/rosette.png (renamed from app/assets/images/emoji/rosette.png)bin1023 -> 1023 bytes
-rw-r--r--public/-/emojis/1/rotating_light.png (renamed from app/assets/images/emoji/rotating_light.png)bin1969 -> 1969 bytes
-rw-r--r--public/-/emojis/1/round_pushpin.png (renamed from app/assets/images/emoji/round_pushpin.png)bin455 -> 455 bytes
-rw-r--r--public/-/emojis/1/rowboat.png (renamed from app/assets/images/emoji/rowboat.png)bin1963 -> 1963 bytes
-rw-r--r--public/-/emojis/1/rowboat_tone1.png (renamed from app/assets/images/emoji/rowboat_tone1.png)bin1971 -> 1971 bytes
-rw-r--r--public/-/emojis/1/rowboat_tone2.png (renamed from app/assets/images/emoji/rowboat_tone2.png)bin1972 -> 1972 bytes
-rw-r--r--public/-/emojis/1/rowboat_tone3.png (renamed from app/assets/images/emoji/rowboat_tone3.png)bin1967 -> 1967 bytes
-rw-r--r--public/-/emojis/1/rowboat_tone4.png (renamed from app/assets/images/emoji/rowboat_tone4.png)bin1974 -> 1974 bytes
-rw-r--r--public/-/emojis/1/rowboat_tone5.png (renamed from app/assets/images/emoji/rowboat_tone5.png)bin1971 -> 1971 bytes
-rw-r--r--public/-/emojis/1/rugby_football.png (renamed from app/assets/images/emoji/rugby_football.png)bin1618 -> 1618 bytes
-rw-r--r--public/-/emojis/1/runner.png (renamed from app/assets/images/emoji/runner.png)bin1161 -> 1161 bytes
-rw-r--r--public/-/emojis/1/runner_tone1.png (renamed from app/assets/images/emoji/runner_tone1.png)bin1163 -> 1163 bytes
-rw-r--r--public/-/emojis/1/runner_tone2.png (renamed from app/assets/images/emoji/runner_tone2.png)bin1162 -> 1162 bytes
-rw-r--r--public/-/emojis/1/runner_tone3.png (renamed from app/assets/images/emoji/runner_tone3.png)bin1151 -> 1151 bytes
-rw-r--r--public/-/emojis/1/runner_tone4.png (renamed from app/assets/images/emoji/runner_tone4.png)bin1156 -> 1156 bytes
-rw-r--r--public/-/emojis/1/runner_tone5.png (renamed from app/assets/images/emoji/runner_tone5.png)bin1145 -> 1145 bytes
-rw-r--r--public/-/emojis/1/running_shirt_with_sash.png (renamed from app/assets/images/emoji/running_shirt_with_sash.png)bin784 -> 784 bytes
-rw-r--r--public/-/emojis/1/sa.png (renamed from app/assets/images/emoji/sa.png)bin420 -> 420 bytes
-rw-r--r--public/-/emojis/1/sagittarius.png (renamed from app/assets/images/emoji/sagittarius.png)bin602 -> 602 bytes
-rw-r--r--public/-/emojis/1/sailboat.png (renamed from app/assets/images/emoji/sailboat.png)bin1274 -> 1274 bytes
-rw-r--r--public/-/emojis/1/sake.png (renamed from app/assets/images/emoji/sake.png)bin826 -> 826 bytes
-rw-r--r--public/-/emojis/1/salad.png (renamed from app/assets/images/emoji/salad.png)bin2398 -> 2398 bytes
-rw-r--r--public/-/emojis/1/sandal.png (renamed from app/assets/images/emoji/sandal.png)bin1180 -> 1180 bytes
-rw-r--r--public/-/emojis/1/santa.png (renamed from app/assets/images/emoji/santa.png)bin1585 -> 1585 bytes
-rw-r--r--public/-/emojis/1/santa_tone1.png (renamed from app/assets/images/emoji/santa_tone1.png)bin1585 -> 1585 bytes
-rw-r--r--public/-/emojis/1/santa_tone2.png (renamed from app/assets/images/emoji/santa_tone2.png)bin1578 -> 1578 bytes
-rw-r--r--public/-/emojis/1/santa_tone3.png (renamed from app/assets/images/emoji/santa_tone3.png)bin1578 -> 1578 bytes
-rw-r--r--public/-/emojis/1/santa_tone4.png (renamed from app/assets/images/emoji/santa_tone4.png)bin1578 -> 1578 bytes
-rw-r--r--public/-/emojis/1/santa_tone5.png (renamed from app/assets/images/emoji/santa_tone5.png)bin1578 -> 1578 bytes
-rw-r--r--public/-/emojis/1/satellite.png (renamed from app/assets/images/emoji/satellite.png)bin1173 -> 1173 bytes
-rw-r--r--public/-/emojis/1/satellite_orbital.png (renamed from app/assets/images/emoji/satellite_orbital.png)bin762 -> 762 bytes
-rw-r--r--public/-/emojis/1/saxophone.png (renamed from app/assets/images/emoji/saxophone.png)bin1442 -> 1442 bytes
-rw-r--r--public/-/emojis/1/scales.png (renamed from app/assets/images/emoji/scales.png)bin1181 -> 1181 bytes
-rw-r--r--public/-/emojis/1/school.png (renamed from app/assets/images/emoji/school.png)bin1234 -> 1234 bytes
-rw-r--r--public/-/emojis/1/school_satchel.png (renamed from app/assets/images/emoji/school_satchel.png)bin1490 -> 1490 bytes
-rw-r--r--public/-/emojis/1/scissors.png (renamed from app/assets/images/emoji/scissors.png)bin937 -> 937 bytes
-rw-r--r--public/-/emojis/1/scooter.png (renamed from app/assets/images/emoji/scooter.png)bin1228 -> 1228 bytes
-rw-r--r--public/-/emojis/1/scorpion.png (renamed from app/assets/images/emoji/scorpion.png)bin1503 -> 1503 bytes
-rw-r--r--public/-/emojis/1/scorpius.png (renamed from app/assets/images/emoji/scorpius.png)bin612 -> 612 bytes
-rw-r--r--public/-/emojis/1/scream.png (renamed from app/assets/images/emoji/scream.png)bin1583 -> 1583 bytes
-rw-r--r--public/-/emojis/1/scream_cat.png (renamed from app/assets/images/emoji/scream_cat.png)bin2120 -> 2120 bytes
-rw-r--r--public/-/emojis/1/scroll.png (renamed from app/assets/images/emoji/scroll.png)bin989 -> 989 bytes
-rw-r--r--public/-/emojis/1/seat.png (renamed from app/assets/images/emoji/seat.png)bin884 -> 884 bytes
-rw-r--r--public/-/emojis/1/second_place.png (renamed from app/assets/images/emoji/second_place.png)bin1511 -> 1511 bytes
-rw-r--r--public/-/emojis/1/secret.png (renamed from app/assets/images/emoji/secret.png)bin857 -> 857 bytes
-rw-r--r--public/-/emojis/1/see_no_evil.png (renamed from app/assets/images/emoji/see_no_evil.png)bin1227 -> 1227 bytes
-rw-r--r--public/-/emojis/1/seedling.png (renamed from app/assets/images/emoji/seedling.png)bin749 -> 749 bytes
-rw-r--r--public/-/emojis/1/selfie.png (renamed from app/assets/images/emoji/selfie.png)bin1160 -> 1160 bytes
-rw-r--r--public/-/emojis/1/selfie_tone1.png (renamed from app/assets/images/emoji/selfie_tone1.png)bin1166 -> 1166 bytes
-rw-r--r--public/-/emojis/1/selfie_tone2.png (renamed from app/assets/images/emoji/selfie_tone2.png)bin1167 -> 1167 bytes
-rw-r--r--public/-/emojis/1/selfie_tone3.png (renamed from app/assets/images/emoji/selfie_tone3.png)bin1154 -> 1154 bytes
-rw-r--r--public/-/emojis/1/selfie_tone4.png (renamed from app/assets/images/emoji/selfie_tone4.png)bin1153 -> 1153 bytes
-rw-r--r--public/-/emojis/1/selfie_tone5.png (renamed from app/assets/images/emoji/selfie_tone5.png)bin1148 -> 1148 bytes
-rw-r--r--public/-/emojis/1/seven.png (renamed from app/assets/images/emoji/seven.png)bin522 -> 522 bytes
-rw-r--r--public/-/emojis/1/shallow_pan_of_food.png (renamed from app/assets/images/emoji/shallow_pan_of_food.png)bin1738 -> 1738 bytes
-rw-r--r--public/-/emojis/1/shamrock.png (renamed from app/assets/images/emoji/shamrock.png)bin1023 -> 1023 bytes
-rw-r--r--public/-/emojis/1/shark.png (renamed from app/assets/images/emoji/shark.png)bin1811 -> 1811 bytes
-rw-r--r--public/-/emojis/1/shaved_ice.png (renamed from app/assets/images/emoji/shaved_ice.png)bin997 -> 997 bytes
-rw-r--r--public/-/emojis/1/sheep.png (renamed from app/assets/images/emoji/sheep.png)bin1372 -> 1372 bytes
-rw-r--r--public/-/emojis/1/shell.png (renamed from app/assets/images/emoji/shell.png)bin1497 -> 1497 bytes
-rw-r--r--public/-/emojis/1/shield.png (renamed from app/assets/images/emoji/shield.png)bin1602 -> 1602 bytes
-rw-r--r--public/-/emojis/1/shinto_shrine.png (renamed from app/assets/images/emoji/shinto_shrine.png)bin579 -> 579 bytes
-rw-r--r--public/-/emojis/1/ship.png (renamed from app/assets/images/emoji/ship.png)bin1405 -> 1405 bytes
-rw-r--r--public/-/emojis/1/shirt.png (renamed from app/assets/images/emoji/shirt.png)bin670 -> 670 bytes
-rw-r--r--public/-/emojis/1/shopping_bags.png (renamed from app/assets/images/emoji/shopping_bags.png)bin1234 -> 1234 bytes
-rw-r--r--public/-/emojis/1/shopping_cart.png (renamed from app/assets/images/emoji/shopping_cart.png)bin1072 -> 1072 bytes
-rw-r--r--public/-/emojis/1/shower.png (renamed from app/assets/images/emoji/shower.png)bin2537 -> 2537 bytes
-rw-r--r--public/-/emojis/1/shrimp.png (renamed from app/assets/images/emoji/shrimp.png)bin1376 -> 1376 bytes
-rw-r--r--public/-/emojis/1/shrug.png (renamed from app/assets/images/emoji/shrug.png)bin1671 -> 1671 bytes
-rw-r--r--public/-/emojis/1/shrug_tone1.png (renamed from app/assets/images/emoji/shrug_tone1.png)bin1676 -> 1676 bytes
-rw-r--r--public/-/emojis/1/shrug_tone2.png (renamed from app/assets/images/emoji/shrug_tone2.png)bin1671 -> 1671 bytes
-rw-r--r--public/-/emojis/1/shrug_tone3.png (renamed from app/assets/images/emoji/shrug_tone3.png)bin1675 -> 1675 bytes
-rw-r--r--public/-/emojis/1/shrug_tone4.png (renamed from app/assets/images/emoji/shrug_tone4.png)bin1641 -> 1641 bytes
-rw-r--r--public/-/emojis/1/shrug_tone5.png (renamed from app/assets/images/emoji/shrug_tone5.png)bin1634 -> 1634 bytes
-rw-r--r--public/-/emojis/1/signal_strength.png (renamed from app/assets/images/emoji/signal_strength.png)bin445 -> 445 bytes
-rw-r--r--public/-/emojis/1/six.png (renamed from app/assets/images/emoji/six.png)bin612 -> 612 bytes
-rw-r--r--public/-/emojis/1/six_pointed_star.png (renamed from app/assets/images/emoji/six_pointed_star.png)bin540 -> 540 bytes
-rw-r--r--public/-/emojis/1/ski.png (renamed from app/assets/images/emoji/ski.png)bin1762 -> 1762 bytes
-rw-r--r--public/-/emojis/1/skier.png (renamed from app/assets/images/emoji/skier.png)bin1539 -> 1539 bytes
-rw-r--r--public/-/emojis/1/skull.png (renamed from app/assets/images/emoji/skull.png)bin628 -> 628 bytes
-rw-r--r--public/-/emojis/1/skull_crossbones.png (renamed from app/assets/images/emoji/skull_crossbones.png)bin726 -> 726 bytes
-rw-r--r--public/-/emojis/1/sleeping.png (renamed from app/assets/images/emoji/sleeping.png)bin1075 -> 1075 bytes
-rw-r--r--public/-/emojis/1/sleeping_accommodation.png (renamed from app/assets/images/emoji/sleeping_accommodation.png)bin926 -> 926 bytes
-rw-r--r--public/-/emojis/1/sleepy.png (renamed from app/assets/images/emoji/sleepy.png)bin1185 -> 1185 bytes
-rw-r--r--public/-/emojis/1/slight_frown.png (renamed from app/assets/images/emoji/slight_frown.png)bin580 -> 580 bytes
-rw-r--r--public/-/emojis/1/slight_smile.png (renamed from app/assets/images/emoji/slight_smile.png)bin600 -> 600 bytes
-rw-r--r--public/-/emojis/1/slot_machine.png (renamed from app/assets/images/emoji/slot_machine.png)bin1648 -> 1648 bytes
-rw-r--r--public/-/emojis/1/small_blue_diamond.png (renamed from app/assets/images/emoji/small_blue_diamond.png)bin191 -> 191 bytes
-rw-r--r--public/-/emojis/1/small_orange_diamond.png (renamed from app/assets/images/emoji/small_orange_diamond.png)bin194 -> 194 bytes
-rw-r--r--public/-/emojis/1/small_red_triangle.png (renamed from app/assets/images/emoji/small_red_triangle.png)bin273 -> 273 bytes
-rw-r--r--public/-/emojis/1/small_red_triangle_down.png (renamed from app/assets/images/emoji/small_red_triangle_down.png)bin291 -> 291 bytes
-rw-r--r--public/-/emojis/1/smile.png (renamed from app/assets/images/emoji/smile.png)bin737 -> 737 bytes
-rw-r--r--public/-/emojis/1/smile_cat.png (renamed from app/assets/images/emoji/smile_cat.png)bin1405 -> 1405 bytes
-rw-r--r--public/-/emojis/1/smiley.png (renamed from app/assets/images/emoji/smiley.png)bin686 -> 686 bytes
-rw-r--r--public/-/emojis/1/smiley_cat.png (renamed from app/assets/images/emoji/smiley_cat.png)bin1669 -> 1669 bytes
-rw-r--r--public/-/emojis/1/smiling_imp.png (renamed from app/assets/images/emoji/smiling_imp.png)bin1078 -> 1078 bytes
-rw-r--r--public/-/emojis/1/smirk.png (renamed from app/assets/images/emoji/smirk.png)bin775 -> 775 bytes
-rw-r--r--public/-/emojis/1/smirk_cat.png (renamed from app/assets/images/emoji/smirk_cat.png)bin1663 -> 1663 bytes
-rw-r--r--public/-/emojis/1/smoking.png (renamed from app/assets/images/emoji/smoking.png)bin417 -> 417 bytes
-rw-r--r--public/-/emojis/1/snail.png (renamed from app/assets/images/emoji/snail.png)bin1731 -> 1731 bytes
-rw-r--r--public/-/emojis/1/snake.png (renamed from app/assets/images/emoji/snake.png)bin1575 -> 1575 bytes
-rw-r--r--public/-/emojis/1/sneezing_face.png (renamed from app/assets/images/emoji/sneezing_face.png)bin1289 -> 1289 bytes
-rw-r--r--public/-/emojis/1/snowboarder.png (renamed from app/assets/images/emoji/snowboarder.png)bin2020 -> 2020 bytes
-rw-r--r--public/-/emojis/1/snowflake.png (renamed from app/assets/images/emoji/snowflake.png)bin691 -> 691 bytes
-rw-r--r--public/-/emojis/1/snowman.png (renamed from app/assets/images/emoji/snowman.png)bin1481 -> 1481 bytes
-rw-r--r--public/-/emojis/1/snowman2.png (renamed from app/assets/images/emoji/snowman2.png)bin2176 -> 2176 bytes
-rw-r--r--public/-/emojis/1/sob.png (renamed from app/assets/images/emoji/sob.png)bin1236 -> 1236 bytes
-rw-r--r--public/-/emojis/1/soccer.png (renamed from app/assets/images/emoji/soccer.png)bin1034 -> 1034 bytes
-rw-r--r--public/-/emojis/1/soon.png (renamed from app/assets/images/emoji/soon.png)bin483 -> 483 bytes
-rw-r--r--public/-/emojis/1/sos.png (renamed from app/assets/images/emoji/sos.png)bin604 -> 604 bytes
-rw-r--r--public/-/emojis/1/sound.png (renamed from app/assets/images/emoji/sound.png)bin690 -> 690 bytes
-rw-r--r--public/-/emojis/1/space_invader.png (renamed from app/assets/images/emoji/space_invader.png)bin1325 -> 1325 bytes
-rw-r--r--public/-/emojis/1/spades.png (renamed from app/assets/images/emoji/spades.png)bin454 -> 454 bytes
-rw-r--r--public/-/emojis/1/spaghetti.png (renamed from app/assets/images/emoji/spaghetti.png)bin1796 -> 1796 bytes
-rw-r--r--public/-/emojis/1/sparkle.png (renamed from app/assets/images/emoji/sparkle.png)bin663 -> 663 bytes
-rw-r--r--public/-/emojis/1/sparkler.png (renamed from app/assets/images/emoji/sparkler.png)bin910 -> 910 bytes
-rw-r--r--public/-/emojis/1/sparkles.png (renamed from app/assets/images/emoji/sparkles.png)bin651 -> 651 bytes
-rw-r--r--public/-/emojis/1/sparkling_heart.png (renamed from app/assets/images/emoji/sparkling_heart.png)bin821 -> 821 bytes
-rw-r--r--public/-/emojis/1/speak_no_evil.png (renamed from app/assets/images/emoji/speak_no_evil.png)bin1497 -> 1497 bytes
-rw-r--r--public/-/emojis/1/speaker.png (renamed from app/assets/images/emoji/speaker.png)bin575 -> 575 bytes
-rw-r--r--public/-/emojis/1/speaking_head.png (renamed from app/assets/images/emoji/speaking_head.png)bin531 -> 531 bytes
-rw-r--r--public/-/emojis/1/speech_balloon.png (renamed from app/assets/images/emoji/speech_balloon.png)bin384 -> 384 bytes
-rw-r--r--public/-/emojis/1/speech_left.png (renamed from app/assets/images/emoji/speech_left.png)bin390 -> 390 bytes
-rw-r--r--public/-/emojis/1/speedboat.png (renamed from app/assets/images/emoji/speedboat.png)bin1255 -> 1255 bytes
-rw-r--r--public/-/emojis/1/spider.png (renamed from app/assets/images/emoji/spider.png)bin1724 -> 1724 bytes
-rw-r--r--public/-/emojis/1/spider_web.png (renamed from app/assets/images/emoji/spider_web.png)bin929 -> 929 bytes
-rw-r--r--public/-/emojis/1/spoon.png (renamed from app/assets/images/emoji/spoon.png)bin700 -> 700 bytes
-rw-r--r--public/-/emojis/1/spy.png (renamed from app/assets/images/emoji/spy.png)bin1650 -> 1650 bytes
-rw-r--r--public/-/emojis/1/spy_tone1.png (renamed from app/assets/images/emoji/spy_tone1.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/spy_tone2.png (renamed from app/assets/images/emoji/spy_tone2.png)bin1632 -> 1632 bytes
-rw-r--r--public/-/emojis/1/spy_tone3.png (renamed from app/assets/images/emoji/spy_tone3.png)bin1645 -> 1645 bytes
-rw-r--r--public/-/emojis/1/spy_tone4.png (renamed from app/assets/images/emoji/spy_tone4.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/spy_tone5.png (renamed from app/assets/images/emoji/spy_tone5.png)bin1639 -> 1639 bytes
-rw-r--r--public/-/emojis/1/squid.png (renamed from app/assets/images/emoji/squid.png)bin1394 -> 1394 bytes
-rw-r--r--public/-/emojis/1/stadium.png (renamed from app/assets/images/emoji/stadium.png)bin1515 -> 1515 bytes
-rw-r--r--public/-/emojis/1/star.png (renamed from app/assets/images/emoji/star.png)bin456 -> 456 bytes
-rw-r--r--public/-/emojis/1/star2.png (renamed from app/assets/images/emoji/star2.png)bin732 -> 732 bytes
-rw-r--r--public/-/emojis/1/star_and_crescent.png (renamed from app/assets/images/emoji/star_and_crescent.png)bin490 -> 490 bytes
-rw-r--r--public/-/emojis/1/star_of_david.png (renamed from app/assets/images/emoji/star_of_david.png)bin491 -> 491 bytes
-rw-r--r--public/-/emojis/1/stars.png (renamed from app/assets/images/emoji/stars.png)bin1048 -> 1048 bytes
-rw-r--r--public/-/emojis/1/station.png (renamed from app/assets/images/emoji/station.png)bin1336 -> 1336 bytes
-rw-r--r--public/-/emojis/1/statue_of_liberty.png (renamed from app/assets/images/emoji/statue_of_liberty.png)bin1145 -> 1145 bytes
-rw-r--r--public/-/emojis/1/steam_locomotive.png (renamed from app/assets/images/emoji/steam_locomotive.png)bin1736 -> 1736 bytes
-rw-r--r--public/-/emojis/1/stew.png (renamed from app/assets/images/emoji/stew.png)bin1960 -> 1960 bytes
-rw-r--r--public/-/emojis/1/stop_button.png (renamed from app/assets/images/emoji/stop_button.png)bin385 -> 385 bytes
-rw-r--r--public/-/emojis/1/stopwatch.png (renamed from app/assets/images/emoji/stopwatch.png)bin1329 -> 1329 bytes
-rw-r--r--public/-/emojis/1/straight_ruler.png (renamed from app/assets/images/emoji/straight_ruler.png)bin1406 -> 1406 bytes
-rw-r--r--public/-/emojis/1/strawberry.png (renamed from app/assets/images/emoji/strawberry.png)bin1206 -> 1206 bytes
-rw-r--r--public/-/emojis/1/stuck_out_tongue.png (renamed from app/assets/images/emoji/stuck_out_tongue.png)bin752 -> 752 bytes
-rw-r--r--public/-/emojis/1/stuck_out_tongue_closed_eyes.png (renamed from app/assets/images/emoji/stuck_out_tongue_closed_eyes.png)bin867 -> 867 bytes
-rw-r--r--public/-/emojis/1/stuck_out_tongue_winking_eye.png (renamed from app/assets/images/emoji/stuck_out_tongue_winking_eye.png)bin1061 -> 1061 bytes
-rw-r--r--public/-/emojis/1/stuffed_flatbread.png (renamed from app/assets/images/emoji/stuffed_flatbread.png)bin2160 -> 2160 bytes
-rw-r--r--public/-/emojis/1/sun_with_face.png (renamed from app/assets/images/emoji/sun_with_face.png)bin741 -> 741 bytes
-rw-r--r--public/-/emojis/1/sunflower.png (renamed from app/assets/images/emoji/sunflower.png)bin1915 -> 1915 bytes
-rw-r--r--public/-/emojis/1/sunglasses.png (renamed from app/assets/images/emoji/sunglasses.png)bin824 -> 824 bytes
-rw-r--r--public/-/emojis/1/sunny.png (renamed from app/assets/images/emoji/sunny.png)bin746 -> 746 bytes
-rw-r--r--public/-/emojis/1/sunrise.png (renamed from app/assets/images/emoji/sunrise.png)bin812 -> 812 bytes
-rw-r--r--public/-/emojis/1/sunrise_over_mountains.png (renamed from app/assets/images/emoji/sunrise_over_mountains.png)bin1576 -> 1576 bytes
-rw-r--r--public/-/emojis/1/surfer.png (renamed from app/assets/images/emoji/surfer.png)bin1777 -> 1777 bytes
-rw-r--r--public/-/emojis/1/surfer_tone1.png (renamed from app/assets/images/emoji/surfer_tone1.png)bin1781 -> 1781 bytes
-rw-r--r--public/-/emojis/1/surfer_tone2.png (renamed from app/assets/images/emoji/surfer_tone2.png)bin1769 -> 1769 bytes
-rw-r--r--public/-/emojis/1/surfer_tone3.png (renamed from app/assets/images/emoji/surfer_tone3.png)bin1777 -> 1777 bytes
-rw-r--r--public/-/emojis/1/surfer_tone4.png (renamed from app/assets/images/emoji/surfer_tone4.png)bin1784 -> 1784 bytes
-rw-r--r--public/-/emojis/1/surfer_tone5.png (renamed from app/assets/images/emoji/surfer_tone5.png)bin1782 -> 1782 bytes
-rw-r--r--public/-/emojis/1/sushi.png (renamed from app/assets/images/emoji/sushi.png)bin2101 -> 2101 bytes
-rw-r--r--public/-/emojis/1/suspension_railway.png (renamed from app/assets/images/emoji/suspension_railway.png)bin927 -> 927 bytes
-rw-r--r--public/-/emojis/1/sweat.png (renamed from app/assets/images/emoji/sweat.png)bin861 -> 861 bytes
-rw-r--r--public/-/emojis/1/sweat_drops.png (renamed from app/assets/images/emoji/sweat_drops.png)bin549 -> 549 bytes
-rw-r--r--public/-/emojis/1/sweat_smile.png (renamed from app/assets/images/emoji/sweat_smile.png)bin851 -> 851 bytes
-rw-r--r--public/-/emojis/1/sweet_potato.png (renamed from app/assets/images/emoji/sweet_potato.png)bin951 -> 951 bytes
-rw-r--r--public/-/emojis/1/swimmer.png (renamed from app/assets/images/emoji/swimmer.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/swimmer_tone1.png (renamed from app/assets/images/emoji/swimmer_tone1.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/swimmer_tone2.png (renamed from app/assets/images/emoji/swimmer_tone2.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/swimmer_tone3.png (renamed from app/assets/images/emoji/swimmer_tone3.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/swimmer_tone4.png (renamed from app/assets/images/emoji/swimmer_tone4.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/swimmer_tone5.png (renamed from app/assets/images/emoji/swimmer_tone5.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/symbols.png (renamed from app/assets/images/emoji/symbols.png)bin746 -> 746 bytes
-rw-r--r--public/-/emojis/1/synagogue.png (renamed from app/assets/images/emoji/synagogue.png)bin1309 -> 1309 bytes
-rw-r--r--public/-/emojis/1/syringe.png (renamed from app/assets/images/emoji/syringe.png)bin737 -> 737 bytes
-rw-r--r--public/-/emojis/1/taco.png (renamed from app/assets/images/emoji/taco.png)bin3045 -> 3045 bytes
-rw-r--r--public/-/emojis/1/tada.png (renamed from app/assets/images/emoji/tada.png)bin1778 -> 1778 bytes
-rw-r--r--public/-/emojis/1/tanabata_tree.png (renamed from app/assets/images/emoji/tanabata_tree.png)bin1479 -> 1479 bytes
-rw-r--r--public/-/emojis/1/tangerine.png (renamed from app/assets/images/emoji/tangerine.png)bin1184 -> 1184 bytes
-rw-r--r--public/-/emojis/1/taurus.png (renamed from app/assets/images/emoji/taurus.png)bin701 -> 701 bytes
-rw-r--r--public/-/emojis/1/taxi.png (renamed from app/assets/images/emoji/taxi.png)bin1230 -> 1230 bytes
-rw-r--r--public/-/emojis/1/tea.png (renamed from app/assets/images/emoji/tea.png)bin1297 -> 1297 bytes
-rw-r--r--public/-/emojis/1/telephone.png (renamed from app/assets/images/emoji/telephone.png)bin1760 -> 1760 bytes
-rw-r--r--public/-/emojis/1/telephone_receiver.png (renamed from app/assets/images/emoji/telephone_receiver.png)bin941 -> 941 bytes
-rw-r--r--public/-/emojis/1/telescope.png (renamed from app/assets/images/emoji/telescope.png)bin1256 -> 1256 bytes
-rw-r--r--public/-/emojis/1/ten.png (renamed from app/assets/images/emoji/ten.png)bin621 -> 621 bytes
-rw-r--r--public/-/emojis/1/tennis.png (renamed from app/assets/images/emoji/tennis.png)bin1561 -> 1561 bytes
-rw-r--r--public/-/emojis/1/tent.png (renamed from app/assets/images/emoji/tent.png)bin1684 -> 1684 bytes
-rw-r--r--public/-/emojis/1/thermometer.png (renamed from app/assets/images/emoji/thermometer.png)bin759 -> 759 bytes
-rw-r--r--public/-/emojis/1/thermometer_face.png (renamed from app/assets/images/emoji/thermometer_face.png)bin1503 -> 1503 bytes
-rw-r--r--public/-/emojis/1/thinking.png (renamed from app/assets/images/emoji/thinking.png)bin1345 -> 1345 bytes
-rw-r--r--public/-/emojis/1/third_place.png (renamed from app/assets/images/emoji/third_place.png)bin1529 -> 1529 bytes
-rw-r--r--public/-/emojis/1/thought_balloon.png (renamed from app/assets/images/emoji/thought_balloon.png)bin489 -> 489 bytes
-rw-r--r--public/-/emojis/1/three.png (renamed from app/assets/images/emoji/three.png)bin602 -> 602 bytes
-rw-r--r--public/-/emojis/1/thumbsdown.png (renamed from app/assets/images/emoji/thumbsdown.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsdown_tone1.png (renamed from app/assets/images/emoji/thumbsdown_tone1.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsdown_tone2.png (renamed from app/assets/images/emoji/thumbsdown_tone2.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsdown_tone3.png (renamed from app/assets/images/emoji/thumbsdown_tone3.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsdown_tone4.png (renamed from app/assets/images/emoji/thumbsdown_tone4.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsdown_tone5.png (renamed from app/assets/images/emoji/thumbsdown_tone5.png)bin815 -> 815 bytes
-rw-r--r--public/-/emojis/1/thumbsup.png (renamed from app/assets/images/emoji/thumbsup.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thumbsup_tone1.png (renamed from app/assets/images/emoji/thumbsup_tone1.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thumbsup_tone2.png (renamed from app/assets/images/emoji/thumbsup_tone2.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thumbsup_tone3.png (renamed from app/assets/images/emoji/thumbsup_tone3.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thumbsup_tone4.png (renamed from app/assets/images/emoji/thumbsup_tone4.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thumbsup_tone5.png (renamed from app/assets/images/emoji/thumbsup_tone5.png)bin814 -> 814 bytes
-rw-r--r--public/-/emojis/1/thunder_cloud_rain.png (renamed from app/assets/images/emoji/thunder_cloud_rain.png)bin1020 -> 1020 bytes
-rw-r--r--public/-/emojis/1/ticket.png (renamed from app/assets/images/emoji/ticket.png)bin763 -> 763 bytes
-rw-r--r--public/-/emojis/1/tickets.png (renamed from app/assets/images/emoji/tickets.png)bin1750 -> 1750 bytes
-rw-r--r--public/-/emojis/1/tiger.png (renamed from app/assets/images/emoji/tiger.png)bin2104 -> 2104 bytes
-rw-r--r--public/-/emojis/1/tiger2.png (renamed from app/assets/images/emoji/tiger2.png)bin2623 -> 2623 bytes
-rw-r--r--public/-/emojis/1/timer.png (renamed from app/assets/images/emoji/timer.png)bin1897 -> 1897 bytes
-rw-r--r--public/-/emojis/1/tired_face.png (renamed from app/assets/images/emoji/tired_face.png)bin1126 -> 1126 bytes
-rw-r--r--public/-/emojis/1/tm.png (renamed from app/assets/images/emoji/tm.png)bin300 -> 300 bytes
-rw-r--r--public/-/emojis/1/toilet.png (renamed from app/assets/images/emoji/toilet.png)bin726 -> 726 bytes
-rw-r--r--public/-/emojis/1/tokyo_tower.png (renamed from app/assets/images/emoji/tokyo_tower.png)bin765 -> 765 bytes
-rw-r--r--public/-/emojis/1/tomato.png (renamed from app/assets/images/emoji/tomato.png)bin1055 -> 1055 bytes
-rw-r--r--public/-/emojis/1/tone1.png (renamed from app/assets/images/emoji/tone1.png)bin372 -> 372 bytes
-rw-r--r--public/-/emojis/1/tone2.png (renamed from app/assets/images/emoji/tone2.png)bin372 -> 372 bytes
-rw-r--r--public/-/emojis/1/tone3.png (renamed from app/assets/images/emoji/tone3.png)bin375 -> 375 bytes
-rw-r--r--public/-/emojis/1/tone4.png (renamed from app/assets/images/emoji/tone4.png)bin374 -> 374 bytes
-rw-r--r--public/-/emojis/1/tone5.png (renamed from app/assets/images/emoji/tone5.png)bin374 -> 374 bytes
-rw-r--r--public/-/emojis/1/tongue.png (renamed from app/assets/images/emoji/tongue.png)bin599 -> 599 bytes
-rw-r--r--public/-/emojis/1/tools.png (renamed from app/assets/images/emoji/tools.png)bin1225 -> 1225 bytes
-rw-r--r--public/-/emojis/1/top.png (renamed from app/assets/images/emoji/top.png)bin389 -> 389 bytes
-rw-r--r--public/-/emojis/1/tophat.png (renamed from app/assets/images/emoji/tophat.png)bin845 -> 845 bytes
-rw-r--r--public/-/emojis/1/track_next.png (renamed from app/assets/images/emoji/track_next.png)bin551 -> 551 bytes
-rw-r--r--public/-/emojis/1/track_previous.png (renamed from app/assets/images/emoji/track_previous.png)bin549 -> 549 bytes
-rw-r--r--public/-/emojis/1/trackball.png (renamed from app/assets/images/emoji/trackball.png)bin892 -> 892 bytes
-rw-r--r--public/-/emojis/1/tractor.png (renamed from app/assets/images/emoji/tractor.png)bin1192 -> 1192 bytes
-rw-r--r--public/-/emojis/1/traffic_light.png (renamed from app/assets/images/emoji/traffic_light.png)bin590 -> 590 bytes
-rw-r--r--public/-/emojis/1/train.png (renamed from app/assets/images/emoji/train.png)bin1031 -> 1031 bytes
-rw-r--r--public/-/emojis/1/train2.png (renamed from app/assets/images/emoji/train2.png)bin1499 -> 1499 bytes
-rw-r--r--public/-/emojis/1/tram.png (renamed from app/assets/images/emoji/tram.png)bin1065 -> 1065 bytes
-rw-r--r--public/-/emojis/1/triangular_flag_on_post.png (renamed from app/assets/images/emoji/triangular_flag_on_post.png)bin415 -> 415 bytes
-rw-r--r--public/-/emojis/1/triangular_ruler.png (renamed from app/assets/images/emoji/triangular_ruler.png)bin369 -> 369 bytes
-rw-r--r--public/-/emojis/1/trident.png (renamed from app/assets/images/emoji/trident.png)bin668 -> 668 bytes
-rw-r--r--public/-/emojis/1/triumph.png (renamed from app/assets/images/emoji/triumph.png)bin1529 -> 1529 bytes
-rw-r--r--public/-/emojis/1/trolleybus.png (renamed from app/assets/images/emoji/trolleybus.png)bin1168 -> 1168 bytes
-rw-r--r--public/-/emojis/1/trophy.png (renamed from app/assets/images/emoji/trophy.png)bin863 -> 863 bytes
-rw-r--r--public/-/emojis/1/tropical_drink.png (renamed from app/assets/images/emoji/tropical_drink.png)bin1428 -> 1428 bytes
-rw-r--r--public/-/emojis/1/tropical_fish.png (renamed from app/assets/images/emoji/tropical_fish.png)bin1676 -> 1676 bytes
-rw-r--r--public/-/emojis/1/truck.png (renamed from app/assets/images/emoji/truck.png)bin1366 -> 1366 bytes
-rw-r--r--public/-/emojis/1/trumpet.png (renamed from app/assets/images/emoji/trumpet.png)bin1281 -> 1281 bytes
-rw-r--r--public/-/emojis/1/tulip.png (renamed from app/assets/images/emoji/tulip.png)bin1065 -> 1065 bytes
-rw-r--r--public/-/emojis/1/tumbler_glass.png (renamed from app/assets/images/emoji/tumbler_glass.png)bin2312 -> 2312 bytes
-rw-r--r--public/-/emojis/1/turkey.png (renamed from app/assets/images/emoji/turkey.png)bin1240 -> 1240 bytes
-rw-r--r--public/-/emojis/1/turtle.png (renamed from app/assets/images/emoji/turtle.png)bin1515 -> 1515 bytes
-rw-r--r--public/-/emojis/1/tv.png (renamed from app/assets/images/emoji/tv.png)bin776 -> 776 bytes
-rw-r--r--public/-/emojis/1/twisted_rightwards_arrows.png (renamed from app/assets/images/emoji/twisted_rightwards_arrows.png)bin574 -> 574 bytes
-rw-r--r--public/-/emojis/1/two.png (renamed from app/assets/images/emoji/two.png)bin567 -> 567 bytes
-rw-r--r--public/-/emojis/1/two_hearts.png (renamed from app/assets/images/emoji/two_hearts.png)bin493 -> 493 bytes
-rw-r--r--public/-/emojis/1/two_men_holding_hands.png (renamed from app/assets/images/emoji/two_men_holding_hands.png)bin1347 -> 1347 bytes
-rw-r--r--public/-/emojis/1/two_women_holding_hands.png (renamed from app/assets/images/emoji/two_women_holding_hands.png)bin1544 -> 1544 bytes
-rw-r--r--public/-/emojis/1/u5272.png (renamed from app/assets/images/emoji/u5272.png)bin411 -> 411 bytes
-rw-r--r--public/-/emojis/1/u5408.png (renamed from app/assets/images/emoji/u5408.png)bin484 -> 484 bytes
-rw-r--r--public/-/emojis/1/u55b6.png (renamed from app/assets/images/emoji/u55b6.png)bin460 -> 460 bytes
-rw-r--r--public/-/emojis/1/u6307.png (renamed from app/assets/images/emoji/u6307.png)bin504 -> 504 bytes
-rw-r--r--public/-/emojis/1/u6708.png (renamed from app/assets/images/emoji/u6708.png)bin409 -> 409 bytes
-rw-r--r--public/-/emojis/1/u6709.png (renamed from app/assets/images/emoji/u6709.png)bin434 -> 434 bytes
-rw-r--r--public/-/emojis/1/u6e80.png (renamed from app/assets/images/emoji/u6e80.png)bin564 -> 564 bytes
-rw-r--r--public/-/emojis/1/u7121.png (renamed from app/assets/images/emoji/u7121.png)bin534 -> 534 bytes
-rw-r--r--public/-/emojis/1/u7533.png (renamed from app/assets/images/emoji/u7533.png)bin306 -> 306 bytes
-rw-r--r--public/-/emojis/1/u7981.png (renamed from app/assets/images/emoji/u7981.png)bin584 -> 584 bytes
-rw-r--r--public/-/emojis/1/u7a7a.png (renamed from app/assets/images/emoji/u7a7a.png)bin456 -> 456 bytes
-rw-r--r--public/-/emojis/1/umbrella.png (renamed from app/assets/images/emoji/umbrella.png)bin1229 -> 1229 bytes
-rw-r--r--public/-/emojis/1/umbrella2.png (renamed from app/assets/images/emoji/umbrella2.png)bin897 -> 897 bytes
-rw-r--r--public/-/emojis/1/unamused.png (renamed from app/assets/images/emoji/unamused.png)bin632 -> 632 bytes
-rw-r--r--public/-/emojis/1/underage.png (renamed from app/assets/images/emoji/underage.png)bin863 -> 863 bytes
-rw-r--r--public/-/emojis/1/unicorn.png (renamed from app/assets/images/emoji/unicorn.png)bin2107 -> 2107 bytes
-rw-r--r--public/-/emojis/1/unlock.png (renamed from app/assets/images/emoji/unlock.png)bin856 -> 856 bytes
-rw-r--r--public/-/emojis/1/up.png (renamed from app/assets/images/emoji/up.png)bin405 -> 405 bytes
-rw-r--r--public/-/emojis/1/upside_down.png (renamed from app/assets/images/emoji/upside_down.png)bin602 -> 602 bytes
-rw-r--r--public/-/emojis/1/urn.png (renamed from app/assets/images/emoji/urn.png)bin742 -> 742 bytes
-rw-r--r--public/-/emojis/1/v.png (renamed from app/assets/images/emoji/v.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/v_tone1.png (renamed from app/assets/images/emoji/v_tone1.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/v_tone2.png (renamed from app/assets/images/emoji/v_tone2.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/v_tone3.png (renamed from app/assets/images/emoji/v_tone3.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/v_tone4.png (renamed from app/assets/images/emoji/v_tone4.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/v_tone5.png (renamed from app/assets/images/emoji/v_tone5.png)bin1009 -> 1009 bytes
-rw-r--r--public/-/emojis/1/vertical_traffic_light.png (renamed from app/assets/images/emoji/vertical_traffic_light.png)bin752 -> 752 bytes
-rw-r--r--public/-/emojis/1/vhs.png (renamed from app/assets/images/emoji/vhs.png)bin632 -> 632 bytes
-rw-r--r--public/-/emojis/1/vibration_mode.png (renamed from app/assets/images/emoji/vibration_mode.png)bin683 -> 683 bytes
-rw-r--r--public/-/emojis/1/video_camera.png (renamed from app/assets/images/emoji/video_camera.png)bin1611 -> 1611 bytes
-rw-r--r--public/-/emojis/1/video_game.png (renamed from app/assets/images/emoji/video_game.png)bin765 -> 765 bytes
-rw-r--r--public/-/emojis/1/violin.png (renamed from app/assets/images/emoji/violin.png)bin1156 -> 1156 bytes
-rw-r--r--public/-/emojis/1/virgo.png (renamed from app/assets/images/emoji/virgo.png)bin618 -> 618 bytes
-rw-r--r--public/-/emojis/1/volcano.png (renamed from app/assets/images/emoji/volcano.png)bin1257 -> 1257 bytes
-rw-r--r--public/-/emojis/1/volleyball.png (renamed from app/assets/images/emoji/volleyball.png)bin1202 -> 1202 bytes
-rw-r--r--public/-/emojis/1/vs.png (renamed from app/assets/images/emoji/vs.png)bin604 -> 604 bytes
-rw-r--r--public/-/emojis/1/vulcan.png (renamed from app/assets/images/emoji/vulcan.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/vulcan_tone1.png (renamed from app/assets/images/emoji/vulcan_tone1.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/vulcan_tone2.png (renamed from app/assets/images/emoji/vulcan_tone2.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/vulcan_tone3.png (renamed from app/assets/images/emoji/vulcan_tone3.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/vulcan_tone4.png (renamed from app/assets/images/emoji/vulcan_tone4.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/vulcan_tone5.png (renamed from app/assets/images/emoji/vulcan_tone5.png)bin1083 -> 1083 bytes
-rw-r--r--public/-/emojis/1/walking.png (renamed from app/assets/images/emoji/walking.png)bin1082 -> 1082 bytes
-rw-r--r--public/-/emojis/1/walking_tone1.png (renamed from app/assets/images/emoji/walking_tone1.png)bin1084 -> 1084 bytes
-rw-r--r--public/-/emojis/1/walking_tone2.png (renamed from app/assets/images/emoji/walking_tone2.png)bin1084 -> 1084 bytes
-rw-r--r--public/-/emojis/1/walking_tone3.png (renamed from app/assets/images/emoji/walking_tone3.png)bin1066 -> 1066 bytes
-rw-r--r--public/-/emojis/1/walking_tone4.png (renamed from app/assets/images/emoji/walking_tone4.png)bin1075 -> 1075 bytes
-rw-r--r--public/-/emojis/1/walking_tone5.png (renamed from app/assets/images/emoji/walking_tone5.png)bin1065 -> 1065 bytes
-rw-r--r--public/-/emojis/1/waning_crescent_moon.png (renamed from app/assets/images/emoji/waning_crescent_moon.png)bin1213 -> 1213 bytes
-rw-r--r--public/-/emojis/1/waning_gibbous_moon.png (renamed from app/assets/images/emoji/waning_gibbous_moon.png)bin1208 -> 1208 bytes
-rw-r--r--public/-/emojis/1/warning.png (renamed from app/assets/images/emoji/warning.png)bin565 -> 565 bytes
-rw-r--r--public/-/emojis/1/wastebasket.png (renamed from app/assets/images/emoji/wastebasket.png)bin2414 -> 2414 bytes
-rw-r--r--public/-/emojis/1/watch.png (renamed from app/assets/images/emoji/watch.png)bin785 -> 785 bytes
-rw-r--r--public/-/emojis/1/water_buffalo.png (renamed from app/assets/images/emoji/water_buffalo.png)bin1536 -> 1536 bytes
-rw-r--r--public/-/emojis/1/water_polo.png (renamed from app/assets/images/emoji/water_polo.png)bin1755 -> 1755 bytes
-rw-r--r--public/-/emojis/1/water_polo_tone1.png (renamed from app/assets/images/emoji/water_polo_tone1.png)bin1758 -> 1758 bytes
-rw-r--r--public/-/emojis/1/water_polo_tone2.png (renamed from app/assets/images/emoji/water_polo_tone2.png)bin1756 -> 1756 bytes
-rw-r--r--public/-/emojis/1/water_polo_tone3.png (renamed from app/assets/images/emoji/water_polo_tone3.png)bin1760 -> 1760 bytes
-rw-r--r--public/-/emojis/1/water_polo_tone4.png (renamed from app/assets/images/emoji/water_polo_tone4.png)bin1749 -> 1749 bytes
-rw-r--r--public/-/emojis/1/water_polo_tone5.png (renamed from app/assets/images/emoji/water_polo_tone5.png)bin1748 -> 1748 bytes
-rw-r--r--public/-/emojis/1/watermelon.png (renamed from app/assets/images/emoji/watermelon.png)bin1275 -> 1275 bytes
-rw-r--r--public/-/emojis/1/wave.png (renamed from app/assets/images/emoji/wave.png)bin1300 -> 1300 bytes
-rw-r--r--public/-/emojis/1/wave_tone1.png (renamed from app/assets/images/emoji/wave_tone1.png)bin1300 -> 1300 bytes
-rw-r--r--public/-/emojis/1/wave_tone2.png (renamed from app/assets/images/emoji/wave_tone2.png)bin1300 -> 1300 bytes
-rw-r--r--public/-/emojis/1/wave_tone3.png (renamed from app/assets/images/emoji/wave_tone3.png)bin1295 -> 1295 bytes
-rw-r--r--public/-/emojis/1/wave_tone4.png (renamed from app/assets/images/emoji/wave_tone4.png)bin1300 -> 1300 bytes
-rw-r--r--public/-/emojis/1/wave_tone5.png (renamed from app/assets/images/emoji/wave_tone5.png)bin1300 -> 1300 bytes
-rw-r--r--public/-/emojis/1/wavy_dash.png (renamed from app/assets/images/emoji/wavy_dash.png)bin359 -> 359 bytes
-rw-r--r--public/-/emojis/1/waxing_crescent_moon.png (renamed from app/assets/images/emoji/waxing_crescent_moon.png)bin1199 -> 1199 bytes
-rw-r--r--public/-/emojis/1/waxing_gibbous_moon.png (renamed from app/assets/images/emoji/waxing_gibbous_moon.png)bin1229 -> 1229 bytes
-rw-r--r--public/-/emojis/1/wc.png (renamed from app/assets/images/emoji/wc.png)bin752 -> 752 bytes
-rw-r--r--public/-/emojis/1/weary.png (renamed from app/assets/images/emoji/weary.png)bin871 -> 871 bytes
-rw-r--r--public/-/emojis/1/wedding.png (renamed from app/assets/images/emoji/wedding.png)bin1260 -> 1260 bytes
-rw-r--r--public/-/emojis/1/whale.png (renamed from app/assets/images/emoji/whale.png)bin1572 -> 1572 bytes
-rw-r--r--public/-/emojis/1/whale2.png (renamed from app/assets/images/emoji/whale2.png)bin1196 -> 1196 bytes
-rw-r--r--public/-/emojis/1/wheel_of_dharma.png (renamed from app/assets/images/emoji/wheel_of_dharma.png)bin666 -> 666 bytes
-rw-r--r--public/-/emojis/1/wheelchair.png (renamed from app/assets/images/emoji/wheelchair.png)bin683 -> 683 bytes
-rw-r--r--public/-/emojis/1/white_check_mark.png (renamed from app/assets/images/emoji/white_check_mark.png)bin547 -> 547 bytes
-rw-r--r--public/-/emojis/1/white_circle.png (renamed from app/assets/images/emoji/white_circle.png)bin351 -> 351 bytes
-rw-r--r--public/-/emojis/1/white_flower.png (renamed from app/assets/images/emoji/white_flower.png)bin941 -> 941 bytes
-rw-r--r--public/-/emojis/1/white_large_square.png (renamed from app/assets/images/emoji/white_large_square.png)bin110 -> 110 bytes
-rw-r--r--public/-/emojis/1/white_medium_small_square.png (renamed from app/assets/images/emoji/white_medium_small_square.png)bin110 -> 110 bytes
-rw-r--r--public/-/emojis/1/white_medium_square.png (renamed from app/assets/images/emoji/white_medium_square.png)bin108 -> 108 bytes
-rw-r--r--public/-/emojis/1/white_small_square.png (renamed from app/assets/images/emoji/white_small_square.png)bin108 -> 108 bytes
-rw-r--r--public/-/emojis/1/white_square_button.png (renamed from app/assets/images/emoji/white_square_button.png)bin122 -> 122 bytes
-rw-r--r--public/-/emojis/1/white_sun_cloud.png (renamed from app/assets/images/emoji/white_sun_cloud.png)bin968 -> 968 bytes
-rw-r--r--public/-/emojis/1/white_sun_rain_cloud.png (renamed from app/assets/images/emoji/white_sun_rain_cloud.png)bin1161 -> 1161 bytes
-rw-r--r--public/-/emojis/1/white_sun_small_cloud.png (renamed from app/assets/images/emoji/white_sun_small_cloud.png)bin989 -> 989 bytes
-rw-r--r--public/-/emojis/1/wilted_rose.png (renamed from app/assets/images/emoji/wilted_rose.png)bin1349 -> 1349 bytes
-rw-r--r--public/-/emojis/1/wind_blowing_face.png (renamed from app/assets/images/emoji/wind_blowing_face.png)bin1827 -> 1827 bytes
-rw-r--r--public/-/emojis/1/wind_chime.png (renamed from app/assets/images/emoji/wind_chime.png)bin1046 -> 1046 bytes
-rw-r--r--public/-/emojis/1/wine_glass.png (renamed from app/assets/images/emoji/wine_glass.png)bin655 -> 655 bytes
-rw-r--r--public/-/emojis/1/wink.png (renamed from app/assets/images/emoji/wink.png)bin746 -> 746 bytes
-rw-r--r--public/-/emojis/1/wolf.png (renamed from app/assets/images/emoji/wolf.png)bin1528 -> 1528 bytes
-rw-r--r--public/-/emojis/1/woman.png (renamed from app/assets/images/emoji/woman.png)bin1212 -> 1212 bytes
-rw-r--r--public/-/emojis/1/woman_tone1.png (renamed from app/assets/images/emoji/woman_tone1.png)bin1212 -> 1212 bytes
-rw-r--r--public/-/emojis/1/woman_tone2.png (renamed from app/assets/images/emoji/woman_tone2.png)bin1212 -> 1212 bytes
-rw-r--r--public/-/emojis/1/woman_tone3.png (renamed from app/assets/images/emoji/woman_tone3.png)bin1202 -> 1202 bytes
-rw-r--r--public/-/emojis/1/woman_tone4.png (renamed from app/assets/images/emoji/woman_tone4.png)bin1195 -> 1195 bytes
-rw-r--r--public/-/emojis/1/woman_tone5.png (renamed from app/assets/images/emoji/woman_tone5.png)bin1202 -> 1202 bytes
-rw-r--r--public/-/emojis/1/womans_clothes.png (renamed from app/assets/images/emoji/womans_clothes.png)bin1042 -> 1042 bytes
-rw-r--r--public/-/emojis/1/womans_hat.png (renamed from app/assets/images/emoji/womans_hat.png)bin1553 -> 1553 bytes
-rw-r--r--public/-/emojis/1/womens.png (renamed from app/assets/images/emoji/womens.png)bin577 -> 577 bytes
-rw-r--r--public/-/emojis/1/worried.png (renamed from app/assets/images/emoji/worried.png)bin715 -> 715 bytes
-rw-r--r--public/-/emojis/1/wrench.png (renamed from app/assets/images/emoji/wrench.png)bin418 -> 418 bytes
-rw-r--r--public/-/emojis/1/wrestlers.png (renamed from app/assets/images/emoji/wrestlers.png)bin2556 -> 2556 bytes
-rw-r--r--public/-/emojis/1/wrestlers_tone1.png (renamed from app/assets/images/emoji/wrestlers_tone1.png)bin2563 -> 2563 bytes
-rw-r--r--public/-/emojis/1/wrestlers_tone2.png (renamed from app/assets/images/emoji/wrestlers_tone2.png)bin2553 -> 2553 bytes
-rw-r--r--public/-/emojis/1/wrestlers_tone3.png (renamed from app/assets/images/emoji/wrestlers_tone3.png)bin2541 -> 2541 bytes
-rw-r--r--public/-/emojis/1/wrestlers_tone4.png (renamed from app/assets/images/emoji/wrestlers_tone4.png)bin2553 -> 2553 bytes
-rw-r--r--public/-/emojis/1/wrestlers_tone5.png (renamed from app/assets/images/emoji/wrestlers_tone5.png)bin2542 -> 2542 bytes
-rw-r--r--public/-/emojis/1/writing_hand.png (renamed from app/assets/images/emoji/writing_hand.png)bin1001 -> 1001 bytes
-rw-r--r--public/-/emojis/1/writing_hand_tone1.png (renamed from app/assets/images/emoji/writing_hand_tone1.png)bin988 -> 988 bytes
-rw-r--r--public/-/emojis/1/writing_hand_tone2.png (renamed from app/assets/images/emoji/writing_hand_tone2.png)bin987 -> 987 bytes
-rw-r--r--public/-/emojis/1/writing_hand_tone3.png (renamed from app/assets/images/emoji/writing_hand_tone3.png)bin977 -> 977 bytes
-rw-r--r--public/-/emojis/1/writing_hand_tone4.png (renamed from app/assets/images/emoji/writing_hand_tone4.png)bin973 -> 973 bytes
-rw-r--r--public/-/emojis/1/writing_hand_tone5.png (renamed from app/assets/images/emoji/writing_hand_tone5.png)bin970 -> 970 bytes
-rw-r--r--public/-/emojis/1/x.png (renamed from app/assets/images/emoji/x.png)bin298 -> 298 bytes
-rw-r--r--public/-/emojis/1/yellow_heart.png (renamed from app/assets/images/emoji/yellow_heart.png)bin435 -> 435 bytes
-rw-r--r--public/-/emojis/1/yen.png (renamed from app/assets/images/emoji/yen.png)bin421 -> 421 bytes
-rw-r--r--public/-/emojis/1/yin_yang.png (renamed from app/assets/images/emoji/yin_yang.png)bin776 -> 776 bytes
-rw-r--r--public/-/emojis/1/yum.png (renamed from app/assets/images/emoji/yum.png)bin896 -> 896 bytes
-rw-r--r--public/-/emojis/1/zap.png (renamed from app/assets/images/emoji/zap.png)bin413 -> 413 bytes
-rw-r--r--public/-/emojis/1/zero.png (renamed from app/assets/images/emoji/zero.png)bin560 -> 560 bytes
-rw-r--r--public/-/emojis/1/zipper_mouth.png (renamed from app/assets/images/emoji/zipper_mouth.png)bin722 -> 722 bytes
-rw-r--r--public/-/emojis/1/zzz.png (renamed from app/assets/images/emoji/zzz.png)bin540 -> 540 bytes
-rw-r--r--qa/.gitignore1
-rw-r--r--qa/Gemfile1
-rw-r--r--qa/Gemfile.lock3
-rw-r--r--qa/README.md3
-rw-r--r--qa/Rakefile6
-rw-r--r--qa/qa/git/repository.rb5
-rw-r--r--qa/qa/page/base.rb4
-rw-r--r--qa/qa/page/merge_request/show.rb16
-rw-r--r--qa/qa/page/project/new.rb7
-rw-r--r--qa/qa/service/kubernetes_cluster.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb34
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb (renamed from qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb)0
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/add_ci_variable_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb241
-rw-r--r--qa/qa/support/api.rb10
-rw-r--r--qa/qa/tools/generate_perf_testdata.rb141
-rw-r--r--qa/spec/git/repository_spec.rb4
-rwxr-xr-xscripts/lint-rugged8
-rw-r--r--spec/controllers/admin/appearances_controller_spec.rb48
-rw-r--r--spec/controllers/concerns/send_file_upload_spec.rb2
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb2
-rw-r--r--spec/controllers/google_api/authorizations_controller_spec.rb60
-rw-r--r--spec/controllers/graphql_controller_spec.rb112
-rw-r--r--spec/controllers/groups/clusters/applications_controller_spec.rb100
-rw-r--r--spec/controllers/groups/shared_projects_controller_spec.rb2
-rw-r--r--spec/controllers/groups_controller_spec.rb4
-rw-r--r--spec/controllers/omniauth_callbacks_controller_spec.rb2
-rw-r--r--spec/controllers/projects/autocomplete_sources_controller_spec.rb31
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb58
-rw-r--r--spec/controllers/projects/clusters/applications_controller_spec.rb97
-rw-r--r--spec/controllers/projects/group_links_controller_spec.rb37
-rw-r--r--spec/controllers/projects/settings/operations_controller_spec.rb63
-rw-r--r--spec/controllers/snippets_controller_spec.rb4
-rw-r--r--spec/controllers/users_controller_spec.rb34
-rw-r--r--spec/factories/ci/group_variables.rb1
-rw-r--r--spec/factories/ci/variables.rb1
-rw-r--r--spec/factories/merge_requests.rb9
-rw-r--r--spec/features/admin/admin_runners_spec.rb50
-rw-r--r--spec/features/dashboard/activity_spec.rb17
-rw-r--r--spec/features/group_variables_spec.rb2
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb84
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb18
-rw-r--r--spec/features/issues/user_uses_quick_actions_spec.rb4
-rw-r--r--spec/features/issues_spec.rb4
-rw-r--r--spec/features/markdown/copy_as_gfm_spec.rb11
-rw-r--r--spec/features/merge_request/maintainer_edits_fork_spec.rb4
-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_sees_merge_request_pipelines_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb6
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb4
-rw-r--r--spec/features/profiles/active_sessions_spec.rb48
-rw-r--r--spec/features/project_variables_spec.rb2
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb5
-rw-r--r--spec/features/projects/blobs/edit_spec.rb9
-rw-r--r--spec/features/projects/clusters/applications_spec.rb80
-rw-r--r--spec/features/projects/environments/environment_spec.rb6
-rw-r--r--spec/features/projects/environments/environments_spec.rb8
-rw-r--r--spec/features/projects/members/invite_group_spec.rb2
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb2
-rw-r--r--spec/features/projects/settings/operations_settings_spec.rb77
-rw-r--r--spec/features/projects/settings/project_settings_spec.rb43
-rw-r--r--spec/features/projects/settings/user_manages_group_links_spec.rb1
-rw-r--r--spec/features/projects/user_sees_sidebar_spec.rb102
-rw-r--r--spec/features/security/group/private_access_spec.rb32
-rw-r--r--spec/finders/admin/runners_finder_spec.rb8
-rw-r--r--spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb66
-rw-r--r--spec/finders/issues_finder_spec.rb55
-rw-r--r--spec/finders/merge_requests_finder_spec.rb516
-rw-r--r--spec/fixtures/security-reports/remediations/gl-dependency-scanning-report.json104
-rw-r--r--spec/fixtures/security-reports/remediations/remediation.patch180
-rw-r--r--spec/fixtures/security-reports/remediations/yarn.lock104
-rw-r--r--spec/fixtures/trace/sample_trace18
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js94
-rw-r--r--spec/graphql/resolvers/metadata_resolver_spec.rb11
-rw-r--r--spec/graphql/types/metadata_type_spec.rb5
-rw-r--r--spec/graphql/types/query_type_spec.rb15
-rw-r--r--spec/helpers/emails_helper_spec.rb54
-rw-r--r--spec/helpers/preferences_helper_spec.rb16
-rw-r--r--spec/helpers/projects_helper_spec.rb50
-rw-r--r--spec/javascripts/api_spec.js34
-rw-r--r--spec/javascripts/awards_handler_spec.js11
-rw-r--r--spec/javascripts/badges/store/actions_spec.js4
-rw-r--r--spec/javascripts/behaviors/copy_as_gfm_spec.js4
-rw-r--r--spec/javascripts/boards/components/issue_due_date_spec.js4
-rw-r--r--spec/javascripts/clusters/components/application_row_spec.js10
-rw-r--r--spec/javascripts/clusters/components/applications_spec.js169
-rw-r--r--spec/javascripts/clusters/services/mock_data.js12
-rw-r--r--spec/javascripts/clusters/stores/clusters_store_spec.js1
-rw-r--r--spec/javascripts/diffs/components/app_spec.js100
-rw-r--r--spec/javascripts/diffs/components/changed_files_dropdown_spec.js1
-rw-r--r--spec/javascripts/diffs/components/compare_versions_dropdown_spec.js153
-rw-r--r--spec/javascripts/diffs/components/diff_content_spec.js2
-rw-r--r--spec/javascripts/diffs/components/diff_file_header_spec.js151
-rw-r--r--spec/javascripts/diffs/components/diff_file_spec.js2
-rw-r--r--spec/javascripts/diffs/components/edit_button_spec.js62
-rw-r--r--spec/javascripts/diffs/components/hidden_files_warning_spec.js49
-rw-r--r--spec/javascripts/diffs/components/inline_diff_view_spec.js2
-rw-r--r--spec/javascripts/diffs/components/parallel_diff_view_spec.js6
-rw-r--r--spec/javascripts/diffs/mock_data/diff_discussions.js1
-rw-r--r--spec/javascripts/diffs/store/actions_spec.js130
-rw-r--r--spec/javascripts/diffs/store/mutations_spec.js62
-rw-r--r--spec/javascripts/diffs/store/utils_spec.js45
-rw-r--r--spec/javascripts/dirty_submit/dirty_submit_form_spec.js2
-rw-r--r--spec/javascripts/emoji_spec.js189
-rw-r--r--spec/javascripts/environments/confirm_rollback_modal_spec.js70
-rw-r--r--spec/javascripts/environments/environment_rollback_spec.js32
-rw-r--r--spec/javascripts/error_tracking/components/error_tracking_list_spec.js22
-rw-r--r--spec/javascripts/error_tracking_settings/components/app_spec.js63
-rw-r--r--spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js91
-rw-r--r--spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js109
-rw-r--r--spec/javascripts/error_tracking_settings/mock.js92
-rw-r--r--spec/javascripts/error_tracking_settings/store/actions_spec.js191
-rw-r--r--spec/javascripts/error_tracking_settings/store/getters_spec.js93
-rw-r--r--spec/javascripts/error_tracking_settings/store/mutation_spec.js82
-rw-r--r--spec/javascripts/error_tracking_settings/utils_spec.js29
-rw-r--r--spec/javascripts/fixtures/autocomplete_sources.rb40
-rw-r--r--spec/javascripts/fixtures/emojis.rb16
-rw-r--r--spec/javascripts/fixtures/static_fixtures.rb22
-rw-r--r--spec/javascripts/ide/components/new_dropdown/modal_spec.js55
-rw-r--r--spec/javascripts/ide/lib/files_spec.js77
-rw-r--r--spec/javascripts/ide/stores/actions/merge_request_spec.js93
-rw-r--r--spec/javascripts/ide/stores/actions/project_spec.js1
-rw-r--r--spec/javascripts/ide/stores/actions/tree_spec.js7
-rw-r--r--spec/javascripts/ide/stores/actions_spec.js28
-rw-r--r--spec/javascripts/ide/stores/mutations_spec.js14
-rw-r--r--spec/javascripts/import_projects/components/import_projects_table_spec.js8
-rw-r--r--spec/javascripts/import_projects/components/imported_project_table_row_spec.js3
-rw-r--r--spec/javascripts/import_projects/components/provider_repo_table_row_spec.js7
-rw-r--r--spec/javascripts/jobs/store/getters_spec.js55
-rw-r--r--spec/javascripts/lib/utils/number_utility_spec.js11
-rw-r--r--spec/javascripts/monitoring/charts/area_spec.js64
-rw-r--r--spec/javascripts/notes/components/note_form_spec.js157
-rw-r--r--spec/javascripts/notes/stores/getters_spec.js8
-rw-r--r--spec/javascripts/notes/stores/mutation_spec.js17
-rw-r--r--spec/javascripts/persistent_user_callout_spec.js88
-rw-r--r--spec/javascripts/test_bundle.js3
-rw-r--r--spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js20
-rw-r--r--spec/javascripts/vue_shared/components/issue/related_issuable_item_spec.js194
-rw-r--r--spec/javascripts/vue_shared/components/issue/related_issuable_mock_data.js111
-rw-r--r--spec/javascripts/vue_shared/components/table_pagination_spec.js182
-rw-r--r--spec/lib/constraints/project_url_constrainer_spec.rb4
-rw-r--r--spec/lib/event_filter_spec.rb8
-rw-r--r--spec/lib/gitlab/auth/ldap/config_spec.rb153
-rw-r--r--spec/lib/gitlab/checks/branch_check_spec.rb124
-rw-r--r--spec/lib/gitlab/ci/build/policy/changes_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/build/policy/refs_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/build/policy/variables_spec.rb21
-rw-r--r--spec/lib/gitlab/ci/config/external/file/base_spec.rb18
-rw-r--r--spec/lib/gitlab/ci/config/external/file/local_spec.rb36
-rw-r--r--spec/lib/gitlab/ci/config/external/file/project_spec.rb47
-rw-r--r--spec/lib/gitlab/ci/config/external/file/remote_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/config/external/file/template_spec.rb35
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb35
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb82
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/build_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb37
-rw-r--r--spec/lib/gitlab/ci/variables/collection/item_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/variables/collection_spec.rb12
-rw-r--r--spec/lib/gitlab/current_settings_spec.rb2
-rw-r--r--spec/lib/gitlab/danger/helper_spec.rb1
-rw-r--r--spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb2
-rw-r--r--spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb4
-rw-r--r--spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb9
-rw-r--r--spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb4
-rw-r--r--spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb18
-rw-r--r--spec/lib/gitlab/dependency_linker/parser/gemfile_spec.rb44
-rw-r--r--spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb5
-rw-r--r--spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb4
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb201
-rw-r--r--spec/lib/gitlab/git/blob_spec.rb16
-rw-r--r--spec/lib/gitlab/git/commit_spec.rb16
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb10
-rw-r--r--spec/lib/gitlab/git/tree_spec.rb74
-rw-r--r--spec/lib/gitlab/gitaly_client/storage_settings_spec.rb10
-rw-r--r--spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb24
-rw-r--r--spec/lib/gitlab/hashed_storage/migrator_spec.rb114
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml2
-rw-r--r--spec/lib/gitlab/import_export/merge_request_parser_spec.rb16
-rw-r--r--spec/lib/gitlab/json_cache_spec.rb28
-rw-r--r--spec/lib/gitlab/kubernetes/kube_client_spec.rb30
-rw-r--r--spec/lib/gitlab/path_regex_spec.rb2
-rw-r--r--spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb4
-rw-r--r--spec/lib/gitlab/quick_actions/command_definition_spec.rb7
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb74
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/shutdown_spec.rb88
-rw-r--r--spec/lib/gitlab/sidekiq_signals_spec.rb69
-rw-r--r--spec/lib/gitlab_spec.rb14
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb2
-rw-r--r--spec/mailers/abuse_report_mailer_spec.rb25
-rw-r--r--spec/mailers/email_rejection_mailer_spec.rb16
-rw-r--r--spec/mailers/emails/auto_devops_spec.rb3
-rw-r--r--spec/mailers/emails/issues_spec.rb9
-rw-r--r--spec/mailers/notify_spec.rb162
-rw-r--r--spec/mailers/repository_check_mailer_spec.rb7
-rw-r--r--spec/models/active_session_spec.rb5
-rw-r--r--spec/models/appearance_spec.rb18
-rw-r--r--spec/models/board_group_recent_visit_spec.rb22
-rw-r--r--spec/models/board_project_recent_visit_spec.rb22
-rw-r--r--spec/models/ci/bridge_spec.rb15
-rw-r--r--spec/models/ci/build_spec.rb294
-rw-r--r--spec/models/ci/build_trace_chunk_spec.rb4
-rw-r--r--spec/models/ci/group_variable_spec.rb1
-rw-r--r--spec/models/ci/pipeline_spec.rb87
-rw-r--r--spec/models/ci/variable_spec.rb1
-rw-r--r--spec/models/clusters/applications/jupyter_spec.rb5
-rw-r--r--spec/models/clusters/applications/knative_spec.rb26
-rw-r--r--spec/models/clusters/platforms/kubernetes_spec.rb16
-rw-r--r--spec/models/concerns/has_ref_spec.rb20
-rw-r--r--spec/models/concerns/has_variable_spec.rb2
-rw-r--r--spec/models/concerns/issuable_spec.rb97
-rw-r--r--spec/models/concerns/maskable_spec.rb76
-rw-r--r--spec/models/concerns/milestoneish_spec.rb142
-rw-r--r--spec/models/concerns/sortable_spec.rb2
-rw-r--r--spec/models/concerns/token_authenticatable_strategies/base_spec.rb32
-rw-r--r--spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb28
-rw-r--r--spec/models/error_tracking/project_error_tracking_setting_spec.rb35
-rw-r--r--spec/models/issue/metrics_spec.rb6
-rw-r--r--spec/models/merge_request_diff_spec.rb14
-rw-r--r--spec/models/merge_request_spec.rb6
-rw-r--r--spec/models/milestone_spec.rb8
-rw-r--r--spec/models/project_services/jira_service_spec.rb3
-rw-r--r--spec/models/project_services/prometheus_service_spec.rb61
-rw-r--r--spec/models/project_spec.rb52
-rw-r--r--spec/models/protected_branch_spec.rb28
-rw-r--r--spec/models/repository_spec.rb16
-rw-r--r--spec/policies/commit_policy_spec.rb55
-rw-r--r--spec/policies/global_policy_spec.rb12
-rw-r--r--spec/policies/group_policy_spec.rb40
-rw-r--r--spec/policies/note_policy_spec.rb94
-rw-r--r--spec/policies/project_policy_spec.rb23
-rw-r--r--spec/presenters/blobs/unfold_presenter_spec.rb159
-rw-r--r--spec/presenters/group_clusterable_presenter_spec.rb8
-rw-r--r--spec/presenters/merge_request_presenter_spec.rb23
-rw-r--r--spec/presenters/project_clusterable_presenter_spec.rb8
-rw-r--r--spec/requests/api/commits_spec.rb15
-rw-r--r--spec/requests/api/graphql/metadata_query_spec.rb32
-rw-r--r--spec/requests/api/graphql_spec.rb86
-rw-r--r--spec/requests/api/group_variables_spec.rb4
-rw-r--r--spec/requests/api/issues_spec.rb220
-rw-r--r--spec/requests/api/jobs_spec.rb43
-rw-r--r--spec/requests/api/merge_requests_spec.rb256
-rw-r--r--spec/requests/api/projects_spec.rb71
-rw-r--r--spec/requests/api/release/links_spec.rb16
-rw-r--r--spec/requests/api/runner_spec.rb20
-rw-r--r--spec/requests/api/runners_spec.rb33
-rw-r--r--spec/requests/api/snippets_spec.rb76
-rw-r--r--spec/requests/api/todos_spec.rb52
-rw-r--r--spec/requests/api/variables_spec.rb4
-rw-r--r--spec/requests/api/version_spec.rb18
-rw-r--r--spec/requests/git_http_spec.rb134
-rw-r--r--spec/serializers/merge_request_for_pipeline_entity_spec.rb29
-rw-r--r--spec/serializers/pipeline_entity_spec.rb45
-rw-r--r--spec/serializers/pipeline_serializer_spec.rb38
-rw-r--r--spec/serializers/provider_repo_entity_spec.rb2
-rw-r--r--spec/services/boards/visits/latest_service_spec.rb12
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb4
-rw-r--r--spec/services/clusters/applications/patch_service_spec.rb128
-rw-r--r--spec/services/clusters/applications/update_service_spec.rb72
-rw-r--r--spec/services/error_tracking/list_projects_service_spec.rb4
-rw-r--r--spec/services/files/multi_service_spec.rb16
-rw-r--r--spec/services/groups/transfer_service_spec.rb29
-rw-r--r--spec/services/issuable/common_system_notes_service_spec.rb4
-rw-r--r--spec/services/issues/build_service_spec.rb76
-rw-r--r--spec/services/issues/update_service_spec.rb6
-rw-r--r--spec/services/merge_requests/build_service_spec.rb9
-rw-r--r--spec/services/merge_requests/create_service_spec.rb4
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb2
-rw-r--r--spec/services/merge_requests/merge_to_ref_service_spec.rb96
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb4
-rw-r--r--spec/services/merge_requests/update_service_spec.rb6
-rw-r--r--spec/services/notes/create_service_spec.rb13
-rw-r--r--spec/services/notes/quick_actions_service_spec.rb24
-rw-r--r--spec/services/notification_service_spec.rb2
-rw-r--r--spec/services/projects/group_links/create_service_spec.rb8
-rw-r--r--spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb6
-rw-r--r--spec/services/projects/hashed_storage/migrate_repository_service_spec.rb12
-rw-r--r--spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb100
-rw-r--r--spec/services/projects/hashed_storage/rollback_repository_service_spec.rb111
-rw-r--r--spec/services/projects/hashed_storage/rollback_service_spec.rb57
-rw-r--r--spec/services/projects/operations/update_service_spec.rb50
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb10
-rw-r--r--spec/services/suggestions/apply_service_spec.rb11
-rw-r--r--spec/services/suggestions/create_service_spec.rb47
-rw-r--r--spec/services/system_note_service_spec.rb9
-rw-r--r--spec/spec_helper.rb9
-rw-r--r--spec/support/api/schema_matcher.rb2
-rw-r--r--spec/support/database_cleaner.rb56
-rw-r--r--spec/support/db_cleaner.rb50
-rw-r--r--spec/support/features/reportable_note_shared_examples.rb2
-rw-r--r--spec/support/features/variable_list_shared_examples.rb8
-rw-r--r--spec/support/helpers/file_mover_helpers.rb12
-rw-r--r--spec/support/helpers/graphql_helpers.rb20
-rw-r--r--spec/support/helpers/javascript_fixtures_helpers.rb27
-rw-r--r--spec/support/helpers/kubernetes_helpers.rb15
-rw-r--r--spec/support/helpers/login_helpers.rb13
-rw-r--r--spec/support/import_export/export_file_helper.rb2
-rw-r--r--spec/support/matchers/access_matchers.rb35
-rw-r--r--spec/support/pg_stat_activity.rb19
-rw-r--r--spec/support/shared_contexts/services_shared_context.rb8
-rw-r--r--spec/support/shared_examples/issuable_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/notify_shared_examples.rb28
-rw-r--r--spec/support/shared_examples/requests/api/discussions.rb31
-rw-r--r--spec/support/shared_examples/requests/api/merge_requests_list.rb31
-rw-r--r--spec/support/shared_examples/views/nav_sidebar.rb11
-rw-r--r--spec/support/webmock.rb10
-rw-r--r--spec/uploaders/file_mover_spec.rb33
-rw-r--r--spec/validators/sha_validator_spec.rb42
-rw-r--r--spec/views/ci/status/_icon.html.haml_spec.rb89
-rw-r--r--spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb13
-rw-r--r--spec/views/layouts/nav/sidebar/_instance_statistics.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb13
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb2
-rw-r--r--spec/views/projects/deployments/_confirm_rollback_modal_spec.html.rb63
-rw-r--r--spec/views/projects/issues/_merge_requests_status.html.haml_spec.rb6
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb1
-rw-r--r--spec/workers/hashed_storage/project_migrate_worker_spec.rb48
-rw-r--r--spec/workers/hashed_storage/project_rollback_worker_spec.rb50
-rw-r--r--spec/workers/hashed_storage/rollbacker_worker_spec.rb27
-rw-r--r--spec/workers/project_migrate_hashed_storage_worker_spec.rb48
-rw-r--r--spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb4
-rw-r--r--vendor/project_templates/dotnetcore.tar.gzbin44710 -> 7027 bytes
-rw-r--r--vendor/project_templates/express.tar.gzbin4894 -> 16098 bytes
-rw-r--r--vendor/project_templates/gitbook.tar.gzbin13808 -> 13068 bytes
-rw-r--r--vendor/project_templates/gomicro.tar.gzbin52756 -> 5388 bytes
-rw-r--r--vendor/project_templates/hexo.tar.gzbin548020 -> 547220 bytes
-rw-r--r--vendor/project_templates/hugo.tar.gzbin1048753 -> 1047952 bytes
-rw-r--r--vendor/project_templates/jekyll.tar.gzbin60703 -> 60086 bytes
-rw-r--r--vendor/project_templates/nfgitbook.tar.gzbin139877 -> 122562 bytes
-rw-r--r--vendor/project_templates/nfhexo.tar.gzbin663568 -> 655028 bytes
-rw-r--r--vendor/project_templates/nfhugo.tar.gzbin1292761 -> 1159251 bytes
-rw-r--r--vendor/project_templates/nfjekyll.tar.gzbin154419 -> 132262 bytes
-rw-r--r--vendor/project_templates/nfplainhtml.tar.gzbin132509 -> 122392 bytes
-rw-r--r--vendor/project_templates/plainhtml.tar.gzbin12079 -> 11389 bytes
-rw-r--r--vendor/project_templates/rails.tar.gzbin25182 -> 25490 bytes
-rw-r--r--vendor/project_templates/spring.tar.gzbin49476 -> 49518 bytes
-rw-r--r--yarn.lock1737
2922 files changed, 55015 insertions, 11938 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0afd59ab007..0cc95ff8436 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -444,6 +444,17 @@ setup-test-env:
- master
- /(^docs[\/-].*|.*-docs$)/
+.review-schedules-only: &review-schedules-only
+ only:
+ refs:
+ - schedules@gitlab-org/gitlab-ce
+ - schedules@gitlab-org/gitlab-ee
+ kubernetes: active
+ except:
+ refs:
+ - tags
+ - /(^docs[\/-].*|.*-docs$)/
+
.review-base: &review-base
<<: *dedicated-no-docs-no-db-pull-cache-job
<<: *review-only
@@ -672,6 +683,30 @@ gitlab:assets:compile:
- docker
- gitlab-org
+gitlab:ui:visual:
+ <<: *except-docs
+ tags:
+ - gitlab-org
+ before_script: []
+ dependencies:
+ - compile-assets
+ script:
+ # Remove node modules from GitLab that may conflict with gitlab-ui
+ - rm -r node_modules
+ - git clone https://gitlab.com/gitlab-org/gitlab-ui.git
+ - cp public/assets/application-*.css gitlab-ui/styles/application.css
+ - cd gitlab-ui
+ - yarn install
+ - CSS_URL=./application.css yarn test
+ only:
+ changes:
+ - app/assets/stylesheets/*.scss
+ - app/assets/stylesheets/**/*.scss
+ - app/assets/stylesheets/**/**/*.scss
+ artifacts:
+ paths:
+ - tests/__image_snapshots__/
+
karma:
<<: *dedicated-no-docs-pull-cache-job
<<: *use-pg
@@ -959,8 +994,7 @@ no_ee_check:
- //@gitlab-org/gitlab-ce
# GitLab Review apps
-review-build-cng:
- <<: *review-only
+.review-build-cng-base: &review-build-cng-base
image: ruby:2.5-alpine
stage: test
before_script: []
@@ -976,7 +1010,15 @@ review-build-cng:
- wait_for_job_to_be_done "gitlab:assets:compile"
- BUILD_TRIGGER_TOKEN=$REVIEW_APPS_BUILD_TRIGGER_TOKEN ./scripts/trigger-build cng
-review-deploy:
+review-build-cng:
+ <<: *review-only
+ <<: *review-build-cng-base
+
+schedule:review-build-cng:
+ <<: *review-schedules-only
+ <<: *review-build-cng-base
+
+.review-deploy-base: &review-deploy-base
<<: *review-base
retry: 2
allow_failure: true
@@ -998,6 +1040,8 @@ review-deploy:
- source ./scripts/review_apps/review-apps.sh
script:
- wait_for_job_to_be_done "review-build-cng"
+ after_script:
+ - source ./scripts/review_apps/review-apps.sh
- check_kube_domain
- download_gitlab_chart
- ensure_namespace
@@ -1006,6 +1050,15 @@ review-deploy:
- time deploy
- add_license
+review-deploy:
+ <<: *review-deploy-base
+
+schedule:review-deploy:
+ <<: *review-deploy-base
+ <<: *review-schedules-only
+ script:
+ - wait_for_job_to_be_done "schedule:review-build-cng"
+
.review-qa-base: &review-qa-base
<<: *review-docker
allow_failure: true
@@ -1032,19 +1085,40 @@ review-deploy:
- apk update && apk add curl jq
- source ./scripts/review_apps/review-apps.sh
- gem install gitlab-qa --no-document ${GITLAB_QA_VERSION:+ --version ${GITLAB_QA_VERSION}}
- - wait_for_job_to_be_done "review-deploy"
review-qa-smoke:
<<: *review-qa-base
script:
+ - wait_for_job_to_be_done "review-deploy"
- gitlab-qa Test::Instance::Smoke "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
review-qa-all:
<<: *review-qa-base
script:
+ - wait_for_job_to_be_done "review-deploy"
- gitlab-qa Test::Instance::Any "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
when: manual
+
+.review-performance-base: &review-performance-base
+ <<: *review-qa-base
+ script:
+ - wait_for_job_to_be_done "review-deploy"
+ after_script:
+ - mkdir gitlab-exporter
+ - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/master/index.js
+ - mkdir sitespeed-results
+ - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.3.1 --plugins.add ./gitlab-exporter --outputFolder sitespeed-results "$CI_ENVIRONMENT_URL"
+ - mv sitespeed-results/data/performance.json performance.json
+ artifacts:
+ paths:
+ - sitespeed-results/
+ reports:
+ performance: performance.json
+
+review-performance:
+ <<: *review-performance-base
+
review-stop:
<<: *review-base
<<: *single-script-job
@@ -1064,21 +1138,20 @@ review-stop:
schedule:review-cleanup:
<<: *review-base
+ <<: *review-schedules-only
stage: build
allow_failure: true
variables:
GIT_DEPTH: "1"
environment:
name: review/auto-cleanup
- only:
- refs:
- - schedules@gitlab-org/gitlab-ce
- - schedules@gitlab-org/gitlab-ee
- kubernetes: active
- except:
- - tags
- - /(^docs[\/-].*|.*-docs$)/
before_script:
- gem install gitlab --no-document
script:
- ruby -rrubygems scripts/review_apps/automated_cleanup.rb
+
+schedule:review-performance:
+ <<: *review-performance-base
+ <<: *review-schedules-only
+ script:
+ - wait_for_job_to_be_done "schedule:review-deploy"
diff --git a/.gitlab/issue_templates/Feature proposal.md b/.gitlab/issue_templates/Feature proposal.md
index 9c86dff835f..eef1e877ff2 100644
--- a/.gitlab/issue_templates/Feature proposal.md
+++ b/.gitlab/issue_templates/Feature proposal.md
@@ -39,7 +39,7 @@ Existing personas are: (copy relevant personas out of this comment, and delete a
### Permissions and Security
-What permissions are required to perform the described actions? Are they consistent with the existing permissions as documented for users, groups, and projects as appropriate? Is the proposed behavior consistent between the UI, API, and other access methods (e.g. email replies)?
+<!-- What permissions are required to perform the described actions? Are they consistent with the existing permissions as documented for users, groups, and projects as appropriate? Is the proposed behavior consistent between the UI, API, and other access methods (e.g. email replies)? -->
### Documentation
diff --git a/.rubocop.yml b/.rubocop.yml
index bcff67ded8c..2985c1446e4 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -181,3 +181,6 @@ Cop/InjectEnterpriseEditionModule:
Exclude:
- 'spec/**/*'
- 'ee/spec/**/*'
+
+Style/ReturnNil:
+ Enabled: true
diff --git a/.stylelintrc b/.stylelintrc
index 69de9a5dd13..04784a0a11a 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,30 +1,107 @@
{
- "extends": "stylelint-config-recommended",
- "plugins": [
- "stylelint-scss"
- ],
- "rules": {
- "no-descending-specificity": null,
- "font-family-no-missing-generic-family-keyword": null,
- "at-rule-no-unknown": [ true, {
- ignoreAtRules: ["include", "each", "mixin", "extend", "if", "function", "for", "else", "return"]
- }],
- "selector-type-no-unknown": [true, {
- "ignoreTypes": ["gl-emoji"]
- }],
- "unit-no-unknown" : [true, {
- "ignoreFunctions": ["-webkit-image-set"]
- }],
- "scss/at-extend-no-missing-placeholder": null,
- "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,
- }
+ "plugins":[
+ "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":[
+ 3,
+ {
+ "ignoreAtRules":[
+ "each",
+ "media",
+ "supports",
+ "include"
+ ],
+ "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,
+ "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":[5, { "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
+ }
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index feda5e0835b..8a4a6c9ff13 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -486,6 +486,33 @@ entry.
- Update url placeholder for the sentry configuration page. !24338
+## 11.6.10 (2019-02-28)
+
+### Security (21 changes)
+
+- Stop linking to unrecognized package sources. !55518
+- Check snippet attached file to be moved is within designated directory.
+- Fix potential Addressable::URI::InvalidURIError.
+- Do not display impersonated sessions under active sessions and remove ability to revoke session.
+- Display only information visible to current user on the Milestone page.
+- Show only merge requests visible to user on milestone detail page.
+- Disable issue boards API when issues are disabled.
+- Don't show new issue link after move when a user does not have permissions.
+- Fix git clone revealing private repo's presence.
+- Fix blind SSRF in Prometheus integration by checking URL before querying.
+- Check if desired milestone for an issue is available.
+- Don't allow non-members to see private related MRs.
+- Fix arbitrary file read via diffs during import.
+- Display the correct number of MRs a user has access to.
+- Forbid creating discussions for users with restricted access.
+- Do not disclose milestone titles for unauthorized users.
+- Validate session key when authorizing with GCP to create a cluster.
+- Block local URLs for Kubernetes integration.
+- Limit mermaid rendering to 5K characters.
+- Remove the possibility to share a project with a group that a user is not a member of.
+- Fix leaking private repository information in API.
+
+
## 11.6.8 (2019-01-30)
- No changes.
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 3500250a4b0..ad2191947f7 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-1.21.0
+1.25.0
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index acd405b1d62..d139a75408e 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-8.6.0
+8.7.1
diff --git a/Gemfile b/Gemfile
index 28666199c0f..2e465f8ced7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -68,7 +68,7 @@ gem 'gpgme', '~> 2.0.18'
# LDAP Auth
# GitLab fork with several improvements to original library. For full list of changes
# see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
-gem 'gitlab_omniauth-ldap', '~> 2.0.4', require: 'omniauth-ldap'
+gem 'gitlab_omniauth-ldap', '~> 2.1.1', require: 'omniauth-ldap'
gem 'net-ldap'
# API
@@ -94,13 +94,15 @@ gem 'carrierwave', '~> 1.3'
gem 'mini_magick'
# for backups
-gem 'fog-aws', '~> 2.0.1'
-gem 'fog-core', '~> 1.44'
-gem 'fog-google', '~> 1.7.1'
-gem 'fog-local', '~> 0.3'
-gem 'fog-openstack', '~> 0.1'
+gem 'fog-aws', '~> 3.3'
+# 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.8'
+gem 'fog-local', '~> 0.6'
+gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
-gem 'fog-aliyun', '~> 0.2.0'
+gem 'fog-aliyun', '~> 0.3'
# for Google storage
gem 'google-api-client', '~> 0.23'
@@ -323,7 +325,7 @@ group :development do
end
group :development, :test do
- gem 'bootsnap', '~> 1.3'
+ gem 'bootsnap', '~> 1.4'
gem 'bullet', '~> 5.5.0', require: !!ENV['ENABLE_BULLET']
gem 'pry-byebug', '~> 3.5.1', platform: :mri
gem 'pry-rails', '~> 0.3.4'
@@ -419,7 +421,7 @@ group :ed25519 do
end
# Gitaly GRPC client
-gem 'gitaly-proto', '~> 1.12.0', require: 'gitaly'
+gem 'gitaly-proto', '~> 1.13.0', require: 'gitaly'
gem 'grpc', '~> 1.15.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 59e152c27fb..4d37075cdfa 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -85,7 +85,7 @@ GEM
binding_ninja (0.2.2)
binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1)
- bootsnap (1.3.2)
+ bootsnap (1.4.1)
msgpack (~> 1.0)
bootstrap_form (2.7.0)
brakeman (4.2.1)
@@ -218,32 +218,33 @@ GEM
flowdock (0.7.1)
httparty (~> 0.7)
multi_json
- fog-aliyun (0.2.0)
- fog-core (~> 1.27)
- fog-json (~> 1.0)
+ fog-aliyun (0.3.3)
+ fog-core
+ fog-json
ipaddress (~> 0.8)
xml-simple (~> 1.1)
- fog-aws (2.0.1)
- fog-core (~> 1.38)
- fog-json (~> 1.0)
+ fog-aws (3.3.0)
+ fog-core (~> 2.1)
+ fog-json (~> 1.1)
fog-xml (~> 0.1)
ipaddress (~> 0.8)
- fog-core (1.45.0)
+ fog-core (2.1.0)
builder
excon (~> 0.58)
formatador (~> 0.2)
- fog-google (1.7.1)
- fog-core
- fog-json
- fog-xml
+ mime-types
+ fog-google (1.8.2)
+ fog-core (<= 2.1.0)
+ fog-json (~> 1.2)
+ fog-xml (~> 0.1.0)
google-api-client (~> 0.23.0)
- fog-json (1.0.2)
- fog-core (~> 1.0)
+ fog-json (1.2.0)
+ fog-core
multi_json (~> 1.10)
- fog-local (0.3.1)
- fog-core (~> 1.27)
- fog-openstack (0.1.21)
- fog-core (>= 1.40)
+ fog-local (0.6.0)
+ fog-core (>= 1.27, < 3.0)
+ fog-openstack (1.0.8)
+ fog-core (~> 2.1)
fog-json (>= 1.0)
ipaddress (>= 0.8)
fog-rackspace (0.1.1)
@@ -278,7 +279,7 @@ GEM
gettext_i18n_rails (>= 0.7.1)
po_to_json (>= 1.0.0)
rails (>= 3.2.0)
- gitaly-proto (1.12.0)
+ gitaly-proto (1.13.0)
grpc (~> 1.0)
github-markup (1.7.0)
gitlab-default_value_for (3.1.1)
@@ -290,7 +291,7 @@ GEM
rubocop (~> 0.54.0)
rubocop-gitlab-security (~> 0.1.0)
rubocop-rspec (~> 1.19)
- gitlab_omniauth-ldap (2.0.4)
+ gitlab_omniauth-ldap (2.1.1)
net-ldap (~> 0.16)
omniauth (~> 1.3)
pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
@@ -309,7 +310,7 @@ GEM
representable (~> 3.0)
retriable (>= 2.0, < 4.0)
google-protobuf (3.6.1)
- googleapis-common-protos-types (1.0.2)
+ googleapis-common-protos-types (1.0.3)
google-protobuf (~> 3.0)
googleauth (0.6.6)
faraday (~> 0.12)
@@ -965,7 +966,7 @@ DEPENDENCIES
benchmark-ips (~> 2.3.0)
better_errors (~> 2.5.0)
binding_of_caller (~> 0.8.0)
- bootsnap (~> 1.3)
+ bootsnap (~> 1.4)
bootstrap_form (~> 2.7.0)
brakeman (~> 4.2)
browser (~> 2.5)
@@ -1002,12 +1003,12 @@ DEPENDENCIES
flipper-active_record (~> 0.13.0)
flipper-active_support_cache_store (~> 0.13.0)
flowdock (~> 0.7)
- fog-aliyun (~> 0.2.0)
- fog-aws (~> 2.0.1)
- fog-core (~> 1.44)
- fog-google (~> 1.7.1)
- fog-local (~> 0.3)
- fog-openstack (~> 0.1)
+ fog-aliyun (~> 0.3)
+ fog-aws (~> 3.3)
+ fog-core (= 2.1.0)
+ fog-google (~> 1.8)
+ fog-local (~> 0.6)
+ fog-openstack (~> 1.0)
fog-rackspace (~> 0.1.1)
font-awesome-rails (~> 4.7)
foreman (~> 0.84.0)
@@ -1017,13 +1018,13 @@ DEPENDENCIES
gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly-proto (~> 1.12.0)
+ gitaly-proto (~> 1.13.0)
github-markup (~> 1.7.0)
gitlab-default_value_for (~> 3.1.1)
gitlab-markup (~> 1.6.5)
gitlab-sidekiq-fetcher (~> 0.4.0)
gitlab-styles (~> 2.4)
- gitlab_omniauth-ldap (~> 2.0.4)
+ gitlab_omniauth-ldap (~> 2.1.1)
gon (~> 6.2)
google-api-client (~> 0.23)
google-protobuf (~> 3.6)
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index 85eb08cc97d..8754c253881 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -12,6 +12,7 @@ const Api = {
projectsPath: '/api/:version/projects.json',
projectPath: '/api/:version/projects/:id',
projectLabelsPath: '/:namespace_path/:project_path/labels',
+ projectMergeRequestsPath: '/api/:version/projects/:id/merge_requests',
projectMergeRequestPath: '/api/:version/projects/:id/merge_requests/:mrid',
projectMergeRequestChangesPath: '/api/:version/projects/:id/merge_requests/:mrid/changes',
projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions',
@@ -111,6 +112,22 @@ const Api = {
return axios.get(url);
},
+ /**
+ * Get all Merge Requests for a project, eventually filtering based on
+ * supplied parameters
+ * @param projectPath
+ * @param params
+ * @returns {Promise}
+ */
+ projectMergeRequests(projectPath, params = {}) {
+ const url = Api.buildUrl(Api.projectMergeRequestsPath).replace(
+ ':id',
+ encodeURIComponent(projectPath),
+ );
+
+ return axios.get(url, { params });
+ },
+
// Return Merge Request for project
projectMergeRequest(projectPath, mergeRequestId, params = {}) {
const url = Api.buildUrl(Api.projectMergeRequestPath)
diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js
index 73ce3e760ab..aeb88715c11 100644
--- a/app/assets/javascripts/awards_handler.js
+++ b/app/assets/javascripts/awards_handler.js
@@ -615,10 +615,18 @@ export class AwardsHandler {
let awardsHandlerPromise = null;
export default function loadAwardsHandler(reload = false) {
if (!awardsHandlerPromise || reload) {
- awardsHandlerPromise = import(/* webpackChunkName: 'emoji' */ './emoji').then(Emoji => {
- const awardsHandler = new AwardsHandler(Emoji);
- awardsHandler.bindEvents();
- return awardsHandler;
+ awardsHandlerPromise = new Promise((resolve, reject) => {
+ import(/* webpackChunkName: 'emoji' */ './emoji')
+ .then(Emoji => {
+ Emoji.initEmojiMap()
+ .then(() => {
+ const awardsHandler = new AwardsHandler(Emoji);
+ awardsHandler.bindEvents();
+ resolve(awardsHandler);
+ })
+ .catch(() => reject);
+ })
+ .catch(() => reject);
});
}
return awardsHandlerPromise;
diff --git a/app/assets/javascripts/behaviors/gl_emoji.js b/app/assets/javascripts/behaviors/gl_emoji.js
index d1d75658181..9034563d9b3 100644
--- a/app/assets/javascripts/behaviors/gl_emoji.js
+++ b/app/assets/javascripts/behaviors/gl_emoji.js
@@ -1,47 +1,74 @@
import 'document-register-element';
import isEmojiUnicodeSupported from '../emoji/support';
+import { initEmojiMap, getEmojiInfo, emojiFallbackImageSrc, emojiImageTag } from '../emoji';
class GlEmoji extends HTMLElement {
constructor() {
super();
- const emojiUnicode = this.textContent.trim();
- const { name, unicodeVersion, fallbackSrc, fallbackSpriteClass } = this.dataset;
-
- const isEmojiUnicode =
- this.childNodes &&
- Array.prototype.every.call(this.childNodes, childNode => childNode.nodeType === 3);
- const hasImageFallback = fallbackSrc && fallbackSrc.length > 0;
- const hasCssSpriteFalback = fallbackSpriteClass && fallbackSpriteClass.length > 0;
-
- if (emojiUnicode && isEmojiUnicode && !isEmojiUnicodeSupported(emojiUnicode, unicodeVersion)) {
- // CSS sprite fallback takes precedence over image fallback
- if (hasCssSpriteFalback) {
- if (!gon.emoji_sprites_css_added && gon.emoji_sprites_css_path) {
- const emojiSpriteLinkTag = document.createElement('link');
- emojiSpriteLinkTag.setAttribute('rel', 'stylesheet');
- emojiSpriteLinkTag.setAttribute('href', gon.emoji_sprites_css_path);
- document.head.appendChild(emojiSpriteLinkTag);
- gon.emoji_sprites_css_added = true;
- }
- // IE 11 doesn't like adding multiple at once :(
- this.classList.add('emoji-icon');
- this.classList.add(fallbackSpriteClass);
- } else {
- import(/* webpackChunkName: 'emoji' */ '../emoji')
- .then(({ emojiImageTag, emojiFallbackImageSrc }) => {
- if (hasImageFallback) {
- this.innerHTML = emojiImageTag(name, fallbackSrc);
+ let emojiUnicode = this.textContent.trim();
+ const { fallbackSpriteClass, fallbackSrc, forceFallback } = this.dataset;
+ let { name, unicodeVersion } = this.dataset;
+
+ initEmojiMap()
+ .then(() => {
+ if (!unicodeVersion) {
+ const emojiInfo = getEmojiInfo(name);
+
+ if (emojiInfo) {
+ if (name !== emojiInfo.name) {
+ ({ name } = emojiInfo);
+ this.dataset.name = emojiInfo.name;
+ }
+ unicodeVersion = emojiInfo.u;
+ this.dataset.uni = unicodeVersion;
+
+ if (forceFallback === 'true' && !fallbackSpriteClass) {
+ this.innerHTML = emojiImageTag(name, emojiFallbackImageSrc(name));
} else {
- const src = emojiFallbackImageSrc(name);
- this.innerHTML = emojiImageTag(name, src);
+ emojiUnicode = emojiInfo.e;
+ this.innerHTML = emojiInfo.e;
}
- })
- .catch(() => {
- // do nothing
- });
- }
- }
+
+ this.title = emojiInfo.d;
+ }
+ }
+
+ const isEmojiUnicode =
+ this.childNodes &&
+ Array.prototype.every.call(this.childNodes, childNode => childNode.nodeType === 3);
+ const hasImageFallback = fallbackSrc && fallbackSrc.length > 0;
+ const hasCssSpriteFalback = fallbackSpriteClass && fallbackSpriteClass.length > 0;
+
+ if (
+ emojiUnicode &&
+ isEmojiUnicode &&
+ !isEmojiUnicodeSupported(emojiUnicode, unicodeVersion)
+ ) {
+ // CSS sprite fallback takes precedence over image fallback
+ if (hasCssSpriteFalback) {
+ if (!gon.emoji_sprites_css_added && gon.emoji_sprites_css_path) {
+ const emojiSpriteLinkTag = document.createElement('link');
+ emojiSpriteLinkTag.setAttribute('rel', 'stylesheet');
+ emojiSpriteLinkTag.setAttribute('href', gon.emoji_sprites_css_path);
+ document.head.appendChild(emojiSpriteLinkTag);
+ gon.emoji_sprites_css_added = true;
+ }
+ // IE 11 doesn't like adding multiple at once :(
+ this.classList.add('emoji-icon');
+ this.classList.add(fallbackSpriteClass);
+ } else if (hasImageFallback) {
+ this.innerHTML = emojiImageTag(name, fallbackSrc);
+ } else {
+ const src = emojiFallbackImageSrc(name);
+ this.innerHTML = emojiImageTag(name, src);
+ }
+ }
+ })
+ .catch(error => {
+ // Only reject is already handled in initEmojiMap
+ throw error;
+ });
}
}
diff --git a/app/assets/javascripts/behaviors/markdown/copy_as_gfm.js b/app/assets/javascripts/behaviors/markdown/copy_as_gfm.js
index 9482a9f166d..58cf057b2c2 100644
--- a/app/assets/javascripts/behaviors/markdown/copy_as_gfm.js
+++ b/app/assets/javascripts/behaviors/markdown/copy_as_gfm.js
@@ -173,7 +173,9 @@ export class CopyAsGFM {
wrapEl.appendChild(node.cloneNode(true));
const doc = DOMParser.fromSchema(schema.default).parse(wrapEl);
- const res = markdownSerializer.default.serialize(doc);
+ const res = markdownSerializer.default.serialize(doc, {
+ tightLists: true,
+ });
return res;
})
.catch(() => {});
diff --git a/app/assets/javascripts/behaviors/markdown/render_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_mermaid.js
index 35380ca49fb..798114b4b0b 100644
--- a/app/assets/javascripts/behaviors/markdown/render_mermaid.js
+++ b/app/assets/javascripts/behaviors/markdown/render_mermaid.js
@@ -1,4 +1,5 @@
import flash from '~/flash';
+import { sprintf, __ } from '../../locale';
// Renders diagrams and flowcharts from text using Mermaid in any element with the
// `js-render-mermaid` class.
@@ -14,6 +15,9 @@ import flash from '~/flash';
// </pre>
//
+// This is an arbitary number; Can be iterated upon when suitable.
+const MAX_CHAR_LIMIT = 5000;
+
export default function renderMermaid($els) {
if (!$els.length) return;
@@ -34,6 +38,21 @@ export default function renderMermaid($els) {
$els.each((i, el) => {
const source = el.textContent;
+ /**
+ * Restrict the rendering to a certain amount of character to
+ * prevent mermaidjs from hanging up the entire thread and
+ * causing a DoS.
+ */
+ if (source && source.length > MAX_CHAR_LIMIT) {
+ el.textContent = sprintf(
+ __(
+ 'Cannot render the image. Maximum character count (%{charLimit}) has been exceeded.',
+ ),
+ { charLimit: MAX_CHAR_LIMIT },
+ );
+ return;
+ }
+
// Remove any extra spans added by the backend syntax highlighting.
Object.assign(el, { textContent: source });
diff --git a/app/assets/javascripts/blob_edit/blob_bundle.js b/app/assets/javascripts/blob_edit/blob_bundle.js
index 5f64175362d..6aaf5bf7296 100644
--- a/app/assets/javascripts/blob_edit/blob_bundle.js
+++ b/app/assets/javascripts/blob_edit/blob_bundle.js
@@ -13,7 +13,7 @@ export default () => {
if (editBlobForm.length) {
const urlRoot = editBlobForm.data('relativeUrlRoot');
const assetsPath = editBlobForm.data('assetsPrefix');
- const filePath = editBlobForm.data('blobFilename');
+ const filePath = `${editBlobForm.data('blobFilename')}`;
const currentAction = $('.js-file-title').data('currentAction');
const projectId = editBlobForm.data('project-id');
const isMarkdown = editBlobForm.data('is-markdown');
diff --git a/app/assets/javascripts/boards/components/issue_due_date.vue b/app/assets/javascripts/boards/components/issue_due_date.vue
index 9c4c6632976..9bc66978198 100644
--- a/app/assets/javascripts/boards/components/issue_due_date.vue
+++ b/app/assets/javascripts/boards/components/issue_due_date.vue
@@ -53,7 +53,7 @@ export default {
} else if (timeDifference === -1) {
return __('Yesterday');
} else if (timeDifference > 0 && timeDifference < 7) {
- return dateFormat(issueDueDate, 'dddd', true);
+ return dateFormat(issueDueDate, 'dddd');
}
return standardDateFormat;
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index f88e9b55988..c4c5fedc615 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -58,6 +58,7 @@ export default () => {
state: boardsStore.state,
loading: true,
boardsEndpoint: $boardApp.dataset.boardsEndpoint,
+ recentBoardsEndpoint: $boardApp.dataset.recentBoardsEndpoint,
listsEndpoint: $boardApp.dataset.listsEndpoint,
boardId: $boardApp.dataset.boardId,
disabled: parseBoolean($boardApp.dataset.disabled),
@@ -75,6 +76,7 @@ export default () => {
created() {
gl.boardService = new BoardService({
boardsEndpoint: this.boardsEndpoint,
+ recentBoardsEndpoint: this.recentBoardsEndpoint,
listsEndpoint: this.listsEndpoint,
bulkUpdatePath: this.bulkUpdatePath,
boardId: this.boardId,
diff --git a/app/assets/javascripts/boards/services/board_service.js b/app/assets/javascripts/boards/services/board_service.js
index 3de6eb056c2..7d463f17ab1 100644
--- a/app/assets/javascripts/boards/services/board_service.js
+++ b/app/assets/javascripts/boards/services/board_service.js
@@ -2,12 +2,13 @@ import axios from '../../lib/utils/axios_utils';
import { mergeUrlParams } from '../../lib/utils/url_utility';
export default class BoardService {
- constructor({ boardsEndpoint, listsEndpoint, bulkUpdatePath, boardId }) {
+ constructor({ boardsEndpoint, listsEndpoint, bulkUpdatePath, boardId, recentBoardsEndpoint }) {
this.boardsEndpoint = boardsEndpoint;
this.boardId = boardId;
this.listsEndpoint = listsEndpoint;
this.listsEndpointGenerate = `${listsEndpoint}/generate.json`;
this.bulkUpdatePath = bulkUpdatePath;
+ this.recentBoardsEndpoint = `${recentBoardsEndpoint}.json`;
}
generateBoardsPath(id) {
diff --git a/app/assets/javascripts/clusters/clusters_bundle.js b/app/assets/javascripts/clusters/clusters_bundle.js
index 6ebd1ad109e..388f674f643 100644
--- a/app/assets/javascripts/clusters/clusters_bundle.js
+++ b/app/assets/javascripts/clusters/clusters_bundle.js
@@ -36,6 +36,7 @@ export default class Clusters {
installRunnerPath,
installJupyterPath,
installKnativePath,
+ updateKnativePath,
installPrometheusPath,
managePrometheusPath,
hasRbac,
@@ -62,6 +63,7 @@ export default class Clusters {
installPrometheusEndpoint: installPrometheusPath,
installJupyterEndpoint: installJupyterPath,
installKnativeEndpoint: installKnativePath,
+ updateKnativeEndpoint: updateKnativePath,
});
this.installApplication = this.installApplication.bind(this);
@@ -119,8 +121,7 @@ export default class Clusters {
static initDismissableCallout() {
const callout = document.querySelector('.js-cluster-security-warning');
-
- if (callout) new PersistentUserCallout(callout); // eslint-disable-line no-new
+ PersistentUserCallout.factory(callout);
}
addListeners() {
@@ -129,6 +130,8 @@ export default class Clusters {
eventHub.$on('upgradeApplication', data => this.upgradeApplication(data));
eventHub.$on('upgradeFailed', appId => this.upgradeFailed(appId));
eventHub.$on('dismissUpgradeSuccess', appId => this.dismissUpgradeSuccess(appId));
+ eventHub.$on('saveKnativeDomain', data => this.saveKnativeDomain(data));
+ eventHub.$on('setKnativeHostname', data => this.setKnativeHostname(data));
}
removeListeners() {
@@ -137,6 +140,8 @@ export default class Clusters {
eventHub.$off('upgradeApplication', this.upgradeApplication);
eventHub.$off('upgradeFailed', this.upgradeFailed);
eventHub.$off('dismissUpgradeSuccess', this.dismissUpgradeSuccess);
+ eventHub.$off('saveKnativeDomain');
+ eventHub.$off('setKnativeHostname');
}
initPolling() {
@@ -272,6 +277,18 @@ export default class Clusters {
this.store.updateAppProperty(appId, 'requestStatus', null);
}
+ saveKnativeDomain(data) {
+ const appId = data.id;
+ this.store.updateAppProperty(appId, 'status', APPLICATION_STATUS.UPDATING);
+ this.service.updateApplication(appId, data.params);
+ }
+
+ setKnativeHostname(data) {
+ const appId = data.id;
+ this.store.updateAppProperty(appId, 'isEditingHostName', true);
+ this.store.updateAppProperty(appId, 'hostname', data.hostname);
+ }
+
destroy() {
this.destroyed = true;
diff --git a/app/assets/javascripts/clusters/components/application_row.vue b/app/assets/javascripts/clusters/components/application_row.vue
index 5952e93b9a7..19e5ac1567d 100644
--- a/app/assets/javascripts/clusters/components/application_row.vue
+++ b/app/assets/javascripts/clusters/components/application_row.vue
@@ -191,14 +191,7 @@ export default {
return this.status === APPLICATION_STATUS.UPDATE_ERRORED;
},
upgradeFailureDescription() {
- return sprintf(
- s__(
- 'ClusterIntegration|Something went wrong when upgrading %{title}. Please check the logs and try again.',
- ),
- {
- title: this.title,
- },
- );
+ return s__('ClusterIntegration|Update failed. Please check the logs and try again.');
},
upgradeSuccessDescription() {
return sprintf(s__('ClusterIntegration|%{title} upgraded successfully.'), {
@@ -210,9 +203,9 @@ export default {
if (this.upgradeAvailable && !this.upgradeFailed && !this.isUpgrading) {
label = s__('ClusterIntegration|Upgrade');
} else if (this.isUpgrading) {
- label = s__('ClusterIntegration|Upgrading');
+ label = s__('ClusterIntegration|Updating');
} else if (this.upgradeFailed) {
- label = s__('ClusterIntegration|Retry upgrade');
+ label = s__('ClusterIntegration|Retry update');
}
return label;
@@ -224,6 +217,14 @@ export default {
(this.upgradeRequested && !this.upgradeSuccessful)
);
},
+ shouldShowUpgradeDetails() {
+ // This method only returns true when;
+ // Upgrade was successful OR Upgrade failed
+ // AND new upgrade is unavailable AND version information is present.
+ return (
+ (this.upgradeSuccessful || this.upgradeFailed) && !this.upgradeAvailable && this.version
+ );
+ },
},
watch: {
status() {
@@ -303,7 +304,7 @@ export default {
</div>
<div
- v-if="(upgradeSuccessful || upgradeFailed) && !upgradeAvailable"
+ v-if="shouldShowUpgradeDetails"
class="form-text text-muted label p-0 js-cluster-application-upgrade-details"
>
{{ versionLabel }}
diff --git a/app/assets/javascripts/clusters/components/applications.vue b/app/assets/javascripts/clusters/components/applications.vue
index 0cf187d4189..f74cd71de04 100644
--- a/app/assets/javascripts/clusters/components/applications.vue
+++ b/app/assets/javascripts/clusters/components/applications.vue
@@ -15,11 +15,14 @@ import { s__, sprintf } from '../../locale';
import applicationRow from './application_row.vue';
import clipboardButton from '../../vue_shared/components/clipboard_button.vue';
import { CLUSTER_TYPE, APPLICATION_STATUS, INGRESS } from '../constants';
+import LoadingButton from '~/vue_shared/components/loading_button.vue';
+import eventHub from '~/clusters/event_hub';
export default {
components: {
applicationRow,
clipboardButton,
+ LoadingButton,
},
props: {
type: {
@@ -173,16 +176,55 @@ export default {
jupyterHostname() {
return this.applications.jupyter.hostname;
},
+ knative() {
+ return this.applications.knative;
+ },
knativeInstalled() {
- return this.applications.knative.status === APPLICATION_STATUS.INSTALLED;
+ return (
+ this.knative.status === APPLICATION_STATUS.INSTALLED ||
+ this.knativeUpgrading ||
+ this.knativeUpgradeFailed ||
+ this.knative.status === APPLICATION_STATUS.UPDATED
+ );
+ },
+ knativeUpgrading() {
+ return (
+ this.knative.status === APPLICATION_STATUS.UPDATING ||
+ this.knative.status === APPLICATION_STATUS.SCHEDULED
+ );
+ },
+ knativeUpgradeFailed() {
+ return this.knative.status === APPLICATION_STATUS.UPDATE_ERRORED;
},
knativeExternalIp() {
- return this.applications.knative.externalIp;
+ return this.knative.externalIp;
+ },
+ canUpdateKnativeEndpoint() {
+ return this.knativeExternalIp && !this.knativeUpgradeFailed && !this.knativeUpgrading;
+ },
+ knativeHostname: {
+ get() {
+ return this.knative.hostname;
+ },
+ set(hostname) {
+ eventHub.$emit('setKnativeHostname', {
+ id: 'knative',
+ hostname,
+ });
+ },
},
},
created() {
this.helmInstallIllustration = helmInstallIllustration;
},
+ methods: {
+ saveKnativeDomain() {
+ eventHub.$emit('saveKnativeDomain', {
+ id: 'knative',
+ params: { hostname: this.knative.hostname },
+ });
+ },
+ },
};
</script>
@@ -471,76 +513,88 @@ export default {
}}
</p>
- <template v-if="knativeInstalled">
- <div class="form-group">
- <label for="knative-domainname">
- {{ s__('ClusterIntegration|Knative Domain Name:') }}
- </label>
- <input
- id="knative-domainname"
- v-model="applications.knative.hostname"
- type="text"
- class="form-control js-domainname"
- readonly
- />
- </div>
- </template>
- <template v-else-if="helmInstalled && rbac">
- <div class="form-group">
- <label for="knative-domainname">
- {{ s__('ClusterIntegration|Knative Domain Name:') }}
- </label>
- <input
- id="knative-domainname"
- v-model="applications.knative.hostname"
- type="text"
- class="form-control js-domainname"
- />
- </div>
- </template>
- <template v-if="knativeInstalled">
- <div class="form-group">
- <label for="knative-ip-address">
- {{ s__('ClusterIntegration|Knative IP Address:') }}
- </label>
- <div v-if="knativeExternalIp" class="input-group">
+ <div class="row">
+ <template v-if="knativeInstalled || (helmInstalled && rbac)">
+ <div
+ :class="{ 'col-md-6': knativeInstalled, 'col-12': helmInstalled && rbac }"
+ class="form-group col-sm-12 mb-0"
+ >
+ <label for="knative-domainname">
+ <strong>
+ {{ s__('ClusterIntegration|Knative Domain Name:') }}
+ </strong>
+ </label>
<input
- id="knative-ip-address"
- :value="knativeExternalIp"
+ id="knative-domainname"
+ v-model="knativeHostname"
type="text"
- class="form-control js-ip-address"
- readonly
+ class="form-control js-knative-domainname"
/>
- <span class="input-group-append">
- <clipboard-button
- :text="knativeExternalIp"
- :title="s__('ClusterIntegration|Copy Knative IP Address to clipboard')"
- class="input-group-text js-clipboard-btn"
+ </div>
+ </template>
+ <template v-if="knativeInstalled">
+ <div class="form-group col-sm-12 col-md-6 pl-md-0 mb-0 mt-3 mt-md-0">
+ <label for="knative-ip-address">
+ <strong>
+ {{ s__('ClusterIntegration|Knative Endpoint:') }}
+ </strong>
+ </label>
+ <div v-if="knativeExternalIp" class="input-group">
+ <input
+ id="knative-ip-address"
+ :value="knativeExternalIp"
+ type="text"
+ class="form-control js-knative-ip-address"
+ readonly
/>
- </span>
+ <span class="input-group-append">
+ <clipboard-button
+ :text="knativeExternalIp"
+ :title="s__('ClusterIntegration|Copy Knative Endpoint to clipboard')"
+ class="input-group-text js-knative-ip-clipboard-btn"
+ />
+ </span>
+ </div>
+ <input
+ v-else
+ type="text"
+ class="form-control js-knative-ip-address"
+ readonly
+ value="?"
+ />
</div>
- <input v-else type="text" class="form-control js-ip-address" readonly value="?" />
- </div>
- <p v-if="!knativeExternalIp" class="settings-message js-no-ip-message">
- {{
- s__(`ClusterIntegration|The IP address is in
- the process of being assigned. Please check your Kubernetes
- cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
- }}
- </p>
+ <p class="form-text text-muted col-12">
+ {{
+ s__(
+ `ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint.`,
+ )
+ }}
+ <a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
+ {{ __('More information') }}
+ </a>
+ </p>
- <p>
- {{
- s__(`ClusterIntegration|Point a wildcard DNS to this
- generated IP address in order to access
- your application after it has been deployed.`)
- }}
- <a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
- {{ __('More information') }}
- </a>
- </p>
- </template>
+ <p
+ v-if="!knativeExternalIp"
+ class="settings-message js-no-knative-ip-message mt-2 mr-3 mb-0 ml-3 "
+ >
+ {{
+ s__(`ClusterIntegration|The IP address is in
+ the process of being assigned. Please check your Kubernetes
+ cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
+ }}
+ </p>
+
+ <button
+ v-if="canUpdateKnativeEndpoint"
+ class="btn btn-success js-knative-save-domain-button mt-3 ml-3"
+ @click="saveKnativeDomain"
+ >
+ {{ s__('ClusterIntegration|Save changes') }}
+ </button>
+ </template>
+ </div>
</div>
</application-row>
</div>
diff --git a/app/assets/javascripts/clusters/services/clusters_service.js b/app/assets/javascripts/clusters/services/clusters_service.js
index 89dda4b7902..dea33ac44c5 100644
--- a/app/assets/javascripts/clusters/services/clusters_service.js
+++ b/app/assets/javascripts/clusters/services/clusters_service.js
@@ -12,6 +12,9 @@ export default class ClusterService {
jupyter: this.options.installJupyterEndpoint,
knative: this.options.installKnativeEndpoint,
};
+ this.appUpdateEndpointMap = {
+ knative: this.options.updateKnativeEndpoint,
+ };
}
fetchData() {
@@ -22,6 +25,10 @@ export default class ClusterService {
return axios.post(this.appInstallEndpointMap[appId], params);
}
+ updateApplication(appId, params) {
+ return axios.patch(this.appUpdateEndpointMap[appId], params);
+ }
+
static updateCluster(endpoint, data) {
return axios.put(endpoint, data);
}
diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js
index d309678be27..3f03a8512fc 100644
--- a/app/assets/javascripts/clusters/stores/clusters_store.js
+++ b/app/assets/javascripts/clusters/stores/clusters_store.js
@@ -66,6 +66,7 @@ export default class ClusterStore {
requestStatus: null,
requestReason: null,
hostname: null,
+ isEditingHostName: false,
externalIp: null,
},
},
@@ -129,8 +130,10 @@ export default class ClusterStore {
? `jupyter.${this.state.applications.ingress.externalIp}.nip.io`
: '');
} else if (appId === KNATIVE) {
- this.state.applications.knative.hostname =
- serverAppEntry.hostname || this.state.applications.knative.hostname;
+ if (!this.state.applications.knative.isEditingHostName) {
+ this.state.applications.knative.hostname =
+ serverAppEntry.hostname || this.state.applications.knative.hostname;
+ }
this.state.applications.knative.externalIp =
serverAppEntry.external_ip || this.state.applications.knative.externalIp;
} else if (appId === RUNNER) {
diff --git a/app/assets/javascripts/contextual_sidebar.js b/app/assets/javascripts/contextual_sidebar.js
index 50efecb3475..67fcdd082a2 100644
--- a/app/assets/javascripts/contextual_sidebar.js
+++ b/app/assets/javascripts/contextual_sidebar.js
@@ -4,6 +4,10 @@ import _ from 'underscore';
import bp from './breakpoints';
import { parseBoolean } from '~/lib/utils/common_utils';
+// NOTE: at 1200px nav sidebar should not overlap the content
+// https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/24555#note_134136110
+const NAV_SIDEBAR_BREAKPOINT = 1200;
+
export default class ContextualSidebar {
constructor() {
this.initDomElements();
@@ -26,44 +30,54 @@ export default class ContextualSidebar {
bindEvents() {
if (!this.$sidebar.length) return;
- document.addEventListener('click', e => {
- if (
- !e.target.closest('.nav-sidebar') &&
- (bp.getBreakpointSize() === 'sm' || bp.getBreakpointSize() === 'md')
- ) {
- this.toggleCollapsedSidebar(true, true);
- }
- });
this.$openSidebar.on('click', () => this.toggleSidebarNav(true));
this.$closeSidebar.on('click', () => this.toggleSidebarNav(false));
this.$overlay.on('click', () => this.toggleSidebarNav(false));
this.$sidebarToggle.on('click', () => {
- const value = !this.$sidebar.hasClass('sidebar-collapsed-desktop');
- this.toggleCollapsedSidebar(value, true);
+ if (!ContextualSidebar.isDesktopBreakpoint()) {
+ this.toggleSidebarNav(!this.$sidebar.hasClass('sidebar-expanded-mobile'));
+ } else {
+ const value = !this.$sidebar.hasClass('sidebar-collapsed-desktop');
+ this.toggleCollapsedSidebar(value, true);
+ }
});
$(window).on('resize', () => _.debounce(this.render(), 100));
}
+ // TODO: use the breakpoints from breakpoints.js once they have been updated for bootstrap 4
+ // See documentation: https://design.gitlab.com/regions/navigation#contextual-navigation
+ static isDesktopBreakpoint = () => bp.windowWidth() >= NAV_SIDEBAR_BREAKPOINT;
static setCollapsedCookie(value) {
- if (bp.getBreakpointSize() !== 'lg') {
+ if (!ContextualSidebar.isDesktopBreakpoint()) {
return;
}
Cookies.set('sidebar_collapsed', value, { expires: 365 * 10 });
}
toggleSidebarNav(show) {
- this.$sidebar.toggleClass('sidebar-expanded-mobile', show);
- this.$overlay.toggleClass('mobile-nav-open', show);
+ const breakpoint = bp.getBreakpointSize();
+ const dbp = ContextualSidebar.isDesktopBreakpoint();
+
+ this.$sidebar.toggleClass('sidebar-expanded-mobile', !dbp ? show : false);
+ this.$overlay.toggleClass(
+ 'mobile-nav-open',
+ breakpoint === 'xs' || breakpoint === 'sm' ? show : false,
+ );
this.$sidebar.removeClass('sidebar-collapsed-desktop');
}
toggleCollapsedSidebar(collapsed, saveCookie) {
const breakpoint = bp.getBreakpointSize();
+ const dbp = ContextualSidebar.isDesktopBreakpoint();
if (this.$sidebar.length) {
this.$sidebar.toggleClass('sidebar-collapsed-desktop', collapsed);
- this.$page.toggleClass('page-with-icon-sidebar', breakpoint === 'sm' ? true : collapsed);
+ this.$sidebar.toggleClass('sidebar-expanded-mobile', !dbp ? !collapsed : false);
+ this.$page.toggleClass(
+ 'page-with-icon-sidebar',
+ breakpoint === 'xs' || breakpoint === 'sm' ? true : collapsed,
+ );
}
if (saveCookie) {
@@ -84,13 +98,11 @@ export default class ContextualSidebar {
render() {
if (!this.$sidebar.length) return;
- const breakpoint = bp.getBreakpointSize();
-
- if (breakpoint === 'sm' || breakpoint === 'md') {
- this.toggleCollapsedSidebar(true, false);
- } else if (breakpoint === 'lg') {
+ if (!ContextualSidebar.isDesktopBreakpoint()) {
+ this.toggleSidebarNav(false);
+ } else {
const collapse = parseBoolean(Cookies.get('sidebar_collapsed'));
- this.toggleCollapsedSidebar(collapse, false);
+ this.toggleCollapsedSidebar(collapse, true);
}
}
}
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 2b801898345..a5125c3d077 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -5,7 +5,7 @@ import { polyfillSticky } from '~/lib/utils/sticky';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import Icon from '~/vue_shared/components/icon.vue';
import FileIcon from '~/vue_shared/components/file_icon.vue';
-import { GlTooltipDirective } from '@gitlab/ui';
+import { GlButton, GlTooltipDirective, GlTooltip, GlLoadingIcon } from '@gitlab/ui';
import { truncateSha } from '~/lib/utils/text_utility';
import { __, s__, sprintf } from '~/locale';
import { diffViewerModes } from '~/ide/constants';
@@ -14,6 +14,9 @@ import DiffStats from './diff_stats.vue';
export default {
components: {
+ GlTooltip,
+ GlLoadingIcon,
+ GlButton,
ClipboardButton,
EditButton,
Icon,
@@ -125,12 +128,15 @@ export default {
isModeChanged() {
return this.diffFile.viewer.name === diffViewerModes.mode_changed;
},
+ showExpandDiffToFullFileEnabled() {
+ return gon.features.expandDiffFullFile && !this.diffFile.is_fully_expanded;
+ },
},
mounted() {
polyfillSticky(this.$refs.header);
},
methods: {
- ...mapActions('diffs', ['toggleFileDiscussions']),
+ ...mapActions('diffs', ['toggleFileDiscussions', 'toggleFullDiff']),
handleToggleFile(e, checkTarget) {
if (
!checkTarget ||
@@ -236,12 +242,34 @@ export default {
<a
v-if="diffFile.replaced_view_path"
:href="diffFile.replaced_view_path"
- class="btn view-file js-view-file"
+ class="btn view-file js-view-replaced-file"
v-html="viewReplacedFileButtonText"
>
</a>
- <a :href="diffFile.view_path" class="btn view-file js-view-file" v-html="viewFileButtonText">
- </a>
+ <gl-tooltip :target="() => $refs.viewButton" placement="bottom">
+ <span v-html="viewFileButtonText"></span>
+ </gl-tooltip>
+ <gl-button
+ ref="viewButton"
+ :href="diffFile.view_path"
+ target="blank"
+ class="view-file js-view-file-button"
+ >
+ <icon name="external-link" />
+ </gl-button>
+ <gl-button
+ v-if="showExpandDiffToFullFileEnabled"
+ class="expand-file js-expand-file"
+ @click="toggleFullDiff(diffFile.file_path)"
+ >
+ <template v-if="diffFile.isShowingFullFile">
+ {{ s__('MRDiff|Show changes only') }}
+ </template>
+ <template v-else>
+ {{ s__('MRDiff|Show full file') }}
+ </template>
+ <gl-loading-icon v-if="diffFile.isLoadingFullFile" inline />
+ </gl-button>
<a
v-if="diffFile.external_url"
@@ -250,7 +278,7 @@ export default {
:title="`View on ${diffFile.formatted_external_url}`"
target="_blank"
rel="noopener noreferrer"
- class="btn btn-file-option"
+ class="btn btn-file-option js-external-url"
>
<icon name="external-link" />
</a>
diff --git a/app/assets/javascripts/diffs/components/diff_line_note_form.vue b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
index 18edbe286ba..bb66ab36283 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -1,6 +1,7 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
import { s__ } from '~/locale';
+import diffLineNoteFormMixin from 'ee_else_ce/notes/mixins/diff_line_note_form';
import noteForm from '../../notes/components/note_form.vue';
import autosave from '../../notes/mixins/autosave';
import { DIFF_NOTE_TYPE } from '../constants';
@@ -9,7 +10,7 @@ export default {
components: {
noteForm,
},
- mixins: [autosave],
+ mixins: [autosave, diffLineNoteFormMixin],
props: {
diffFileHash: {
type: String,
@@ -103,6 +104,7 @@ export default {
:help-page-path="helpPagePath"
save-button-title="Comment"
class="diff-comment-form"
+ @handleFormUpdateAddToReview="addToReview"
@cancelForm="handleCancelCommentForm"
@handleFormUpdate="handleSaveNote"
/>
diff --git a/app/assets/javascripts/diffs/components/edit_button.vue b/app/assets/javascripts/diffs/components/edit_button.vue
index 5d38d545ce8..f0cc5de4b33 100644
--- a/app/assets/javascripts/diffs/components/edit_button.vue
+++ b/app/assets/javascripts/diffs/components/edit_button.vue
@@ -1,5 +1,15 @@
<script>
+import { GlTooltipDirective, GlButton } from '@gitlab/ui';
+import Icon from '~/vue_shared/components/icon.vue';
+
export default {
+ components: {
+ GlButton,
+ Icon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
props: {
editPath: {
type: String,
@@ -17,12 +27,7 @@ export default {
},
methods: {
handleEditClick(evt) {
- if (!this.canCurrentUserFork || this.canModifyBlob) {
- // if we can Edit, do default Edit button behavior
- return;
- }
-
- if (this.canCurrentUserFork) {
+ if (this.canCurrentUserFork && !this.canModifyBlob) {
evt.preventDefault();
this.$emit('showForkMessage');
}
@@ -32,5 +37,13 @@ export default {
</script>
<template>
- <a :href="editPath" class="btn btn-default js-edit-blob" @click="handleEditClick"> Edit </a>
+ <gl-button
+ v-gl-tooltip.bottom
+ :href="editPath"
+ :title="__('Edit file')"
+ class="js-edit-blob"
+ @click.native="handleEditClick"
+ >
+ <icon name="pencil" />
+ </gl-button>
</template>
diff --git a/app/assets/javascripts/diffs/components/inline_diff_view.vue b/app/assets/javascripts/diffs/components/inline_diff_view.vue
index e781397214d..8c76a555b62 100644
--- a/app/assets/javascripts/diffs/components/inline_diff_view.vue
+++ b/app/assets/javascripts/diffs/components/inline_diff_view.vue
@@ -1,5 +1,6 @@
<script>
import { mapGetters } from 'vuex';
+import draftCommentsMixin from 'ee_else_ce/diffs/mixins/draft_comments';
import inlineDiffTableRow from './inline_diff_table_row.vue';
import inlineDiffCommentRow from './inline_diff_comment_row.vue';
@@ -7,7 +8,10 @@ export default {
components: {
inlineDiffCommentRow,
inlineDiffTableRow,
+ InlineDraftCommentRow: () =>
+ import('ee_component/batch_comments/components/inline_draft_comment_row.vue'),
},
+ mixins: [draftCommentsMixin],
props: {
diffFile: {
type: Object,
@@ -54,6 +58,11 @@ export default {
:line="line"
:help-page-path="helpPagePath"
/>
+ <inline-draft-comment-row
+ v-if="shouldRenderDraftRow(diffFile.file_hash, line)"
+ :key="`draft_${index}`"
+ :draft="draftForLine(diffFile.file_hash, line)"
+ />
</template>
</tbody>
</table>
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_view.vue b/app/assets/javascripts/diffs/components/parallel_diff_view.vue
index 1bf693380db..93e754fa896 100644
--- a/app/assets/javascripts/diffs/components/parallel_diff_view.vue
+++ b/app/assets/javascripts/diffs/components/parallel_diff_view.vue
@@ -1,5 +1,6 @@
<script>
import { mapGetters } from 'vuex';
+import draftCommentsMixin from 'ee_else_ce/diffs/mixins/draft_comments';
import parallelDiffTableRow from './parallel_diff_table_row.vue';
import parallelDiffCommentRow from './parallel_diff_comment_row.vue';
@@ -7,7 +8,10 @@ export default {
components: {
parallelDiffTableRow,
parallelDiffCommentRow,
+ ParallelDraftCommentRow: () =>
+ import('ee_component/batch_comments/components/parallel_draft_comment_row.vue'),
},
+ mixins: [draftCommentsMixin],
props: {
diffFile: {
type: Object,
@@ -56,6 +60,12 @@ export default {
:line-index="index"
:help-page-path="helpPagePath"
/>
+ <parallel-draft-comment-row
+ v-if="shouldRenderParallelDraftRow(diffFile.file_hash, line)"
+ :key="`drafts-${index}`"
+ :line="line"
+ :diff-file-content-sha="diffFile.file_hash"
+ />
</template>
</tbody>
</table>
diff --git a/app/assets/javascripts/diffs/constants.js b/app/assets/javascripts/diffs/constants.js
index 7002655ea49..6f380fe6ece 100644
--- a/app/assets/javascripts/diffs/constants.js
+++ b/app/assets/javascripts/diffs/constants.js
@@ -42,3 +42,8 @@ export const INITIAL_TREE_WIDTH = 320;
export const MIN_TREE_WIDTH = 240;
export const MAX_TREE_WIDTH = 400;
export const TREE_HIDE_STATS_WIDTH = 260;
+
+export const OLD_LINE_KEY = 'old_line';
+export const NEW_LINE_KEY = 'new_line';
+export const TYPE_KEY = 'type';
+export const LEFT_LINE_KEY = 'left';
diff --git a/app/assets/javascripts/diffs/mixins/draft_comments.js b/app/assets/javascripts/diffs/mixins/draft_comments.js
new file mode 100644
index 00000000000..cfa722b27f1
--- /dev/null
+++ b/app/assets/javascripts/diffs/mixins/draft_comments.js
@@ -0,0 +1,7 @@
+export default {
+ computed: {
+ shouldRenderDraftRow: () => () => false,
+ shouldRenderParallelDraftRow: () => () => false,
+ draftForLine: () => () => ({}),
+ },
+};
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index c40775c3259..57ddc923a3e 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -309,5 +309,40 @@ export const cacheTreeListWidth = (_, size) => {
localStorage.setItem(TREE_LIST_WIDTH_STORAGE_KEY, size);
};
+export const requestFullDiff = ({ commit }, filePath) => commit(types.REQUEST_FULL_DIFF, filePath);
+export const receiveFullDiffSucess = ({ commit }, { filePath, data }) =>
+ commit(types.RECEIVE_FULL_DIFF_SUCCESS, { filePath, data });
+export const receiveFullDiffError = ({ commit }, filePath) => {
+ commit(types.RECEIVE_FULL_DIFF_ERROR, filePath);
+ createFlash(s__('MergeRequest|Error loading full diff. Please try again.'));
+};
+
+export const fetchFullDiff = ({ dispatch }, file) =>
+ axios
+ .get(file.context_lines_path, {
+ params: {
+ full: true,
+ from_merge_request: true,
+ },
+ })
+ .then(({ data }) => dispatch('receiveFullDiffSucess', { filePath: file.file_path, data }))
+ .then(() => scrollToElement(`#${file.file_hash}`))
+ .catch(() => dispatch('receiveFullDiffError', file.file_path));
+
+export const toggleFullDiff = ({ dispatch, getters, state }, filePath) => {
+ const file = state.diffFiles.find(f => f.file_path === filePath);
+
+ dispatch('requestFullDiff', filePath);
+
+ if (file.isShowingFullFile) {
+ dispatch('loadCollapsedDiff', file)
+ .then(() => dispatch('assignDiscussionsToDiff', getters.getDiffFileDiscussions(file)))
+ .then(() => scrollToElement(`#${file.file_hash}`))
+ .catch(() => dispatch('receiveFullDiffError', filePath));
+ } else {
+ dispatch('fetchFullDiff', file);
+ }
+};
+
// prevent babel-plugin-rewire from generating an invalid default during karma tests
export default () => {};
diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js
index 71ad108ce88..b441b1de451 100644
--- a/app/assets/javascripts/diffs/store/mutation_types.js
+++ b/app/assets/javascripts/diffs/store/mutation_types.js
@@ -23,3 +23,7 @@ export const SET_TREE_DATA = 'SET_TREE_DATA';
export const SET_RENDER_TREE_LIST = 'SET_RENDER_TREE_LIST';
export const SET_SHOW_WHITESPACE = 'SET_SHOW_WHITESPACE';
export const TOGGLE_FILE_FINDER_VISIBLE = 'TOGGLE_FILE_FINDER_VISIBLE';
+
+export const REQUEST_FULL_DIFF = 'REQUEST_FULL_DIFF';
+export const RECEIVE_FULL_DIFF_SUCCESS = 'RECEIVE_FULL_DIFF_SUCCESS';
+export const RECEIVE_FULL_DIFF_ERROR = 'RECEIVE_FULL_DIFF_ERROR';
diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js
index 5a27388863c..45187d93fef 100644
--- a/app/assets/javascripts/diffs/store/mutations.js
+++ b/app/assets/javascripts/diffs/store/mutations.js
@@ -6,8 +6,10 @@ import {
addContextLines,
prepareDiffData,
isDiscussionApplicableToLine,
+ convertExpandLines,
} from './utils';
import * as types from './mutation_types';
+import { OLD_LINE_KEY, NEW_LINE_KEY, TYPE_KEY, LEFT_LINE_KEY } from '../constants';
export default {
[types.SET_BASE_CONFIG](state, options) {
@@ -248,4 +250,54 @@ export default {
[types.TOGGLE_FILE_FINDER_VISIBLE](state, visible) {
state.fileFinderVisible = visible;
},
+ [types.REQUEST_FULL_DIFF](state, filePath) {
+ const file = findDiffFile(state.diffFiles, filePath, 'file_path');
+
+ file.isLoadingFullFile = true;
+ },
+ [types.RECEIVE_FULL_DIFF_ERROR](state, filePath) {
+ const file = findDiffFile(state.diffFiles, filePath, 'file_path');
+
+ file.isLoadingFullFile = false;
+ },
+ [types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath, data }) {
+ const file = findDiffFile(state.diffFiles, filePath, 'file_path');
+
+ file.isShowingFullFile = true;
+ file.isLoadingFullFile = false;
+
+ file.highlighted_diff_lines = convertExpandLines({
+ diffLines: file.highlighted_diff_lines,
+ typeKey: [TYPE_KEY],
+ oldLineKey: [OLD_LINE_KEY],
+ newLineKey: [NEW_LINE_KEY],
+ data,
+ mapLine: ({ line, oldLine, newLine }) => ({
+ ...line,
+ old_line: oldLine,
+ new_line: newLine,
+ line_code: `${file.file_hash}_${oldLine}_${newLine}`,
+ }),
+ });
+
+ file.parallel_diff_lines = convertExpandLines({
+ diffLines: file.parallel_diff_lines,
+ typeKey: [LEFT_LINE_KEY, TYPE_KEY],
+ oldLineKey: [LEFT_LINE_KEY, OLD_LINE_KEY],
+ newLineKey: [LEFT_LINE_KEY, NEW_LINE_KEY],
+ data,
+ mapLine: ({ line, oldLine, newLine }) => ({
+ left: {
+ ...line,
+ old_line: oldLine,
+ line_code: `${file.file_hash}_${oldLine}_${newLine}`,
+ },
+ right: {
+ ...line,
+ new_line: newLine,
+ line_code: `${file.file_hash}_${newLine}_${oldLine}`,
+ },
+ }),
+ });
+ },
};
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 247d1e65fea..27a79369a24 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -15,8 +15,8 @@ import {
TREE_TYPE,
} from '../constants';
-export function findDiffFile(files, hash) {
- return files.filter(file => file.file_hash === hash)[0];
+export function findDiffFile(files, match, matchKey = 'file_hash') {
+ return files.find(file => file[matchKey] === match);
}
export const getReversePosition = linePosition => {
@@ -250,6 +250,8 @@ export function prepareDiffData(diffData) {
renderIt: showingLines < LINES_TO_BE_RENDERED_DIRECTLY,
collapsed:
file.viewer.name === diffViewerModes.text && showingLines > MAX_LINES_TO_BE_RENDERED,
+ isShowingFullFile: false,
+ isLoadingFullFile: false,
discussions: [],
});
}
@@ -411,3 +413,37 @@ export const getDiffMode = diffFile => {
diffModes.replaced
);
};
+
+export const convertExpandLines = ({
+ diffLines,
+ data,
+ typeKey,
+ oldLineKey,
+ newLineKey,
+ mapLine,
+}) => {
+ const dataLength = data.length;
+
+ return diffLines.reduce((acc, line, i) => {
+ if (_.property(typeKey)(line) === 'match') {
+ const beforeLine = diffLines[i - 1];
+ const afterLine = diffLines[i + 1];
+ const beforeLineIndex = _.property(newLineKey)(beforeLine) || 0;
+ const afterLineIndex = _.property(newLineKey)(afterLine) - 1 || dataLength;
+
+ acc.push(
+ ...data.slice(beforeLineIndex, afterLineIndex).map((l, index) => ({
+ ...mapLine({
+ line: { ...l, hasForm: false, discussions: [] },
+ oldLine: (_.property(oldLineKey)(beforeLine) || 0) + index + 1,
+ newLine: (_.property(newLineKey)(beforeLine) || 0) + index + 1,
+ }),
+ })),
+ );
+ } else {
+ acc.push(line);
+ }
+
+ return acc;
+ }, []);
+};
diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js
index cd8dff40b88..36542315c4c 100644
--- a/app/assets/javascripts/emoji/index.js
+++ b/app/assets/javascripts/emoji/index.js
@@ -1,13 +1,58 @@
import _ from 'underscore';
-import emojiMap from 'emojis/digests.json';
+import createFlash from '~/flash';
+import { s__ } from '~/locale';
import emojiAliases from 'emojis/aliases.json';
+import axios from '../lib/utils/axios_utils';
-export const validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
+import AccessorUtilities from '../lib/utils/accessor';
+
+let emojiMap = null;
+let validEmojiNames = null;
+
+export const EMOJI_VERSION = '1';
+const EMOJI_VERSION_LOCALSTORAGE = `EMOJIS_${EMOJI_VERSION}`;
+
+const isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();
+
+export function initEmojiMap() {
+ return new Promise((resolve, reject) => {
+ if (emojiMap) {
+ resolve(emojiMap);
+ } else if (isLocalStorageAvailable && window.localStorage.getItem(EMOJI_VERSION_LOCALSTORAGE)) {
+ emojiMap = JSON.parse(window.localStorage.getItem(EMOJI_VERSION_LOCALSTORAGE));
+ validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
+ resolve(emojiMap);
+ } else {
+ // We load the JSON from server
+ axios
+ .get(
+ `${gon.asset_host || ''}${gon.relative_url_root ||
+ ''}/-/emojis/${EMOJI_VERSION}/emojis.json`,
+ )
+ .then(({ data }) => {
+ emojiMap = data;
+ validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
+ resolve(emojiMap);
+ if (isLocalStorageAvailable) {
+ window.localStorage.setItem(EMOJI_VERSION_LOCALSTORAGE, JSON.stringify(emojiMap));
+ }
+ })
+ .catch(err => {
+ createFlash(s__('Emojis|Something went wrong while loading emojis.'));
+ reject(err);
+ });
+ }
+ });
+}
export function normalizeEmojiName(name) {
return Object.prototype.hasOwnProperty.call(emojiAliases, name) ? emojiAliases[name] : name;
}
+export function getValidEmojiNames() {
+ return validEmojiNames;
+}
+
export function isEmojiNameValid(name) {
return validEmojiNames.indexOf(name) >= 0;
}
@@ -36,8 +81,8 @@ export function getEmojiCategoryMap() {
};
Object.keys(emojiMap).forEach(name => {
const emoji = emojiMap[name];
- if (emojiCategoryMap[emoji.category]) {
- emojiCategoryMap[emoji.category].push(name);
+ if (emojiCategoryMap[emoji.c]) {
+ emojiCategoryMap[emoji.c].push(name);
}
});
}
@@ -58,8 +103,9 @@ export function getEmojiInfo(query) {
}
export function emojiFallbackImageSrc(inputName) {
- const { name, digest } = getEmojiInfo(inputName);
- return `${gon.asset_host || ''}${gon.relative_url_root || ''}/assets/emoji/${name}-${digest}.png`;
+ const { name } = getEmojiInfo(inputName);
+ return `${gon.asset_host || ''}${gon.relative_url_root ||
+ ''}/-/emojis/${EMOJI_VERSION}/${name}.png`;
}
export function emojiImageTag(name, src) {
@@ -68,9 +114,8 @@ export function emojiImageTag(name, src) {
export function glEmojiTag(inputName, options) {
const opts = { sprite: false, forceFallback: false, ...options };
- const { name, ...emojiInfo } = getEmojiInfo(inputName);
+ const name = normalizeEmojiName(inputName);
- const fallbackImageSrc = emojiFallbackImageSrc(name);
const fallbackSpriteClass = `emoji-${name}`;
const classList = [];
@@ -79,24 +124,19 @@ export function glEmojiTag(inputName, options) {
classList.push(fallbackSpriteClass);
}
const classAttribute = classList.length > 0 ? `class="${classList.join(' ')}"` : '';
+
const fallbackSpriteAttribute = opts.sprite
? `data-fallback-sprite-class="${fallbackSpriteClass}"`
: '';
- let contents = emojiInfo.moji;
- if (opts.forceFallback && !opts.sprite) {
- contents = emojiImageTag(name, fallbackImageSrc);
- }
+ const forceFallbackAttribute = opts.forceFallback ? 'data-force-fallback="true"' : '';
return `
<gl-emoji
${classAttribute}
data-name="${name}"
- data-fallback-src="${fallbackImageSrc}"
${fallbackSpriteAttribute}
- data-unicode-version="${emojiInfo.unicodeVersion}"
- title="${emojiInfo.description}"
+ ${forceFallbackAttribute}
>
- ${contents}
</gl-emoji>
`;
}
diff --git a/app/assets/javascripts/emoji/support/index.js b/app/assets/javascripts/emoji/support/index.js
index 1f7852dd487..ed9bfb8bc78 100644
--- a/app/assets/javascripts/emoji/support/index.js
+++ b/app/assets/javascripts/emoji/support/index.js
@@ -5,6 +5,9 @@ import getUnicodeSupportMap from './unicode_support_map';
let browserUnicodeSupportMap;
export default function isEmojiUnicodeSupportedByBrowser(emojiUnicode, unicodeVersion) {
+ // Our Spec browser would fail producing emoji maps
+ if (/\bHeadlessChrome\//.test(navigator.userAgent)) return true;
+
browserUnicodeSupportMap = browserUnicodeSupportMap || getUnicodeSupportMap();
return isEmojiUnicodeSupported(browserUnicodeSupportMap, emojiUnicode, unicodeVersion);
}
diff --git a/app/assets/javascripts/environments/components/confirm_rollback_modal.vue b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue
new file mode 100644
index 00000000000..a8ee3f4ac10
--- /dev/null
+++ b/app/assets/javascripts/environments/components/confirm_rollback_modal.vue
@@ -0,0 +1,108 @@
+<script>
+/**
+ * Render modal to confirm rollback/redeploy.
+ */
+
+import _ from 'underscore';
+import { GlModal } from '@gitlab/ui';
+import { s__, sprintf } from '~/locale';
+
+import eventHub from '../event_hub';
+
+export default {
+ name: 'ConfirmRollbackModal',
+
+ components: {
+ GlModal,
+ },
+
+ props: {
+ environment: {
+ type: Object,
+ required: true,
+ },
+ },
+
+ computed: {
+ modalTitle() {
+ const title = this.environment.isLastDeployment
+ ? s__('Environments|Re-deploy environment %{name}?')
+ : s__('Environments|Rollback environment %{name}?');
+
+ return sprintf(title, {
+ name: _.escape(this.environment.name),
+ });
+ },
+
+ commitShortSha() {
+ const { last_deployment } = this.environment;
+ return this.commitData(last_deployment, 'short_id');
+ },
+
+ commitUrl() {
+ const { last_deployment } = this.environment;
+ return this.commitData(last_deployment, 'commit_path');
+ },
+
+ commitTitle() {
+ const { last_deployment } = this.environment;
+ return this.commitData(last_deployment, 'title');
+ },
+
+ modalText() {
+ const linkStart = `<a class="commit-sha" href="${_.escape(this.commitUrl)}">`;
+ const commitId = _.escape(this.commitShortSha);
+ const linkEnd = '</a>';
+ const name = _.escape(this.name);
+ const body = this.environment.isLastDeployment
+ ? s__(
+ '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?',
+ )
+ : s__(
+ '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?',
+ );
+ return sprintf(
+ body,
+ {
+ commitId,
+ linkStart,
+ linkEnd,
+ name,
+ },
+ false,
+ );
+ },
+
+ modalActionText() {
+ return this.environment.isLastDeployment
+ ? s__('Environments|Re-deploy')
+ : s__('Environments|Rollback');
+ },
+ },
+
+ methods: {
+ onOk() {
+ eventHub.$emit('rollbackEnvironment', this.environment);
+ },
+
+ commitData(lastDeployment, key) {
+ if (lastDeployment && lastDeployment.commit) {
+ return lastDeployment.commit[key];
+ }
+
+ return '';
+ },
+ },
+};
+</script>
+<template>
+ <gl-modal
+ :title="modalTitle"
+ modal-id="confirm-rollback-modal"
+ :ok-title="modalActionText"
+ ok-variant="danger"
+ @ok="onOk"
+ >
+ <p v-html="modalText"></p>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue
index 503c1b38f71..1e89dce69cb 100644
--- a/app/assets/javascripts/environments/components/environment_item.vue
+++ b/app/assets/javascripts/environments/components/environment_item.vue
@@ -3,7 +3,6 @@ import Timeago from 'timeago.js';
import _ from 'underscore';
import { GlTooltipDirective } from '@gitlab/ui';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-import { humanize } from '~/lib/utils/text_utility';
import Icon from '~/vue_shared/components/icon.vue';
import ActionsComponent from './environment_actions.vue';
import ExternalUrlComponent from './environment_external_url.vue';
@@ -156,7 +155,7 @@ export default {
const combinedActions = (manualActions || []).concat(scheduledActions || []);
return combinedActions.map(action => ({
...action,
- name: humanize(action.name),
+ name: action.name,
}));
},
@@ -556,6 +555,7 @@ export default {
<rollback-component
v-if="canRetry"
+ :environment="model"
:is-last-deployment="isLastDeployment"
:retry-url="retryUrl"
/>
diff --git a/app/assets/javascripts/environments/components/environment_rollback.vue b/app/assets/javascripts/environments/components/environment_rollback.vue
index 50c86af057c..266cdc42518 100644
--- a/app/assets/javascripts/environments/components/environment_rollback.vue
+++ b/app/assets/javascripts/environments/components/environment_rollback.vue
@@ -5,29 +5,38 @@
*
* Makes a post request when the button is clicked.
*/
+import { GlTooltipDirective, GlLoadingIcon, GlModalDirective, GlButton } from '@gitlab/ui';
import { s__ } from '~/locale';
-import { GlTooltipDirective, GlLoadingIcon } from '@gitlab/ui';
import Icon from '~/vue_shared/components/icon.vue';
+import ConfirmRollbackModal from './confirm_rollback_modal.vue';
import eventHub from '../event_hub';
export default {
components: {
Icon,
GlLoadingIcon,
+ GlButton,
+ ConfirmRollbackModal,
},
directives: {
GlTooltip: GlTooltipDirective,
+ GlModal: GlModalDirective,
},
props: {
- retryUrl: {
- type: String,
- default: '',
- },
-
isLastDeployment: {
type: Boolean,
default: true,
},
+
+ environment: {
+ type: Object,
+ required: true,
+ },
+
+ retryUrl: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
@@ -45,23 +54,31 @@ export default {
methods: {
onClick() {
- this.isLoading = true;
-
- eventHub.$emit('postAction', { endpoint: this.retryUrl });
+ eventHub.$emit('requestRollbackEnvironment', {
+ ...this.environment,
+ retryUrl: this.retryUrl,
+ isLastDeployment: this.isLastDeployment,
+ });
+ eventHub.$on('rollbackEnvironment', environment => {
+ if (environment.id === this.environment.id) {
+ this.isLoading = true;
+ }
+ });
},
},
};
</script>
<template>
- <button
+ <gl-button
v-gl-tooltip
+ v-gl-modal.confirm-rollback-modal
+ variant="secondary"
:disabled="isLoading"
:title="title"
- type="button"
- class="btn d-none d-sm-none d-md-block"
+ class="d-none d-md-block"
@click="onClick"
>
<icon v-if="isLastDeployment" name="repeat" /> <icon v-else name="redo" />
<gl-loading-icon v-if="isLoading" />
- </button>
+ </gl-button>
</template>
diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index aa2417d3194..6e55c3f901a 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -6,11 +6,13 @@ import eventHub from '../event_hub';
import environmentsMixin from '../mixins/environments_mixin';
import CIPaginationMixin from '../../vue_shared/mixins/ci_pagination_api_mixin';
import StopEnvironmentModal from './stop_environment_modal.vue';
+import ConfirmRollbackModal from './confirm_rollback_modal.vue';
export default {
components: {
emptyState,
StopEnvironmentModal,
+ ConfirmRollbackModal,
},
mixins: [CIPaginationMixin, environmentsMixin],
@@ -87,6 +89,7 @@ export default {
<template>
<div :class="cssContainerClass">
<stop-environment-modal :environment="environmentInStopModal" />
+ <confirm-rollback-modal :environment="environmentInRollbackModal" />
<div class="top-area">
<tabs :tabs="tabs" scope="environments" @onChangeTab="onChangeTab" />
diff --git a/app/assets/javascripts/environments/mixins/environments_mixin.js b/app/assets/javascripts/environments/mixins/environments_mixin.js
index 9d83840c87c..71b6b578196 100644
--- a/app/assets/javascripts/environments/mixins/environments_mixin.js
+++ b/app/assets/javascripts/environments/mixins/environments_mixin.js
@@ -36,6 +36,7 @@ export default {
page: getParameterByName('page') || '1',
requestData: {},
environmentInStopModal: {},
+ environmentInRollbackModal: {},
};
},
@@ -116,6 +117,10 @@ export default {
this.environmentInStopModal = environment;
},
+ updateRollbackModal(environment) {
+ this.environmentInRollbackModal = environment;
+ },
+
stopEnvironment(environment) {
const endpoint = environment.stop_path;
const errorMessage = s__(
@@ -123,6 +128,16 @@ export default {
);
this.postAction({ endpoint, errorMessage });
},
+
+ rollbackEnvironment(environment) {
+ const { retryUrl, isLastDeployment } = environment;
+ const errorMessage = isLastDeployment
+ ? s__('Environments|An error occurred while re-deploying the environment, please try again')
+ : s__(
+ 'Environments|An error occurred while rolling back the environment, please try again',
+ );
+ this.postAction({ endpoint: retryUrl, errorMessage });
+ },
},
computed: {
@@ -181,11 +196,17 @@ export default {
eventHub.$on('postAction', this.postAction);
eventHub.$on('requestStopEnvironment', this.updateStopModal);
eventHub.$on('stopEnvironment', this.stopEnvironment);
+
+ eventHub.$on('requestRollbackEnvironment', this.updateRollbackModal);
+ eventHub.$on('rollbackEnvironment', this.rollbackEnvironment);
},
beforeDestroy() {
eventHub.$off('postAction', this.postAction);
eventHub.$off('requestStopEnvironment', this.updateStopModal);
eventHub.$off('stopEnvironment', this.stopEnvironment);
+
+ eventHub.$off('requestRollbackEnvironment', this.updateRollbackModal);
+ eventHub.$off('rollbackEnvironment', this.rollbackEnvironment);
},
};
diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
index 6981afe1ead..43ae54133af 100644
--- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
+++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
@@ -48,7 +48,7 @@ export default {
}
},
methods: {
- ...mapActions(['startPolling']),
+ ...mapActions(['startPolling', 'restartPolling']),
},
};
</script>
@@ -56,19 +56,17 @@ export default {
<template>
<div>
<div v-if="errorTrackingEnabled">
- <div v-if="loading" class="py-3"><gl-loading-icon :size="3" /></div>
+ <div v-if="loading" class="py-3">
+ <gl-loading-icon :size="3" />
+ </div>
<div v-else>
<div class="d-flex justify-content-end">
- <gl-button class="my-3 ml-auto" variant="primary" :href="externalUrl" target="_blank"
- >View in Sentry <icon name="external-link" />
+ <gl-button class="my-3 ml-auto" variant="primary" :href="externalUrl" target="_blank">
+ {{ __('View in Sentry') }}
+ <icon name="external-link" />
</gl-button>
</div>
- <gl-table
- :items="errors"
- :fields="$options.fields"
- :show-empty="true"
- :empty-text="__('No errors to display')"
- >
+ <gl-table :items="errors" :fields="$options.fields" :show-empty="true">
<template slot="HEAD_events" slot-scope="data">
<div class="text-right">{{ data.label }}</div>
</template>
@@ -102,6 +100,14 @@ export default {
<time-ago :time="errors.item.lastSeen" class="text-secondary" />
</div>
</template>
+ <template slot="empty">
+ <div ref="empty">
+ {{ __('No errors to display.') }}
+ <gl-link class="js-try-again" @click="restartPolling">
+ {{ __('Check again') }}
+ </gl-link>
+ </div>
+ </template>
</gl-table>
</div>
</div>
diff --git a/app/assets/javascripts/error_tracking/store/actions.js b/app/assets/javascripts/error_tracking/store/actions.js
index 11aec312368..d42e4f145dc 100644
--- a/app/assets/javascripts/error_tracking/store/actions.js
+++ b/app/assets/javascripts/error_tracking/store/actions.js
@@ -6,7 +6,7 @@ import { __, sprintf } from '~/locale';
let eTagPoll;
-export function startPolling({ commit }, endpoint) {
+export function startPolling({ commit, dispatch }, endpoint) {
eTagPoll = new Poll({
resource: Service,
method: 'getErrorList',
@@ -18,6 +18,7 @@ export function startPolling({ commit }, endpoint) {
commit(types.SET_ERRORS, data.errors);
commit(types.SET_EXTERNAL_URL, data.external_url);
commit(types.SET_LOADING, false);
+ dispatch('stopPolling');
},
errorCallback: response => {
let errorMessage = '';
@@ -36,4 +37,16 @@ export function startPolling({ commit }, endpoint) {
eTagPoll.makeRequest();
}
+export const stopPolling = () => {
+ if (eTagPoll) eTagPoll.stop();
+};
+
+export function restartPolling({ commit }) {
+ commit(types.SET_ERRORS, []);
+ commit(types.SET_EXTERNAL_URL, '');
+ commit(types.SET_LOADING, true);
+
+ if (eTagPoll) eTagPoll.restart();
+}
+
export default () => {};
diff --git a/app/assets/javascripts/error_tracking_settings/components/app.vue b/app/assets/javascripts/error_tracking_settings/components/app.vue
new file mode 100644
index 00000000000..50eb3e63b7c
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/components/app.vue
@@ -0,0 +1,129 @@
+<script>
+import { mapActions, mapGetters, mapState } from 'vuex';
+import { GlButton } from '@gitlab/ui';
+import ProjectDropdown from './project_dropdown.vue';
+import ErrorTrackingForm from './error_tracking_form.vue';
+
+export default {
+ components: { ProjectDropdown, ErrorTrackingForm, GlButton },
+ props: {
+ initialApiHost: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ initialEnabled: {
+ type: String,
+ required: true,
+ },
+ initialProject: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ initialToken: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ listProjectsEndpoint: {
+ type: String,
+ required: true,
+ },
+ operationsSettingsEndpoint: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ ...mapGetters([
+ 'dropdownLabel',
+ 'hasProjects',
+ 'invalidProjectLabel',
+ 'isProjectInvalid',
+ 'projectSelectionLabel',
+ ]),
+ ...mapState([
+ 'apiHost',
+ 'connectError',
+ 'connectSuccessful',
+ 'enabled',
+ 'projects',
+ 'selectedProject',
+ 'settingsLoading',
+ 'token',
+ ]),
+ },
+ created() {
+ this.setInitialState({
+ apiHost: this.initialApiHost,
+ enabled: this.initialEnabled,
+ project: this.initialProject,
+ token: this.initialToken,
+ listProjectsEndpoint: this.listProjectsEndpoint,
+ operationsSettingsEndpoint: this.operationsSettingsEndpoint,
+ });
+ },
+ methods: {
+ ...mapActions([
+ 'fetchProjects',
+ 'setInitialState',
+ 'updateApiHost',
+ 'updateEnabled',
+ 'updateSelectedProject',
+ 'updateSettings',
+ 'updateToken',
+ ]),
+ handleSubmit() {
+ this.updateSettings();
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div class="form-check form-group">
+ <input
+ id="error-tracking-enabled"
+ :checked="enabled"
+ class="form-check-input"
+ type="checkbox"
+ @change="updateEnabled($event.target.checked)"
+ />
+ <label class="form-check-label" for="error-tracking-enabled">{{
+ s__('ErrorTracking|Active')
+ }}</label>
+ </div>
+ <error-tracking-form
+ :api-host="apiHost"
+ :connect-error="connectError"
+ :connect-successful="connectSuccessful"
+ :token="token"
+ @handle-connect="fetchProjects"
+ @update-api-host="updateApiHost"
+ @update-token="updateToken"
+ />
+ <div class="form-group">
+ <project-dropdown
+ :has-projects="hasProjects"
+ :invalid-project-label="invalidProjectLabel"
+ :is-project-invalid="isProjectInvalid"
+ :dropdown-label="dropdownLabel"
+ :project-selection-label="projectSelectionLabel"
+ :projects="projects"
+ :selected-project="selectedProject"
+ :token="token"
+ @select-project="updateSelectedProject"
+ />
+ </div>
+ <gl-button
+ :disabled="settingsLoading"
+ class="js-error-tracking-button"
+ variant="success"
+ @click="handleSubmit"
+ >
+ {{ __('Save changes') }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/error_tracking_settings/components/error_tracking_form.vue b/app/assets/javascripts/error_tracking_settings/components/error_tracking_form.vue
new file mode 100644
index 00000000000..060d8e25227
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/components/error_tracking_form.vue
@@ -0,0 +1,91 @@
+<script>
+import { GlButton, GlFormInput } from '@gitlab/ui';
+import Icon from '~/vue_shared/components/icon.vue';
+
+export default {
+ components: { GlButton, GlFormInput, Icon },
+ props: {
+ apiHost: {
+ type: String,
+ required: true,
+ },
+ connectError: {
+ type: Boolean,
+ required: true,
+ },
+ connectSuccessful: {
+ type: Boolean,
+ required: true,
+ },
+ token: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ tokenInputState() {
+ return this.connectError ? false : null;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div class="form-group">
+ <label class="label-bold" for="error-tracking-api-host">{{ __('Sentry API URL') }}</label>
+ <div class="row">
+ <div class="col-8 col-md-9 gl-pr-0">
+ <gl-form-input
+ id="error-tracking-api-host"
+ :value="apiHost"
+ placeholder="https://mysentryserver.com"
+ @input="$emit('update-api-host', $event)"
+ />
+ </div>
+ </div>
+ <p class="form-text text-muted">
+ {{ s__('ErrorTracking|Find your hostname in your Sentry account settings page') }}
+ </p>
+ </div>
+ <div class="form-group" :class="{ 'gl-show-field-errors': connectError }">
+ <label class="label-bold" for="error-tracking-token">{{
+ s__('ErrorTracking|Auth Token')
+ }}</label>
+ <div class="row">
+ <div class="col-8 col-md-9 gl-pr-0">
+ <gl-form-input
+ id="error-tracking-token"
+ :value="token"
+ :state="tokenInputState"
+ @input="$emit('update-token', $event)"
+ />
+ </div>
+ <div class="col-4 col-md-3 gl-pl-0">
+ <gl-button
+ class="js-error-tracking-connect prepend-left-5"
+ @click="$emit('handle-connect')"
+ >
+ {{ __('Connect') }}
+ </gl-button>
+ <icon
+ v-show="connectSuccessful"
+ class="js-error-tracking-connect-success prepend-left-5 text-success align-middle"
+ :aria-label="__('Projects Successfully Retrieved')"
+ name="check-circle"
+ />
+ </div>
+ </div>
+ <p v-if="connectError" class="gl-field-error">
+ {{ s__('ErrorTracking|Connection has failed. Re-check Auth Token and try again.') }}
+ </p>
+ <p v-else class="form-text text-muted">
+ {{
+ s__(
+ "ErrorTracking|After adding your Auth Token, use the 'Connect' button to load projects",
+ )
+ }}
+ </p>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue b/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue
new file mode 100644
index 00000000000..82df02afafd
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/components/project_dropdown.vue
@@ -0,0 +1,82 @@
+<script>
+import { GlDropdown, GlDropdownHeader, GlDropdownItem } from '@gitlab/ui';
+import Icon from '~/vue_shared/components/icon.vue';
+import { getDisplayName } from '../utils';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownHeader,
+ GlDropdownItem,
+ Icon,
+ },
+ props: {
+ dropdownLabel: {
+ type: String,
+ required: true,
+ },
+ hasProjects: {
+ type: Boolean,
+ required: true,
+ },
+ invalidProjectLabel: {
+ type: String,
+ required: true,
+ },
+ isProjectInvalid: {
+ type: Boolean,
+ required: true,
+ },
+ projects: {
+ type: Array,
+ required: true,
+ },
+ selectedProject: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ projectSelectionLabel: {
+ type: String,
+ required: true,
+ },
+ token: {
+ type: String,
+ required: true,
+ },
+ },
+ methods: {
+ getDisplayName,
+ },
+};
+</script>
+
+<template>
+ <div :class="{ 'gl-show-field-errors': isProjectInvalid }">
+ <label class="label-bold" for="project-dropdown">{{ __('Project') }}</label>
+ <div class="row">
+ <gl-dropdown
+ id="project-dropdown"
+ class="col-8 col-md-9 gl-pr-0"
+ :disabled="!hasProjects"
+ menu-class="w-100 mw-100"
+ toggle-class="dropdown-menu-toggle w-100 gl-field-error-outline"
+ :text="dropdownLabel"
+ >
+ <gl-dropdown-item
+ v-for="project in projects"
+ :key="`${project.organizationSlug}.${project.slug}`"
+ class="w-100"
+ @click="$emit('select-project', project)"
+ >{{ getDisplayName(project) }}</gl-dropdown-item
+ >
+ </gl-dropdown>
+ </div>
+ <p v-if="isProjectInvalid" class="js-project-dropdown-error gl-field-error">
+ {{ invalidProjectLabel }}
+ </p>
+ <p v-else-if="!hasProjects" class="js-project-dropdown-label form-text text-muted">
+ {{ projectSelectionLabel }}
+ </p>
+ </div>
+</template>
diff --git a/app/assets/javascripts/error_tracking_settings/index.js b/app/assets/javascripts/error_tracking_settings/index.js
new file mode 100644
index 00000000000..ce315963723
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/index.js
@@ -0,0 +1,27 @@
+import Vue from 'vue';
+import ErrorTrackingSettings from './components/app.vue';
+import createStore from './store';
+
+export default () => {
+ const formContainerEl = document.querySelector('.js-error-tracking-form');
+ const {
+ dataset: { apiHost, enabled, project, token, listProjectsEndpoint, operationsSettingsEndpoint },
+ } = formContainerEl;
+
+ return new Vue({
+ el: formContainerEl,
+ store: createStore(),
+ render(createElement) {
+ return createElement(ErrorTrackingSettings, {
+ props: {
+ initialApiHost: apiHost,
+ initialEnabled: enabled,
+ initialProject: project,
+ initialToken: token,
+ listProjectsEndpoint,
+ operationsSettingsEndpoint,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/error_tracking_settings/store/actions.js b/app/assets/javascripts/error_tracking_settings/store/actions.js
new file mode 100644
index 00000000000..95105797807
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/actions.js
@@ -0,0 +1,91 @@
+import { __ } from '~/locale';
+import axios from '~/lib/utils/axios_utils';
+import { refreshCurrentPage } from '~/lib/utils/url_utility';
+import createFlash from '~/flash';
+import { transformFrontendSettings } from '../utils';
+import * as types from './mutation_types';
+
+export const requestProjects = ({ commit }) => {
+ commit(types.RESET_CONNECT);
+};
+
+export const receiveProjectsSuccess = ({ commit }, projects) => {
+ commit(types.UPDATE_CONNECT_SUCCESS);
+ commit(types.RECEIVE_PROJECTS, projects);
+};
+
+export const receiveProjectsError = ({ commit }) => {
+ commit(types.UPDATE_CONNECT_ERROR);
+ commit(types.CLEAR_PROJECTS);
+};
+
+export const fetchProjects = ({ dispatch, state }) => {
+ dispatch('requestProjects');
+ return axios
+ .post(state.listProjectsEndpoint, {
+ error_tracking_setting: {
+ api_host: state.apiHost,
+ token: state.token,
+ },
+ })
+ .then(({ data: { projects } }) => {
+ dispatch('receiveProjectsSuccess', projects);
+ })
+ .catch(() => {
+ dispatch('receiveProjectsError');
+ });
+};
+
+export const requestSettings = ({ commit }) => {
+ commit(types.UPDATE_SETTINGS_LOADING, true);
+};
+
+export const receiveSettingsError = ({ commit }, { response = {} }) => {
+ const message = response.data && response.data.message ? response.data.message : '';
+
+ createFlash(`${__('There was an error saving your changes.')} ${message}`, 'alert');
+ commit(types.UPDATE_SETTINGS_LOADING, false);
+};
+
+export const updateSettings = ({ dispatch, state }) => {
+ dispatch('requestSettings');
+ return axios
+ .patch(state.operationsSettingsEndpoint, {
+ project: {
+ error_tracking_setting_attributes: {
+ ...transformFrontendSettings(state),
+ },
+ },
+ })
+ .then(() => {
+ refreshCurrentPage();
+ })
+ .catch(err => {
+ dispatch('receiveSettingsError', err);
+ });
+};
+
+export const updateApiHost = ({ commit }, apiHost) => {
+ commit(types.UPDATE_API_HOST, apiHost);
+ commit(types.RESET_CONNECT);
+};
+
+export const updateEnabled = ({ commit }, enabled) => {
+ commit(types.UPDATE_ENABLED, enabled);
+};
+
+export const updateToken = ({ commit }, token) => {
+ commit(types.UPDATE_TOKEN, token);
+ commit(types.RESET_CONNECT);
+};
+
+export const updateSelectedProject = ({ commit }, selectedProject) => {
+ commit(types.UPDATE_SELECTED_PROJECT, selectedProject);
+};
+
+export const setInitialState = ({ commit }, data) => {
+ commit(types.SET_INITIAL_STATE, data);
+};
+
+// prevent babel-plugin-rewire from generating an invalid default during karma tests
+export default () => {};
diff --git a/app/assets/javascripts/error_tracking_settings/store/getters.js b/app/assets/javascripts/error_tracking_settings/store/getters.js
new file mode 100644
index 00000000000..a008b181907
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/getters.js
@@ -0,0 +1,44 @@
+import _ from 'underscore';
+import { __, s__, sprintf } from '~/locale';
+import { getDisplayName } from '../utils';
+
+export const hasProjects = state => !!state.projects && state.projects.length > 0;
+
+export const isProjectInvalid = (state, getters) =>
+ !!state.selectedProject &&
+ getters.hasProjects &&
+ !state.projects.some(project => _.isMatch(state.selectedProject, project));
+
+export const dropdownLabel = (state, getters) => {
+ if (state.selectedProject !== null) {
+ return getDisplayName(state.selectedProject);
+ }
+ if (!getters.hasProjects) {
+ return s__('ErrorTracking|No projects available');
+ }
+ return s__('ErrorTracking|Select project');
+};
+
+export const invalidProjectLabel = state => {
+ if (state.selectedProject) {
+ return sprintf(
+ __('Project "%{name}" is no longer available. Select another project to continue.'),
+ {
+ name: state.selectedProject.name,
+ },
+ );
+ }
+ return '';
+};
+
+export const projectSelectionLabel = state => {
+ if (state.token) {
+ return s__(
+ "ErrorTracking|Click 'Connect' to re-establish the connection to Sentry and activate the dropdown.",
+ );
+ }
+ return s__('ErrorTracking|To enable project selection, enter a valid Auth Token');
+};
+
+// prevent babel-plugin-rewire from generating an invalid default during karma tests
+export default () => {};
diff --git a/app/assets/javascripts/error_tracking_settings/store/index.js b/app/assets/javascripts/error_tracking_settings/store/index.js
new file mode 100644
index 00000000000..560f265a2ea
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/index.js
@@ -0,0 +1,16 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import createState from './state';
+import * as actions from './actions';
+import * as getters from './getters';
+import mutations from './mutations';
+
+Vue.use(Vuex);
+
+export default () =>
+ new Vuex.Store({
+ state: createState(),
+ actions,
+ getters,
+ mutations,
+ });
diff --git a/app/assets/javascripts/error_tracking_settings/store/mutation_types.js b/app/assets/javascripts/error_tracking_settings/store/mutation_types.js
new file mode 100644
index 00000000000..b4f8a237947
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/mutation_types.js
@@ -0,0 +1,11 @@
+export const CLEAR_PROJECTS = 'CLEAR_PROJECTS';
+export const SET_INITIAL_STATE = 'SET_INITIAL_STATE';
+export const RECEIVE_PROJECTS = 'RECEIVE_PROJECTS';
+export const RESET_CONNECT = 'RESET_CONNECT';
+export const UPDATE_API_HOST = 'UPDATE_API_HOST';
+export const UPDATE_CONNECT_ERROR = 'UPDATE_CONNECT_ERROR';
+export const UPDATE_CONNECT_SUCCESS = 'UPDATE_CONNECT_SUCCESS';
+export const UPDATE_ENABLED = 'UPDATE_ENABLED';
+export const UPDATE_SELECTED_PROJECT = 'UPDATE_SELECTED_PROJECT';
+export const UPDATE_SETTINGS_LOADING = 'UPDATE_SETTINGS_LOADING';
+export const UPDATE_TOKEN = 'UPDATE_TOKEN';
diff --git a/app/assets/javascripts/error_tracking_settings/store/mutations.js b/app/assets/javascripts/error_tracking_settings/store/mutations.js
new file mode 100644
index 00000000000..4089d1ee94e
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/mutations.js
@@ -0,0 +1,61 @@
+import _ from 'underscore';
+import { convertObjectPropsToCamelCase, parseBoolean } from '~/lib/utils/common_utils';
+import * as types from './mutation_types';
+import { projectKeys } from '../utils';
+
+export default {
+ [types.CLEAR_PROJECTS](state) {
+ state.projects = [];
+ },
+ [types.RECEIVE_PROJECTS](state, projects) {
+ state.projects = projects
+ .map(convertObjectPropsToCamelCase)
+ // The `pick` strips out extra properties returned from Sentry.
+ // Such properties could be problematic later, e.g. when checking whether `projects` contains `selectedProject`
+ .map(project => _.pick(project, projectKeys));
+ },
+ [types.RESET_CONNECT](state) {
+ state.connectSuccessful = false;
+ state.connectError = false;
+ },
+ [types.SET_INITIAL_STATE](
+ state,
+ { apiHost, enabled, project, token, listProjectsEndpoint, operationsSettingsEndpoint },
+ ) {
+ state.enabled = parseBoolean(enabled);
+ state.apiHost = apiHost;
+ state.token = token;
+ state.listProjectsEndpoint = listProjectsEndpoint;
+ state.operationsSettingsEndpoint = operationsSettingsEndpoint;
+
+ if (project) {
+ state.selectedProject = _.pick(
+ convertObjectPropsToCamelCase(JSON.parse(project)),
+ projectKeys,
+ );
+ }
+ },
+ [types.UPDATE_API_HOST](state, apiHost) {
+ state.apiHost = apiHost;
+ },
+ [types.UPDATE_ENABLED](state, enabled) {
+ state.enabled = enabled;
+ },
+ [types.UPDATE_TOKEN](state, token) {
+ state.token = token;
+ },
+ [types.UPDATE_SELECTED_PROJECT](state, selectedProject) {
+ state.selectedProject = selectedProject;
+ },
+ [types.UPDATE_SETTINGS_LOADING](state, settingsLoading) {
+ state.settingsLoading = settingsLoading;
+ },
+ [types.UPDATE_CONNECT_SUCCESS](state) {
+ state.connectSuccessful = true;
+ state.connectError = false;
+ },
+ [types.UPDATE_CONNECT_ERROR](state) {
+ state.connectSuccessful = false;
+ state.connectError = true;
+ },
+};
diff --git a/app/assets/javascripts/error_tracking_settings/store/state.js b/app/assets/javascripts/error_tracking_settings/store/state.js
new file mode 100644
index 00000000000..98219d33f4d
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/store/state.js
@@ -0,0 +1,12 @@
+export default () => ({
+ apiHost: '',
+ enabled: false,
+ token: '',
+ projects: [],
+ selectedProject: null,
+ settingsLoading: false,
+ connectSuccessful: false,
+ connectError: false,
+ listProjectsEndpoint: '',
+ operationsSettingsEndpoint: '',
+});
diff --git a/app/assets/javascripts/error_tracking_settings/utils.js b/app/assets/javascripts/error_tracking_settings/utils.js
new file mode 100644
index 00000000000..6613e04ee0e
--- /dev/null
+++ b/app/assets/javascripts/error_tracking_settings/utils.js
@@ -0,0 +1,18 @@
+export const projectKeys = ['name', 'organizationName', 'organizationSlug', 'slug'];
+
+export const transformFrontendSettings = ({ apiHost, enabled, token, selectedProject }) => {
+ const project = selectedProject
+ ? {
+ slug: selectedProject.slug,
+ name: selectedProject.name,
+ organization_name: selectedProject.organizationName,
+ organization_slug: selectedProject.organizationSlug,
+ }
+ : null;
+
+ return { api_host: apiHost || null, enabled, token: token || null, project };
+};
+
+export const getDisplayName = project => `${project.organizationName} | ${project.name}`;
+
+export default () => {};
diff --git a/app/assets/javascripts/filtered_search/admin_runners_filtered_search_token_keys.js b/app/assets/javascripts/filtered_search/admin_runners_filtered_search_token_keys.js
index 934375023ba..691d165c585 100644
--- a/app/assets/javascripts/filtered_search/admin_runners_filtered_search_token_keys.js
+++ b/app/assets/javascripts/filtered_search/admin_runners_filtered_search_token_keys.js
@@ -17,6 +17,14 @@ const tokenKeys = [
icon: 'cube',
tag: 'type',
},
+ {
+ key: 'tag',
+ type: 'array',
+ param: 'name[]',
+ symbol: '~',
+ icon: 'tag',
+ tag: '~tag',
+ },
];
const AdminRunnersFilteredSearchTokenKeys = new FilteredSearchTokenKeys(tokenKeys);
diff --git a/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
new file mode 100644
index 00000000000..b27bb63c220
--- /dev/null
+++ b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
@@ -0,0 +1,68 @@
+import createFlash from '../flash';
+import AjaxFilter from '../droplab/plugins/ajax_filter';
+import FilteredSearchDropdown from './filtered_search_dropdown';
+import DropdownUtils from './dropdown_utils';
+import FilteredSearchTokenizer from './filtered_search_tokenizer';
+import { __ } from '~/locale';
+
+export default class DropdownAjaxFilter extends FilteredSearchDropdown {
+ constructor(options = {}) {
+ const { tokenKeys, endpoint, symbol } = options;
+
+ super(options);
+
+ this.tokenKeys = tokenKeys;
+ this.endpoint = endpoint;
+ this.symbol = symbol;
+
+ this.config = {
+ AjaxFilter: this.ajaxFilterConfig(),
+ };
+ }
+
+ ajaxFilterConfig() {
+ return {
+ endpoint: `${gon.relative_url_root || ''}${this.endpoint}`,
+ searchKey: 'search',
+ searchValueFunction: this.getSearchInput.bind(this),
+ loadingTemplate: this.loadingTemplate,
+ onError() {
+ createFlash(__('An error occurred fetching the dropdown data.'));
+ },
+ };
+ }
+
+ itemClicked(e) {
+ super.itemClicked(e, selected =>
+ selected.querySelector('.dropdown-light-content').innerText.trim(),
+ );
+ }
+
+ renderContent(forceShowList = false) {
+ this.droplab.changeHookList(this.hookId, this.dropdown, [AjaxFilter], this.config);
+ super.renderContent(forceShowList);
+ }
+
+ getSearchInput() {
+ const query = DropdownUtils.getSearchInput(this.input);
+ const { lastToken } = FilteredSearchTokenizer.processTokens(query, this.tokenKeys.get());
+
+ let value = lastToken || '';
+
+ if (value[0] === this.symbol) {
+ value = value.slice(1);
+ }
+
+ // Removes the first character if it is a quotation so that we can search
+ // with multiple words
+ if (value[0] === '"' || value[0] === "'") {
+ value = value.slice(1);
+ }
+
+ return value;
+ }
+
+ init() {
+ this.droplab.addHook(this.input, this.dropdown, [AjaxFilter], this.config).init();
+ }
+}
diff --git a/app/assets/javascripts/filtered_search/dropdown_user.js b/app/assets/javascripts/filtered_search/dropdown_user.js
index d5027590bb7..f1e7be6bde1 100644
--- a/app/assets/javascripts/filtered_search/dropdown_user.js
+++ b/app/assets/javascripts/filtered_search/dropdown_user.js
@@ -1,54 +1,34 @@
-import Flash from '../flash';
-import AjaxFilter from '../droplab/plugins/ajax_filter';
-import FilteredSearchDropdown from './filtered_search_dropdown';
import { addClassIfElementExists } from '../lib/utils/dom_utils';
-import DropdownUtils from './dropdown_utils';
-import FilteredSearchTokenizer from './filtered_search_tokenizer';
+import DropdownAjaxFilter from './dropdown_ajax_filter';
-export default class DropdownUser extends FilteredSearchDropdown {
+export default class DropdownUser extends DropdownAjaxFilter {
constructor(options = {}) {
- const { tokenKeys } = options;
- super(options);
- this.config = {
- AjaxFilter: {
- endpoint: `${gon.relative_url_root || ''}/autocomplete/users.json`,
- searchKey: 'search',
- params: {
- active: true,
- group_id: this.getGroupId(),
- project_id: this.getProjectId(),
- current_user: true,
- },
- searchValueFunction: this.getSearchInput.bind(this),
- loadingTemplate: this.loadingTemplate,
- onLoadingFinished: () => {
- this.hideCurrentUser();
- },
- onError() {
- /* eslint-disable no-new */
- new Flash('An error occurred fetching the dropdown data.');
- /* eslint-enable no-new */
- },
+ super({
+ ...options,
+ endpoint: '/autocomplete/users.json',
+ symbol: '@',
+ });
+ }
+
+ ajaxFilterConfig() {
+ return {
+ ...super.ajaxFilterConfig(),
+ params: {
+ active: true,
+ group_id: this.getGroupId(),
+ project_id: this.getProjectId(),
+ current_user: true,
+ },
+ onLoadingFinished: () => {
+ this.hideCurrentUser();
},
};
- this.tokenKeys = tokenKeys;
}
hideCurrentUser() {
addClassIfElementExists(this.dropdown.querySelector('.js-current-user'), 'hidden');
}
- itemClicked(e) {
- super.itemClicked(e, selected =>
- selected.querySelector('.dropdown-light-content').innerText.trim(),
- );
- }
-
- renderContent(forceShowList = false) {
- this.droplab.changeHookList(this.hookId, this.dropdown, [AjaxFilter], this.config);
- super.renderContent(forceShowList);
- }
-
getGroupId() {
return this.input.getAttribute('data-group-id');
}
@@ -56,27 +36,4 @@ export default class DropdownUser extends FilteredSearchDropdown {
getProjectId() {
return this.input.getAttribute('data-project-id');
}
-
- getSearchInput() {
- const query = DropdownUtils.getSearchInput(this.input);
- const { lastToken } = FilteredSearchTokenizer.processTokens(query, this.tokenKeys.get());
-
- let value = lastToken || '';
-
- if (value[0] === '@') {
- value = value.slice(1);
- }
-
- // Removes the first character if it is a quotation so that we can search
- // with multiple words
- if (value[0] === '"' || value[0] === "'") {
- value = value.slice(1);
- }
-
- return value;
- }
-
- init() {
- this.droplab.addHook(this.input, this.dropdown, [AjaxFilter], this.config).init();
- }
}
diff --git a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
index 4d05f46ed17..57847d4ad9f 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
@@ -7,6 +7,7 @@ import DropdownHint from './dropdown_hint';
import DropdownEmoji from './dropdown_emoji';
import DropdownNonUser from './dropdown_non_user';
import DropdownUser from './dropdown_user';
+import DropdownAjaxFilter from './dropdown_ajax_filter';
import NullDropdown from './null_dropdown';
import FilteredSearchVisualTokens from './filtered_search_visual_tokens';
@@ -111,6 +112,15 @@ export default class FilteredSearchDropdownManager {
gl: NullDropdown,
element: this.container.querySelector('#js-dropdown-admin-runner-type'),
},
+ tag: {
+ reference: null,
+ gl: DropdownAjaxFilter,
+ extraArguments: {
+ endpoint: this.getRunnerTagsEndpoint(),
+ symbol: '~',
+ },
+ element: this.container.querySelector('#js-dropdown-runner-tag'),
+ },
};
supportedTokens.forEach(type => {
@@ -146,6 +156,10 @@ export default class FilteredSearchDropdownManager {
return endpoint;
}
+ getRunnerTagsEndpoint() {
+ return `${this.baseEndpoint}/admin/runners/tag_list.json`;
+ }
+
static addWordToInput(tokenName, tokenValue = '', clicked = false, options = {}) {
const { uppercaseTokenName = false, capitalizeTokenValue = false } = options;
const input = FilteredSearchContainer.container.querySelector('.filtered-search');
diff --git a/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js b/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
index 5090b0bdc3c..addf1ad94df 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
@@ -142,19 +142,29 @@ export default class FilteredSearchVisualTokens {
static updateEmojiTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue) {
const container = tokenValueContainer;
const element = tokenValueElement;
+ const value = tokenValue;
return (
import(/* webpackChunkName: 'emoji' */ '../emoji')
.then(Emoji => {
- if (!Emoji.isEmojiNameValid(tokenValue)) {
- return;
- }
-
- container.dataset.originalValue = tokenValue;
- element.innerHTML = Emoji.glEmojiTag(tokenValue);
+ Emoji.initEmojiMap()
+ .then(() => {
+ if (!Emoji.isEmojiNameValid(value)) {
+ return;
+ }
+
+ container.dataset.originalValue = value;
+ element.innerHTML = Emoji.glEmojiTag(value);
+ })
+ // ignore error and leave emoji name in the search bar
+ .catch(err => {
+ throw err;
+ });
})
// ignore error and leave emoji name in the search bar
- .catch(() => {})
+ .catch(importError => {
+ throw importError;
+ })
);
}
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index c81e754df4c..50ea13edf63 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -487,9 +487,15 @@ class GfmAutoComplete {
this.loadData($input, at, this.cachedData[at]);
} else if (GfmAutoComplete.atTypeMap[at] === 'emojis') {
import(/* webpackChunkName: 'emoji' */ './emoji')
- .then(({ validEmojiNames, glEmojiTag }) => {
- this.loadData($input, at, validEmojiNames);
- GfmAutoComplete.glEmojiTag = glEmojiTag;
+ .then(({ initEmojiMap, getValidEmojiNames, glEmojiTag }) => {
+ initEmojiMap()
+ .then(() => {
+ this.loadData($input, at, getValidEmojiNames());
+ GfmAutoComplete.glEmojiTag = glEmojiTag;
+ })
+ .catch(() => {
+ this.isLoadingData[at] = false;
+ });
})
.catch(() => {
this.isLoadingData[at] = false;
diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js
index a8ac2f510a4..27d8669b256 100644
--- a/app/assets/javascripts/gl_dropdown.js
+++ b/app/assets/javascripts/gl_dropdown.js
@@ -656,23 +656,7 @@ GitLabDropdown = (function() {
if (this.options.renderMenu) {
return this.options.renderMenu(html);
} else {
- var ul = document.createElement('ul');
-
- for (var i = 0; i < html.length; i += 1) {
- var el = html[i];
-
- if (el instanceof $) {
- el = el.get(0);
- }
-
- if (typeof el === 'string') {
- ul.innerHTML += el;
- } else {
- ul.appendChild(el);
- }
- }
-
- return ul;
+ return $('<ul>').append(html);
}
};
diff --git a/app/assets/javascripts/ide/components/new_dropdown/index.vue b/app/assets/javascripts/ide/components/new_dropdown/index.vue
index d7a7b1b4d78..593a9162a06 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/index.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/index.vue
@@ -1,7 +1,6 @@
<script>
import { mapActions } from 'vuex';
import icon from '~/vue_shared/components/icon.vue';
-import newModal from './modal.vue';
import upload from './upload.vue';
import ItemButton from './button.vue';
import { modalTypes } from '../../constants';
@@ -9,7 +8,6 @@ import { modalTypes } from '../../constants';
export default {
components: {
icon,
- newModal,
upload,
ItemButton,
},
diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
index c9c4e9e86f8..ba6bbdfef4b 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
@@ -1,6 +1,7 @@
<script>
import $ from 'jquery';
-import { __ } from '~/locale';
+import flash from '~/flash';
+import { __, sprintf, s__ } from '~/locale';
import { mapActions, mapState, mapGetters } from 'vuex';
import GlModal from '~/vue_shared/components/gl_modal.vue';
import { modalTypes } from '../../constants';
@@ -15,15 +16,17 @@ export default {
};
},
computed: {
- ...mapState(['entryModal']),
+ ...mapState(['entries', 'entryModal']),
...mapGetters('fileTemplates', ['templateTypes']),
entryName: {
get() {
+ const entryPath = this.entryModal.entry.path;
+
if (this.entryModal.type === modalTypes.rename) {
- return this.name || this.entryModal.entry.name;
+ return this.name || entryPath;
}
- return this.name || (this.entryModal.path !== '' ? `${this.entryModal.path}/` : '');
+ return this.name || (entryPath ? `${entryPath}/` : '');
},
set(val) {
this.name = val;
@@ -62,10 +65,40 @@ export default {
...mapActions(['createTempEntry', 'renameEntry']),
submitForm() {
if (this.entryModal.type === modalTypes.rename) {
- this.renameEntry({
- path: this.entryModal.entry.path,
- name: this.entryName,
- });
+ if (this.entries[this.entryName] && !this.entries[this.entryName].deleted) {
+ flash(
+ sprintf(s__('The name %{entryName} is already taken in this directory.'), {
+ entryName: this.entryName,
+ }),
+ 'alert',
+ document,
+ null,
+ false,
+ true,
+ );
+ } else {
+ let parentPath = this.entryName.split('/');
+ const entryName = parentPath.pop();
+ parentPath = parentPath.join('/');
+
+ const createPromise =
+ parentPath && !this.entries[parentPath]
+ ? this.createTempEntry({ name: parentPath, type: 'tree' })
+ : Promise.resolve();
+
+ createPromise
+ .then(() =>
+ this.renameEntry({
+ path: this.entryModal.entry.path,
+ name: entryName,
+ entryPath: null,
+ parentPath,
+ }),
+ )
+ .catch(() =>
+ flash(__('Error creating a new path'), 'alert', document, null, false, true),
+ );
+ }
} else {
this.createTempEntry({
name: this.name,
@@ -82,7 +115,14 @@ export default {
$('#ide-new-entry').modal('toggle');
},
focusInput() {
+ const name = this.entries[this.entryName] ? this.entries[this.entryName].name : null;
+ const inputValue = this.$refs.fieldName.value;
+
this.$refs.fieldName.focus();
+
+ if (name) {
+ this.$refs.fieldName.setSelectionRange(inputValue.indexOf(name), inputValue.length);
+ }
},
closedModal() {
this.name = '';
diff --git a/app/assets/javascripts/ide/lib/files.js b/app/assets/javascripts/ide/lib/files.js
new file mode 100644
index 00000000000..5dfba8fe531
--- /dev/null
+++ b/app/assets/javascripts/ide/lib/files.js
@@ -0,0 +1,113 @@
+import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
+import { decorateData, sortTree } from '../stores/utils';
+
+export const splitParent = path => {
+ const idx = path.lastIndexOf('/');
+
+ return {
+ parent: idx >= 0 ? path.substring(0, idx) : null,
+ name: idx >= 0 ? path.substring(idx + 1) : path,
+ };
+};
+
+/**
+ * Create file objects from a list of file paths.
+ */
+export const decorateFiles = ({
+ data,
+ projectId,
+ branchId,
+ tempFile = false,
+ content = '',
+ base64 = false,
+}) => {
+ const treeList = [];
+ const entries = {};
+
+ // These mutable variable references end up being exported and used by `createTempEntry`
+ let file;
+ let parentPath;
+
+ const insertParent = path => {
+ if (!path) {
+ return null;
+ } else if (entries[path]) {
+ return entries[path];
+ }
+
+ const { parent, name } = splitParent(path);
+ const parentFolder = parent && insertParent(parent);
+ parentPath = parentFolder && parentFolder.path;
+
+ const tree = decorateData({
+ projectId,
+ branchId,
+ id: path,
+ name,
+ path,
+ url: `/${projectId}/tree/${branchId}/-/${path}/`,
+ type: 'tree',
+ parentTreeUrl: parentFolder ? parentFolder.url : `/${projectId}/tree/${branchId}/`,
+ tempFile,
+ changed: tempFile,
+ opened: tempFile,
+ parentPath,
+ });
+
+ Object.assign(entries, {
+ [path]: tree,
+ });
+
+ if (parentFolder) {
+ parentFolder.tree.push(tree);
+ } else {
+ treeList.push(tree);
+ }
+
+ return tree;
+ };
+
+ data.forEach(path => {
+ const { parent, name } = splitParent(path);
+
+ const fileFolder = parent && insertParent(parent);
+
+ if (name) {
+ parentPath = fileFolder && fileFolder.path;
+
+ file = decorateData({
+ projectId,
+ branchId,
+ id: path,
+ name,
+ path,
+ url: `/${projectId}/blob/${branchId}/-/${path}`,
+ type: 'blob',
+ parentTreeUrl: fileFolder ? fileFolder.url : `/${projectId}/blob/${branchId}`,
+ tempFile,
+ changed: tempFile,
+ content,
+ base64,
+ previewMode: viewerInformationForPath(name),
+ parentPath,
+ });
+
+ Object.assign(entries, {
+ [path]: file,
+ });
+
+ if (fileFolder) {
+ fileFolder.tree.push(file);
+ } else {
+ treeList.push(file);
+ }
+ }
+ });
+
+ return {
+ entries,
+ treeList: sortTree(treeList),
+ file,
+ parentPath,
+ };
+};
diff --git a/app/assets/javascripts/ide/services/index.js b/app/assets/javascripts/ide/services/index.js
index 13449592e62..ba33b6826d6 100644
--- a/app/assets/javascripts/ide/services/index.js
+++ b/app/assets/javascripts/ide/services/index.js
@@ -40,6 +40,9 @@ export default {
getProjectData(namespace, project) {
return Api.project(`${namespace}/${project}`);
},
+ getProjectMergeRequests(projectId, params = {}) {
+ return Api.projectMergeRequests(projectId, params);
+ },
getProjectMergeRequestData(projectId, mergeRequestId, params = {}) {
return Api.projectMergeRequest(projectId, mergeRequestId, params);
},
diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js
index e10a132ab4b..7b660bda081 100644
--- a/app/assets/javascripts/ide/stores/actions.js
+++ b/app/assets/javascripts/ide/stores/actions.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
import { visitUrl } from '~/lib/utils/url_utility';
import flash from '~/flash';
import * as types from './mutation_types';
-import FilesDecoratorWorker from './workers/files_decorator_worker';
+import { decorateFiles } from '../lib/files';
import { stageKeys } from '../constants';
export const redirectToUrl = (_, url) => visitUrl(url);
@@ -56,7 +56,6 @@ export const createTempEntry = (
{ name, type, content = '', base64 = false },
) =>
new Promise(resolve => {
- const worker = new FilesDecoratorWorker();
const fullName = name.slice(-1) !== '/' && type === 'tree' ? `${name}/` : name;
if (state.entries[name]) {
@@ -74,31 +73,7 @@ export const createTempEntry = (
return null;
}
- worker.addEventListener('message', ({ data }) => {
- const { file, parentPath } = data;
-
- worker.terminate();
-
- commit(types.CREATE_TMP_ENTRY, {
- data,
- projectId: state.currentProjectId,
- branchId: state.currentBranchId,
- });
-
- if (type === 'blob') {
- commit(types.TOGGLE_FILE_OPEN, file.path);
- commit(types.ADD_FILE_TO_CHANGED, file.path);
- dispatch('setFileActive', file.path);
- }
-
- if (parentPath && !state.entries[parentPath].opened) {
- commit(types.TOGGLE_TREE_OPEN, parentPath);
- }
-
- resolve(file);
- });
-
- worker.postMessage({
+ const data = decorateFiles({
data: [fullName],
projectId: state.currentProjectId,
branchId: state.currentBranchId,
@@ -107,6 +82,25 @@ export const createTempEntry = (
base64,
content,
});
+ const { file, parentPath } = data;
+
+ commit(types.CREATE_TMP_ENTRY, {
+ data,
+ projectId: state.currentProjectId,
+ branchId: state.currentBranchId,
+ });
+
+ if (type === 'blob') {
+ commit(types.TOGGLE_FILE_OPEN, file.path);
+ commit(types.ADD_FILE_TO_CHANGED, file.path);
+ dispatch('setFileActive', file.path);
+ }
+
+ if (parentPath && !state.entries[parentPath].opened) {
+ commit(types.TOGGLE_TREE_OPEN, parentPath);
+ }
+
+ resolve(file);
return null;
});
@@ -215,15 +209,27 @@ export const deleteEntry = ({ commit, dispatch, state }, path) => {
export const resetOpenFiles = ({ commit }) => commit(types.RESET_OPEN_FILES);
-export const renameEntry = ({ dispatch, commit, state }, { path, name, entryPath = null }) => {
+export const renameEntry = (
+ { dispatch, commit, state },
+ { path, name, entryPath = null, parentPath },
+) => {
const entry = state.entries[entryPath || path];
- commit(types.RENAME_ENTRY, { path, name, entryPath });
+ commit(types.RENAME_ENTRY, { path, name, entryPath, parentPath });
if (entry.type === 'tree') {
- state.entries[entryPath || path].tree.forEach(f =>
- dispatch('renameEntry', { path, name, entryPath: f.path }),
- );
+ const slashedParentPath = parentPath ? `${parentPath}/` : '';
+ const targetEntry = entryPath ? entryPath.split('/').pop() : name;
+ const newParentPath = `${slashedParentPath}${targetEntry}`;
+
+ state.entries[entryPath || path].tree.forEach(f => {
+ dispatch('renameEntry', {
+ path,
+ name,
+ entryPath: f.path,
+ parentPath: newParentPath,
+ });
+ });
}
if (!entryPath && !entry.tempFile) {
diff --git a/app/assets/javascripts/ide/stores/actions/merge_request.js b/app/assets/javascripts/ide/stores/actions/merge_request.js
index 18c24369996..362ced248a1 100644
--- a/app/assets/javascripts/ide/stores/actions/merge_request.js
+++ b/app/assets/javascripts/ide/stores/actions/merge_request.js
@@ -4,6 +4,38 @@ import service from '../../services';
import * as types from '../mutation_types';
import { activityBarViews } from '../../constants';
+export const getMergeRequestsForBranch = ({ commit }, { projectId, branchId } = {}) =>
+ service
+ .getProjectMergeRequests(`${projectId}`, {
+ source_branch: branchId,
+ order_by: 'created_at',
+ per_page: 1,
+ })
+ .then(({ data }) => {
+ if (data.length > 0) {
+ const currentMR = data[0];
+
+ commit(types.SET_MERGE_REQUEST, {
+ projectPath: projectId,
+ mergeRequestId: currentMR.iid,
+ mergeRequest: currentMR,
+ });
+
+ commit(types.SET_CURRENT_MERGE_REQUEST, `${currentMR.iid}`);
+ }
+ })
+ .catch(e => {
+ flash(
+ __(`Error fetching merge requests for ${branchId}`),
+ 'alert',
+ document,
+ null,
+ false,
+ true,
+ );
+ throw e;
+ });
+
export const getMergeRequestData = (
{ commit, dispatch, state },
{ projectId, mergeRequestId, targetProjectId = null, force = false } = {},
diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js
index b65f631c99c..06ed5c0b572 100644
--- a/app/assets/javascripts/ide/stores/actions/project.js
+++ b/app/assets/javascripts/ide/stores/actions/project.js
@@ -136,17 +136,24 @@ export const openBranch = ({ dispatch, state }, { projectId, branchId, basePath
return dispatch('getFiles', {
projectId,
branchId,
- }).then(() => {
- if (basePath) {
- const path = basePath.slice(-1) === '/' ? basePath.slice(0, -1) : basePath;
- const treeEntryKey = Object.keys(state.entries).find(
- key => key === path && !state.entries[key].pending,
- );
- const treeEntry = state.entries[treeEntryKey];
+ })
+ .then(() => {
+ if (basePath) {
+ const path = basePath.slice(-1) === '/' ? basePath.slice(0, -1) : basePath;
+ const treeEntryKey = Object.keys(state.entries).find(
+ key => key === path && !state.entries[key].pending,
+ );
+ const treeEntry = state.entries[treeEntryKey];
- if (treeEntry) {
- dispatch('handleTreeEntryAction', treeEntry);
+ if (treeEntry) {
+ dispatch('handleTreeEntryAction', treeEntry);
+ }
}
- }
- });
+ })
+ .then(() => {
+ dispatch('getMergeRequestsForBranch', {
+ projectId,
+ branchId,
+ });
+ });
};
diff --git a/app/assets/javascripts/ide/stores/actions/tree.js b/app/assets/javascripts/ide/stores/actions/tree.js
index de5f6050074..3d83e4a9ba5 100644
--- a/app/assets/javascripts/ide/stores/actions/tree.js
+++ b/app/assets/javascripts/ide/stores/actions/tree.js
@@ -1,7 +1,8 @@
+import _ from 'underscore';
import { __ } from '../../../locale';
import service from '../../services';
import * as types from '../mutation_types';
-import FilesDecoratorWorker from '../workers/files_decorator_worker';
+import { decorateFiles } from '../../lib/files';
export const toggleTreeOpen = ({ commit }, path) => {
commit(types.TOGGLE_TREE_OPEN, path);
@@ -32,6 +33,19 @@ export const handleTreeEntryAction = ({ commit, dispatch }, row) => {
dispatch('showTreeEntry', row.path);
};
+export const setDirectoryData = ({ state, commit }, { projectId, branchId, treeList }) => {
+ const selectedTree = state.trees[`${projectId}/${branchId}`];
+
+ commit(types.SET_DIRECTORY_DATA, {
+ treePath: `${projectId}/${branchId}`,
+ data: treeList,
+ });
+ commit(types.TOGGLE_LOADING, {
+ entry: selectedTree,
+ forceValue: false,
+ });
+};
+
export const getFiles = ({ state, commit, dispatch }, { projectId, branchId } = {}) =>
new Promise((resolve, reject) => {
if (
@@ -45,31 +59,19 @@ export const getFiles = ({ state, commit, dispatch }, { projectId, branchId } =
service
.getFiles(selectedProject.web_url, branchId)
.then(({ data }) => {
- const worker = new FilesDecoratorWorker();
- worker.addEventListener('message', e => {
- const { entries, treeList } = e.data;
- const selectedTree = state.trees[`${projectId}/${branchId}`];
-
- commit(types.SET_ENTRIES, entries);
- commit(types.SET_DIRECTORY_DATA, {
- treePath: `${projectId}/${branchId}`,
- data: treeList,
- });
- commit(types.TOGGLE_LOADING, {
- entry: selectedTree,
- forceValue: false,
- });
-
- worker.terminate();
-
- resolve();
- });
-
- worker.postMessage({
+ const { entries, treeList } = decorateFiles({
data,
projectId,
branchId,
});
+
+ commit(types.SET_ENTRIES, entries);
+
+ // Defer setting the directory data because this triggers some intense rendering.
+ // The entries is all we need to load the file editor.
+ _.defer(() => dispatch('setDirectoryData', { projectId, branchId, treeList }));
+
+ resolve();
})
.catch(e => {
if (e.response.status === 404) {
diff --git a/app/assets/javascripts/ide/stores/mutations.js b/app/assets/javascripts/ide/stores/mutations.js
index 78cdfda74f0..9b9f4b21f1c 100644
--- a/app/assets/javascripts/ide/stores/mutations.js
+++ b/app/assets/javascripts/ide/stores/mutations.js
@@ -206,19 +206,17 @@ export default {
}
}
},
- [types.RENAME_ENTRY](state, { path, name, entryPath = null }) {
+ [types.RENAME_ENTRY](state, { path, name, entryPath = null, parentPath }) {
const oldEntry = state.entries[entryPath || path];
- const nameRegex =
- !entryPath && oldEntry.type === 'blob'
- ? new RegExp(`${oldEntry.name}$`)
- : new RegExp(`^${path}`);
- const newPath = oldEntry.path.replace(nameRegex, name);
- const parentPath = oldEntry.parentPath ? oldEntry.parentPath.replace(nameRegex, name) : '';
+ const slashedParentPath = parentPath ? `${parentPath}/` : '';
+ const newPath = entryPath
+ ? `${slashedParentPath}${oldEntry.name}`
+ : `${slashedParentPath}${name}`;
state.entries[newPath] = {
...oldEntry,
id: newPath,
- key: `${name}-${oldEntry.type}-${oldEntry.id}`,
+ key: `${newPath}-${oldEntry.type}-${oldEntry.id}`,
path: newPath,
name: entryPath ? oldEntry.name : name,
tempFile: true,
@@ -228,6 +226,7 @@ export default {
parentPath,
raw: '',
};
+
oldEntry.moved = true;
oldEntry.movedPath = newPath;
@@ -256,6 +255,7 @@ export default {
Vue.delete(state.entries, oldEntry.path);
}
},
+
...projectMutations,
...mergeRequestMutation,
...fileMutations,
diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js
index 0ede76fd1e0..0b2a18e9c8a 100644
--- a/app/assets/javascripts/ide/stores/utils.js
+++ b/app/assets/javascripts/ide/stores/utils.js
@@ -75,8 +75,7 @@ export const decorateData = entity => {
parentPath = '',
} = entity;
- return {
- ...dataStructure(),
+ return Object.assign(dataStructure(), {
id,
projectId,
branchId,
@@ -97,7 +96,7 @@ export const decorateData = entity => {
file_lock,
html,
parentPath,
- };
+ });
};
export const findEntry = (tree, type, name, prop = 'name') =>
diff --git a/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js b/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js
deleted file mode 100644
index fa35c215880..00000000000
--- a/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
-import { decorateData, sortTree } from '../utils';
-
-// eslint-disable-next-line no-restricted-globals
-self.addEventListener('message', e => {
- const { data, projectId, branchId, tempFile = false, content = '', base64 = false } = e.data;
-
- const treeList = [];
- let file;
- let parentPath;
- const entries = data.reduce((acc, path) => {
- const pathSplit = path.split('/');
- const blobName = pathSplit.pop().trim();
-
- if (pathSplit.length > 0) {
- pathSplit.reduce((pathAcc, folderName) => {
- const parentFolder = acc[pathAcc[pathAcc.length - 1]];
- const folderPath = `${parentFolder ? `${parentFolder.path}/` : ''}${folderName}`;
- const foundEntry = acc[folderPath];
-
- if (!foundEntry) {
- parentPath = parentFolder ? parentFolder.path : null;
-
- const tree = decorateData({
- projectId,
- branchId,
- id: folderPath,
- name: folderName,
- path: folderPath,
- url: `/${projectId}/tree/${branchId}/-/${folderPath}/`,
- type: 'tree',
- parentTreeUrl: parentFolder ? parentFolder.url : `/${projectId}/tree/${branchId}/`,
- tempFile,
- changed: tempFile,
- opened: tempFile,
- parentPath,
- });
-
- Object.assign(acc, {
- [folderPath]: tree,
- });
-
- if (parentFolder) {
- parentFolder.tree.push(tree);
- } else {
- treeList.push(tree);
- }
-
- pathAcc.push(tree.path);
- } else {
- pathAcc.push(foundEntry.path);
- }
-
- return pathAcc;
- }, []);
- }
-
- if (blobName !== '') {
- const fileFolder = acc[pathSplit.join('/')];
- parentPath = fileFolder ? fileFolder.path : null;
-
- file = decorateData({
- projectId,
- branchId,
- id: path,
- name: blobName,
- path,
- url: `/${projectId}/blob/${branchId}/-/${path}`,
- type: 'blob',
- parentTreeUrl: fileFolder ? fileFolder.url : `/${projectId}/blob/${branchId}`,
- tempFile,
- changed: tempFile,
- content,
- base64,
- previewMode: viewerInformationForPath(blobName),
- parentPath,
- });
-
- Object.assign(acc, {
- [path]: file,
- });
-
- if (fileFolder) {
- fileFolder.tree.push(file);
- } else {
- treeList.push(file);
- }
- }
-
- return acc;
- }, {});
-
- // eslint-disable-next-line no-restricted-globals
- self.postMessage({
- entries,
- treeList: sortTree(treeList),
- file,
- parentPath,
- });
-});
diff --git a/app/assets/javascripts/import_projects/index.js b/app/assets/javascripts/import_projects/index.js
index 5c77484aee1..2d99d716609 100644
--- a/app/assets/javascripts/import_projects/index.js
+++ b/app/assets/javascripts/import_projects/index.js
@@ -3,7 +3,7 @@ import { mapActions } from 'vuex';
import Translate from '../vue_shared/translate';
import ImportProjectsTable from './components/import_projects_table.vue';
import { parseBoolean } from '../lib/utils/common_utils';
-import store from './store';
+import createStore from './store';
Vue.use(Translate);
@@ -20,6 +20,7 @@ export default function mountImportProjectsTable(mountElement) {
ciCdOnly,
} = mountElement.dataset;
+ const store = createStore();
return new Vue({
el: mountElement,
store,
diff --git a/app/assets/javascripts/import_projects/store/index.js b/app/assets/javascripts/import_projects/store/index.js
index 6ac9bfd8189..f666e2ebf33 100644
--- a/app/assets/javascripts/import_projects/store/index.js
+++ b/app/assets/javascripts/import_projects/store/index.js
@@ -7,9 +7,10 @@ import mutations from './mutations';
Vue.use(Vuex);
-export default new Vuex.Store({
- state: state(),
- actions,
- mutations,
- getters,
-});
+export default () =>
+ new Vuex.Store({
+ state: state(),
+ actions,
+ mutations,
+ getters,
+ });
diff --git a/app/assets/javascripts/jobs/components/job_app.vue b/app/assets/javascripts/jobs/components/job_app.vue
index d473d6a482d..dbadd224251 100644
--- a/app/assets/javascripts/jobs/components/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job_app.vue
@@ -34,6 +34,7 @@ export default {
StuckBlock,
Sidebar,
GlLoadingIcon,
+ SharedRunner: () => import('ee_component/jobs/components/shared_runner_limit_block.vue'),
},
mixins: [delayedJobMixin],
props: {
@@ -84,6 +85,7 @@ export default {
'shouldRenderCalloutMessage',
'shouldRenderTriggeredLabel',
'hasEnvironment',
+ 'shouldRenderSharedRunnerLimitWarning',
'hasTrace',
'emptyStateIllustration',
'isScrollingDown',
@@ -221,6 +223,14 @@ export default {
:runners-path="runnerSettingsUrl"
/>
+ <shared-runner
+ v-if="shouldRenderSharedRunnerLimitWarning"
+ class="js-shared-runner-limit"
+ :quota-used="job.runners.quota.used"
+ :quota-limit="job.runners.quota.limit"
+ :runners-path="runnerHelpUrl"
+ />
+
<environments-block
v-if="hasEnvironment"
class="js-job-environment"
diff --git a/app/assets/javascripts/jobs/store/getters.js b/app/assets/javascripts/jobs/store/getters.js
index 98911717381..73c1cbc3a99 100644
--- a/app/assets/javascripts/jobs/store/getters.js
+++ b/app/assets/javascripts/jobs/store/getters.js
@@ -28,6 +28,17 @@ export const emptyStateIllustration = state =>
export const emptyStateAction = state =>
(state.job && state.job.status && state.job.status.action) || null;
+/**
+ * Shared runners limit is only rendered when
+ * used quota is bigger or equal than the limit
+ *
+ * @returns {Boolean}
+ */
+export const shouldRenderSharedRunnerLimitWarning = state =>
+ !_.isEmpty(state.job.runners) &&
+ !_.isEmpty(state.job.runners.quota) &&
+ state.job.runners.quota.used >= state.job.runners.quota.limit;
+
export const isScrollingDown = state => isScrolledToBottom() && !state.isTraceComplete;
export const hasRunnersForProject = state =>
diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js
index f7a611fbca0..cca4927c115 100644
--- a/app/assets/javascripts/labels_select.js
+++ b/app/assets/javascripts/labels_select.js
@@ -199,8 +199,8 @@ export default class LabelsSelect {
.catch(() => flash(__('Error fetching labels.')));
},
renderRow: function(label, instance) {
- var $a,
- $li,
+ var linkEl,
+ listItemEl,
color,
colorEl,
indeterminate,
@@ -209,12 +209,11 @@ export default class LabelsSelect {
spacing,
i,
marked,
- dropdownName,
dropdownValue;
- $li = $('<li>');
- $a = $('<a href="#">');
+
selectedClass = [];
removesAll = label.id <= 0 || label.id == null;
+
if ($dropdown.hasClass('js-filter-bulk-update')) {
indeterminate = $dropdown.data('indeterminate') || [];
marked = $dropdown.data('marked') || [];
@@ -233,7 +232,6 @@ export default class LabelsSelect {
}
} else {
if (this.id(label)) {
- dropdownName = $dropdown.data('fieldName');
dropdownValue = this.id(label)
.toString()
.replace(/'/g, "\\'");
@@ -241,7 +239,7 @@ export default class LabelsSelect {
if (
$form.find(
"input[type='hidden'][name='" +
- dropdownName +
+ this.fieldName +
"'][value='" +
dropdownValue +
"']",
@@ -251,24 +249,34 @@ export default class LabelsSelect {
}
}
- if ($dropdown.hasClass('js-multiselect') && removesAll) {
+ if (this.multiSelect && removesAll) {
selectedClass.push('dropdown-clear-active');
}
}
+
if (label.color) {
colorEl =
"<span class='dropdown-label-box' style='background: " + label.color + "'></span>";
} else {
colorEl = '';
}
+
+ linkEl = document.createElement('a');
+ linkEl.href = '#';
+
// We need to identify which items are actually labels
if (label.id) {
selectedClass.push('label-item');
- $a.attr('data-label-id', label.id);
+ linkEl.dataset.labelId = label.id;
}
- $a.addClass(selectedClass.join(' ')).html(`${colorEl} ${_.escape(label.title)}`);
- // Return generated html
- return $li.html($a).prop('outerHTML');
+
+ linkEl.className = selectedClass.join(' ');
+ linkEl.innerHTML = `${colorEl} ${_.escape(label.title)}`;
+
+ listItemEl = document.createElement('li');
+ listItemEl.appendChild(linkEl);
+
+ return listItemEl;
},
search: {
fields: ['title'],
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index a73cdb73690..1af6b63efc9 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -708,6 +708,14 @@ export const NavigationType = {
TYPE_RESERVED: 255,
};
+/**
+ * Returns the value of `gon.ee`
+ * Used to check if it's the EE codebase or the CE one.
+ *
+ * @returns Boolean
+ */
+export const isEE = () => window.gon && window.gon.ee;
+
window.gl = window.gl || {};
window.gl.utils = {
...(window.gl.utils || {}),
diff --git a/app/assets/javascripts/lib/utils/http_status.js b/app/assets/javascripts/lib/utils/http_status.js
index 14c02218990..37ad1676f7a 100644
--- a/app/assets/javascripts/lib/utils/http_status.js
+++ b/app/assets/javascripts/lib/utils/http_status.js
@@ -16,6 +16,7 @@ const httpStatusCodes = {
IM_USED: 226,
MULTIPLE_CHOICES: 300,
BAD_REQUEST: 400,
+ UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
UNPROCESSABLE_ENTITY: 422,
diff --git a/app/assets/javascripts/lib/utils/number_utils.js b/app/assets/javascripts/lib/utils/number_utils.js
index 2ccc51c35f7..19c4de6083d 100644
--- a/app/assets/javascripts/lib/utils/number_utils.js
+++ b/app/assets/javascripts/lib/utils/number_utils.js
@@ -80,3 +80,22 @@ export function numberToHumanSize(size) {
}
return `${bytesToGiB(size).toFixed(2)} GiB`;
}
+
+/**
+ * A simple method that returns the value of a + b
+ * It seems unessesary, but when combined with a reducer it
+ * adds up all the values in an array.
+ *
+ * e.g. `[1, 2, 3, 4, 5].reduce(sum) // => 15`
+ *
+ * @param {Float} a
+ * @param {Float} b
+ * @example
+ * // return 15
+ * [1, 2, 3, 4, 5].reduce(sum);
+ *
+ * // returns 6
+ * Object.values([{a: 1, b: 2, c: 3].reduce(sum);
+ * @returns {Float} The summed value
+ */
+export const sum = (a = 0, b = 0) => a + b;
diff --git a/app/assets/javascripts/members.js b/app/assets/javascripts/members.js
index bd263c75a3d..af2697444f2 100644
--- a/app/assets/javascripts/members.js
+++ b/app/assets/javascripts/members.js
@@ -16,25 +16,33 @@ export default class Members {
gl.utils.disableButtonIfEmptyField('#user_ids', 'input[name=commit]', 'change');
}
+ dropdownClicked(options) {
+ 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);
$btn.glDropdown({
selectable: true,
- isSelectable(selected, $el) {
- return !$el.hasClass('is-active');
- },
+ isSelectable: (selected, $el) => this.dropdownIsSelectable(selected, $el),
fieldName: $btn.data('fieldName'),
id(selected, $el) {
return $el.data('id');
},
- toggleLabel(selected, $el) {
- return $el.text();
- },
- clicked: options => {
- this.formSubmit(null, options.$el);
- },
+ toggleLabel: (selected, $el) => this.dropdownToggleLabel(selected, $el, $btn),
+ clicked: options => this.dropdownClicked(options),
});
});
}
@@ -55,6 +63,7 @@ export default class Members {
$toggle.enable();
$dateInput.enable();
}
+
// eslint-disable-next-line class-methods-use-this
getMemberListItems($el) {
const $memberListItem = $el.is('.member') ? $el : $(`#${$el.data('elId')}`);
diff --git a/app/assets/javascripts/monitoring/components/charts/area.vue b/app/assets/javascripts/monitoring/components/charts/area.vue
index 9e031b03579..41783d311ef 100644
--- a/app/assets/javascripts/monitoring/components/charts/area.vue
+++ b/app/assets/javascripts/monitoring/components/charts/area.vue
@@ -4,6 +4,7 @@ import dateFormat from 'dateformat';
import { debounceByAnimationFrame } from '~/lib/utils/common_utils';
import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
import Icon from '~/vue_shared/components/icon.vue';
+import { chartHeight, graphTypes, lineTypes } from '../../constants';
let debouncedResize;
@@ -19,7 +20,6 @@ export default {
required: true,
validator(data) {
return (
- data.queries &&
Array.isArray(data.queries) &&
data.queries.filter(query => {
if (Array.isArray(query.result)) {
@@ -51,21 +51,44 @@ export default {
return {
tooltip: {
title: '',
- content: '',
+ content: [],
isDeployment: false,
sha: '',
},
width: 0,
- height: 0,
- scatterSymbol: undefined,
+ height: chartHeight,
+ svgs: {},
+ primaryColor: null,
};
},
computed: {
chartData() {
- return this.graphData.queries.reduce((accumulator, query) => {
- accumulator[query.unit] = query.result.reduce((acc, res) => acc.concat(res.values), []);
- return accumulator;
- }, {});
+ return this.graphData.queries.map(query => {
+ const { appearance } = query;
+ const lineType =
+ appearance && appearance.line && appearance.line.type
+ ? appearance.line.type
+ : lineTypes.default;
+ const lineColor = lineType === lineTypes.threshold ? this.primaryColor : undefined;
+
+ return {
+ name: this.formatLegendLabel(query),
+ data: this.concatenateResults(query.result),
+ lineStyle: {
+ type: lineType,
+ color: lineColor,
+ },
+ itemStyle: {
+ color: lineColor,
+ },
+ areaStyle: {
+ opacity:
+ appearance && appearance.area && typeof appearance.area.opacity === 'number'
+ ? appearance.area.opacity
+ : undefined,
+ },
+ };
+ });
},
chartOptions() {
return {
@@ -78,28 +101,25 @@ export default {
axisPointer: {
snap: true,
},
- nameTextStyle: {
- padding: [18, 0, 0, 0],
- },
},
yAxis: {
name: this.yAxisLabel,
axisLabel: {
formatter: value => value.toFixed(3),
},
- nameTextStyle: {
- padding: [0, 0, 36, 0],
- },
- },
- legend: {
- formatter: this.xAxisLabel,
},
series: this.scatterSeries,
+ dataZoom: this.dataZoomConfig,
};
},
+ dataZoomConfig() {
+ const handleIcon = this.svgs['scroll-handle'];
+
+ return handleIcon ? { handleIcon } : {};
+ },
earliestDatapoint() {
- return Object.values(this.chartData).reduce((acc, data) => {
- const [[timestamp]] = data.sort(([a], [b]) => {
+ return this.chartData.reduce((acc, series) => {
+ const [[timestamp]] = series.data.sort(([a], [b]) => {
if (a < b) {
return -1;
}
@@ -129,15 +149,15 @@ export default {
},
scatterSeries() {
return {
- type: 'scatter',
+ type: graphTypes.deploymentData,
data: this.recentDeployments.map(deployment => [deployment.createdAt, 0]),
- symbol: this.scatterSymbol,
+ symbol: this.svgs.rocket,
symbolSize: 14,
+ itemStyle: {
+ color: this.primaryColor,
+ },
};
},
- xAxisLabel() {
- return this.graphData.queries.map(query => query.label).join(', ');
- },
yAxisLabel() {
return `${this.graphData.y_label}`;
},
@@ -151,35 +171,54 @@ export default {
created() {
debouncedResize = debounceByAnimationFrame(this.onResize);
window.addEventListener('resize', debouncedResize);
- this.getScatterSymbol();
+ this.setSvg('rocket');
+ this.setSvg('scroll-handle');
},
methods: {
+ concatenateResults(results) {
+ return results.reduce((acc, result) => acc.concat(result.values), []);
+ },
+ formatLegendLabel(query) {
+ return `${query.label}`;
+ },
formatTooltipText(params) {
- const [seriesData] = params.seriesData;
- this.tooltip.isDeployment = seriesData.componentSubType === 'scatter';
this.tooltip.title = dateFormat(params.value, 'dd mmm yyyy, h:MMTT');
- if (this.tooltip.isDeployment) {
- const [deploy] = this.recentDeployments.filter(
- deployment => deployment.createdAt === seriesData.value[0],
- );
- this.tooltip.sha = deploy.sha.substring(0, 8);
- } else {
- this.tooltip.content = `${this.yAxisLabel} ${seriesData.value[1].toFixed(3)}`;
- }
+ this.tooltip.content = [];
+ params.seriesData.forEach(seriesData => {
+ if (seriesData.componentSubType === graphTypes.deploymentData) {
+ this.tooltip.isDeployment = true;
+ const [deploy] = this.recentDeployments.filter(
+ deployment => deployment.createdAt === seriesData.value[0],
+ );
+ this.tooltip.sha = deploy.sha.substring(0, 8);
+ } else {
+ const { seriesName } = seriesData;
+ // seriesData.value contains the chart's [x, y] value pair
+ // seriesData.value[1] is threfore the chart y value
+ const value = seriesData.value[1].toFixed(3);
+
+ this.tooltip.content.push({
+ name: seriesName,
+ value,
+ });
+ }
+ });
},
- getScatterSymbol() {
- getSvgIconPathContent('rocket')
+ setSvg(name) {
+ getSvgIconPathContent(name)
.then(path => {
if (path) {
- this.scatterSymbol = `path://${path}`;
+ this.$set(this.svgs, name, `path://${path}`);
}
})
.catch(() => {});
},
+ onChartUpdated(chart) {
+ [this.primaryColor] = chart.getOption().color;
+ },
onResize() {
- const { width, height } = this.$refs.areaChart.$el.getBoundingClientRect();
+ const { width } = this.$refs.areaChart.$el.getBoundingClientRect();
this.width = width;
- this.height = height;
},
},
};
@@ -200,6 +239,7 @@ export default {
:thresholds="alertData"
:width="width"
:height="height"
+ @updated="onChartUpdated"
>
<template slot="tooltipTitle">
<div v-if="tooltip.isDeployment">
@@ -213,7 +253,13 @@ export default {
{{ tooltip.sha }}
</div>
<template v-else>
- {{ tooltip.content }}
+ <div
+ v-for="(content, key) in tooltip.content"
+ :key="key"
+ class="d-flex justify-content-between"
+ >
+ {{ content.name }} {{ content.value }}
+ </div>
</template>
</template>
</gl-area-chart>
diff --git a/app/assets/javascripts/monitoring/constants.js b/app/assets/javascripts/monitoring/constants.js
new file mode 100644
index 00000000000..869173b6572
--- /dev/null
+++ b/app/assets/javascripts/monitoring/constants.js
@@ -0,0 +1,10 @@
+export const chartHeight = 300;
+
+export const graphTypes = {
+ deploymentData: 'scatter',
+};
+
+export const lineTypes = {
+ default: 'solid',
+ threshold: 'dashed',
+};
diff --git a/app/assets/javascripts/mr_notes/index.js b/app/assets/javascripts/mr_notes/index.js
index 9e99aa4f724..8eccba07c38 100644
--- a/app/assets/javascripts/mr_notes/index.js
+++ b/app/assets/javascripts/mr_notes/index.js
@@ -1,11 +1,9 @@
-import $ from 'jquery';
import Vue from 'vue';
-import { mapActions, mapState, mapGetters } from 'vuex';
+import store from 'ee_else_ce/mr_notes/stores';
+import initNotesApp from './init_notes';
import initDiffsApp from '../diffs';
-import notesApp from '../notes/components/notes_app.vue';
import discussionCounter from '../notes/components/discussion_counter.vue';
import initDiscussionFilters from '../notes/discussion_filters';
-import store from './stores';
import MergeRequest from '../merge_request';
import { resetServiceWorkersPublicPath } from '../lib/utils/webpack';
@@ -18,68 +16,7 @@ export default function initMrNotes() {
action: mrShowNode.dataset.mrAction,
});
- // eslint-disable-next-line no-new
- new Vue({
- el: '#js-vue-mr-discussions',
- name: 'MergeRequestDiscussions',
- components: {
- notesApp,
- },
- store,
- data() {
- const notesDataset = document.getElementById('js-vue-mr-discussions').dataset;
- const noteableData = JSON.parse(notesDataset.noteableData);
- noteableData.noteableType = notesDataset.noteableType;
- noteableData.targetType = notesDataset.targetType;
-
- return {
- noteableData,
- currentUserData: JSON.parse(notesDataset.currentUserData),
- notesData: JSON.parse(notesDataset.notesData),
- helpPagePath: notesDataset.helpPagePath,
- };
- },
- computed: {
- ...mapGetters(['discussionTabCounter']),
- ...mapState({
- activeTab: state => state.page.activeTab,
- }),
- },
- watch: {
- discussionTabCounter() {
- this.updateDiscussionTabCounter();
- },
- },
- created() {
- this.setActiveTab(window.mrTabs.getCurrentAction());
- },
- mounted() {
- this.notesCountBadge = $('.issuable-details').find('.notes-tab .badge');
- $(document).on('visibilitychange', this.updateDiscussionTabCounter);
- window.mrTabs.eventHub.$on('MergeRequestTabChange', this.setActiveTab);
- },
- beforeDestroy() {
- $(document).off('visibilitychange', this.updateDiscussionTabCounter);
- window.mrTabs.eventHub.$off('MergeRequestTabChange', this.setActiveTab);
- },
- methods: {
- ...mapActions(['setActiveTab']),
- updateDiscussionTabCounter() {
- this.notesCountBadge.text(this.discussionTabCounter);
- },
- },
- render(createElement) {
- return createElement('notes-app', {
- props: {
- noteableData: this.noteableData,
- notesData: this.notesData,
- userData: this.currentUserData,
- shouldShow: this.activeTab === 'show',
- helpPagePath: this.helpPagePath,
- },
- });
- },
- });
+ initNotesApp();
// eslint-disable-next-line no-new
new Vue({
diff --git a/app/assets/javascripts/mr_notes/init_notes.js b/app/assets/javascripts/mr_notes/init_notes.js
new file mode 100644
index 00000000000..842a209a545
--- /dev/null
+++ b/app/assets/javascripts/mr_notes/init_notes.js
@@ -0,0 +1,70 @@
+import $ from 'jquery';
+import Vue from 'vue';
+import { mapActions, mapState, mapGetters } from 'vuex';
+import store from 'ee_else_ce/mr_notes/stores';
+import notesApp from '../notes/components/notes_app.vue';
+
+export default () => {
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: '#js-vue-mr-discussions',
+ name: 'MergeRequestDiscussions',
+ components: {
+ notesApp,
+ },
+ store,
+ data() {
+ const notesDataset = document.getElementById('js-vue-mr-discussions').dataset;
+ const noteableData = JSON.parse(notesDataset.noteableData);
+ noteableData.noteableType = notesDataset.noteableType;
+ noteableData.targetType = notesDataset.targetType;
+
+ return {
+ noteableData,
+ currentUserData: JSON.parse(notesDataset.currentUserData),
+ notesData: JSON.parse(notesDataset.notesData),
+ helpPagePath: notesDataset.helpPagePath,
+ };
+ },
+ computed: {
+ ...mapGetters(['discussionTabCounter']),
+ ...mapState({
+ activeTab: state => state.page.activeTab,
+ }),
+ },
+ watch: {
+ discussionTabCounter() {
+ this.updateDiscussionTabCounter();
+ },
+ },
+ created() {
+ this.setActiveTab(window.mrTabs.getCurrentAction());
+ },
+ mounted() {
+ this.notesCountBadge = $('.issuable-details').find('.notes-tab .badge');
+ $(document).on('visibilitychange', this.updateDiscussionTabCounter);
+ window.mrTabs.eventHub.$on('MergeRequestTabChange', this.setActiveTab);
+ },
+ beforeDestroy() {
+ $(document).off('visibilitychange', this.updateDiscussionTabCounter);
+ window.mrTabs.eventHub.$off('MergeRequestTabChange', this.setActiveTab);
+ },
+ methods: {
+ ...mapActions(['setActiveTab']),
+ updateDiscussionTabCounter() {
+ this.notesCountBadge.text(this.discussionTabCounter);
+ },
+ },
+ render(createElement) {
+ return createElement('notes-app', {
+ props: {
+ noteableData: this.noteableData,
+ notesData: this.notesData,
+ userData: this.currentUserData,
+ shouldShow: this.activeTab === 'show',
+ helpPagePath: this.helpPagePath,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 7b39901024d..68b753a4abf 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -69,7 +69,7 @@ export default {
type="button"
@click="handleToggle"
>
- <i :class="toggleChevronClass" class="fa" aria-hidden="true"> </i>
+ <i :class="toggleChevronClass" class="fa" aria-hidden="true"></i>
{{ __('Toggle discussion') }}
</button>
</div>
@@ -81,19 +81,18 @@ export default {
:data-user-id="author.id"
:data-username="author.username"
>
+ <slot name="note-header-info"></slot>
<span class="note-header-author-name">{{ author.name }}</span>
<span v-if="author.status_tooltip_html" v-html="author.status_tooltip_html"></span>
- <span class="note-headline-light"> @{{ author.username }} </span>
+ <span class="note-headline-light">@{{ author.username }}</span>
</a>
- <span v-else> {{ __('A deleted user') }} </span>
+ <span v-else>{{ __('A deleted user') }}</span>
<span class="note-headline-light">
<span class="note-headline-meta">
<span class="system-note-message"> <slot></slot> </span>
<template v-if="createdAt">
<span class="system-note-separator">
- <template v-if="actionText">
- {{ actionText }}
- </template>
+ <template v-if="actionText">{{ actionText }}</template>
</span>
<a
:href="noteTimestampLink"
@@ -107,8 +106,7 @@ export default {
class="fa fa-spinner fa-spin editing-spinner"
aria-label="Comment is being updated"
aria-hidden="true"
- >
- </i>
+ ></i>
</span>
</span>
</div>
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 3894dc8c677..fc51998935d 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -6,6 +6,7 @@ import { truncateSha } from '~/lib/utils/text_utility';
import { s__, __, sprintf } from '~/locale';
import systemNote from '~/vue_shared/components/notes/system_note.vue';
import icon from '~/vue_shared/components/icon.vue';
+import diffLineNoteFormMixin from 'ee_else_ce/notes/mixins/diff_line_note_form';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import Flash from '../../flash';
import { SYSTEM_NOTE } from '../constants';
@@ -47,12 +48,13 @@ export default {
placeholderSystemNote,
ResolveWithIssueButton,
systemNote,
+ DraftNote: () => import('ee_component/batch_comments/components/draft_note.vue'),
TimelineEntryItem,
},
directives: {
GlTooltip: GlTooltipDirective,
},
- mixins: [autosave, noteable, resolvable, discussionNavigation],
+ mixins: [autosave, noteable, resolvable, discussionNavigation, diffLineNoteFormMixin],
props: {
discussion: {
type: Object,
@@ -510,6 +512,7 @@ Please check your network connection and try again.`;
:is-editing="false"
:line="diffLine"
save-button-title="Comment"
+ @handleFormUpdateAddToReview="addReplyToReview"
@handleFormUpdate="saveReply"
@cancelForm="cancelReplyForm"
/>
diff --git a/app/assets/javascripts/notes/mixins/diff_line_note_form.js b/app/assets/javascripts/notes/mixins/diff_line_note_form.js
new file mode 100644
index 00000000000..188556e8921
--- /dev/null
+++ b/app/assets/javascripts/notes/mixins/diff_line_note_form.js
@@ -0,0 +1,10 @@
+export default {
+ computed: {
+ draftForDiscussion: () => () => ({}),
+ },
+ methods: {
+ showDraft: () => false,
+ addReplyToReview: () => {},
+ addToReview: () => {},
+ },
+};
diff --git a/app/assets/javascripts/notes/mixins/resolvable.js b/app/assets/javascripts/notes/mixins/resolvable.js
index 8edf3d088bb..2329727bca2 100644
--- a/app/assets/javascripts/notes/mixins/resolvable.js
+++ b/app/assets/javascripts/notes/mixins/resolvable.js
@@ -31,6 +31,10 @@ export default {
},
methods: {
resolveHandler(resolvedState = false) {
+ if (this.note && this.note.isDraft) {
+ return this.$emit('toggleResolveStatus');
+ }
+
this.isResolving = true;
const isResolved = this.discussionResolved || resolvedState;
const discussion = this.resolveAsThread;
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index 5026c13dab5..fcc8889b0c7 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -191,6 +191,9 @@ export const firstUnresolvedDiscussionId = (state, getters) => diffOrder => {
return getters.unresolvedDiscussionsIdsByDate[0];
};
+export const getDiscussion = state => discussionId =>
+ state.discussions.find(discussion => discussion.id === discussionId);
+
export const commentsDisabled = state => state.commentsDisabled;
// prevent babel-plugin-rewire from generating an invalid default during karma tests
diff --git a/app/assets/javascripts/notes/stores/mutations.js b/app/assets/javascripts/notes/stores/mutations.js
index ae6f8b7790a..fa44ef2d057 100644
--- a/app/assets/javascripts/notes/stores/mutations.js
+++ b/app/assets/javascripts/notes/stores/mutations.js
@@ -193,6 +193,10 @@ export default {
const noteObj = utils.findNoteObjectById(state.discussions, note.discussion_id);
if (noteObj.individual_note) {
+ if (note.type === constants.DISCUSSION_NOTE) {
+ noteObj.individual_note = false;
+ }
+
noteObj.notes.splice(0, 1, note);
} else {
const comment = utils.findNoteObjectById(noteObj.notes, note.id);
diff --git a/app/assets/javascripts/pages/groups/clusters/index/index.js b/app/assets/javascripts/pages/groups/clusters/index/index.js
index 21efc4f6d00..30d519d0e37 100644
--- a/app/assets/javascripts/pages/groups/clusters/index/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/index/index.js
@@ -2,6 +2,5 @@ import PersistentUserCallout from '~/persistent_user_callout';
document.addEventListener('DOMContentLoaded', () => {
const callout = document.querySelector('.gcp-signup-offer');
-
- if (callout) new PersistentUserCallout(callout); // eslint-disable-line no-new
+ PersistentUserCallout.factory(callout);
});
diff --git a/app/assets/javascripts/pages/groups/group_members/index/index.js b/app/assets/javascripts/pages/groups/group_members/index/index.js
index c22a164cd4e..e4f4c3b574e 100644
--- a/app/assets/javascripts/pages/groups/group_members/index/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index/index.js
@@ -1,7 +1,7 @@
/* eslint-disable no-new */
import memberExpirationDate from '~/member_expiration_date';
-import Members from '~/members';
+import Members from 'ee_else_ce/members';
import UsersSelect from '~/users_select';
document.addEventListener('DOMContentLoaded', () => {
diff --git a/app/assets/javascripts/pages/groups/index.js b/app/assets/javascripts/pages/groups/index.js
index a63a0dbc6b1..451be6497de 100644
--- a/app/assets/javascripts/pages/groups/index.js
+++ b/app/assets/javascripts/pages/groups/index.js
@@ -3,8 +3,7 @@ import initGkeDropdowns from '~/projects/gke_cluster_dropdowns';
function initGcpSignupCallout() {
const callout = document.querySelector('.gcp-signup-offer');
-
- if (callout) new PersistentUserCallout(callout); // eslint-disable-line no-new
+ PersistentUserCallout.factory(callout);
}
document.addEventListener('DOMContentLoaded', () => {
diff --git a/app/assets/javascripts/pages/profiles/show/index.js b/app/assets/javascripts/pages/profiles/show/index.js
index 0dd0d5336fc..c9d3bbc8c39 100644
--- a/app/assets/javascripts/pages/profiles/show/index.js
+++ b/app/assets/javascripts/pages/profiles/show/index.js
@@ -56,30 +56,34 @@ document.addEventListener('DOMContentLoaded', () => {
import(/* webpackChunkName: 'emoji' */ '~/emoji')
.then(Emoji => {
- const emojiMenu = new EmojiMenu(
- Emoji,
- toggleEmojiMenuButtonSelector,
- 'js-status-emoji-menu',
- selectEmojiCallback,
- );
- emojiMenu.bindEvents();
+ Emoji.initEmojiMap()
+ .then(() => {
+ const emojiMenu = new EmojiMenu(
+ Emoji,
+ toggleEmojiMenuButtonSelector,
+ 'js-status-emoji-menu',
+ selectEmojiCallback,
+ );
+ emojiMenu.bindEvents();
- const defaultEmojiTag = Emoji.glEmojiTag(defaultStatusEmoji);
- statusMessageField.addEventListener('input', () => {
- const hasStatusMessage = statusMessageField.value.trim() !== '';
- const statusEmoji = findStatusEmoji();
- if (hasStatusMessage && statusEmoji) {
- return;
- }
+ const defaultEmojiTag = Emoji.glEmojiTag(defaultStatusEmoji);
+ statusMessageField.addEventListener('input', () => {
+ const hasStatusMessage = statusMessageField.value.trim() !== '';
+ const statusEmoji = findStatusEmoji();
+ if (hasStatusMessage && statusEmoji) {
+ return;
+ }
- if (hasStatusMessage) {
- toggleNoEmojiPlaceholder(false);
- toggleEmojiMenuButton.innerHTML += defaultEmojiTag;
- } else if (statusEmoji.dataset.name === defaultStatusEmoji) {
- toggleNoEmojiPlaceholder(true);
- removeStatusEmoji();
- }
- });
+ if (hasStatusMessage) {
+ toggleNoEmojiPlaceholder(false);
+ toggleEmojiMenuButton.innerHTML += defaultEmojiTag;
+ } else if (statusEmoji.dataset.name === defaultStatusEmoji) {
+ toggleNoEmojiPlaceholder(true);
+ removeStatusEmoji();
+ }
+ });
+ })
+ .catch(() => createFlash('Failed to load emoji list.'));
})
.catch(() => createFlash('Failed to load emoji list.'));
});
diff --git a/app/assets/javascripts/pages/projects/clusters/index/index.js b/app/assets/javascripts/pages/projects/clusters/index/index.js
index 21efc4f6d00..30d519d0e37 100644
--- a/app/assets/javascripts/pages/projects/clusters/index/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/index/index.js
@@ -2,6 +2,5 @@ import PersistentUserCallout from '~/persistent_user_callout';
document.addEventListener('DOMContentLoaded', () => {
const callout = document.querySelector('.gcp-signup-offer');
-
- if (callout) new PersistentUserCallout(callout); // eslint-disable-line no-new
+ PersistentUserCallout.factory(callout);
});
diff --git a/app/assets/javascripts/pages/projects/index.js b/app/assets/javascripts/pages/projects/index.js
index b0345b4e50d..d4bd02c14e9 100644
--- a/app/assets/javascripts/pages/projects/index.js
+++ b/app/assets/javascripts/pages/projects/index.js
@@ -13,7 +13,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (newClusterViews.indexOf(page) > -1) {
const callout = document.querySelector('.gcp-signup-offer');
- if (callout) new PersistentUserCallout(callout); // eslint-disable-line no-new
+ PersistentUserCallout.factory(callout);
initGkeDropdowns();
}
diff --git a/app/assets/javascripts/pages/projects/issues/edit/index.js b/app/assets/javascripts/pages/projects/issues/edit/index.js
index ffc84dc106b..aecc6484b26 100644
--- a/app/assets/javascripts/pages/projects/issues/edit/index.js
+++ b/app/assets/javascripts/pages/projects/issues/edit/index.js
@@ -1,3 +1,3 @@
-import initForm from '../form';
+import initForm from 'ee_else_ce/pages/projects/issues/form';
document.addEventListener('DOMContentLoaded', initForm);
diff --git a/app/assets/javascripts/pages/projects/issues/form.js b/app/assets/javascripts/pages/projects/issues/form.js
index f99023ad8e7..941c4552579 100644
--- a/app/assets/javascripts/pages/projects/issues/form.js
+++ b/app/assets/javascripts/pages/projects/issues/form.js
@@ -2,7 +2,7 @@
import $ from 'jquery';
import GLForm from '~/gl_form';
-import IssuableForm from '~/issuable_form';
+import IssuableForm from 'ee_else_ce/issuable_form';
import LabelsSelect from '~/labels_select';
import MilestoneSelect from '~/milestone_select';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
diff --git a/app/assets/javascripts/pages/projects/issues/new/index.js b/app/assets/javascripts/pages/projects/issues/new/index.js
index ffc84dc106b..aecc6484b26 100644
--- a/app/assets/javascripts/pages/projects/issues/new/index.js
+++ b/app/assets/javascripts/pages/projects/issues/new/index.js
@@ -1,3 +1,3 @@
-import initForm from '../form';
+import initForm from 'ee_else_ce/pages/projects/issues/form';
document.addEventListener('DOMContentLoaded', initForm);
diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
index e3971618da5..8f0dc8554e2 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request.js
@@ -4,7 +4,7 @@ import $ from 'jquery';
import Diff from '~/diff';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import GLForm from '~/gl_form';
-import IssuableForm from '~/issuable_form';
+import IssuableForm from 'ee_else_ce/issuable_form';
import LabelsSelect from '~/labels_select';
import MilestoneSelect from '~/milestone_select';
import IssuableTemplateSelectors from '~/templates/issuable_template_selectors';
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index adbe744290a..f39765818e7 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -1,7 +1,7 @@
+import Members from 'ee_else_ce/members';
import memberExpirationDate from '../../../member_expiration_date';
import UsersSelect from '../../../users_select';
import groupsSelect from '../../../groups_select';
-import Members from '../../../members';
document.addEventListener('DOMContentLoaded', () => {
memberExpirationDate('.js-access-expiration-date-groups');
diff --git a/app/assets/javascripts/pages/projects/settings/operations/show/index.js b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
new file mode 100644
index 00000000000..73c745179be
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
@@ -0,0 +1,5 @@
+import mountErrorTrackingForm from '~/error_tracking_settings';
+
+document.addEventListener('DOMContentLoaded', () => {
+ mountErrorTrackingForm();
+});
diff --git a/app/assets/javascripts/pages/users/activity_calendar.js b/app/assets/javascripts/pages/users/activity_calendar.js
index afa099d0e0b..61204c37307 100644
--- a/app/assets/javascripts/pages/users/activity_calendar.js
+++ b/app/assets/javascripts/pages/users/activity_calendar.js
@@ -10,6 +10,12 @@ import { __ } from '~/locale';
const d3 = { select, scaleLinear, scaleThreshold };
+const firstDayOfWeekChoices = Object.freeze({
+ sunday: 0,
+ monday: 1,
+ saturday: 6,
+});
+
const LOADING_HTML = `
<div class="text-center">
<i class="fa fa-spinner fa-spin user-calendar-activities-loading"></i>
@@ -49,7 +55,7 @@ export default class ActivityCalendar {
timestamps,
calendarActivitiesPath,
utcOffset = 0,
- firstDayOfWeek = 0,
+ firstDayOfWeek = firstDayOfWeekChoices.sunday,
monthsAgo = 12,
) {
this.calendarActivitiesPath = calendarActivitiesPath;
@@ -206,11 +212,16 @@ export default class ActivityCalendar {
},
];
- if (this.firstDayOfWeek === 1) {
+ if (this.firstDayOfWeek === firstDayOfWeekChoices.monday) {
days.push({
text: 'S',
y: 29 + this.dayYPos(7),
});
+ } else if (this.firstDayOfWeek === firstDayOfWeekChoices.saturday) {
+ days.push({
+ text: 'S',
+ y: 29 + this.dayYPos(6),
+ });
}
this.svg
diff --git a/app/assets/javascripts/persistent_user_callout.js b/app/assets/javascripts/persistent_user_callout.js
index 1e34e74a152..4a08e158f6b 100644
--- a/app/assets/javascripts/persistent_user_callout.js
+++ b/app/assets/javascripts/persistent_user_callout.js
@@ -31,4 +31,12 @@ export default class PersistentUserCallout {
Flash(__('An error occurred while dismissing the alert. Refresh the page and try again.'));
});
}
+
+ static factory(container) {
+ if (!container) {
+ return undefined;
+ }
+
+ return new PersistentUserCallout(container);
+ }
}
diff --git a/app/assets/javascripts/pipelines/mixins/pipelines.js b/app/assets/javascripts/pipelines/mixins/pipelines.js
index 74ca3071364..3cc9d0a3a4e 100644
--- a/app/assets/javascripts/pipelines/mixins/pipelines.js
+++ b/app/assets/javascripts/pipelines/mixins/pipelines.js
@@ -27,11 +27,7 @@ export default {
},
computed: {
shouldRenderPagination() {
- return (
- !this.isLoading &&
- this.state.pipelines.length &&
- this.state.pageInfo.total > this.state.pageInfo.perPage
- );
+ return !this.isLoading;
},
},
beforeMount() {
diff --git a/app/assets/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown.vue b/app/assets/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown.vue
index 5f8a4946f4a..fd5d5f86401 100644
--- a/app/assets/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown.vue
+++ b/app/assets/javascripts/projects/gke_cluster_dropdowns/components/gke_zone_dropdown.vue
@@ -34,7 +34,7 @@ export default {
},
errorMessage() {
return sprintf(
- s__('ClusterIntegration|An error occured while trying to fetch project zones: %{error}'),
+ s__('ClusterIntegration|An error occurred while trying to fetch project zones: %{error}'),
{ error: this.gapiError },
);
},
diff --git a/app/assets/javascripts/releases/store/actions.js b/app/assets/javascripts/releases/store/actions.js
index b5c4d54ac33..e0a922d5ef6 100644
--- a/app/assets/javascripts/releases/store/actions.js
+++ b/app/assets/javascripts/releases/store/actions.js
@@ -30,7 +30,7 @@ export const receiveReleasesSuccess = ({ commit }, data) =>
export const receiveReleasesError = ({ commit }) => {
commit(types.RECEIVE_RELEASES_ERROR);
- createFlash(__('An error occured while fetching the releases. Please try again.'));
+ createFlash(__('An error occurred while fetching the releases. Please try again.'));
};
// prevent babel-plugin-rewire from generating an invalid default during karma tests
diff --git a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
index 7f86741ed29..e9ed05e30cd 100644
--- a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
+++ b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
@@ -66,19 +66,23 @@ export default {
import(/* webpackChunkName: 'emoji' */ '~/emoji')
.then(Emoji => {
- if (this.emoji) {
- this.emojiTag = Emoji.glEmojiTag(this.emoji);
- }
- this.noEmoji = this.emoji === '';
- this.defaultEmojiTag = Emoji.glEmojiTag('speech_balloon');
+ Emoji.initEmojiMap()
+ .then(() => {
+ if (this.emoji) {
+ this.emojiTag = Emoji.glEmojiTag(this.emoji);
+ }
+ this.noEmoji = this.emoji === '';
+ this.defaultEmojiTag = Emoji.glEmojiTag('speech_balloon');
- this.emojiMenu = new EmojiMenuInModal(
- Emoji,
- toggleEmojiMenuButtonSelector,
- emojiMenuClass,
- this.setEmoji,
- this.$refs.userStatusForm,
- );
+ this.emojiMenu = new EmojiMenuInModal(
+ Emoji,
+ toggleEmojiMenuButtonSelector,
+ emojiMenuClass,
+ this.setEmoji,
+ this.$refs.userStatusForm,
+ );
+ })
+ .catch(() => createFlash(__('Failed to load emoji list.')));
})
.catch(() => createFlash(__('Failed to load emoji list.')));
},
diff --git a/app/assets/javascripts/users_select.js b/app/assets/javascripts/users_select.js
index 4017630d6ef..8c71615dff2 100644
--- a/app/assets/javascripts/users_select.js
+++ b/app/assets/javascripts/users_select.js
@@ -93,23 +93,22 @@ function UsersSelect(currentUser, els, options = {}) {
}
// Save current selected user to the DOM
- const input = document.createElement('input');
- input.type = 'hidden';
- input.name = $dropdown.data('fieldName');
-
- const currentUserInfo = $dropdown.data('currentUserInfo');
-
- if (currentUserInfo) {
- input.value = currentUserInfo.id;
- input.dataset.meta = _.escape(currentUserInfo.name);
- } else if (_this.currentUser) {
- input.value = _this.currentUser.id;
- }
+ const currentUserInfo = $dropdown.data('currentUserInfo') || {};
+ const currentUser = _this.currentUser || {};
+ const fieldName = $dropdown.data('fieldName');
+ const userName = currentUserInfo.name;
+ const userId = currentUserInfo.id || currentUser.id;
+
+ const inputHtmlString = _.template(`
+ <input type="hidden" name="<%- fieldName %>"
+ data-meta="<%- userName %>"
+ value="<%- userId %>" />
+ `)({ fieldName, userName, userId });
if ($selectbox) {
- $dropdown.parent().before(input);
+ $dropdown.parent().before(inputHtmlString);
} else {
- $dropdown.after(input);
+ $dropdown.after(inputHtmlString);
}
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
index 3b9fc2661ef..50ab7ead582 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
@@ -135,7 +135,7 @@ export default {
<span class="dropdown">
<button
type="button"
- class="btn dropdown-toggle"
+ class="btn dropdown-toggle qa-dropdown-toggle"
data-toggle="dropdown"
aria-label="Download as"
aria-haspopup="true"
@@ -145,12 +145,20 @@ export default {
</button>
<ul class="dropdown-menu dropdown-menu-right">
<li>
- <a :href="mr.emailPatchesPath" class="js-download-email-patches" download>
+ <a
+ :href="mr.emailPatchesPath"
+ class="js-download-email-patches qa-download-email-patches"
+ download
+ >
{{ s__('mrWidget|Email patches') }}
</a>
</li>
<li>
- <a :href="mr.plainDiffPath" class="js-download-plain-diff" download>
+ <a
+ :href="mr.plainDiffPath"
+ class="js-download-plain-diff qa-download-plain-diff"
+ download
+ >
{{ s__('mrWidget|Plain diff') }}
</a>
</li>
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 f11cf21b0ca..9e63aa00341 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
@@ -5,6 +5,7 @@ import PipelineStage from '~/pipelines/components/stage.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import Icon from '~/vue_shared/components/icon.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+import mrWidgetPipelineMixin from 'ee_else_ce/vue_merge_request_widget/mixins/mr_widget_pipeline';
export default {
name: 'MRWidgetPipeline',
@@ -13,7 +14,10 @@ export default {
CiIcon,
Icon,
TooltipOnTruncate,
+ LinkedPipelinesMiniList: () =>
+ import('ee_component/vue_shared/components/linked_pipelines_mini_list.vue'),
},
+ mixins: [mrWidgetPipelineMixin],
props: {
pipeline: {
type: Object,
@@ -82,8 +86,7 @@ export default {
<div v-if="hasPipeline || hasCIError" class="ci-widget media">
<template v-if="hasCIError">
<div
- class="add-border ci-status-icon ci-status-icon-failed ci-error
- js-ci-error append-right-default"
+ class="add-border ci-status-icon ci-status-icon-failed ci-error js-ci-error append-right-default"
>
<icon :size="32" name="status_failed_borderless" />
</div>
@@ -101,16 +104,13 @@ export default {
<a :href="pipeline.path" class="pipeline-id font-weight-normal pipeline-number"
>#{{ pipeline.id }}</a
>
-
{{ pipeline.details.status.label }}
-
<template v-if="hasCommitInfo">
for
<a
:href="pipeline.commit.commit_path"
class="commit-sha js-commit-link font-weight-normal"
- >
- {{ pipeline.commit.short_id }}</a
+ >{{ pipeline.commit.short_id }}</a
>
on
<tooltip-on-truncate
@@ -126,15 +126,22 @@ export default {
</div>
<div>
<span class="mr-widget-pipeline-graph">
- <span v-if="hasStages" class="stage-cell">
- <div
- v-for="(stage, i) in pipeline.details.stages"
- :key="i"
- class="stage-container dropdown js-mini-pipeline-graph mr-widget-pipeline-stages"
- >
- <pipeline-stage :stage="stage" />
- </div>
+ <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 js-mini-pipeline-graph mr-widget-pipeline-stages"
+ >
+ <pipeline-stage :stage="stage" />
+ </div>
+ </template>
</span>
+ <linked-pipelines-mini-list v-if="triggered.length" :triggered="triggered" />
</span>
</div>
</div>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
index b3c1c0e329d..b6722de5277 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
@@ -20,7 +20,6 @@ export default {
<div>
<gl-dropdown
right
- no-caret
text="Use an existing commit message"
variant="link"
class="mr-commit-dropdown"
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 ce4207864ea..9b4e80ee3a3 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
@@ -329,7 +329,7 @@ export default {
>
<ul class="border-top content-list commits-list flex-list">
<commit-edit
- v-if="squashBeforeMerge"
+ v-if="squashBeforeMerge && shouldShowSquashBeforeMerge"
v-model="squashCommitMessage"
:label="__('Squash commit message')"
input-id="squash-message-edit"
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
new file mode 100644
index 00000000000..96e8bb45e34
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/mixins/mr_widget_pipeline.js
@@ -0,0 +1,15 @@
+export default {
+ computed: {
+ triggered() {
+ return [];
+ },
+ triggeredBy() {
+ return [];
+ },
+ },
+ methods: {
+ hasDownstream() {
+ return false;
+ },
+ },
+};
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 2f498c4fa2a..e6f0a1c69cd 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -21,6 +21,7 @@ import Icon from '../../vue_shared/components/icon.vue';
* - Jobs table
* - Jobs show view header
* - Jobs show view sidebar
+ * - Linked pipelines
*/
const validSizes = [8, 12, 16, 18, 24, 32, 48, 72];
diff --git a/app/assets/javascripts/vue_shared/components/empty_component.js b/app/assets/javascripts/vue_shared/components/empty_component.js
new file mode 100644
index 00000000000..e4402020096
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/empty_component.js
@@ -0,0 +1,3 @@
+export default {
+ render: () => null,
+};
diff --git a/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue
new file mode 100644
index 00000000000..27cfa8abb24
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue
@@ -0,0 +1,116 @@
+<script>
+import { GlTooltipDirective } from '@gitlab/ui';
+import { __, sprintf } from '~/locale';
+import IssueMilestone from '~/vue_shared/components/issue/issue_milestone.vue';
+import IssueAssignees from '~/vue_shared/components/issue/issue_assignees.vue';
+import relatedIssuableMixin from '~/vue_shared/mixins/related_issuable_mixin';
+
+export default {
+ name: 'IssueItem',
+ components: {
+ IssueMilestone,
+ IssueAssignees,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ mixins: [relatedIssuableMixin],
+ props: {
+ canReorder: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ stateTitle() {
+ return sprintf(
+ '<span class="bold">%{state}</span> %{timeInWords}<br/><span class="text-tertiary">%{timestamp}</span>',
+ {
+ state: this.isOpen ? __('Opened') : __('Closed'),
+ timeInWords: this.isOpen ? this.createdAtInWords : this.closedAtInWords,
+ timestamp: this.isOpen ? this.createdAtTimestamp : this.closedAtTimestamp,
+ },
+ );
+ },
+ },
+};
+</script>
+
+<template>
+ <div
+ :class="{
+ 'issuable-info-container': !canReorder,
+ 'card-body': canReorder,
+ }"
+ class="item-body"
+ >
+ <div class="item-contents">
+ <div class="item-title d-flex align-items-center">
+ <icon
+ v-if="hasState"
+ v-tooltip
+ :css-classes="iconClass"
+ :name="iconName"
+ :size="16"
+ :title="stateTitle"
+ :aria-label="state"
+ data-html="true"
+ />
+ <icon
+ v-if="confidential"
+ v-gl-tooltip
+ name="eye-slash"
+ :size="16"
+ :title="__('Confidential')"
+ class="confidential-icon append-right-4"
+ :aria-label="__('Confidential')"
+ />
+ <a :href="computedPath" class="sortable-link">{{ title }}</a>
+ </div>
+ <div class="item-meta">
+ <div class="d-flex align-items-center item-path-id">
+ <icon
+ v-if="hasState"
+ v-tooltip
+ :css-classes="iconClass"
+ :name="iconName"
+ :size="16"
+ :title="stateTitle"
+ :aria-label="state"
+ data-html="true"
+ />
+ <span v-tooltip :title="itemPath" class="path-id-text">{{ itemPath }}</span>
+ {{ pathIdSeparator }}{{ itemId }}
+ </div>
+ <div class="item-meta-child d-flex align-items-center">
+ <issue-milestone
+ v-if="hasMilestone"
+ :milestone="milestone"
+ class="d-flex align-items-center item-milestone"
+ />
+ <slot name="dueDate"></slot>
+ <slot name="weight"></slot>
+ </div>
+ <issue-assignees
+ v-if="assignees.length"
+ :assignees="assignees"
+ class="item-assignees d-inline-flex"
+ />
+ </div>
+ </div>
+ <button
+ v-if="canRemove"
+ ref="removeButton"
+ v-tooltip
+ :disabled="removeDisabled"
+ type="button"
+ class="btn btn-default btn-svg btn-item-remove js-issue-item-remove-button qa-remove-issue-button"
+ title="Remove"
+ aria-label="Remove"
+ @click="onRemoveRequest"
+ >
+ <icon :size="16" class="btn-item-remove-icon" name="close" />
+ </button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index dbfa32cd0ce..cc6ecdb0395 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -79,7 +79,7 @@ export default {
<ul class="nav-links clearfix">
<li :class="{ active: !previewMarkdown }" class="md-header-tab">
<button class="js-write-link" tabindex="-1" type="button" @click="writeMarkdownTab($event)">
- Write
+ {{ __('Write') }}
</button>
</li>
<li :class="{ active: previewMarkdown }" class="md-header-tab">
@@ -89,36 +89,41 @@ export default {
type="button"
@click="previewMarkdownTab($event)"
>
- Preview
+ {{ __('Preview') }}
</button>
</li>
<li :class="{ active: !previewMarkdown }" class="md-header-toolbar">
- <toolbar-button tag="**" button-title="Add bold text" icon="bold" />
- <toolbar-button tag="*" button-title="Add italic text" icon="italic" />
- <toolbar-button :prepend="true" tag="> " button-title="Insert a quote" icon="quote" />
- <toolbar-button tag="`" tag-block="```" button-title="Insert code" icon="code" />
+ <toolbar-button tag="**" :button-title="__('Add bold text')" icon="bold" />
+ <toolbar-button tag="*" :button-title="__('Add italic text')" icon="italic" />
+ <toolbar-button
+ :prepend="true"
+ tag="> "
+ :button-title="__('Insert a quote')"
+ icon="quote"
+ />
+ <toolbar-button tag="`" tag-block="```" :button-title="__('Insert code')" icon="code" />
<toolbar-button
tag="[{text}](url)"
tag-select="url"
- button-title="Add a link"
+ :button-title="__('Add a link')"
icon="link"
/>
<toolbar-button
:prepend="true"
tag="* "
- button-title="Add a bullet list"
+ :button-title="__('Add a bullet list')"
icon="list-bulleted"
/>
<toolbar-button
:prepend="true"
tag="1. "
- button-title="Add a numbered list"
+ :button-title="__('Add a numbered list')"
icon="list-numbered"
/>
<toolbar-button
:prepend="true"
tag="* [ ] "
- button-title="Add a task list"
+ :button-title="__('Add a task list')"
icon="task-done"
/>
<toolbar-button
@@ -139,11 +144,11 @@ export default {
/>
<button
v-gl-tooltip
- aria-label="Go full screen"
+ :aria-label="__('Go full screen')"
class="toolbar-btn toolbar-fullscreen-btn js-zen-enter"
data-container="body"
tabindex="-1"
- title="Go full screen"
+ :title="__('Go full screen')"
type="button"
>
<icon name="screen-full" />
diff --git a/app/assets/javascripts/vue_shared/components/table_pagination.vue b/app/assets/javascripts/vue_shared/components/table_pagination.vue
index 9f38c2e4b9e..8e0b08032f7 100644
--- a/app/assets/javascripts/vue_shared/components/table_pagination.vue
+++ b/app/assets/javascripts/vue_shared/components/table_pagination.vue
@@ -54,15 +54,14 @@ export default {
return this.pageInfo.nextPage;
},
getItems() {
- const total = this.pageInfo.totalPages;
- const { page } = this.pageInfo;
+ const { totalPages, nextPage, previousPage, page } = this.pageInfo;
const items = [];
if (page > 1) {
items.push({ title: FIRST, first: true });
}
- if (page > 1) {
+ if (previousPage) {
items.push({ title: PREV, prev: true });
} else {
items.push({ title: PREV, disabled: true, prev: true });
@@ -70,32 +69,34 @@ export default {
if (page > UI_LIMIT) items.push({ title: SPREAD, separator: true });
- const start = Math.max(page - PAGINATION_UI_BUTTON_LIMIT, 1);
- const end = Math.min(page + PAGINATION_UI_BUTTON_LIMIT, total);
+ if (totalPages) {
+ const start = Math.max(page - PAGINATION_UI_BUTTON_LIMIT, 1);
+ const end = Math.min(page + PAGINATION_UI_BUTTON_LIMIT, totalPages);
- for (let i = start; i <= end; i += 1) {
- const isActive = i === page;
- items.push({ title: i, active: isActive, page: true });
- }
+ for (let i = start; i <= end; i += 1) {
+ const isActive = i === page;
+ items.push({ title: i, active: isActive, page: true });
+ }
- if (total - page > PAGINATION_UI_BUTTON_LIMIT) {
- items.push({ title: SPREAD, separator: true, page: true });
+ if (totalPages - page > PAGINATION_UI_BUTTON_LIMIT) {
+ items.push({ title: SPREAD, separator: true, page: true });
+ }
}
- if (page === total) {
- items.push({ title: NEXT, disabled: true, next: true });
- } else if (total - page >= 1) {
+ if (nextPage) {
items.push({ title: NEXT, next: true });
+ } else {
+ items.push({ title: NEXT, disabled: true, next: true });
}
- if (total - page >= 1) {
+ if (totalPages && totalPages - page >= 1) {
items.push({ title: LAST, last: true });
}
return items;
},
showPagination() {
- return this.pageInfo.totalPages > 1;
+ return this.pageInfo.nextPage || this.pageInfo.previousPage;
},
},
methods: {
diff --git a/app/assets/javascripts/vue_shared/mixins/is_ee.js b/app/assets/javascripts/vue_shared/mixins/is_ee.js
new file mode 100644
index 00000000000..8e00d93ef18
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/mixins/is_ee.js
@@ -0,0 +1,10 @@
+import Vue from 'vue';
+import { isEE } from '~/lib/utils/common_utils';
+
+Vue.mixin({
+ computed: {
+ isEE() {
+ return isEE();
+ },
+ },
+});
diff --git a/app/assets/javascripts/vue_shared/mixins/related_issuable_mixin.js b/app/assets/javascripts/vue_shared/mixins/related_issuable_mixin.js
new file mode 100644
index 00000000000..455ae832234
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/mixins/related_issuable_mixin.js
@@ -0,0 +1,155 @@
+import _ from 'underscore';
+import { formatDate } from '~/lib/utils/datetime_utility';
+import tooltip from '~/vue_shared/directives/tooltip';
+import icon from '~/vue_shared/components/icon.vue';
+import timeagoMixin from '~/vue_shared/mixins/timeago';
+
+const mixins = {
+ data() {
+ return {
+ removeDisabled: false,
+ };
+ },
+ props: {
+ idKey: {
+ type: Number,
+ required: true,
+ },
+ displayReference: {
+ type: String,
+ required: true,
+ },
+ pathIdSeparator: {
+ type: String,
+ required: true,
+ },
+ eventNamespace: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ confidential: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ title: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ path: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ state: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ createdAt: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ closedAt: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ milestone: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ dueDate: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ assignees: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ weight: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ canRemove: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ components: {
+ icon,
+ },
+ directives: {
+ tooltip,
+ },
+ mixins: [timeagoMixin],
+ computed: {
+ hasState() {
+ return this.state && this.state.length > 0;
+ },
+ isOpen() {
+ return this.state === 'opened';
+ },
+ isClosed() {
+ return this.state === 'closed';
+ },
+ hasTitle() {
+ return this.title.length > 0;
+ },
+ hasMilestone() {
+ return !_.isEmpty(this.milestone);
+ },
+ iconName() {
+ return this.isOpen ? 'issue-open-m' : 'issue-close';
+ },
+ iconClass() {
+ return this.isOpen ? 'issue-token-state-icon-open' : 'issue-token-state-icon-closed';
+ },
+ computedLinkElementType() {
+ return this.path.length > 0 ? 'a' : 'span';
+ },
+ computedPath() {
+ return this.path.length ? this.path : null;
+ },
+ itemPath() {
+ return this.displayReference.split(this.pathIdSeparator)[0];
+ },
+ itemId() {
+ return this.displayReference.split(this.pathIdSeparator).pop();
+ },
+ createdAtInWords() {
+ return this.createdAt ? this.timeFormated(this.createdAt) : '';
+ },
+ createdAtTimestamp() {
+ return this.createdAt ? formatDate(new Date(this.createdAt)) : '';
+ },
+ closedAtInWords() {
+ return this.closedAt ? this.timeFormated(this.closedAt) : '';
+ },
+ closedAtTimestamp() {
+ return this.closedAt ? formatDate(new Date(this.closedAt)) : '';
+ },
+ },
+ methods: {
+ onRemoveRequest() {
+ let namespacePrefix = '';
+ if (this.eventNamespace && this.eventNamespace.length > 0) {
+ namespacePrefix = `${this.eventNamespace}`;
+ }
+
+ this.$emit(`${namespacePrefix}RemoveRequest`, this.idKey);
+
+ this.removeDisabled = true;
+ },
+ },
+};
+
+export default mixins;
diff --git a/app/assets/stylesheets/components/related_items_list.scss b/app/assets/stylesheets/components/related_items_list.scss
index 048a5c0300c..edf7b26ebaa 100644
--- a/app/assets/stylesheets/components/related_items_list.scss
+++ b/app/assets/stylesheets/components/related_items_list.scss
@@ -195,8 +195,7 @@ $item-weight-max-width: 48px;
}
.mr-status-wrapper,
-.mr-ci-status
- {
+.mr-ci-status {
line-height: 0;
}
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 555ea276c6c..216877a4461 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -66,3 +66,4 @@
@import 'framework/read_more';
@import 'framework/flex_grid';
@import 'framework/system_messages';
+@import "framework/spinner";
diff --git a/app/assets/stylesheets/framework/animations.scss b/app/assets/stylesheets/framework/animations.scss
index 70d50c74ca9..257d788873c 100644
--- a/app/assets/stylesheets/framework/animations.scss
+++ b/app/assets/stylesheets/framework/animations.scss
@@ -27,7 +27,7 @@
&.flipOutY,
&.bounceIn,
&.bounceOut {
- @include webkit-prefix(animation-duration, .75s);
+ @include webkit-prefix(animation-duration, 0.75s);
}
&.short {
@@ -73,22 +73,10 @@
@mixin disable-all-animation {
/*CSS transitions*/
- -o-transition-property: none !important;
- -moz-transition-property: none !important;
- -ms-transition-property: none !important;
- -webkit-transition-property: none !important;
transition-property: none !important;
/*CSS transforms*/
- -o-transform: none !important;
- -moz-transform: none !important;
- -ms-transform: none !important;
- -webkit-transform: none !important;
transform: none !important;
/*CSS animations*/
- -webkit-animation: none !important;
- -moz-animation: none !important;
- -o-animation: none !important;
- -ms-animation: none !important;
animation: none !important;
}
@@ -202,7 +190,7 @@ a {
}
}
- [class^="skeleton-line-"] {
+ [class^='skeleton-line-'] {
position: relative;
background-color: $gray-100;
height: 10px;
@@ -218,13 +206,11 @@ a {
animation: blockTextShine 1s linear infinite forwards;
background-repeat: no-repeat;
background-size: cover;
- background-image: linear-gradient(
- to right,
- $gray-100 0%,
- $gray-50 20%,
- $gray-100 40%,
- $gray-100 100%
- );
+ background-image: linear-gradient(to right,
+ $gray-100 0%,
+ $gray-50 20%,
+ $gray-100 40%,
+ $gray-100 100%);
height: 10px;
}
}
diff --git a/app/assets/stylesheets/framework/asciidoctor.scss b/app/assets/stylesheets/framework/asciidoctor.scss
index 62493c32833..1586265d40e 100644
--- a/app/assets/stylesheets/framework/asciidoctor.scss
+++ b/app/assets/stylesheets/framework/asciidoctor.scss
@@ -1,7 +1,7 @@
.admonitionblock td.icon {
width: 1%;
- [class^="fa icon-"] {
+ [class^='fa icon-'] {
@extend .fa-2x;
}
diff --git a/app/assets/stylesheets/framework/avatar.scss b/app/assets/stylesheets/framework/avatar.scss
index bfd3d776bd4..af79a4d9392 100644
--- a/app/assets/stylesheets/framework/avatar.scss
+++ b/app/assets/stylesheets/framework/avatar.scss
@@ -45,7 +45,6 @@
display: inline-block;
margin-left: 2px;
flex-shrink: 0;
- -webkit-flex-shrink: 0;
&.s16 { margin-right: 4px; }
&.s24 { margin-right: 4px; }
@@ -74,20 +73,48 @@
background-color: $gray-darker;
// Sizes
- &.s16 { font-size: 12px; line-height: 1.33; }
- &.s24 { font-size: 13px; line-height: 1.8; }
- &.s26 { font-size: 20px; line-height: 1.33; }
- &.s32 { font-size: 20px; line-height: 30px; }
- &.s40 { font-size: 16px; line-height: 38px; }
- &.s48 { font-size: 20px; line-height: 46px; }
- &.s60 { font-size: 32px; line-height: 58px; }
- &.s64 { font-size: 32px; line-height: 64px; }
- &.s70 { font-size: 34px; line-height: 70px; }
- &.s90 { font-size: 36px; line-height: 88px; }
- &.s100 { font-size: 36px; line-height: 98px; }
- &.s110 { font-size: 40px; line-height: 108px; font-weight: $gl-font-weight-normal; }
- &.s140 { font-size: 72px; line-height: 138px; }
- &.s160 { font-size: 96px; line-height: 158px; }
+ &.s16 { font-size: 12px;
+ line-height: 1.33; }
+
+ &.s24 { font-size: 13px;
+ line-height: 1.8; }
+
+ &.s26 { font-size: 20px;
+ line-height: 1.33; }
+
+ &.s32 { font-size: 20px;
+ line-height: 30px; }
+
+ &.s40 { font-size: 16px;
+ line-height: 38px; }
+
+ &.s48 { font-size: 20px;
+ line-height: 46px; }
+
+ &.s60 { font-size: 32px;
+ line-height: 58px; }
+
+ &.s64 { font-size: 32px;
+ line-height: 64px; }
+
+ &.s70 { font-size: 34px;
+ line-height: 70px; }
+
+ &.s90 { font-size: 36px;
+ line-height: 88px; }
+
+ &.s100 { font-size: 36px;
+ line-height: 98px; }
+
+ &.s110 { font-size: 40px;
+ line-height: 108px;
+ font-weight: $gl-font-weight-normal; }
+
+ &.s140 { font-size: 72px;
+ line-height: 138px; }
+
+ &.s160 { font-size: 96px;
+ line-height: 158px; }
// Background colors
&.bg1 { background-color: $identicon-red; }
@@ -120,8 +147,11 @@
align-self: center;
}
- &.s40 { min-width: 40px; min-height: 40px; }
- &.s64 { min-width: 64px; min-height: 64px; }
+ &.s40 { min-width: 40px;
+ min-height: 40px; }
+
+ &.s64 { min-width: 64px;
+ min-height: 64px; }
}
.rect-avatar {
diff --git a/app/assets/stylesheets/framework/awards.scss b/app/assets/stylesheets/framework/awards.scss
index 5cfd5bbd4f5..648e1944388 100644
--- a/app/assets/stylesheets/framework/awards.scss
+++ b/app/assets/stylesheets/framework/awards.scss
@@ -23,9 +23,9 @@
box-shadow: 0 6px 12px $award-emoji-menu-shadow;
pointer-events: none;
opacity: 0;
- transform: scale(.2);
+ transform: scale(0.2);
transform-origin: 0 -45px;
- transition: .3s cubic-bezier(.67, .06, .19, 1.44);
+ transition: 0.3s cubic-bezier(0.67, 0.06, 0.19, 1.44);
transition-property: transform, opacity;
&.is-rendered {
@@ -62,7 +62,7 @@
}
.emoji-search {
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAFu0lEQVRIia1WTahkVxH+quqce7vf6zdvJpHoIlkYJ2SiJiIokmQjgoGgIAaEIYuYXWICgojiwkmC4taFwhjcyIDusogEIwwiSSCKPwsdwzAg0SjJ9Izzk5n3+nXfe8+pqizOvd395scfsJqi6dPnnDr11Vc/NJ1OwUTosqJLCmYCHCAC2mSHs+ojZv6AO46Y+20AhIneJsafhPhXVZSXDk7qi+aOLhtQNuBmQtcarAKjTXpn2+l3u2yPunvZSABRucjcAV/eMZuM48/Go/g1d19kc4wq+e8MZjWkbI/P5t2P3RFFbv7SQdyBlBUx8N8OTuqjMcof+N94yMPrY2DMm/ytnb32J0QrY+6AqsHM4Q64O9SKDmerKDD3Oy/tNL9vk342CC8RuU6n0ymCMHb22scu7zQngtASOjUHE1BX4UUAv4b7Ow6qiXCXuz/UdvogAAweDY943/b4cAz0ZlYHXeMsnT07RVb7wMUr8ykI4H5HVkMd5Rcb4/jNURVOL5qErAaAUUdCCIJ5kx5q2nw8m39ImEAAsjpE6PStB0YfMcd1wqqG3Xn7A3PfZyyKnNjaqD4fmE/fCNKshirIyY1xvI+Av6g5QIAIIWX7cJPssboSiBBEeKmsZne0Sb8kzAUWNYyq8NvbDo0fZ6beqxuLmqOOMr/lwOh+YXpXtbjERGja9JyZ9+HxpXKb9Gj5oywRESbj+Cj1ENG1QViTGBl1FbC1We1tbVRfHWIoQkhqH9xbpE92XUbb6VJZ1R4crjRz1JWcDMJvLdoMcyAEhjuwHo8Bfndg3mbszhOY+adVlMtD3po51OwzIQiEaams7oeJhxRw1FFOVpFRRUYIhMBAFRnjOsC8IFHHUA4TQQhgAqpAiIFfGbxkIqj54ayGbL7UoOqHCniAEKHLNr26l+D9wQJzeUwMAnfHvEnLECzZRwRV++d60ptjW9VLZeolEJG6GwCCE0CFVNB+Ay0NEqoQYG4YYFu7B8IEVRt3uRzy/osIoLV9QZimWXGHUMFdmI6M64DUF2Je88R9VZqCSP+QlcF5k+4tCzSsXaqjINuK6UyE0+s/mk6/qFq8oAIL9pqMLhkGsNrOyoOIlszust3aJv0U9+kFdwjTGwWl1YdF+KWlQSZ0Se/psj8yGVdg5tJyfH96EBWmLtoEMwMzMFt031NzGWLLzKhC+KV7H5ZeeaMOPxemma2x68puc0LN3+/u6LJiePS6MKHvn4wu6cPzJj0hsioeMfDrEvjv5r6W9gBvjKJujuKzQ0URIZj75NylvT+mbHfXQa4rwAMaVRTMm/SFyzvNy0yF6+4AM+1ubcSnqkAIUjQKl1RKSbE5jt+vovx1MBqF0WW7/d1Z80ab9BtmuJ3Xk5cJKds9TZt/uLPXvtiTrQ+dIwqfAejUvM1os6FNikXKUHfQ+ekUsXT5u85enJ0CaBSkkGEo1syUQ+DfMdE/4GA1uzupf9zdbzhOmLsF4efHVXjaHHAzmDtGdQRd/Nc5wAEJjNki3XfhyvwVNz80xANrht3LsENY9cBBdN1L9GUyyvFRFZ42t75sBvCQRykbRlU4tT2pPxoCvzx09d4GmPs200M6wKdWSDGK8mppYSWdhAlt0qeaLv+IadXU9/Evq4FAZ8ej+LmtcTxaRX4NWI0Uag5Vg1p5MYg8BnlhXIdPHDow+vTWZvVMVttXDLqkTzZdPj6Qii6cP1cSvIdl3iQkNYyi9HH0I22y+93tY3DcQkTZgQtM+POoCr8x97eylkmtrgKuztrvXJ21x/aNKuqIkZ/fntRfCdcTfhUTAIhRzoDojJD0aSNLLwMzmpT7+JaLtyf1MwDo6qz9djFaUq3t9MlFmy/c1OCSceY9fMsVaL9mvH9ocXdkdWxv1scAePG0THAhMOaLdOw/Gvxfxb1w4eCapyIENUcV5M3/u8FitAxZ25P6GAHT3UX39Srw+QOb1ZffA98Dl2Wy1BYkAAAAAElFTkSuQmCC");
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAFu0lEQVRIia1WTahkVxH+quqce7vf6zdvJpHoIlkYJ2SiJiIokmQjgoGgIAaEIYuYXWICgojiwkmC4taFwhjcyIDusogEIwwiSSCKPwsdwzAg0SjJ9Izzk5n3+nXfe8+pqizOvd395scfsJqi6dPnnDr11Vc/NJ1OwUTosqJLCmYCHCAC2mSHs+ojZv6AO46Y+20AhIneJsafhPhXVZSXDk7qi+aOLhtQNuBmQtcarAKjTXpn2+l3u2yPunvZSABRucjcAV/eMZuM48/Go/g1d19kc4wq+e8MZjWkbI/P5t2P3RFFbv7SQdyBlBUx8N8OTuqjMcof+N94yMPrY2DMm/ytnb32J0QrY+6AqsHM4Q64O9SKDmerKDD3Oy/tNL9vk342CC8RuU6n0ymCMHb22scu7zQngtASOjUHE1BX4UUAv4b7Ow6qiXCXuz/UdvogAAweDY943/b4cAz0ZlYHXeMsnT07RVb7wMUr8ykI4H5HVkMd5Rcb4/jNURVOL5qErAaAUUdCCIJ5kx5q2nw8m39ImEAAsjpE6PStB0YfMcd1wqqG3Xn7A3PfZyyKnNjaqD4fmE/fCNKshirIyY1xvI+Av6g5QIAIIWX7cJPssboSiBBEeKmsZne0Sb8kzAUWNYyq8NvbDo0fZ6beqxuLmqOOMr/lwOh+YXpXtbjERGja9JyZ9+HxpXKb9Gj5oywRESbj+Cj1ENG1QViTGBl1FbC1We1tbVRfHWIoQkhqH9xbpE92XUbb6VJZ1R4crjRz1JWcDMJvLdoMcyAEhjuwHo8Bfndg3mbszhOY+adVlMtD3po51OwzIQiEaams7oeJhxRw1FFOVpFRRUYIhMBAFRnjOsC8IFHHUA4TQQhgAqpAiIFfGbxkIqj54ayGbL7UoOqHCniAEKHLNr26l+D9wQJzeUwMAnfHvEnLECzZRwRV++d60ptjW9VLZeolEJG6GwCCE0CFVNB+Ay0NEqoQYG4YYFu7B8IEVRt3uRzy/osIoLV9QZimWXGHUMFdmI6M64DUF2Je88R9VZqCSP+QlcF5k+4tCzSsXaqjINuK6UyE0+s/mk6/qFq8oAIL9pqMLhkGsNrOyoOIlszust3aJv0U9+kFdwjTGwWl1YdF+KWlQSZ0Se/psj8yGVdg5tJyfH96EBWmLtoEMwMzMFt031NzGWLLzKhC+KV7H5ZeeaMOPxemma2x68puc0LN3+/u6LJiePS6MKHvn4wu6cPzJj0hsioeMfDrEvjv5r6W9gBvjKJujuKzQ0URIZj75NylvT+mbHfXQa4rwAMaVRTMm/SFyzvNy0yF6+4AM+1ubcSnqkAIUjQKl1RKSbE5jt+vovx1MBqF0WW7/d1Z80ab9BtmuJ3Xk5cJKds9TZt/uLPXvtiTrQ+dIwqfAejUvM1os6FNikXKUHfQ+ekUsXT5u85enJ0CaBSkkGEo1syUQ+DfMdE/4GA1uzupf9zdbzhOmLsF4efHVXjaHHAzmDtGdQRd/Nc5wAEJjNki3XfhyvwVNz80xANrht3LsENY9cBBdN1L9GUyyvFRFZ42t75sBvCQRykbRlU4tT2pPxoCvzx09d4GmPs200M6wKdWSDGK8mppYSWdhAlt0qeaLv+IadXU9/Evq4FAZ8ej+LmtcTxaRX4NWI0Uag5Vg1p5MYg8BnlhXIdPHDow+vTWZvVMVttXDLqkTzZdPj6Qii6cP1cSvIdl3iQkNYyi9HH0I22y+93tY3DcQkTZgQtM+POoCr8x97eylkmtrgKuztrvXJ21x/aNKuqIkZ/fntRfCdcTfhUTAIhRzoDojJD0aSNLLwMzmpT7+JaLtyf1MwDo6qz9djFaUq3t9MlFmy/c1OCSceY9fMsVaL9mvH9ocXdkdWxv1scAePG0THAhMOaLdOw/Gvxfxb1w4eCapyIENUcV5M3/u8FitAxZ25P6GAHT3UX39Srw+QOb1ZffA98Dl2Wy1BYkAAAAAElFTkSuQmCC');
background-repeat: no-repeat;
background-position: right 5px center;
background-size: 16px;
@@ -90,7 +90,7 @@
background: none;
border: 0;
border-radius: $border-radius-base;
- transition: transform .15s cubic-bezier(.3, 0, .2, 2);
+ transition: transform 0.15s cubic-bezier(0.3, 0, 0.2, 2);
&:hover {
background-color: transparent;
diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss
index 43b7c26b272..e6c55252b24 100644
--- a/app/assets/stylesheets/framework/blocks.scss
+++ b/app/assets/stylesheets/framework/blocks.scss
@@ -86,11 +86,8 @@
}
.block-controls {
- display: -webkit-flex;
display: flex;
- -webkit-justify-content: flex-end;
justify-content: flex-end;
- -webkit-flex: 1;
flex: 1;
.control {
@@ -153,7 +150,7 @@
display: inline-block;
margin-left: 5px;
font-size: 18px;
- color: color("gray");
+ color: color('gray');
}
p {
@@ -228,7 +225,6 @@
}
.group-info {
-
h1 {
display: inline;
font-weight: $gl-font-weight-normal;
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index cb2c8879c5f..a4af84f8d27 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -395,8 +395,6 @@
cursor: default;
&:active {
- -moz-box-shadow: inset 0 0 0 $white-light;
- -webkit-box-shadow: inset 0 0 0 $white-light;
box-shadow: inset 0 0 0 $white-light;
}
}
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index b09e44e052a..aad5150c0b5 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -57,7 +57,11 @@
text-decoration: underline;
}
-.hint { font-style: italic; color: $gl-gray-400; }
+.hint {
+ font-style: italic;
+ color: $gl-gray-400;
+}
+
.light { color: $gl-text-color; }
.slead {
@@ -158,13 +162,14 @@ p.time {
text-shadow: none;
}
-.thin_area {
+.thin-area {
height: 150px;
}
// Fix issue with notes & lists creating a bunch of bottom borders.
li.note {
img { max-width: 100%; }
+
.note-title {
li {
border-bottom: 0 !important;
@@ -335,7 +340,7 @@ img.emoji {
.disabled-content {
pointer-events: none;
- opacity: .5;
+ opacity: 0.5;
}
.break-word {
@@ -399,7 +404,9 @@ img.emoji {
.flex-grow { flex-grow: 1; }
.flex-no-shrink { flex-shrink: 0; }
.ws-initial { white-space: initial; }
+.ws-normal { white-space: normal; }
.overflow-auto { overflow: auto; }
+
.d-flex-center {
display: flex;
align-items: center;
diff --git a/app/assets/stylesheets/framework/contextual_sidebar.scss b/app/assets/stylesheets/framework/contextual_sidebar.scss
index 8b6a7017c47..3238b01c6c0 100644
--- a/app/assets/stylesheets/framework/contextual_sidebar.scss
+++ b/app/assets/stylesheets/framework/contextual_sidebar.scss
@@ -5,7 +5,7 @@
padding-left: $contextual-sidebar-collapsed-width;
}
- @include media-breakpoint-up(lg) {
+ @include media-breakpoint-up(xl) {
padding-left: $contextual-sidebar-width;
}
@@ -15,7 +15,7 @@
}
.page-with-icon-sidebar {
- @include media-breakpoint-up(sm) {
+ @include media-breakpoint-up(md) {
padding-left: $contextual-sidebar-collapsed-width;
}
}
@@ -71,6 +71,44 @@
}
}
+@mixin collapse-contextual-sidebar-content {
+ .context-header {
+ height: 60px;
+ width: $contextual-sidebar-collapsed-width;
+
+ a {
+ padding: 10px 4px;
+ }
+ }
+
+ .sidebar-top-level-items > li {
+ .sidebar-sub-level-items {
+ &:not(.flyout-list) {
+ display: none;
+ }
+ }
+ }
+
+ .nav-icon-container {
+ margin-right: 0;
+ }
+
+ .toggle-sidebar-button {
+ padding: 16px;
+ width: $contextual-sidebar-collapsed-width - 1px;
+
+ .collapse-text,
+ .icon-angle-double-left {
+ display: none;
+ }
+
+ .icon-angle-double-right {
+ display: block;
+ margin: 0;
+ }
+ }
+}
+
.nav-sidebar {
transition: width $sidebar-transition-duration, left $sidebar-transition-duration;
position: fixed;
@@ -89,7 +127,7 @@
}
}
- &.sidebar-collapsed-desktop {
+ @mixin collapse-contextual-sidebar {
width: $contextual-sidebar-collapsed-width;
.nav-sidebar-inner-scroll {
@@ -115,6 +153,10 @@
}
}
+ &.sidebar-collapsed-desktop {
+ @include collapse-contextual-sidebar;
+ }
+
&.sidebar-expanded-mobile {
left: 0;
}
@@ -150,7 +192,7 @@
}
}
- @include media-breakpoint-down(xs) {
+ @include media-breakpoint-down(sm) {
left: (-$contextual-sidebar-width);
}
@@ -167,16 +209,19 @@
height: 16px;
width: 16px;
}
+
+ @media (min-width: map-get($grid-breakpoints, md)) and (max-width: map-get($grid-breakpoints, xl) - 1px) {
+ &:not(.sidebar-expanded-mobile) {
+ @include collapse-contextual-sidebar;
+ @include collapse-contextual-sidebar-content;
+ }
+ }
}
.nav-sidebar-inner-scroll {
height: 100%;
width: 100%;
overflow: auto;
-
- @include media-breakpoint-up(sm) {
- overflow: hidden;
- }
}
.with-performance-bar .nav-sidebar {
@@ -346,53 +391,13 @@
}
}
-.toggle-sidebar-button {
- @include media-breakpoint-down(xs) {
- display: none;
- }
-}
-
.collapse-text {
white-space: nowrap;
overflow: hidden;
}
.sidebar-collapsed-desktop {
- .context-header {
- height: 60px;
- width: $contextual-sidebar-collapsed-width;
-
- a {
- padding: 10px 4px;
- }
- }
-
- .sidebar-top-level-items > li {
- .sidebar-sub-level-items {
- &:not(.flyout-list) {
- display: none;
- }
- }
- }
-
- .nav-icon-container {
- margin-right: 0;
- }
-
- .toggle-sidebar-button {
- padding: 16px;
- width: $contextual-sidebar-collapsed-width - 1px;
-
- .collapse-text,
- .icon-angle-double-left {
- display: none;
- }
-
- .icon-angle-double-right {
- display: block;
- margin: 0;
- }
- }
+ @include collapse-contextual-sidebar-content;
}
.fly-out-top-item {
@@ -428,16 +433,14 @@
color: $gl-text-color-secondary;
}
- @include media-breakpoint-down(xs) {
+ @include media-breakpoint-down(sm) {
display: flex;
align-items: center;
i {
font-size: 18px;
}
- }
- @include media-breakpoint-down(xs) {
+ .breadcrumbs-links {
padding-left: $gl-padding;
border-left: 1px solid $gl-text-color-quaternary;
@@ -445,21 +448,25 @@
}
}
-@include media-breakpoint-down(xs) {
+@include media-breakpoint-down(sm) {
.close-nav-button {
display: flex;
}
-}
-.mobile-overlay {
- display: none;
+ .toggle-sidebar-button {
+ display: none;
+ }
- &.mobile-nav-open {
- display: block;
- position: fixed;
- background-color: $black-transparent;
- height: 100%;
- width: 100%;
- z-index: 300;
+ .mobile-overlay {
+ display: none;
+
+ &.mobile-nav-open {
+ display: block;
+ position: fixed;
+ background-color: $black-transparent;
+ height: 100%;
+ width: 100%;
+ z-index: 300;
+ }
}
}
diff --git a/app/assets/stylesheets/framework/emojis.scss b/app/assets/stylesheets/framework/emojis.scss
index be85e03430e..13c5541da92 100644
--- a/app/assets/stylesheets/framework/emojis.scss
+++ b/app/assets/stylesheets/framework/emojis.scss
@@ -2,7 +2,7 @@ gl-emoji {
font-style: normal;
display: inline-flex;
vertical-align: middle;
- font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
font-size: 1.4em;
line-height: 1em;
}
diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index f48b3ddc912..e5b529ae11d 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -50,19 +50,15 @@
}
.filtered-search-wrapper {
- display: -webkit-flex;
display: flex;
@include media-breakpoint-down(xs) {
- -webkit-flex-direction: column;
flex-direction: column;
}
.tokens-container {
- display: -webkit-flex;
display: flex;
flex: 1;
- -webkit-flex: 1;
padding-left: 12px;
position: relative;
margin-bottom: 0;
@@ -82,21 +78,18 @@
.input-token:only-child,
.input-token:last-child {
flex: 1;
- -webkit-flex: 1;
max-width: inherit;
}
}
.filtered-search-token,
.filtered-search-term {
- display: -webkit-flex;
display: flex;
flex-shrink: 0;
margin-top: 4px;
margin-bottom: 4px;
.selectable {
- display: -webkit-flex;
display: flex;
}
@@ -176,7 +169,6 @@
}
.scroll-container {
- display: -webkit-flex;
display: flex;
overflow-x: auto;
white-space: nowrap;
@@ -186,7 +178,6 @@
.filtered-search-box {
position: relative;
flex: 1;
- display: -webkit-flex;
display: flex;
width: 100%;
min-width: 0;
@@ -194,7 +185,6 @@
background-color: $white-light;
@include media-breakpoint-down(xs) {
- -webkit-flex: 1 1 auto;
flex: 1 1 auto;
margin-bottom: 10px;
}
@@ -349,7 +339,6 @@
}
.filter-dropdown-container {
- display: -webkit-flex;
display: flex;
.dropdown-toggle {
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index cbf9ee24ec5..3b1d1d67509 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -156,8 +156,6 @@ label {
.select-control {
padding-left: 10px;
padding-right: 10px;
- -webkit-appearance: none;
- -moz-appearance: none;
appearance: none;
&::-ms-expand {
@@ -178,7 +176,8 @@ label {
font-weight: $gl-font-weight-normal;
}
-.form-control::-webkit-input-placeholder {
+
+.form-control::placeholder {
color: $gl-text-color-tertiary;
}
diff --git a/app/assets/stylesheets/framework/gfm.scss b/app/assets/stylesheets/framework/gfm.scss
index 50d4298d418..6943bfbc3d0 100644
--- a/app/assets/stylesheets/framework/gfm.scss
+++ b/app/assets/stylesheets/framework/gfm.scss
@@ -32,7 +32,7 @@
height: $chip-size;
background: $white-light;
background-image: linear-gradient(135deg, $gray-dark 25%, transparent 0%, transparent 75%, $gray-dark 0%),
- linear-gradient(135deg, $gray-dark 25%, transparent 0%, transparent 75%, $gray-dark 0%);
+ linear-gradient(135deg, $gray-dark 25%, transparent 0%, transparent 75%, $gray-dark 0%);
background-size: $bg-size $bg-size;
background-position: 0 0, $bg-pos $bg-pos;
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 23dcc1817b1..f5ed6621c55 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -39,7 +39,6 @@
.header-content {
width: 100%;
- display: -webkit-flex;
display: flex;
justify-content: space-between;
position: relative;
@@ -47,11 +46,8 @@
padding-left: 0;
.title-container {
- display: -webkit-flex;
display: flex;
- -webkit-align-items: stretch;
align-items: stretch;
- -webkit-flex: 1 1 auto;
flex: 1 1 auto;
padding-top: 0;
overflow: visible;
@@ -60,7 +56,6 @@
.title {
padding-right: 0;
color: currentColor;
- display: -webkit-flex;
display: flex;
position: relative;
margin: 0;
@@ -85,7 +80,6 @@
}
a {
- display: -webkit-flex;
display: flex;
align-items: center;
padding: 2px 8px;
@@ -173,7 +167,6 @@
.navbar-nav {
@include media-breakpoint-down(xs) {
- display: -webkit-flex;
display: flex;
padding-right: 10px;
flex-direction: row;
@@ -258,7 +251,6 @@
> li {
> a,
> button {
- display: -webkit-flex;
display: flex;
align-items: center;
justify-content: center;
@@ -294,7 +286,6 @@
}
.navbar-sub-nav {
- display: -webkit-flex;
display: flex;
margin: 0 0 0 6px;
@@ -326,14 +317,12 @@
}
.breadcrumbs {
- display: -webkit-flex;
display: flex;
min-height: $breadcrumb-min-height;
color: $gl-text-color;
}
.breadcrumbs-container {
- display: -webkit-flex;
display: flex;
width: 100%;
position: relative;
@@ -344,7 +333,6 @@
}
.breadcrumbs-links {
- -webkit-flex: 1;
flex: 1;
min-width: 0;
align-self: center;
@@ -379,7 +367,6 @@
}
.breadcrumbs-list {
- display: -webkit-flex;
display: flex;
margin-bottom: 0;
line-height: 16px;
@@ -430,7 +417,6 @@
}
.breadcrumbs-extra {
- display: -webkit-flex;
display: flex;
flex: 0 0 auto;
margin-left: auto;
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index d9d4a210f5f..1a74e06a75d 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -15,7 +15,7 @@
word-wrap: break-word;
&::after {
- content: " ";
+ content: ' ';
display: table;
clear: both;
}
@@ -167,7 +167,7 @@ ul.content-list {
}
.no-comments {
- opacity: .5;
+ opacity: 0.5;
}
}
@@ -196,8 +196,6 @@ ul.content-list {
// Content list using flexbox
.flex-list {
.flex-row {
- display: -webkit-flex;
- display: -ms-flexbox;
display: flex;
align-items: center;
white-space: nowrap;
diff --git a/app/assets/stylesheets/framework/logo.scss b/app/assets/stylesheets/framework/logo.scss
index 429cfbe7235..c5feefb8c54 100644
--- a/app/assets/stylesheets/framework/logo.scss
+++ b/app/assets/stylesheets/framework/logo.scss
@@ -9,7 +9,6 @@
}
.tanuki-logo {
-
.tanuki-left-ear,
.tanuki-right-ear,
.tanuki-nose {
@@ -34,7 +33,9 @@
.tanuki-left-cheek {
@include include-keyframes(animate-tanuki-left-cheek) {
- 0%, 10%, 100% {
+ 0%,
+ 10%,
+ 100% {
fill: lighten($tanuki-yellow, 25%);
}
@@ -46,11 +47,13 @@
.tanuki-left-eye {
@include include-keyframes(animate-tanuki-left-eye) {
- 10%, 80% {
+ 10%,
+ 80% {
fill: $tanuki-orange;
}
- 20%, 90% {
+ 20%,
+ 90% {
fill: lighten($tanuki-orange, 25%);
}
}
@@ -58,11 +61,13 @@
.tanuki-left-ear {
@include include-keyframes(animate-tanuki-left-ear) {
- 10%, 80% {
+ 10%,
+ 80% {
fill: $tanuki-red;
}
- 20%, 90% {
+ 20%,
+ 90% {
fill: lighten($tanuki-red, 25%);
}
}
@@ -70,11 +75,13 @@
.tanuki-nose {
@include include-keyframes(animate-tanuki-nose) {
- 20%, 70% {
+ 20%,
+ 70% {
fill: $tanuki-red;
}
- 30%, 80% {
+ 30%,
+ 80% {
fill: lighten($tanuki-red, 25%);
}
}
@@ -82,11 +89,13 @@
.tanuki-right-eye {
@include include-keyframes(animate-tanuki-right-eye) {
- 30%, 60% {
+ 30%,
+ 60% {
fill: $tanuki-orange;
}
- 40%, 70% {
+ 40%,
+ 70% {
fill: lighten($tanuki-orange, 25%);
}
}
@@ -94,11 +103,13 @@
.tanuki-right-ear {
@include include-keyframes(animate-tanuki-right-ear) {
- 30%, 60% {
+ 30%,
+ 60% {
fill: $tanuki-red;
}
- 40%, 70% {
+ 40%,
+ 70% {
fill: lighten($tanuki-red, 25%);
}
}
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index 3b0869e31a9..ba3b0906e28 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -26,16 +26,11 @@
*/
@mixin markdown-table {
width: auto;
- display: inline-block;
+ display: block;
overflow-x: auto;
border: 0;
border-color: $gl-gray-100;
- @supports (width: fit-content) {
- display: block;
- width: fit-content;
- }
-
tr {
th {
border-bottom: solid 2px $gl-gray-100;
@@ -120,16 +115,13 @@
/* http://phrappe.com/css/conditional-css-for-webkit-based-browsers/ */
@mixin on-webkit-only {
+ /* stylelint-disable-next-line media-feature-name-no-vendor-prefix */
@media screen and (-webkit-min-device-pixel-ratio: 0) {
@content;
}
}
@mixin keyframes($animation-name) {
- @-webkit-keyframes #{$animation-name} {
- @content;
- }
-
@keyframes #{$animation-name} {
@content;
}
@@ -169,12 +161,10 @@
width: 43px;
height: 30px;
transition-duration: 0.3s;
- -webkit-transform: translateZ(0);
- background: linear-gradient(
- to $gradient-direction,
- $gradient-color 45%,
- rgba($gradient-color, 0.4)
- );
+ transform: translateZ(0);
+ background: linear-gradient(to $gradient-direction,
+ $gradient-color 45%,
+ rgba($gradient-color, 0.4));
&.scrolling {
visibility: visible;
@@ -270,7 +260,6 @@
border: 1px solid $border-color;
color: $gl-text-color;
position: sticky;
- position: -webkit-sticky;
top: $header-height;
padding: $grid-size;
diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss
index bcd601e198a..ac673eafdc7 100644
--- a/app/assets/stylesheets/framework/selects.scss
+++ b/app/assets/stylesheets/framework/selects.scss
@@ -32,7 +32,7 @@
}
&::after {
- content: "\f078";
+ content: '\f078';
position: absolute;
z-index: 1;
text-align: center;
diff --git a/app/assets/stylesheets/framework/spinner.scss b/app/assets/stylesheets/framework/spinner.scss
new file mode 100644
index 00000000000..91fe75075dc
--- /dev/null
+++ b/app/assets/stylesheets/framework/spinner.scss
@@ -0,0 +1,51 @@
+@mixin spinner-color($color) {
+ border-color: rgba($color, 0.25);
+ border-top-color: $color;
+}
+
+@mixin spinner-size($size, $border-width) {
+ width: $size;
+ height: $size;
+ border-width: $border-width;
+ @include webkit-prefix(transform-origin, 50% 50% calc((#{$size} / 2) + #{$border-width}));
+}
+
+@keyframes spinner-rotate {
+ 0% {
+ transform: rotate(0);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.spinner {
+ border-radius: 50%;
+ position: relative;
+ margin: 0 auto;
+ animation-name: spinner-rotate;
+ animation-duration: 0.6s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ border-style: solid;
+ display: inline-flex;
+ @include spinner-size(16px, 2px);
+ @include spinner-color($orange-600);
+
+ &.spinner-md {
+ @include spinner-size(32px, 3px);
+ }
+
+ &.spinner-lg {
+ @include spinner-size(64px, 4px);
+ }
+
+ &.spinner-dark {
+ @include spinner-color($gray-700);
+ }
+
+ &.spinner-light {
+ @include spinner-color($white);
+ }
+}
diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index 295a5b5ee7a..ba406bac50b 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -161,4 +161,3 @@ table {
border-top: 0;
}
}
-
diff --git a/app/assets/stylesheets/framework/terms.scss b/app/assets/stylesheets/framework/terms.scss
index 3f4be8829d7..b07d6023127 100644
--- a/app/assets/stylesheets/framework/terms.scss
+++ b/app/assets/stylesheets/framework/terms.scss
@@ -13,7 +13,6 @@
.card {
.card-header {
- display: -webkit-flex;
display: flex;
align-items: center;
justify-content: space-between;
diff --git a/app/assets/stylesheets/framework/toggle.scss b/app/assets/stylesheets/framework/toggle.scss
index 8258da07e4d..5f8ac3b7e37 100644
--- a/app/assets/stylesheets/framework/toggle.scss
+++ b/app/assets/stylesheets/framework/toggle.scss
@@ -34,7 +34,7 @@
background: $gl-gray-400;
border-radius: 12px;
padding: 3px;
- transition: all .4s ease;
+ transition: all 0.4s ease;
&::selection,
&::before::selection,
@@ -52,7 +52,7 @@
left: 0;
border-radius: 9px;
background: $feature-toggle-color;
- transition: all .2s ease;
+ transition: all 0.2s ease;
&,
.toggle-icon-svg {
@@ -135,12 +135,18 @@
}
@keyframes animate-enabled {
- 0%, 35% { opacity: 0; }
+ 0%,
+
+ 35% { opacity: 0; }
+
100% { opacity: 1; }
}
@keyframes animate-disabled {
- 0%, 35% { opacity: 0; }
+ 0%,
+
+ 35% { opacity: 0; }
+
100% { opacity: 1; }
}
}
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 1b36c1f4862..55ce0d7004e 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -2,7 +2,7 @@
color: $gl-text-color;
word-wrap: break-word;
- [dir="auto"] {
+ [dir='auto'] {
text-align: initial;
}
@@ -224,8 +224,8 @@
}
}
- a[href*="/uploads/"],
- a[href*="storage.googleapis.com/google-code-attachments/"] {
+ a[href*='/uploads/'],
+ a[href*='storage.googleapis.com/google-code-attachments/'] {
&::before {
margin-right: 4px;
@@ -233,7 +233,7 @@
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
- content: "\f0c6";
+ content: '\f0c6';
}
&:hover::before {
@@ -423,6 +423,7 @@ h4 {
/**
* form text input i.e. search bar, comments, forms, etc.
*/
+/* stylelint-disable selector-no-vendor-prefix */
input,
textarea {
&::-webkit-input-placeholder {
@@ -447,5 +448,6 @@ textarea {
color: $gl-text-color-tertiary;
}
}
+/* stylelint-enable */
.lh-100 { line-height: 1; }
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 25b272ab3a9..0333b9445c5 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -41,13 +41,13 @@ $t-gray-a-04: rgba($black, 0.04);
$t-gray-a-06: rgba($black, 0.06);
$t-gray-a-08: rgba($black, 0.08);
-$gl-gray-100: #dddddd;
-$gl-gray-200: #cccccc;
-$gl-gray-350: #aaaaaa;
-$gl-gray-400: #999999;
-$gl-gray-500: #777777;
-$gl-gray-600: #666666;
-$gl-gray-700: #555555;
+$gl-gray-100: #ddd;
+$gl-gray-200: #ccc;
+$gl-gray-350: #aaa;
+$gl-gray-400: #999;
+$gl-gray-500: #777;
+$gl-gray-600: #666;
+$gl-gray-700: #555;
$green-50: #f1fdf6;
$green-100: #dcf5e7;
@@ -100,7 +100,7 @@ $red-950: #4b140b;
$gray-50: #fafafa;
$gray-100: #f2f2f2;
$gray-200: #dfdfdf;
-$gray-300: #cccccc;
+$gray-300: #ccc;
$gray-400: #bababa;
$gray-500: #a7a7a7;
$gray-600: #919191;
@@ -323,8 +323,8 @@ $line-select-yellow: #fcf8e7;
$line-select-yellow-dark: #f0e2bd;
$dark-diff-match-bg: rgba(255, 255, 255, 0.3);
$dark-diff-match-color: rgba(255, 255, 255, 0.1);
-$diff-image-info-color: gray;
-$diff-view-modes-color: gray;
+$diff-image-info-color: #808080;
+$diff-view-modes-color: #808080;
$diff-view-modes-border: #c1c1c1;
$diff-jagged-border-gradient-color: darken($white-normal, 8%);
@@ -343,6 +343,7 @@ $regular-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-San
$dropdown-width: 300px;
$dropdown-min-height: 40px;
$dropdown-max-height: 312px;
+$dropdown-max-height-lg: 445px;
$dropdown-vertical-offset: 4px;
$dropdown-empty-row-bg: rgba(#000, 0.04);
$dropdown-shadow-color: rgba(#000, 0.1);
diff --git a/app/assets/stylesheets/framework/variables_overrides.scss b/app/assets/stylesheets/framework/variables_overrides.scss
index 9b52493fd4d..79d52932719 100644
--- a/app/assets/stylesheets/framework/variables_overrides.scss
+++ b/app/assets/stylesheets/framework/variables_overrides.scss
@@ -37,7 +37,7 @@ $h6-font-size: 14px;
$spacer: $grid-size;
$spacers: (
0: 0,
- 1: ($spacer * .5),
+ 1: ($spacer * 0.5),
2: ($spacer),
3: ($spacer * 2),
4: ($spacer * 3),
diff --git a/app/assets/stylesheets/highlight/common.scss b/app/assets/stylesheets/highlight/common.scss
index 2b0794759d5..ac3214a07d9 100644
--- a/app/assets/stylesheets/highlight/common.scss
+++ b/app/assets/stylesheets/highlight/common.scss
@@ -1,4 +1,4 @@
-@import "../framework/variables";
+@import '../framework/variables';
@mixin diff-background($background, $idiff, $border) {
background: $background;
diff --git a/app/assets/stylesheets/highlight/embedded.scss b/app/assets/stylesheets/highlight/embedded.scss
index 44c8a1d39ec..74364ee4ddb 100644
--- a/app/assets/stylesheets/highlight/embedded.scss
+++ b/app/assets/stylesheets/highlight/embedded.scss
@@ -1,3 +1,3 @@
.code {
- @import "white_base";
+ @import 'white_base';
}
diff --git a/app/assets/stylesheets/highlight/white_base.scss b/app/assets/stylesheets/highlight/white_base.scss
index 23ec3380ce9..ee0ec94c636 100644
--- a/app/assets/stylesheets/highlight/white_base.scss
+++ b/app/assets/stylesheets/highlight/white_base.scss
@@ -1,6 +1,6 @@
/* https://github.com/aahan/pygments-github-style */
-@import "./common";
+@import './common';
/*
* White Syntax Colors
@@ -37,16 +37,16 @@ $white-kt: #458;
$white-m: #099;
$white-s: #d14;
$white-n: #333;
-$white-na: teal;
+$white-na: #008080;
$white-nb: #0086b3;
$white-nc: #458;
-$white-no: teal;
-$white-ni: purple;
+$white-no: #008080;
+$white-ni: #800080;
$white-ne: #900;
$white-nf: #900;
$white-nn: #555;
-$white-nt: navy;
-$white-nv: teal;
+$white-nt: #000080;
+$white-nv: #008080;
$white-w: #bbb;
$white-mf: #099;
$white-mh: #099;
@@ -64,9 +64,9 @@ $white-sr: #009926;
$white-s1: #d14;
$white-ss: #990073;
$white-bp: #999;
-$white-vc: teal;
-$white-vg: teal;
-$white-vi: teal;
+$white-vc: #008080;
+$white-vg: #008080;
+$white-vi: #008080;
$white-il: #099;
$white-gc-color: #999;
$white-gc-bg: #eaf2f5;
@@ -77,7 +77,7 @@ $white-gc-bg: #eaf2f5;
background-color: $gray-light;
}
- // Line numbers
+// Line numbers
.line-numbers,
.diff-line-num {
background-color: $gray-light;
@@ -103,7 +103,6 @@ pre.code,
// Diff line
.line_holder {
-
&.match .line_content,
.new-nonewline.line_content,
.old-nonewline.line_content {
@@ -201,25 +200,38 @@ pre .hll {
background-color: $white-pre-hll-bg !important;
}
- // Search result highlight
+// Search result highlight
span.highlight_word {
background-color: $white-highlight !important;
}
- // Links to URLs, emails, or dependencies
+// Links to URLs, emails, or dependencies
.line a {
color: $white-nb;
}
.hll { background-color: $white-hll-bg; }
-.c { color: $white-c; font-style: italic; }
-.err { color: $white-err; background-color: $white-err-bg; }
+
+.c { color: $white-c;
+ font-style: italic; }
+
+.err { color: $white-err;
+ background-color: $white-err-bg; }
.k { font-weight: $gl-font-weight-bold; }
.o { font-weight: $gl-font-weight-bold; }
-.cm { color: $white-cm; font-style: italic; }
-.cp { color: $white-cp; font-weight: $gl-font-weight-bold; }
-.c1 { color: $white-c1; font-style: italic; }
-.cs { color: $white-cs; font-weight: $gl-font-weight-bold; font-style: italic; }
+
+.cm { color: $white-cm;
+ font-style: italic; }
+
+.cp { color: $white-cp;
+ font-weight: $gl-font-weight-bold; }
+
+.c1 { color: $white-c1;
+ font-style: italic; }
+
+.cs { color: $white-cs;
+ font-weight: $gl-font-weight-bold;
+ font-style: italic; }
.gd {
color: $white-gd;
@@ -248,24 +260,34 @@ span.highlight_word {
.go { color: $white-go; }
.gp { color: $white-gp; }
.gs { font-weight: $gl-font-weight-bold; }
-.gu { color: $white-gu; font-weight: $gl-font-weight-bold; }
+
+.gu { color: $white-gu;
+ font-weight: $gl-font-weight-bold; }
.gt { color: $white-gt; }
.kc { font-weight: $gl-font-weight-bold; }
.kd { font-weight: $gl-font-weight-bold; }
.kn { font-weight: $gl-font-weight-bold; }
.kp { font-weight: $gl-font-weight-bold; }
.kr { font-weight: $gl-font-weight-bold; }
-.kt { color: $white-kt; font-weight: $gl-font-weight-bold; }
+
+.kt { color: $white-kt;
+ font-weight: $gl-font-weight-bold; }
.m { color: $white-m; }
.s { color: $white-s; }
.n { color: $white-n; }
.na { color: $white-na; }
.nb { color: $white-nb; }
-.nc { color: $white-nc; font-weight: $gl-font-weight-bold; }
+
+.nc { color: $white-nc;
+ font-weight: $gl-font-weight-bold; }
.no { color: $white-no; }
.ni { color: $white-ni; }
-.ne { color: $white-ne; font-weight: $gl-font-weight-bold; }
-.nf { color: $white-nf; font-weight: $gl-font-weight-bold; }
+
+.ne { color: $white-ne;
+ font-weight: $gl-font-weight-bold; }
+
+.nf { color: $white-nf;
+ font-weight: $gl-font-weight-bold; }
.nn { color: $white-nn; }
.nt { color: $white-nt; }
.nv { color: $white-nv; }
@@ -291,4 +313,6 @@ span.highlight_word {
.vg { color: $white-vg; }
.vi { color: $white-vi; }
.il { color: $white-il; }
-.gc { color: $white-gc-color; background-color: $white-gc-bg; }
+
+.gc { color: $white-gc-color;
+ background-color: $white-gc-bg; }
diff --git a/app/assets/stylesheets/mailers/highlighted_diff_email.scss b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
index 8b234a5a656..33c114838c2 100644
--- a/app/assets/stylesheets/mailers/highlighted_diff_email.scss
+++ b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
@@ -1,4 +1,4 @@
-@import "framework/variables";
+@import 'framework/variables';
// This file is largely copied from `highlight/white.scss`, but modified to
// avoid all descendant selectors (`table td`). This is because the CSS inlining
@@ -40,16 +40,16 @@ $highlighted-kt: #458;
$highlighted-m: #099;
$highlighted-s: #d14;
$highlighted-n: #333;
-$highlighted-na: teal;
+$highlighted-na: #008080;
$highlighted-nb: #0086b3;
$highlighted-nc: #458;
-$highlighted-no: teal;
-$highlighted-ni: purple;
+$highlighted-no: #008080;
+$highlighted-ni: #800080;
$highlighted-ne: #900;
$highlighted-nf: #900;
$highlighted-nn: #555;
-$highlighted-nt: navy;
-$highlighted-nv: teal;
+$highlighted-nt: #000080;
+$highlighted-nv: #008080;
$highlighted-w: #bbb;
$highlighted-mf: #099;
$highlighted-mh: #099;
@@ -67,9 +67,9 @@ $highlighted-sr: #009926;
$highlighted-s1: #d14;
$highlighted-ss: #990073;
$highlighted-bp: #999;
-$highlighted-vc: teal;
-$highlighted-vg: teal;
-$highlighted-vi: teal;
+$highlighted-vc: #008080;
+$highlighted-vg: #008080;
+$highlighted-vi: #008080;
$highlighted-il: #099;
$highlighted-gc: #999;
$highlighted-gc-bg: #eaf2f5;
@@ -151,14 +151,27 @@ span.highlight_word {
}
.hll { background-color: $highlighted-hll-bg; }
-.c { color: $highlighted-c; font-style: italic; }
-.err { color: $highlighted-err; background-color: $highlighted-err-bg; }
+
+.c { color: $highlighted-c;
+ font-style: italic; }
+
+.err { color: $highlighted-err;
+ background-color: $highlighted-err-bg; }
.k { font-weight: $gl-font-weight-bold; }
.o { font-weight: $gl-font-weight-bold; }
-.cm { color: $highlighted-cm; font-style: italic; }
-.cp { color: $highlighted-cp; font-weight: $gl-font-weight-bold; }
-.c1 { color: $highlighted-c1; font-style: italic; }
-.cs { color: $highlighted-cs; font-weight: $gl-font-weight-bold; font-style: italic; }
+
+.cm { color: $highlighted-cm;
+ font-style: italic; }
+
+.cp { color: $highlighted-cp;
+ font-weight: $gl-font-weight-bold; }
+
+.c1 { color: $highlighted-c1;
+ font-style: italic; }
+
+.cs { color: $highlighted-cs;
+ font-weight: $gl-font-weight-bold;
+ font-style: italic; }
.gd {
color: $highlighted-gd;
@@ -187,24 +200,34 @@ span.highlight_word {
.go { color: $highlighted-go; }
.gp { color: $highlighted-gp; }
.gs { font-weight: $gl-font-weight-bold; }
-.gu { color: $highlighted-gu; font-weight: $gl-font-weight-bold; }
+
+.gu { color: $highlighted-gu;
+ font-weight: $gl-font-weight-bold; }
.gt { color: $highlighted-gt; }
.kc { font-weight: $gl-font-weight-bold; }
.kd { font-weight: $gl-font-weight-bold; }
.kn { font-weight: $gl-font-weight-bold; }
.kp { font-weight: $gl-font-weight-bold; }
.kr { font-weight: $gl-font-weight-bold; }
-.kt { color: $highlighted-kt; font-weight: $gl-font-weight-bold; }
+
+.kt { color: $highlighted-kt;
+ font-weight: $gl-font-weight-bold; }
.m { color: $highlighted-m; }
.s { color: $highlighted-s; }
.n { color: $highlighted-n; }
.na { color: $highlighted-na; }
.nb { color: $highlighted-nb; }
-.nc { color: $highlighted-nc; font-weight: $gl-font-weight-bold; }
+
+.nc { color: $highlighted-nc;
+ font-weight: $gl-font-weight-bold; }
.no { color: $highlighted-no; }
.ni { color: $highlighted-ni; }
-.ne { color: $highlighted-ne; font-weight: $gl-font-weight-bold; }
-.nf { color: $highlighted-nf; font-weight: $gl-font-weight-bold; }
+
+.ne { color: $highlighted-ne;
+ font-weight: $gl-font-weight-bold; }
+
+.nf { color: $highlighted-nf;
+ font-weight: $gl-font-weight-bold; }
.nn { color: $highlighted-nn; }
.nt { color: $highlighted-nt; }
.nv { color: $highlighted-nv; }
@@ -230,4 +253,6 @@ span.highlight_word {
.vg { color: $highlighted-vg; }
.vi { color: $highlighted-vi; }
.il { color: $highlighted-il; }
-.gc { color: $highlighted-gc; background-color: $highlighted-gc-bg; }
+
+.gc { color: $highlighted-gc;
+ background-color: $highlighted-gc-bg; }
diff --git a/app/assets/stylesheets/page_bundles/xterm.scss b/app/assets/stylesheets/page_bundles/xterm.scss
index 7f040ac9b96..de3f2a1177d 100644
--- a/app/assets/stylesheets/page_bundles/xterm.scss
+++ b/app/assets/stylesheets/page_bundles/xterm.scss
@@ -6,11 +6,11 @@
$black: #000;
$red: #ea1010;
- $green: #009900;
- $yellow: #999900;
+ $green: #090;
+ $yellow: #990;
$blue: #0073e6;
$magenta: #d411d4;
- $cyan: #009999;
+ $cyan: #099;
$white: #ccc;
$l-black: #373b41;
$l-red: #ff6161;
diff --git a/app/assets/stylesheets/pages/boards.scss b/app/assets/stylesheets/pages/boards.scss
index a9324ba2ed0..81216b2b98e 100644
--- a/app/assets/stylesheets/pages/boards.scss
+++ b/app/assets/stylesheets/pages/boards.scss
@@ -3,7 +3,6 @@
}
.user-can-drag {
- cursor: -webkit-grab;
cursor: grab;
}
@@ -12,12 +11,8 @@
opacity: 1 !important;
* {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
user-select: none;
// !important to make sure no style can override this when dragging
- cursor: -webkit-grabbing !important;
cursor: grabbing !important;
}
}
@@ -501,7 +496,6 @@
}
.add-issues-modal {
- display: -webkit-flex;
display: flex;
position: fixed;
top: 0;
@@ -513,9 +507,7 @@
}
.add-issues-container {
- display: -webkit-flex;
display: flex;
- -webkit-flex-direction: column;
flex-direction: column;
width: 90vw;
height: 85vh;
@@ -528,16 +520,12 @@
box-shadow: 0 2px 12px rgba($black, 0.5);
.empty-state {
- display: -webkit-flex;
display: flex;
- -webkit-flex: 1;
flex: 1;
margin-top: 0;
&.add-issues-empty-state-filter {
- -webkit-flex-direction: column;
flex-direction: column;
- -webkit-justify-content: center;
justify-content: center;
}
@@ -566,11 +554,9 @@
}
.add-issues-search {
- display: -webkit-flex;
display: flex;
.issues-filters {
- -webkit-flex: 1;
flex: 1;
}
}
@@ -588,9 +574,7 @@
}
.add-issues-list {
- display: -webkit-flex;
display: flex;
- -webkit-flex: 1;
flex: 1;
padding-top: 3px;
margin-left: -$gl-vert-padding;
@@ -609,7 +593,6 @@
}
.add-issues-list-loading {
- -webkit-align-self: center;
align-self: center;
width: 100%;
padding-left: $gl-vert-padding;
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index 11966931a6c..670e320dbc2 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -342,11 +342,11 @@
}
&.invalid {
- @include status-color($gray-dark, color("gray"), $gray-darkest);
+ @include status-color($gray-dark, color('gray'), $gray-darkest);
border-color: $gray-darkest;
&:not(span):hover {
- color: color("gray");
+ color: color('gray');
}
}
}
diff --git a/app/assets/stylesheets/pages/cycle_analytics.scss b/app/assets/stylesheets/pages/cycle_analytics.scss
index ec2108b15be..2b932d164a5 100644
--- a/app/assets/stylesheets/pages/cycle_analytics.scss
+++ b/app/assets/stylesheets/pages/cycle_analytics.scss
@@ -330,7 +330,6 @@
// Custom Styles for stage items
.item-build-component {
-
.item-title {
.icon-build-status {
float: left;
diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss
index d001dff7986..e50db5310a6 100644
--- a/app/assets/stylesheets/pages/diff.scss
+++ b/app/assets/stylesheets/pages/diff.scss
@@ -9,7 +9,6 @@
@media (min-width: map-get($grid-breakpoints, md)) {
$mr-file-header-top: $mr-version-controls-height + $header-height + $mr-tabs-height;
- position: -webkit-sticky;
position: sticky;
top: $mr-file-header-top;
z-index: 102;
@@ -54,6 +53,10 @@
background-color: $gray-normal;
}
+ a {
+ color: $gray-700;
+ }
+
svg {
vertical-align: middle;
top: -1px;
@@ -239,22 +242,18 @@
img {
border: 1px solid $white-light;
- background-image: linear-gradient(
- 45deg,
- $border-color 25%,
- transparent 25%,
- transparent 75%,
- $border-color 75%,
- $border-color 100%
- ),
- linear-gradient(
- 45deg,
- $border-color 25%,
- transparent 25%,
- transparent 75%,
- $border-color 75%,
- $border-color 100%
- );
+ background-image: linear-gradient(45deg,
+ $border-color 25%,
+ transparent 25%,
+ transparent 75%,
+ $border-color 75%,
+ $border-color 100%),
+ linear-gradient(45deg,
+ $border-color 25%,
+ transparent 25%,
+ transparent 75%,
+ $border-color 75%,
+ $border-color 100%);
background-size: 10px 10px;
background-position: 0 0, 5px 5px;
max-width: 100%;
@@ -510,10 +509,10 @@
.diff-stats {
align-items: center;
- padding: 0 .25rem;
+ padding: 0 0.25rem;
.diff-stats-group {
- padding: 0 .25rem;
+ padding: 0 0.25rem;
}
svg.diff-stats-icon {
@@ -522,7 +521,7 @@
&.is-compare-versions-header {
.diff-stats-group {
- padding: 0 .5rem;
+ padding: 0 0.5rem;
}
}
}
@@ -726,7 +725,6 @@
}
@include media-breakpoint-up(sm) {
- position: -webkit-sticky;
position: sticky;
top: $header-height;
background-color: $white-light;
@@ -834,34 +832,26 @@
width: 100%;
height: 10px;
background-color: $white-light;
- background-image: linear-gradient(
- 45deg,
- transparent,
- transparent 73%,
- $diff-jagged-border-gradient-color 75%,
- $white-light 80%
- ),
- linear-gradient(
- 225deg,
- transparent,
- transparent 73%,
- $diff-jagged-border-gradient-color 75%,
- $white-light 80%
- ),
- linear-gradient(
- 135deg,
- transparent,
- transparent 73%,
- $diff-jagged-border-gradient-color 75%,
- $white-light 80%
- ),
- linear-gradient(
- -45deg,
- transparent,
- transparent 73%,
- $diff-jagged-border-gradient-color 75%,
- $white-light 80%
- );
+ background-image: linear-gradient(45deg,
+ transparent,
+ transparent 73%,
+ $diff-jagged-border-gradient-color 75%,
+ $white-light 80%),
+ linear-gradient(225deg,
+ transparent,
+ transparent 73%,
+ $diff-jagged-border-gradient-color 75%,
+ $white-light 80%),
+ linear-gradient(135deg,
+ transparent,
+ transparent 73%,
+ $diff-jagged-border-gradient-color 75%,
+ $white-light 80%),
+ linear-gradient(-45deg,
+ transparent,
+ transparent 73%,
+ $diff-jagged-border-gradient-color 75%,
+ $white-light 80%);
background-position: 5px 5px, 0 5px, 0 5px, 5px 5px;
background-size: 10px 10px;
background-repeat: repeat;
@@ -904,7 +894,7 @@
}
}
-.files:not([data-can-create-note="true"]) .frame {
+.files:not([data-can-create-note='true']) .frame {
cursor: auto;
}
@@ -913,15 +903,14 @@
.btn-transparent.image-diff-overlay-add-comment {
position: relative;
cursor: image-url('illustrations/image_comment_light_cursor.svg')
- $image-comment-cursor-left-offset $image-comment-cursor-top-offset,
+ $image-comment-cursor-left-offset $image-comment-cursor-top-offset,
auto;
// Retina cursor
- cursor: -webkit-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,
+ // 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;
.comment-indicator {
@@ -1026,7 +1015,6 @@
}
.diff-tree-list {
- position: -webkit-sticky;
position: sticky;
$top-pos: $header-height + $mr-tabs-height + $mr-version-controls-height + 10px;
top: $header-height + $mr-tabs-height + $mr-version-controls-height + 10px;
diff --git a/app/assets/stylesheets/pages/graph.scss b/app/assets/stylesheets/pages/graph.scss
index 83b1680512d..3febf4cf826 100644
--- a/app/assets/stylesheets/pages/graph.scss
+++ b/app/assets/stylesheets/pages/graph.scss
@@ -71,12 +71,10 @@
.svg-graph-container-with-grab {
cursor: grab;
- cursor: -webkit-grab;
}
.svg-graph-container-grabbed {
cursor: grabbing;
- cursor: -webkit-grabbing;
}
@keyframes flickerAnimation {
diff --git a/app/assets/stylesheets/pages/help.scss b/app/assets/stylesheets/pages/help.scss
index 2c23f31c240..161d4dbfb22 100644
--- a/app/assets/stylesheets/pages/help.scss
+++ b/app/assets/stylesheets/pages/help.scss
@@ -30,7 +30,7 @@
.key {
@extend .badge.badge-pill;
background-color: $label-inverse-bg;
- font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+ font: 11px Consolas, 'Liberation Mono', Menlo, Courier, monospace;
padding: 3px 5px;
}
}
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index e0bdc1341b1..623fa485ba6 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -22,6 +22,7 @@
.detail-page-header,
.page-content-header,
.commit-box,
+ .info-well,
.commit-ci-menu,
.files-changed-inner,
.limited-header-width,
@@ -136,7 +137,7 @@
color: $blue-800;
.avatar {
- border-color: rgba($gray-normal, .2);
+ border-color: rgba($gray-normal, 0.2);
}
}
@@ -223,7 +224,7 @@
}
a.edit-link:not([href]):hover {
- color: rgba($gray-normal, .2);
+ color: rgba($gray-normal, 0.2);
}
.lock-edit, // uses same style, different js behaviour
@@ -711,14 +712,11 @@
.issuable-list {
li {
-
.issue-box {
- display: -webkit-flex;
display: flex;
}
.issuable-info-container {
- -webkit-flex: 1;
flex: 1;
display: flex;
padding-right: $gl-padding;
@@ -813,7 +811,6 @@
.sidebar-collapsed-icon {
-
> .stopwatch-svg {
display: inline-block;
}
@@ -871,11 +868,11 @@
}
.help-state-toggle-enter-active {
- transition: all .8s ease;
+ transition: all 0.8s ease;
}
.help-state-toggle-leave-active {
- transition: all .5s ease;
+ transition: all 0.5s ease;
}
.help-state-toggle-enter,
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 0037364978c..9f30495a7ef 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -58,8 +58,6 @@ form.edit-issue {
}
ul.related-merge-requests > li {
- display: -ms-flexbox;
- display: -webkit-flex;
display: flex;
align-items: center;
diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss
index 2372640277e..75d219320ef 100644
--- a/app/assets/stylesheets/pages/labels.scss
+++ b/app/assets/stylesheets/pages/labels.scss
@@ -95,13 +95,11 @@
.prioritized-labels & {
box-shadow: 0 1px 2px $issue-boards-card-shadow;
cursor: move;
- cursor: -webkit-grab;
- cursor: -moz-grab;
+ cursor: grab;
border: 0;
&:active {
- cursor: -webkit-grabbing;
- cursor: -moz-grabbing;
+ cursor: grabbing;
}
}
}
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 67d7a8175ac..22a515cbdaa 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -120,7 +120,6 @@
}
.new-session-tabs {
- display: -webkit-flex;
display: flex;
box-shadow: 0 0 0 1px $border-color;
border-top-right-radius: $border-radius-default;
@@ -190,7 +189,7 @@
margin-top: 16px;
}
- input[type="submit"] {
+ input[type='submit'] {
@extend .btn-block;
margin-bottom: 0;
}
diff --git a/app/assets/stylesheets/pages/members.scss b/app/assets/stylesheets/pages/members.scss
index 99609a96976..eb32beb0972 100644
--- a/app/assets/stylesheets/pages/members.scss
+++ b/app/assets/stylesheets/pages/members.scss
@@ -27,7 +27,6 @@
.controls {
@include media-breakpoint-up(sm) {
- display: -webkit-flex;
display: flex;
}
diff --git a/app/assets/stylesheets/pages/merge_conflicts.scss b/app/assets/stylesheets/pages/merge_conflicts.scss
index e0f7d075fc7..278a9014458 100644
--- a/app/assets/stylesheets/pages/merge_conflicts.scss
+++ b/app/assets/stylesheets/pages/merge_conflicts.scss
@@ -20,81 +20,81 @@ $colors: (
white-header-not-chosen : #f0f0f0,
white-line-not-chosen : $gray-light,
- dark-header-head-neutral : rgba(#3f3, .2),
- dark-line-head-neutral : rgba(#3f3, .1),
+ dark-header-head-neutral : rgba(#3f3, 0.2),
+ dark-line-head-neutral : rgba(#3f3, 0.1),
dark-button-head-neutral : #40874f,
- dark-header-head-chosen : rgba(#3f3, .33),
- dark-line-head-chosen : rgba(#3f3, .2),
+ dark-header-head-chosen : rgba(#3f3, 0.33),
+ dark-line-head-chosen : rgba(#3f3, 0.2),
dark-button-head-chosen : #258537,
- dark-header-origin-neutral : rgba(#2878c9, .4),
- dark-line-origin-neutral : rgba(#2878c9, .3),
+ dark-header-origin-neutral : rgba(#2878c9, 0.4),
+ dark-line-origin-neutral : rgba(#2878c9, 0.3),
dark-button-origin-neutral : #2a5c8c,
- dark-header-origin-chosen : rgba(#2878c9, .6),
- dark-line-origin-chosen : rgba(#2878c9, .4),
+ dark-header-origin-chosen : rgba(#2878c9, 0.6),
+ dark-line-origin-chosen : rgba(#2878c9, 0.4),
dark-button-origin-chosen : #1d6cbf,
- dark-header-not-chosen : rgba(#fff, .25),
- dark-line-not-chosen : rgba(#fff, .1),
+ dark-header-not-chosen : rgba(#fff, 0.25),
+ dark-line-not-chosen : rgba(#fff, 0.1),
- monokai-header-head-neutral : rgba(#a6e22e, .25),
- monokai-line-head-neutral : rgba(#a6e22e, .1),
+ monokai-header-head-neutral : rgba(#a6e22e, 0.25),
+ monokai-line-head-neutral : rgba(#a6e22e, 0.1),
monokai-button-head-neutral : #376b20,
- monokai-header-head-chosen : rgba(#a6e22e, .4),
- monokai-line-head-chosen : rgba(#a6e22e, .25),
+ monokai-header-head-chosen : rgba(#a6e22e, 0.4),
+ monokai-line-head-chosen : rgba(#a6e22e, 0.25),
monokai-button-head-chosen : #39800d,
- monokai-header-origin-neutral : rgba(#60d9f1, .35),
- monokai-line-origin-neutral : rgba(#60d9f1, .15),
+ monokai-header-origin-neutral : rgba(#60d9f1, 0.35),
+ monokai-line-origin-neutral : rgba(#60d9f1, 0.15),
monokai-button-origin-neutral : #38848c,
- monokai-header-origin-chosen : rgba(#60d9f1, .5),
- monokai-line-origin-chosen : rgba(#60d9f1, .35),
+ monokai-header-origin-chosen : rgba(#60d9f1, 0.5),
+ monokai-line-origin-chosen : rgba(#60d9f1, 0.35),
monokai-button-origin-chosen : #3ea4b2,
- monokai-header-not-chosen : rgba(#76715d, .24),
- monokai-line-not-chosen : rgba(#76715d, .1),
+ monokai-header-not-chosen : rgba(#76715d, 0.24),
+ monokai-line-not-chosen : rgba(#76715d, 0.1),
- solarized-light-header-head-neutral : rgba(#859900, .37),
- solarized-light-line-head-neutral : rgba(#859900, .2),
+ solarized-light-header-head-neutral : rgba(#859900, 0.37),
+ solarized-light-line-head-neutral : rgba(#859900, 0.2),
solarized-light-button-head-neutral : #afb262,
- solarized-light-header-head-chosen : rgba(#859900, .5),
- solarized-light-line-head-chosen : rgba(#859900, .37),
+ solarized-light-header-head-chosen : rgba(#859900, 0.5),
+ solarized-light-line-head-chosen : rgba(#859900, 0.37),
solarized-light-button-head-chosen : #94993d,
- solarized-light-header-origin-neutral : rgba(#2878c9, .37),
- solarized-light-line-origin-neutral : rgba(#2878c9, .15),
+ solarized-light-header-origin-neutral : rgba(#2878c9, 0.37),
+ solarized-light-line-origin-neutral : rgba(#2878c9, 0.15),
solarized-light-button-origin-neutral : #60a1bf,
- solarized-light-header-origin-chosen : rgba(#2878c9, .6),
- solarized-light-line-origin-chosen : rgba(#2878c9, .37),
+ solarized-light-header-origin-chosen : rgba(#2878c9, 0.6),
+ solarized-light-line-origin-chosen : rgba(#2878c9, 0.37),
solarized-light-button-origin-chosen : #2482b2,
- solarized-light-header-not-chosen : rgba(#839496, .37),
- solarized-light-line-not-chosen : rgba(#839496, .2),
+ solarized-light-header-not-chosen : rgba(#839496, 0.37),
+ solarized-light-line-not-chosen : rgba(#839496, 0.2),
- solarized-dark-header-head-neutral : rgba(#859900, .35),
- solarized-dark-line-head-neutral : rgba(#859900, .15),
+ solarized-dark-header-head-neutral : rgba(#859900, 0.35),
+ solarized-dark-line-head-neutral : rgba(#859900, 0.15),
solarized-dark-button-head-neutral : #376b20,
- solarized-dark-header-head-chosen : rgba(#859900, .5),
- solarized-dark-line-head-chosen : rgba(#859900, .35),
+ solarized-dark-header-head-chosen : rgba(#859900, 0.5),
+ solarized-dark-line-head-chosen : rgba(#859900, 0.35),
solarized-dark-button-head-chosen : #39800d,
- solarized-dark-header-origin-neutral : rgba(#2878c9, .35),
- solarized-dark-line-origin-neutral : rgba(#2878c9, .15),
+ solarized-dark-header-origin-neutral : rgba(#2878c9, 0.35),
+ solarized-dark-line-origin-neutral : rgba(#2878c9, 0.15),
solarized-dark-button-origin-neutral : #086799,
- solarized-dark-header-origin-chosen : rgba(#2878c9, .6),
- solarized-dark-line-origin-chosen : rgba(#2878c9, .35),
+ solarized-dark-header-origin-chosen : rgba(#2878c9, 0.6),
+ solarized-dark-line-origin-chosen : rgba(#2878c9, 0.35),
solarized-dark-button-origin-chosen : #0082cc,
- solarized_dark_header_not_chosen : rgba(#839496, .25),
- solarized_dark_line_not_chosen : rgba(#839496, .15),
+ solarized_dark_header_not_chosen : rgba(#839496, 0.25),
+ solarized_dark_line_not_chosen : rgba(#839496, 0.15),
none_header_head_neutral : $gray-normal,
none_line_head_neutral : $gray-normal,
@@ -210,26 +210,20 @@ $colors: (
}
#conflicts {
-
.white {
- @include color-scheme('white')
- }
+ @include color-scheme('white'); }
.dark {
- @include color-scheme('dark')
- }
+ @include color-scheme('dark'); }
.monokai {
- @include color-scheme('monokai')
- }
+ @include color-scheme('monokai'); }
.solarized-light {
- @include color-scheme('solarized-light')
- }
+ @include color-scheme('solarized-light'); }
.solarized-dark {
- @include color-scheme('solarized-dark')
- }
+ @include color-scheme('solarized-dark'); }
.diff-wrap-lines .line_content {
white-space: normal;
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index cfd3faab122..e73d1a1289d 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -491,11 +491,9 @@
.merge-request {
padding: 10px 0 10px 15px;
position: relative;
- display: -webkit-flex;
display: flex;
.issuable-info-container {
- -webkit-flex: 1;
flex: 1;
}
@@ -786,7 +784,6 @@
}
@include media-breakpoint-up(md) {
- position: -webkit-sticky;
position: sticky;
top: $header-height + $mr-tabs-height;
width: 100%;
@@ -814,7 +811,6 @@
@include media-breakpoint-up(sm) {
position: sticky;
- position: -webkit-sticky;
}
&.affix {
diff --git a/app/assets/stylesheets/pages/milestone.scss b/app/assets/stylesheets/pages/milestone.scss
index 15f3a2ef4a8..3ca8e943a3a 100644
--- a/app/assets/stylesheets/pages/milestone.scss
+++ b/app/assets/stylesheets/pages/milestone.scss
@@ -67,18 +67,14 @@ $status-box-line-height: 26px;
.card-header {
line-height: $line-height-base;
padding: 14px 16px;
- display: -webkit-flex;
display: flex;
.title {
- -webkit-flex: 1;
- -webkit-flex-grow: 1;
flex: 1;
flex-grow: 2;
}
.counter {
- -webkit-flex: 1;
flex: 0;
padding-left: 16px;
}
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 51f755c67af..3343b55d24b 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -58,7 +58,7 @@
border: 1px solid $border-color;
border-radius: $border-radius-base;
transition: border-color ease-in-out 0.15s,
- box-shadow ease-in-out 0.15s;
+ box-shadow ease-in-out 0.15s;
&.is-focused {
@extend .form-control:focus;
@@ -72,7 +72,7 @@
&.is-dropzone-hover {
border-color: $green-500;
box-shadow: 0 0 2px $black-transparent,
- 0 0 4px $green-500-focus;
+ 0 0 4px $green-500-focus;
.comment-toolbar,
.nav-links {
@@ -84,9 +84,7 @@
.md-header .nav-links {
display: flex;
- display: -webkit-flex;
flex-flow: row wrap;
- -webkit-flex-flow: row wrap;
width: 100%;
.float-right {
@@ -444,7 +442,7 @@ table {
.uploading-error-message {
@include media-breakpoint-down(xs) {
&::after {
- content: "\a";
+ content: '\a';
white-space: pre;
}
}
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index 1198b9ea143..72f48e98c24 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -4,7 +4,7 @@ $note-form-margin-left: 72px;
@mixin vertical-line($left) {
&::before {
- content: "";
+ content: '';
border-left: 2px solid $gray-100;
position: absolute;
top: 0;
@@ -53,12 +53,12 @@ $note-form-margin-left: 72px;
&.note-form {
margin-left: 0;
- @include notes-media("min", map-get($grid-breakpoints, md)) {
+ @include notes-media('min', map-get($grid-breakpoints, md)) {
margin-left: $note-form-margin-left;
}
.timeline-icon {
- @include notes-media("min", map-get($grid-breakpoints, sm)) {
+ @include notes-media('min', map-get($grid-breakpoints, sm)) {
margin-left: -$note-icon-gutter-width;
}
}
@@ -242,7 +242,7 @@ $note-form-margin-left: 72px;
}
.note-header {
- @include notes-media("max", map-get($grid-breakpoints, xs)) {
+ @include notes-media('max', map-get($grid-breakpoints, xs)) {
.inline {
display: block;
}
@@ -304,7 +304,7 @@ $note-form-margin-left: 72px;
}
.timeline-content {
- @include notes-media("min", map-get($grid-breakpoints, sm)) {
+ @include notes-media('min', map-get($grid-breakpoints, sm)) {
margin-left: 30px;
}
}
@@ -348,7 +348,7 @@ $note-form-margin-left: 72px;
}
&::after {
- content: "";
+ content: '';
height: 70px;
position: absolute;
left: $gl-padding-24;
@@ -590,7 +590,7 @@ $note-form-margin-left: 72px;
.note-headline-light {
display: inline;
- @include notes-media("max", map-get($grid-breakpoints, xs)) {
+ @include notes-media('max', map-get($grid-breakpoints, xs)) {
display: block;
}
}
@@ -656,7 +656,7 @@ $note-form-margin-left: 72px;
margin-left: 10px;
color: $gray-darkest;
- @include notes-media("max", map-get($grid-breakpoints, sm) - 1) {
+ @include notes-media('max', map-get($grid-breakpoints, sm) - 1) {
float: none;
margin-left: 0;
}
@@ -775,7 +775,7 @@ $note-form-margin-left: 72px;
}
.line-resolve-all-container {
- @include notes-media("min", map-get($grid-breakpoints, sm)) {
+ @include notes-media('min', map-get($grid-breakpoints, sm)) {
margin-right: 0;
}
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index e676d48c1f4..2b6319ddd4f 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -341,13 +341,15 @@
&.builds .ci-table tr {
height: 71px;
}
-}
-.build-failures {
- th {
- border-top: 0;
+ .ci-table {
+ thead th {
+ border-top: 0;
+ }
}
+}
+.build-failures {
.build-state {
padding: 20px 2px;
@@ -994,7 +996,6 @@ button.mini-pipeline-graph-dropdown-toggle {
* Top arrow in the dropdown in the mini pipeline graph
*/
.mini-pipeline-graph-dropdown-menu {
-
&::before,
&::after {
content: '';
diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss
index a1e847009fc..ab26259c007 100644
--- a/app/assets/stylesheets/pages/profile.scss
+++ b/app/assets/stylesheets/pages/profile.scss
@@ -270,11 +270,9 @@
position: static;
padding: 0 16px;
margin-bottom: 20px;
- display: -webkit-flex;
display: flex;
.btn {
- -webkit-flex-grow: 1;
flex-grow: 1;
&:first-child {
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 277030ad3af..1349845f300 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -571,9 +571,7 @@
.import-buttons {
padding-left: 0;
- display: -webkit-flex;
display: flex;
- -webkit-flex-wrap: wrap;
flex-wrap: wrap;
.btn {
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index 149c3254d84..20bdc6596e9 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -84,9 +84,7 @@ input[type='checkbox']:hover {
.search-icon {
transition: color $default-transition-duration;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
+ user-select: none;
}
.clear-icon {
@@ -185,13 +183,11 @@ input[type='checkbox']:hover {
.search-holder {
@include media-breakpoint-up(sm) {
- display: -webkit-flex;
display: flex;
}
.search-field-holder,
.project-filter-form {
- -webkit-flex: 1 0 auto;
flex: 1 0 auto;
position: relative;
margin-right: 0;
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index 811cc310a8f..4f9d96da4bd 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -316,8 +316,4 @@
.push-pull-table {
margin-top: 1em;
-
- .mirror-action-buttons {
- padding-right: 0;
- }
}
diff --git a/app/assets/stylesheets/pages/status.scss b/app/assets/stylesheets/pages/status.scss
index 7d59dd3b5d1..f4d568d02ac 100644
--- a/app/assets/stylesheets/pages/status.scss
+++ b/app/assets/stylesheets/pages/status.scss
@@ -33,7 +33,7 @@
border-color: $gl-text-color;
&:not(span):hover {
- background-color: rgba($gl-text-color, .07);
+ background-color: rgba($gl-text-color, 0.07);
}
}
@@ -54,7 +54,7 @@
border-color: $gl-text-color-secondary;
&:not(span):hover {
- background-color: rgba($gl-text-color-secondary, .07);
+ background-color: rgba($gl-text-color-secondary, 0.07);
}
}
}
diff --git a/app/assets/stylesheets/pages/todos.scss b/app/assets/stylesheets/pages/todos.scss
index 3fc37e20c36..2a1e8345755 100644
--- a/app/assets/stylesheets/pages/todos.scss
+++ b/app/assets/stylesheets/pages/todos.scss
@@ -6,9 +6,7 @@
.todos-list > .todo {
// workaround because we cannot use border-colapse
border-top: 1px solid transparent;
- display: -webkit-flex;
display: flex;
- -webkit-flex-direction: row;
flex-direction: row;
&:hover {
@@ -29,23 +27,18 @@
.todo-avatar,
.todo-actions {
@include transition(opacity);
- -webkit-flex: 0 0 auto;
flex: 0 0 auto;
}
.todo-actions {
- display: -webkit-flex;
display: flex;
- -webkit-justify-content: center;
justify-content: center;
- -webkit-flex-direction: column;
flex-direction: column;
margin-left: 10px;
min-width: 55px;
}
.todo-item {
- -webkit-flex: 0 1 100%;
flex: 0 1 100%;
min-width: 0;
}
@@ -60,13 +53,13 @@
.todo-avatar,
.todo-item {
- opacity: .6;
+ opacity: 0.6;
}
}
.todo-avatar,
.todo-item {
- opacity: .2;
+ opacity: 0.2;
}
.btn {
@@ -82,7 +75,6 @@
display: flex;
> .title-item {
- -webkit-flex: 0 0 auto;
flex: 0 0 auto;
margin: 0 2px;
@@ -96,7 +88,6 @@
}
.todo-label {
- -webkit-flex: 0 1 auto;
flex: 0 1 auto;
overflow: hidden;
text-overflow: ellipsis;
@@ -222,23 +213,19 @@
}
.todos-empty {
- display: -webkit-flex;
display: flex;
- -webkit-flex-direction: column;
flex-direction: column;
max-width: 900px;
margin-left: auto;
margin-right: auto;
@include media-breakpoint-up(sm) {
- -webkit-flex-direction: row;
flex-direction: row;
padding-top: 80px;
}
}
.todos-empty-content {
- -webkit-align-self: center;
align-self: center;
max-width: 480px;
margin-right: 20px;
@@ -252,7 +239,6 @@
@include media-breakpoint-up(sm) {
width: 300px;
margin-right: 0;
- -webkit-order: 2;
order: 2;
}
}
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index a46b8679a42..5664f46484e 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -172,26 +172,6 @@
text-decoration: inherit;
}
}
-
- .tree_commit {
- max-width: 320px;
-
- .str-truncated {
- max-width: 100%;
- }
- }
-
- .tree_time_ago {
- min-width: 135px;
- }
- }
-
- .tree_author {
- padding-right: 8px;
-
- .commit-author-name {
- color: $gl-text-color;
- }
}
.tree-truncated-warning {
diff --git a/app/assets/stylesheets/pages/ui_dev_kit.scss b/app/assets/stylesheets/pages/ui_dev_kit.scss
index 84c617c7ec0..7744fd814d0 100644
--- a/app/assets/stylesheets/pages/ui_dev_kit.scss
+++ b/app/assets/stylesheets/pages/ui_dev_kit.scss
@@ -10,7 +10,7 @@
margin-bottom: 15px;
&::before {
- content: "Example";
+ content: 'Example';
color: $ui-dev-kit-example-color;
}
}
diff --git a/app/controllers/admin/appearances_controller.rb b/app/controllers/admin/appearances_controller.rb
index 2b9cae21da2..189fee98aa0 100644
--- a/app/controllers/admin/appearances_controller.rb
+++ b/app/controllers/admin/appearances_controller.rb
@@ -78,6 +78,7 @@ class Admin::AppearancesController < Admin::ApplicationController
footer_message
message_background_color
message_font_color
+ email_header_and_footer_enabled
]
end
end
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index 0b6ff491c66..8a00408001e 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::RunnersController < Admin::ApplicationController
- before_action :runner, except: :index
+ before_action :runner, except: [:index, :tag_list]
def index
finder = Admin::RunnersFinder.new(params: params)
@@ -48,6 +48,12 @@ class Admin::RunnersController < Admin::ApplicationController
end
end
+ def tag_list
+ tags = Autocomplete::ActsAsTaggableOn::TagsFinder.new(params: params).execute
+
+ render json: ActsAsTaggableOn::TagSerializer.new.represent(tags)
+ end
+
private
def runner
diff --git a/app/controllers/clusters/applications_controller.rb b/app/controllers/clusters/applications_controller.rb
index c4e7fc950f9..73c744efeba 100644
--- a/app/controllers/clusters/applications_controller.rb
+++ b/app/controllers/clusters/applications_controller.rb
@@ -3,26 +3,41 @@
class Clusters::ApplicationsController < Clusters::BaseController
before_action :cluster
before_action :authorize_create_cluster!, only: [:create]
+ before_action :authorize_update_cluster!, only: [:update]
def create
- Clusters::Applications::CreateService
- .new(@cluster, current_user, create_cluster_application_params)
- .execute(request)
+ request_handler do
+ Clusters::Applications::CreateService
+ .new(@cluster, current_user, cluster_application_params)
+ .execute(request)
+ end
+ end
+
+ def update
+ request_handler do
+ Clusters::Applications::UpdateService
+ .new(@cluster, current_user, cluster_application_params)
+ .execute(request)
+ end
+ end
+
+ private
+
+ def request_handler
+ yield
head :no_content
- rescue Clusters::Applications::CreateService::InvalidApplicationError
+ rescue Clusters::Applications::BaseService::InvalidApplicationError
render_404
rescue StandardError
head :bad_request
end
- private
-
def cluster
@cluster ||= clusterable.clusters.find(params[:id]) || render_404
end
- def create_cluster_application_params
+ def cluster_application_params
params.permit(:application, :hostname, :email)
end
end
diff --git a/app/controllers/concerns/continue_params.rb b/app/controllers/concerns/continue_params.rb
index f0e6adf4dec..54c0510497f 100644
--- a/app/controllers/concerns/continue_params.rb
+++ b/app/controllers/concerns/continue_params.rb
@@ -6,7 +6,7 @@ module ContinueParams
def continue_params
continue_params = params[:continue]
- return nil unless continue_params
+ return unless continue_params
continue_params = continue_params.permit(:to, :notice, :notice_now)
continue_params[:to] = safe_redirect_path(continue_params[:to])
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index cd3fa641e89..05d88429cfe 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -8,7 +8,7 @@ module IssuableActions
before_action :authorize_destroy_issuable!, only: :destroy
before_action :authorize_admin_issuable!, only: :bulk_update
before_action only: :show do
- push_frontend_feature_flag(:reply_to_individual_notes)
+ push_frontend_feature_flag(:reply_to_individual_notes, default_enabled: true)
end
end
diff --git a/app/controllers/concerns/milestone_actions.rb b/app/controllers/concerns/milestone_actions.rb
index eccbe35577b..c0c0160a827 100644
--- a/app/controllers/concerns/milestone_actions.rb
+++ b/app/controllers/concerns/milestone_actions.rb
@@ -8,7 +8,7 @@ module MilestoneActions
format.html { redirect_to milestone_redirect_path }
format.json do
render json: tabs_json("shared/milestones/_merge_requests_tab", {
- merge_requests: @milestone.sorted_merge_requests, # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ merge_requests: @milestone.sorted_merge_requests(current_user), # rubocop:disable Gitlab/ModuleWithInstanceVariables
show_project_name: true
})
end
diff --git a/app/controllers/concerns/renders_notes.rb b/app/controllers/concerns/renders_notes.rb
index ce36da6b715..18015b1de88 100644
--- a/app/controllers/concerns/renders_notes.rb
+++ b/app/controllers/concerns/renders_notes.rb
@@ -16,7 +16,7 @@ module RendersNotes
private
def preload_max_access_for_authors(notes, project)
- return nil unless project
+ return unless project
user_ids = notes.map(&:author_id)
project.team.max_member_access_for_user_ids(user_ids)
diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb
index b1d224d026f..b044affd4e8 100644
--- a/app/controllers/dashboard/projects_controller.rb
+++ b/app/controllers/dashboard/projects_controller.rb
@@ -13,7 +13,13 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
@projects = load_projects(params.merge(non_public: true))
respond_to do |format|
- format.html
+ format.html do
+ # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37434
+ # Also https://gitlab.com/gitlab-org/gitlab-ce/issues/40260
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ render
+ end
+ end
format.atom do
load_events
render layout: 'xml.atom'
diff --git a/app/controllers/google_api/authorizations_controller.rb b/app/controllers/google_api/authorizations_controller.rb
index dd9f5af61b3..ed0995e7ffd 100644
--- a/app/controllers/google_api/authorizations_controller.rb
+++ b/app/controllers/google_api/authorizations_controller.rb
@@ -2,6 +2,10 @@
module GoogleApi
class AuthorizationsController < ApplicationController
+ include Gitlab::Utils::StrongMemoize
+
+ before_action :validate_session_key!
+
def callback
token, expires_at = GoogleApi::CloudPlatform::Client
.new(nil, callback_google_api_auth_url)
@@ -11,21 +15,27 @@ module GoogleApi
session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at] =
expires_at.to_s
- state_redirect_uri = redirect_uri_from_session_key(params[:state])
-
- if state_redirect_uri
- redirect_to state_redirect_uri
- else
- redirect_to root_path
- end
+ redirect_to redirect_uri_from_session
end
private
- def redirect_uri_from_session_key(state)
- key = GoogleApi::CloudPlatform::Client
- .session_key_for_redirect_uri(params[:state])
- session[key] if key
+ def validate_session_key!
+ access_denied! unless redirect_uri_from_session.present?
+ end
+
+ def redirect_uri_from_session
+ strong_memoize(:redirect_uri_from_session) do
+ if params[:state].present?
+ session[session_key_for_redirect_uri(params[:state])]
+ else
+ nil
+ end
+ end
+ end
+
+ def session_key_for_redirect_uri(state)
+ GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(state)
end
end
end
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index 3ef03bc9622..e147d32be2e 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -3,9 +3,16 @@
class GraphqlController < ApplicationController
# Unauthenticated users have access to the API for public data
skip_before_action :authenticate_user!
- prepend_before_action(only: [:execute]) { authenticate_sessionless_user!(:api) }
+
+ # Allow missing CSRF tokens, this would mean that if a CSRF is invalid or missing,
+ # the user won't be authenticated but can proceed as an anonymous user.
+ #
+ # If a CSRF is valid, the user is authenticated. This makes it easier to play
+ # around in GraphiQL.
+ protect_from_forgery with: :null_session, only: :execute
before_action :check_graphql_feature_flag!
+ before_action(only: [:execute]) { authenticate_sessionless_user!(:api) }
def execute
variables = Gitlab::Graphql::Variables.new(params[:variables]).to_h
diff --git a/app/controllers/profiles/active_sessions_controller.rb b/app/controllers/profiles/active_sessions_controller.rb
index efe7ede5efa..c473023cacb 100644
--- a/app/controllers/profiles/active_sessions_controller.rb
+++ b/app/controllers/profiles/active_sessions_controller.rb
@@ -2,15 +2,6 @@
class Profiles::ActiveSessionsController < Profiles::ApplicationController
def index
- @sessions = ActiveSession.list(current_user)
- end
-
- def destroy
- ActiveSession.destroy(current_user, params[:id])
-
- respond_to do |format|
- format.html { redirect_to profile_active_sessions_url, status: :found }
- format.js { head :ok }
- end
+ @sessions = ActiveSession.list(current_user).reject(&:is_impersonated)
end
end
diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb
index e0677ce3fbc..6504fd6c08a 100644
--- a/app/controllers/projects/application_controller.rb
+++ b/app/controllers/projects/application_controller.rb
@@ -17,7 +17,7 @@ class Projects::ApplicationController < ApplicationController
def project
return @project if @project
- return nil unless params[:project_id] || params[:id]
+ return unless params[:project_id] || params[:id]
path = File.join(params[:namespace_id], params[:project_id] || params[:id])
auth_proc = ->(project) { !project.pending_delete? }
diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb
index 9c130af8394..0e3f13045ce 100644
--- a/app/controllers/projects/autocomplete_sources_controller.rb
+++ b/app/controllers/projects/autocomplete_sources_controller.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class Projects::AutocompleteSourcesController < Projects::ApplicationController
+ before_action :authorize_read_milestone!, only: :milestones
+
def members
render json: ::Projects::ParticipantsService.new(@project, current_user).execute(target)
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 77672e7d9fc..0a33856a8d3 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -90,65 +90,21 @@ class Projects::BlobController < Projects::ApplicationController
def diff
apply_diff_view_cookie!
- @blob.load_all_data!
- @lines = @blob.present.highlight.lines
-
- @form = UnfoldForm.new(params.to_unsafe_h)
-
- @lines = @lines[@form.since - 1..@form.to - 1].map(&:html_safe)
-
- if @form.bottom?
- @match_line = ''
- else
- lines_length = @lines.length - 1
- line = [@form.since, lines_length].join(',')
- @match_line = "@@ -#{line}+#{line} @@"
- end
+ @form = Blobs::UnfoldPresenter.new(blob, params.to_unsafe_h)
- # We can keep only 'render_diff_lines' from this conditional when
+ # keep only json rendering when
# https://gitlab.com/gitlab-org/gitlab-ce/issues/44988 is done
if rendered_for_merge_request?
- render_diff_lines
+ render json: DiffLineSerializer.new.represent(@form.diff_lines)
else
+ @lines = @form.lines
+ @match_line = @form.match_line_text
render layout: false
end
end
private
- # Converts a String array to Gitlab::Diff::Line array
- def render_diff_lines
- @lines.map! do |line|
- # These are marked as context lines but are loaded from blobs.
- # We also have context lines loaded from diffs in other places.
- diff_line = Gitlab::Diff::Line.new(line, nil, nil, nil, nil)
- diff_line.rich_text = line
- diff_line
- end
-
- add_match_line
-
- render json: DiffLineSerializer.new.represent(@lines)
- end
-
- def add_match_line
- return unless @form.unfold?
-
- if @form.bottom? && @form.to < @blob.lines.size
- old_pos = @form.to - @form.offset
- new_pos = @form.to
- elsif @form.since != 1
- old_pos = new_pos = @form.since
- end
-
- # Match line is not needed when it reaches the top limit or bottom limit of the file.
- return unless new_pos
-
- @match_line = Gitlab::Diff::Line.new(@match_line, 'match', nil, old_pos, new_pos)
-
- @form.bottom? ? @lines.push(@match_line) : @lines.unshift(@match_line)
- end
-
def blob
@blob ||= @repository.blob_at(@commit.id, @path)
@@ -231,6 +187,8 @@ class Projects::BlobController < Projects::ApplicationController
end
def validate_diff_params
+ return if params[:full]
+
if [:since, :to, :offset].any? { |key| params[key].blank? }
head :ok
end
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index b13c0ae3967..939a09d4fd2 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -65,7 +65,11 @@ class Projects::CommitController < Projects::ApplicationController
# rubocop: enable CodeReuse/ActiveRecord
def merge_requests
- @merge_requests = @commit.merge_requests.map do |mr|
+ @merge_requests = MergeRequestsFinder.new(
+ current_user,
+ project_id: @project.id,
+ commit_sha: @commit.sha
+ ).execute.map do |mr|
{ iid: mr.iid, path: merge_request_path(mr), title: mr.title }
end
diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb
index 7c713c19762..bc942ba9288 100644
--- a/app/controllers/projects/group_links_controller.rb
+++ b/app/controllers/projects/group_links_controller.rb
@@ -13,9 +13,10 @@ class Projects::GroupLinksController < Projects::ApplicationController
group = Group.find(params[:link_group_id]) if params[:link_group_id].present?
if group
- return render_404 unless can?(current_user, :read_group, group)
+ result = Projects::GroupLinks::CreateService.new(project, current_user, group_link_create_params).execute(group)
+ return render_404 if result[:http_status] == 404
- Projects::GroupLinks::CreateService.new(project, current_user, group_link_create_params).execute(group)
+ flash[:alert] = result[:message] if result[:http_status] == 409
else
flash[:alert] = 'Please select a group.'
end
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb
index 518d41bd3fb..456d2c34768 100644
--- a/app/controllers/projects/merge_requests/diffs_controller.rb
+++ b/app/controllers/projects/merge_requests/diffs_controller.rb
@@ -46,8 +46,8 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
# rubocop: disable CodeReuse/ActiveRecord
def commit
- return nil unless commit_id = params[:commit_id].presence
- return nil unless @merge_request.all_commits.exists?(sha: commit_id)
+ return unless commit_id = params[:commit_id].presence
+ return unless @merge_request.all_commits.exists?(sha: commit_id)
@commit ||= @project.commit(commit_id)
end
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 46a44841c31..2903f7d705b 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -18,6 +18,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
before_action only: [:show] do
push_frontend_feature_flag(:diff_tree_filtering, default_enabled: true)
+ push_frontend_feature_flag(:expand_diff_full_file)
end
def index
diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb
index 521ec2acebb..7276964b6e1 100644
--- a/app/controllers/projects/settings/operations_controller.rb
+++ b/app/controllers/projects/settings/operations_controller.rb
@@ -14,16 +14,37 @@ module Projects
def update
result = ::Projects::Operations::UpdateService.new(project, current_user, update_params).execute
+ render_update_response(result)
+ end
+
+ private
+
+ # overridden in EE
+ def render_update_response(result)
+ respond_to do |format|
+ format.json do
+ render_update_json_response(result)
+ end
+ end
+ end
+
+ def render_update_json_response(result)
if result[:status] == :success
flash[:notice] = _('Your changes have been saved')
- redirect_to project_settings_operations_path(@project)
+ render json: {
+ status: result[:status]
+ }
else
- render 'show'
+ render(
+ status: result[:http_status] || :bad_request,
+ json: {
+ status: result[:status],
+ message: result[:message]
+ }
+ )
end
end
- private
-
def error_tracking_setting
@error_tracking_setting ||= project.error_tracking_setting ||
project.build_error_tracking_setting
@@ -35,7 +56,14 @@ module Projects
# overridden in EE
def permitted_project_params
- { error_tracking_setting_attributes: [:enabled, :api_url, :token] }
+ {
+ error_tracking_setting_attributes: [
+ :enabled,
+ :api_host,
+ :token,
+ project: [:slug, :name, :organization_slug, :organization_name]
+ ]
+ }
end
def check_license
diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index 519e7439205..568c6e2a852 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -28,13 +28,13 @@ class UploadsController < ApplicationController
end
def find_model
- return nil unless params[:id]
+ return unless params[:id]
upload_model_class.find(params[:id])
end
def authorize_access!
- return nil unless model
+ return unless model
authorized =
case model
@@ -54,7 +54,7 @@ class UploadsController < ApplicationController
end
def authorize_create_access!
- return nil unless model
+ return unless model
# for now we support only personal snippets comments
authorized = can?(current_user, :comment_personal_snippet, model)
diff --git a/app/finders/admin/runners_finder.rb b/app/finders/admin/runners_finder.rb
index 8d936b8121c..b2799565f57 100644
--- a/app/finders/admin/runners_finder.rb
+++ b/app/finders/admin/runners_finder.rb
@@ -11,6 +11,7 @@ class Admin::RunnersFinder < UnionFinder
search!
filter_by_status!
filter_by_runner_type!
+ filter_by_tag_list!
sort!
paginate!
@@ -44,6 +45,14 @@ class Admin::RunnersFinder < UnionFinder
filter_by!(:type_type, Ci::Runner::AVAILABLE_TYPES)
end
+ def filter_by_tag_list!
+ tag_list = @params[:tag_name].presence
+
+ if tag_list
+ @runners = @runners.tagged_with(tag_list)
+ end
+ end
+
def sort!
@runners = @runners.order_by(sort_key)
end
diff --git a/app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb b/app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb
new file mode 100644
index 00000000000..f38c187799c
--- /dev/null
+++ b/app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Autocomplete
+ module ActsAsTaggableOn
+ class TagsFinder
+ LIMIT = 20
+
+ def initialize(params:)
+ @params = params
+ end
+
+ def execute
+ tags = all_tags
+ tags = filter_by_name(tags)
+ limit(tags)
+ end
+
+ private
+
+ def all_tags
+ ::ActsAsTaggableOn::Tag.all
+ end
+
+ def filter_by_name(tags)
+ return tags unless search
+ return tags.none if search.empty?
+
+ if search.length >= Gitlab::SQL::Pattern::MIN_CHARS_FOR_PARTIAL_MATCHING
+ tags.named_like(search)
+ else
+ tags.named(search)
+ end
+ end
+
+ def limit(tags)
+ tags.limit(LIMIT) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ def search
+ @params[:search]
+ end
+ end
+ end
+end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 5870f158690..072d07e0ed2 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -78,13 +78,15 @@ class IssuableFinder
items = init_collection
items = filter_items(items)
- # This has to be last as we may use a CTE as an optimization fence
- # by passing the attempt_group_search_optimizations param and
- # enabling the use_cte_for_group_issues_search feature flag
+ # This has to be last as we use a CTE as an optimization fence
+ # for counts by passing the force_cte param and enabling the
+ # attempt_group_search_optimizations feature flag
# https://www.postgresql.org/docs/current/static/queries-with.html
items = by_search(items)
- sort(items)
+ items = sort(items) unless use_cte_for_count?
+
+ items
end
def filter_items(items)
@@ -117,8 +119,9 @@ class IssuableFinder
#
# rubocop: disable CodeReuse/ActiveRecord
def count_by_state
- count_params = params.merge(state: nil, sort: nil)
+ count_params = params.merge(state: nil, sort: nil, force_cte: true)
finder = self.class.new(current_user, count_params)
+
counts = Hash.new(0)
# Searching by label includes a GROUP BY in the query, but ours will be last
@@ -128,8 +131,11 @@ class IssuableFinder
#
# This does not apply when we are using a CTE for the search, as the labels
# GROUP BY is inside the subquery in that case, so we set labels_count to 1.
+ #
+ # We always use CTE when searching in Groups if the feature flag is enabled,
+ # but never when searching in Projects.
labels_count = label_names.any? ? label_names.count : 1
- labels_count = 1 if use_cte_for_search?
+ labels_count = 1 if use_cte_for_count?
finder.execute.reorder(nil).group(:state).count.each do |key, value|
counts[count_key(key)] += value / labels_count
@@ -305,27 +311,31 @@ class IssuableFinder
def use_subquery_for_search?
strong_memoize(:use_subquery_for_search) do
- attempt_group_search_optimizations? &&
- Feature.enabled?(:use_subquery_for_group_issues_search, default_enabled: true)
+ !force_cte? && attempt_group_search_optimizations?
end
end
- def use_cte_for_search?
- strong_memoize(:use_cte_for_search) do
- attempt_group_search_optimizations? &&
- !use_subquery_for_search? &&
- Feature.enabled?(:use_cte_for_group_issues_search, default_enabled: true)
+ def use_cte_for_count?
+ strong_memoize(:use_cte_for_count) do
+ force_cte? && attempt_group_search_optimizations?
end
end
private
+ def force_cte?
+ !!params[:force_cte]
+ end
+
def init_collection
klass.all
end
def attempt_group_search_optimizations?
- search && Gitlab::Database.postgresql? && params[:attempt_group_search_optimizations]
+ search &&
+ Gitlab::Database.postgresql? &&
+ params[:attempt_group_search_optimizations] &&
+ Feature.enabled?(:attempt_group_search_optimizations, default_enabled: true)
end
def count_key(value)
@@ -411,7 +421,7 @@ class IssuableFinder
def by_search(items)
return items unless search
- if use_cte_for_search?
+ if use_cte_for_count?
cte = Gitlab::SQL::RecursiveCTE.new(klass.table_name)
cte << items
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb
index b645011a3c5..93bee3f1488 100644
--- a/app/finders/merge_requests_finder.rb
+++ b/app/finders/merge_requests_finder.rb
@@ -37,13 +37,20 @@ class MergeRequestsFinder < IssuableFinder
end
def filter_items(_items)
- items = by_source_branch(super)
+ items = by_commit(super)
+ items = by_source_branch(items)
items = by_wip(items)
by_target_branch(items)
end
private
+ def by_commit(items)
+ return items unless params[:commit_sha].presence
+
+ items.by_commit_sha(params[:commit_sha])
+ end
+
def source_branch
@source_branch ||= params[:source_branch].presence
end
diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb
index d3774746cb8..bf29f15642d 100644
--- a/app/finders/snippets_finder.rb
+++ b/app/finders/snippets_finder.rb
@@ -69,6 +69,8 @@ class SnippetsFinder < UnionFinder
base.with_optional_visibility(visibility_from_scope).fresh
end
+ private
+
# Produces a query that retrieves snippets from multiple projects.
#
# The resulting query will, depending on the user's permissions, include the
diff --git a/app/graphql/resolvers/metadata_resolver.rb b/app/graphql/resolvers/metadata_resolver.rb
new file mode 100644
index 00000000000..3a79e6434fb
--- /dev/null
+++ b/app/graphql/resolvers/metadata_resolver.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class MetadataResolver < BaseResolver
+ type Types::MetadataType, null: false
+
+ def resolve(**args)
+ { version: Gitlab::VERSION, revision: Gitlab.revision }
+ end
+ end
+end
diff --git a/app/graphql/types/metadata_type.rb b/app/graphql/types/metadata_type.rb
new file mode 100644
index 00000000000..2d8bad0614b
--- /dev/null
+++ b/app/graphql/types/metadata_type.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module Types
+ class MetadataType < ::Types::BaseObject
+ graphql_name 'Metadata'
+
+ field :version, GraphQL::STRING_TYPE, null: false
+ field :revision, GraphQL::STRING_TYPE, null: false
+ end
+end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 3ef0cc5020c..b96c2f3afb2 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -16,7 +16,6 @@ module Types
field :description, GraphQL::STRING_TYPE, null: true
- field :default_branch, GraphQL::STRING_TYPE, null: true
field :tag_list, GraphQL::STRING_TYPE, null: true
field :ssh_url_to_repo, GraphQL::STRING_TYPE, null: true
@@ -59,7 +58,6 @@ module Types
end
field :import_status, GraphQL::STRING_TYPE, null: true
- field :ci_config_path, GraphQL::STRING_TYPE, null: true
field :only_allow_merge_if_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true
field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 954bcc0a5a3..472fe5d6ec2 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Types
- class QueryType < BaseObject
+ class QueryType < ::Types::BaseObject
graphql_name 'Query'
field :project, Types::ProjectType,
@@ -10,6 +10,14 @@ module Types
description: "Find a project",
authorize: :read_project
+ field :metadata, Types::MetadataType,
+ null: true,
+ resolver: Resolvers::MetadataResolver,
+ description: 'Metadata about GitLab' do |*args|
+
+ authorize :read_instance_metadata
+ end
+
field :echo, GraphQL::STRING_TYPE, null: false, function: Functions::Echo.new
end
end
diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb
index 023e44258b7..c0db9910143 100644
--- a/app/helpers/appearances_helper.rb
+++ b/app/helpers/appearances_helper.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module AppearancesHelper
+ include MarkupHelper
+
def brand_title
current_appearance&.title.presence || default_brand_title
end
@@ -47,7 +49,7 @@ module AppearancesHelper
class_names = []
class_names << 'with-performance-bar' if performance_bar_enabled?
- render_message(:header_message, class_names)
+ render_message(:header_message, class_names: class_names)
end
def footer_message
@@ -58,10 +60,10 @@ module AppearancesHelper
private
- def render_message(field_sym, class_names = [])
+ def render_message(field_sym, class_names: [], style: message_style)
class_names << field_sym.to_s.dasherize
- content_tag :div, class: class_names, style: message_style do
+ content_tag :div, class: class_names, style: style do
markdown_field(current_appearance, field_sym)
end
end
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index 06beeebe2ba..3e1bb9af5cc 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -37,7 +37,7 @@ module BlobHelper
end
def ide_edit_button(project = @project, ref = @ref, path = @path, options = {})
- return unless Feature.enabled?(:web_ide_default)
+ return if Feature.enabled?(:web_ide_default)
return unless blob = readable_blob(options, path, project, ref)
edit_button_tag(blob,
diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb
index 923a06a0512..355b91a8661 100644
--- a/app/helpers/ci_status_helper.rb
+++ b/app/helpers/ci_status_helper.rb
@@ -100,17 +100,6 @@ module CiStatusHelper
"pipeline-status/#{pipeline_status.sha}-#{pipeline_status.status}"
end
- def render_project_pipeline_status(pipeline_status, tooltip_placement: 'left')
- project = pipeline_status.project
- path = pipelines_project_commit_path(project, pipeline_status.sha, ref: pipeline_status.ref)
-
- render_status_with_link(
- 'commit',
- pipeline_status.status,
- path,
- tooltip_placement: tooltip_placement)
- end
-
def render_commit_status(commit, ref: nil, tooltip_placement: 'left')
project = commit.project
path = pipelines_project_commit_path(project, commit, ref: ref)
@@ -123,12 +112,6 @@ module CiStatusHelper
icon_size: 24)
end
- def render_pipeline_status(pipeline, tooltip_placement: 'left')
- project = pipeline.project
- path = project_pipeline_path(project, pipeline)
- render_status_with_link('pipeline', pipeline.status, path, tooltip_placement: tooltip_placement)
- end
-
def render_status_with_link(type, status, path = nil, tooltip_placement: 'left', cssclass: '', container: 'body', icon_size: 16)
klass = "ci-status-link ci-status-icon-#{status.dasherize} #{cssclass}"
title = "#{type.titleize}: #{ci_label_for_status(status)}"
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index dedc58f482b..96471d15aac 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -131,4 +131,42 @@ module EmailsHelper
project.id.to_s + "." + project_path_as_domain + "." + Gitlab.config.gitlab.host
end
+
+ def html_header_message
+ return unless show_header?
+
+ render_message(:header_message, style: '')
+ end
+
+ def html_footer_message
+ return unless show_footer?
+
+ render_message(:footer_message, style: '')
+ end
+
+ def text_header_message
+ return unless show_header?
+
+ strip_tags(render_message(:header_message, style: ''))
+ end
+
+ def text_footer_message
+ return unless show_footer?
+
+ strip_tags(render_message(:footer_message, style: ''))
+ end
+
+ private
+
+ def show_footer?
+ email_header_and_footer_enabled? && current_appearance&.show_footer?
+ end
+
+ def show_header?
+ email_header_and_footer_enabled? && current_appearance&.show_header?
+ end
+
+ def email_header_and_footer_enabled?
+ current_appearance&.email_header_and_footer_enabled?
+ end
end
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index af28e6fcb93..0622cdfc196 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -191,7 +191,7 @@ module IssuablesHelper
output << content_tag(:strong) do
author_output = link_to_member(project, issuable.author, size: 24, mobile_classes: "d-none d-sm-inline")
- author_output << link_to_member(project, issuable.author, size: 24, by_username: true, avatar: false, mobile_classes: "d-block d-sm-none")
+ author_output << link_to_member(project, issuable.author, size: 24, by_username: true, avatar: false, mobile_classes: "d-inline d-sm-none")
if status = user_status(issuable.author)
author_output << "#{status}".html_safe
diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb
index 66f4b7b3f30..d83c69603a9 100644
--- a/app/helpers/markup_helper.rb
+++ b/app/helpers/markup_helper.rb
@@ -74,7 +74,7 @@ module MarkupHelper
# the tag contents are truncated without removing the closing tag.
def first_line_in_markdown(object, attribute, max_chars = nil, options = {})
md = markdown_field(object, attribute, options)
- return nil unless md.present?
+ return unless md.present?
tags = %w(a gl-emoji b pre code p span)
tags << 'img' if options[:allow_images]
diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb
index 23d7aa427bb..991ca42c445 100644
--- a/app/helpers/merge_requests_helper.rb
+++ b/app/helpers/merge_requests_helper.rb
@@ -29,7 +29,7 @@ module MergeRequestsHelper
def ci_build_details_path(merge_request)
build_url = merge_request.source_project.ci_service.build_page(merge_request.diff_head_sha, merge_request.source_branch)
- return nil unless build_url
+ return unless build_url
parsed_url = URI.parse(build_url)
@@ -92,7 +92,7 @@ module MergeRequestsHelper
end
def version_index(merge_request_diff)
- return nil if @merge_request_diffs.empty?
+ return if @merge_request_diffs.empty?
@merge_request_diffs.size - @merge_request_diffs.index(merge_request_diff)
end
@@ -149,7 +149,7 @@ module MergeRequestsHelper
def merge_request_source_project_for_project(project = @project)
unless can?(current_user, :create_merge_request_in, project)
- return nil
+ return
end
if can?(current_user, :create_merge_request_from, project)
diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb
index aaf38cbfe70..a50137bea3d 100644
--- a/app/helpers/notes_helper.rb
+++ b/app/helpers/notes_helper.rb
@@ -122,7 +122,7 @@ module NotesHelper
end
def new_form_url
- return nil unless @snippet.is_a?(PersonalSnippet)
+ return unless @snippet.is_a?(PersonalSnippet)
snippet_notes_path(@snippet)
end
diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index eed529f93db..766508b6609 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -46,7 +46,8 @@ module PreferencesHelper
def first_day_of_week_choices
[
[_('Sunday'), 0],
- [_('Monday'), 1]
+ [_('Monday'), 1],
+ [_('Saturday'), 6]
]
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index c400302cda3..2ac8ddc5244 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -284,6 +284,20 @@ module ProjectsHelper
can?(current_user, :read_environment, @project)
end
+ def error_tracking_setting_project_json
+ setting = @project.error_tracking_setting
+
+ return if setting.blank? || setting.project_slug.blank? ||
+ setting.organization_slug.blank?
+
+ {
+ name: setting.project_name,
+ organization_name: setting.organization_name,
+ organization_slug: setting.organization_slug,
+ slug: setting.project_slug
+ }.to_json
+ end
+
private
def get_project_nav_tabs(project, current_user)
diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb
index e2879bfdcf1..c5bab877c00 100644
--- a/app/helpers/tree_helper.rb
+++ b/app/helpers/tree_helper.rb
@@ -136,18 +136,9 @@ module TreeHelper
end
# returns the relative path of the first subdir that doesn't have only one directory descendant
- # rubocop: disable CodeReuse/ActiveRecord
def flatten_tree(root_path, tree)
- return tree.flat_path.sub(%r{\A#{Regexp.escape(root_path)}/}, '') if tree.flat_path.present?
-
- subtree = Gitlab::Git::Tree.where(@repository, @commit.id, tree.path)
- if subtree.count == 1 && subtree.first.dir?
- return tree_join(tree.name, flatten_tree(root_path, subtree.first))
- else
- return tree.name
- end
+ tree.flat_path.sub(%r{\A#{Regexp.escape(root_path)}/}, '')
end
- # rubocop: enable CodeReuse/ActiveRecord
def selected_branch
@branch_name || tree_edit_branch
diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb
index 1ad7bb81784..5d658d35107 100644
--- a/app/helpers/user_callouts_helper.rb
+++ b/app/helpers/user_callouts_helper.rb
@@ -17,6 +17,9 @@ module UserCalloutsHelper
render 'shared/flash_user_callout', flash_type: flash_type, message: message, feature_name: feature_name
end
+ def render_dashboard_gold_trial(user)
+ end
+
private
def user_dismissed?(feature_name)
diff --git a/app/mailers/abuse_report_mailer.rb b/app/mailers/abuse_report_mailer.rb
index e032f568913..e0aa66e6de3 100644
--- a/app/mailers/abuse_report_mailer.rb
+++ b/app/mailers/abuse_report_mailer.rb
@@ -1,6 +1,10 @@
# frozen_string_literal: true
class AbuseReportMailer < BaseMailer
+ layout 'empty_mailer'
+
+ helper EmailsHelper
+
def notify(abuse_report_id)
return unless deliverable?
diff --git a/app/mailers/email_rejection_mailer.rb b/app/mailers/email_rejection_mailer.rb
index 45fc5a6c383..d743533b1bc 100644
--- a/app/mailers/email_rejection_mailer.rb
+++ b/app/mailers/email_rejection_mailer.rb
@@ -1,6 +1,10 @@
# frozen_string_literal: true
class EmailRejectionMailer < BaseMailer
+ layout 'empty_mailer'
+
+ helper EmailsHelper
+
def rejection(reason, original_raw, can_retry = false)
@reason = reason
@original_message = Mail::Message.new(original_raw)
diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb
index 654ae211310..d2e334fb856 100644
--- a/app/mailers/emails/issues.rb
+++ b/app/mailers/emails/issues.rb
@@ -74,6 +74,7 @@ module Emails
@new_issue = new_issue
@new_project = new_issue.project
+ @can_access_project = recipient.can?(:read_project, @new_project)
mail_answer_thread(issue, issue_thread_options(updated_by_user.id, recipient.id, reason))
end
diff --git a/app/mailers/emails/pipelines.rb b/app/mailers/emails/pipelines.rb
index 31e183640ad..fb57c0da34d 100644
--- a/app/mailers/emails/pipelines.rb
+++ b/app/mailers/emails/pipelines.rb
@@ -15,7 +15,7 @@ module Emails
def pipeline_mail(pipeline, recipients, status)
@project = pipeline.project
@pipeline = pipeline
- @merge_request = pipeline.merge_requests.first
+ @merge_request = pipeline.merge_requests_as_head_pipeline.first
add_headers
# We use bcc here because we don't want to generate this emails for a
diff --git a/app/mailers/repository_check_mailer.rb b/app/mailers/repository_check_mailer.rb
index 145169be8a6..a24d3476d0e 100644
--- a/app/mailers/repository_check_mailer.rb
+++ b/app/mailers/repository_check_mailer.rb
@@ -2,6 +2,10 @@
class RepositoryCheckMailer < BaseMailer
# rubocop: disable CodeReuse/ActiveRecord
+ layout 'empty_mailer'
+
+ helper EmailsHelper
+
def notify(failed_count)
@message =
if failed_count == 1
diff --git a/app/models/active_session.rb b/app/models/active_session.rb
index 0d9c6a4a1f0..1e01f1d17e6 100644
--- a/app/models/active_session.rb
+++ b/app/models/active_session.rb
@@ -5,7 +5,8 @@ class ActiveSession
attr_accessor :created_at, :updated_at,
:session_id, :ip_address,
- :browser, :os, :device_name, :device_type
+ :browser, :os, :device_name, :device_type,
+ :is_impersonated
def current?(session)
return false if session_id.nil? || session.id.nil?
@@ -31,7 +32,8 @@ class ActiveSession
device_type: client.device_type,
created_at: user.current_sign_in_at || timestamp,
updated_at: timestamp,
- session_id: session_id
+ session_id: session_id,
+ is_impersonated: request.session[:impersonator_id].present?
)
redis.pipelined do
diff --git a/app/models/appearance.rb b/app/models/appearance.rb
index b9ad676ca47..bdee9b2b73c 100644
--- a/app/models/appearance.rb
+++ b/app/models/appearance.rb
@@ -20,6 +20,7 @@ class Appearance < ActiveRecord::Base
default_value_for :message_background_color, '#E75E40'
default_value_for :message_font_color, '#FFFFFF'
+ default_value_for :email_header_and_footer_enabled, false
mount_uploader :logo, AttachmentUploader
mount_uploader :header_logo, AttachmentUploader
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index daadf9427ba..c5035797621 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -7,7 +7,7 @@ class ApplicationSetting < ActiveRecord::Base
include IgnorableColumn
include ChronicDurationAttribute
- add_authentication_token_field :runners_registration_token, encrypted: true, fallback: true
+ add_authentication_token_field :runners_registration_token, encrypted: -> { Feature.enabled?(:application_settings_tokens_optional_encryption) ? :optional : :required }
add_authentication_token_field :health_check_access_token
DOMAIN_LIST_SEPARATOR = %r{\s*[,;]\s* # comma or semicolon, optionally surrounded by whitespace
diff --git a/app/models/board_group_recent_visit.rb b/app/models/board_group_recent_visit.rb
index 92abbb67222..f5b75270595 100644
--- a/app/models/board_group_recent_visit.rb
+++ b/app/models/board_group_recent_visit.rb
@@ -10,7 +10,7 @@ class BoardGroupRecentVisit < ActiveRecord::Base
validates :group, presence: true
validates :board, presence: true
- scope :by_user_group, -> (user, group) { where(user: user, group: group).order(:updated_at) }
+ scope :by_user_group, -> (user, group) { where(user: user, group: group) }
def self.visited!(user, board)
visit = find_or_create_by(user: user, group: board.group, board: board)
@@ -19,7 +19,10 @@ class BoardGroupRecentVisit < ActiveRecord::Base
retry
end
- def self.latest(user, group)
- by_user_group(user, group).last
+ def self.latest(user, group, count: nil)
+ visits = by_user_group(user, group).order(updated_at: :desc)
+ visits = visits.preload(:board) if count && count > 1
+
+ visits.first(count)
end
end
diff --git a/app/models/board_project_recent_visit.rb b/app/models/board_project_recent_visit.rb
index 7cffff906d8..2a1b14b3ae0 100644
--- a/app/models/board_project_recent_visit.rb
+++ b/app/models/board_project_recent_visit.rb
@@ -10,7 +10,7 @@ class BoardProjectRecentVisit < ActiveRecord::Base
validates :project, presence: true
validates :board, presence: true
- scope :by_user_project, -> (user, project) { where(user: user, project: project).order(:updated_at) }
+ scope :by_user_project, -> (user, project) { where(user: user, project: project) }
def self.visited!(user, board)
visit = find_or_create_by(user: user, project: board.project, board: board)
@@ -19,7 +19,10 @@ class BoardProjectRecentVisit < ActiveRecord::Base
retry
end
- def self.latest(user, project)
- by_user_project(user, project).last
+ def self.latest(user, project, count: nil)
+ visits = by_user_project(user, project).order(updated_at: :desc)
+ visits = visits.preload(:board) if count && count > 1
+
+ visits.first(count)
end
end
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index 5450d40ea95..0d8d7d95791 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -3,14 +3,18 @@
module Ci
class Bridge < CommitStatus
include Ci::Processable
+ include Ci::Contextable
include Importable
include AfterCommitQueue
+ include HasRef
include Gitlab::Utils::StrongMemoize
belongs_to :project
belongs_to :trigger_request
validates :ref, presence: true
+ delegate :merge_request_event?, to: :pipeline
+
def self.retry(bridge, current_user)
raise NotImplementedError
end
@@ -37,11 +41,11 @@ module Ci
false
end
- def expanded_environment_name
+ def runnable?
+ false
end
- def predefined_variables
- raise NotImplementedError
+ def expanded_environment_name
end
def execute_hooks
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index c902e49ee6d..a64c6051f95 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -5,6 +5,7 @@ module Ci
prepend ArtifactMigratable
include Ci::Processable
include Ci::Metadatable
+ include Ci::Contextable
include TokenAuthenticatable
include AfterCommitQueue
include ObjectStorage::BackgroundMove
@@ -46,7 +47,7 @@ module Ci
delegate :terminal_specification, to: :runner_session, allow_nil: true
delegate :gitlab_deploy_token, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true
- delegate :merge_request?, to: :pipeline
+ delegate :merge_request_event?, to: :pipeline
##
# Since Gitlab 11.5, deployments records started being created right after
@@ -137,7 +138,7 @@ module Ci
acts_as_taggable
- add_authentication_token_field :token, encrypted: true, fallback: true
+ add_authentication_token_field :token, encrypted: :optional
before_save :update_artifacts_size, if: :artifacts_file_changed?
before_save :ensure_token
@@ -289,6 +290,10 @@ module Ci
self.name == 'pages'
end
+ def runnable?
+ true
+ end
+
def archived?
return true if degenerated?
@@ -398,46 +403,6 @@ module Ci
options&.dig(:environment, :on_stop)
end
- # A slugified version of the build ref, suitable for inclusion in URLs and
- # domain names. Rules:
- #
- # * Lowercased
- # * Anything not matching [a-z0-9-] is replaced with a -
- # * Maximum length is 63 bytes
- # * First/Last Character is not a hyphen
- def ref_slug
- Gitlab::Utils.slugify(ref.to_s)
- end
-
- ##
- # Variables in the environment name scope.
- #
- def scoped_variables(environment: expanded_environment_name)
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- variables.concat(predefined_variables)
- variables.concat(project.predefined_variables)
- variables.concat(pipeline.predefined_variables)
- variables.concat(runner.predefined_variables) if runner
- variables.concat(project.deployment_variables(environment: environment)) if environment
- variables.concat(yaml_variables)
- variables.concat(user_variables)
- variables.concat(secret_group_variables)
- variables.concat(secret_project_variables(environment: environment))
- variables.concat(trigger_request.user_variables) if trigger_request
- variables.concat(pipeline.variables)
- variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline.pipeline_schedule
- end
- end
-
- ##
- # Variables that do not depend on the environment name.
- #
- def simple_variables
- strong_memoize(:simple_variables) do
- scoped_variables(environment: nil).to_runner_variables
- end
- end
-
##
# All variables, including persisted environment variables.
#
@@ -451,12 +416,46 @@ module Ci
end
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
+ CI_REGISTRY_USER = 'gitlab-ci-token'.freeze
+
+ def persisted_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables unless persisted?
+
+ variables
+ .concat(pipeline.persisted_variables)
+ .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)
+ .append(key: 'CI_BUILD_ID', value: id.to_s)
+ .append(key: 'CI_BUILD_TOKEN', value: token.to_s, public: false)
+ .append(key: 'CI_REGISTRY_USER', value: CI_REGISTRY_USER)
+ .append(key: 'CI_REGISTRY_PASSWORD', value: token.to_s, public: false)
+ .append(key: 'CI_REPOSITORY_URL', value: repo_url.to_s, public: false)
+ .concat(deploy_token_variables)
+ end
+ end
+
+ def persisted_environment_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables unless persisted? && persisted_environment.present?
+
+ variables.concat(persisted_environment.predefined_variables)
+
+ # Here we're passing unexpanded environment_url for runner to expand,
+ # and we need to make sure that CI_ENVIRONMENT_NAME and
+ # CI_ENVIRONMENT_SLUG so on are available for the URL be expanded.
+ variables.append(key: 'CI_ENVIRONMENT_URL', value: environment_url) if environment_url
+ end
+ end
+
+ def deploy_token_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables unless gitlab_deploy_token
+
+ variables.append(key: 'CI_DEPLOY_USER', value: gitlab_deploy_token.username)
+ variables.append(key: 'CI_DEPLOY_PASSWORD', value: gitlab_deploy_token.token, public: false)
+ end
end
def features
@@ -634,27 +633,6 @@ module Ci
super || project.try(:build_coverage_regex)
end
- def user_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables if user.blank?
-
- variables.append(key: 'GITLAB_USER_ID', value: user.id.to_s)
- variables.append(key: 'GITLAB_USER_EMAIL', value: user.email)
- variables.append(key: 'GITLAB_USER_LOGIN', value: user.username)
- variables.append(key: 'GITLAB_USER_NAME', value: user.name)
- end
- end
-
- def secret_group_variables
- return [] unless project.group
-
- project.group.ci_variables_for(git_ref, project)
- end
-
- def secret_project_variables(environment: persisted_environment)
- project.ci_variables_for(ref: git_ref, environment: environment)
- end
-
def steps
[Gitlab::Ci::Build::Step.from_commands(self),
Gitlab::Ci::Build::Step.from_after_script(self)].compact
@@ -757,7 +735,7 @@ module Ci
# Virtual deployment status depending on the environment status.
def deployment_status
- return nil unless starts_environment?
+ return unless starts_environment?
if success?
return successful_deployment_status
@@ -814,89 +792,6 @@ module Ci
@unscoped_project ||= Project.unscoped.find_by(id: project_id)
end
- CI_REGISTRY_USER = 'gitlab-ci-token'.freeze
-
- def persisted_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables unless persisted?
-
- variables
- .concat(pipeline.persisted_variables)
- .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)
- .append(key: 'CI_BUILD_ID', value: id.to_s)
- .append(key: 'CI_BUILD_TOKEN', value: token.to_s, public: false)
- .append(key: 'CI_REGISTRY_USER', value: CI_REGISTRY_USER)
- .append(key: 'CI_REGISTRY_PASSWORD', value: token.to_s, public: false)
- .append(key: 'CI_REPOSITORY_URL', value: repo_url.to_s, public: false)
- .concat(deploy_token_variables)
- end
- end
-
- def predefined_variables # rubocop:disable Metrics/AbcSize
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- variables.append(key: 'CI', value: 'true')
- variables.append(key: 'GITLAB_CI', value: 'true')
- variables.append(key: 'GITLAB_FEATURES', value: project.licensed_features.join(','))
- variables.append(key: 'CI_SERVER_NAME', value: 'GitLab')
- variables.append(key: 'CI_SERVER_VERSION', value: Gitlab::VERSION)
- variables.append(key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s)
- variables.append(key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s)
- variables.append(key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s)
- variables.append(key: 'CI_SERVER_REVISION', value: Gitlab.revision)
- variables.append(key: 'CI_JOB_NAME', value: name)
- variables.append(key: 'CI_JOB_STAGE', value: stage)
- variables.append(key: 'CI_COMMIT_SHA', value: sha)
- variables.append(key: 'CI_COMMIT_SHORT_SHA', value: short_sha)
- variables.append(key: 'CI_COMMIT_BEFORE_SHA', value: before_sha)
- variables.append(key: 'CI_COMMIT_REF_NAME', value: ref)
- variables.append(key: 'CI_COMMIT_REF_SLUG', value: ref_slug)
- variables.append(key: "CI_COMMIT_TAG", value: ref) if tag?
- variables.append(key: "CI_PIPELINE_TRIGGERED", value: 'true') if trigger_request
- variables.append(key: "CI_JOB_MANUAL", value: 'true') if action?
- variables.append(key: "CI_NODE_INDEX", value: self.options[:instance].to_s) if self.options&.include?(:instance)
- variables.append(key: "CI_NODE_TOTAL", value: (self.options&.dig(:parallel) || 1).to_s)
- variables.concat(legacy_variables)
- end
- end
-
- def legacy_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- variables.append(key: 'CI_BUILD_REF', value: sha)
- variables.append(key: 'CI_BUILD_BEFORE_SHA', value: before_sha)
- variables.append(key: 'CI_BUILD_REF_NAME', value: ref)
- variables.append(key: 'CI_BUILD_REF_SLUG', value: ref_slug)
- variables.append(key: 'CI_BUILD_NAME', value: name)
- variables.append(key: 'CI_BUILD_STAGE', value: stage)
- variables.append(key: "CI_BUILD_TAG", value: ref) if tag?
- variables.append(key: "CI_BUILD_TRIGGERED", value: 'true') if trigger_request
- variables.append(key: "CI_BUILD_MANUAL", value: 'true') if action?
- end
- end
-
- def persisted_environment_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables unless persisted? && persisted_environment.present?
-
- variables.concat(persisted_environment.predefined_variables)
-
- # Here we're passing unexpanded environment_url for runner to expand,
- # and we need to make sure that CI_ENVIRONMENT_NAME and
- # CI_ENVIRONMENT_SLUG so on are available for the URL be expanded.
- variables.append(key: 'CI_ENVIRONMENT_URL', value: environment_url) if environment_url
- end
- end
-
- def deploy_token_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables unless gitlab_deploy_token
-
- variables.append(key: 'CI_DEPLOY_USER', value: gitlab_deploy_token.username)
- variables.append(key: 'CI_DEPLOY_PASSWORD', value: gitlab_deploy_token.token, public: false)
- end
- end
-
def environment_url
options&.dig(:environment, :url) || persisted_environment&.external_url
end
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index 33e61cd2111..75017f224a0 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -115,7 +115,7 @@ module Ci
current_data = get_data
unless current_data&.bytesize.to_i == CHUNK_SIZE
- raise FailedToPersistDataError, 'Data is not fullfilled in a bucket'
+ raise FailedToPersistDataError, 'Data is not fulfilled in a bucket'
end
old_store_class = self.class.get_store_class(data_store)
diff --git a/app/models/ci/group_variable.rb b/app/models/ci/group_variable.rb
index 492d1d0329e..323ff560564 100644
--- a/app/models/ci/group_variable.rb
+++ b/app/models/ci/group_variable.rb
@@ -5,6 +5,7 @@ module Ci
extend Gitlab::Ci::Model
include HasVariable
include Presentable
+ include Maskable
belongs_to :group, class_name: "::Group"
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index d4586219333..ca9725f7a04 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -39,7 +39,7 @@ module Ci
# Merge requests for which the current pipeline is running against
# the merge request's latest commit.
- has_many :merge_requests, foreign_key: "head_pipeline_id"
+ has_many :merge_requests_as_head_pipeline, foreign_key: "head_pipeline_id", class_name: 'MergeRequest'
has_many :pending_builds, -> { pending }, foreign_key: :commit_id, class_name: 'Ci::Build'
has_many :retryable_builds, -> { latest.failed_or_canceled.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build'
@@ -60,9 +60,9 @@ module Ci
validates :sha, presence: { unless: :importing? }
validates :ref, presence: { unless: :importing? }
- validates :merge_request, presence: { if: :merge_request? }
- validates :merge_request, absence: { unless: :merge_request? }
- validates :tag, inclusion: { in: [false], if: :merge_request? }
+ validates :merge_request, presence: { if: :merge_request_event? }
+ validates :merge_request, absence: { unless: :merge_request_event? }
+ validates :tag, inclusion: { in: [false], if: :merge_request_event? }
validates :status, presence: { unless: :importing? }
validate :valid_commit_sha, unless: :importing?
validates :source, exclusion: { in: %w(unknown), unless: :importing? }, on: :create
@@ -179,7 +179,7 @@ module Ci
scope :sort_by_merge_request_pipelines, -> do
sql = 'CASE ci_pipelines.source WHEN (?) THEN 0 ELSE 1 END, ci_pipelines.id DESC'
- query = ActiveRecord::Base.send(:sanitize_sql_array, [sql, sources[:merge_request]]) # rubocop:disable GitlabSecurity/PublicSend
+ query = ActiveRecord::Base.send(:sanitize_sql_array, [sql, sources[:merge_request_event]]) # rubocop:disable GitlabSecurity/PublicSend
order(query)
end
@@ -196,7 +196,7 @@ module Ci
end
scope :triggered_by_merge_request, -> (merge_request) do
- where(source: :merge_request, merge_request: merge_request)
+ where(source: :merge_request_event, merge_request: merge_request)
end
scope :detached_merge_request_pipelines, -> (merge_request) do
@@ -417,10 +417,6 @@ module Ci
@commit ||= Commit.lazy(project, sha)
end
- def branch?
- super && !merge_request?
- end
-
def stuck?
pending_builds.any?(&:stuck?)
end
@@ -643,7 +639,7 @@ module Ci
variables.append(key: 'CI_COMMIT_TITLE', value: git_commit_full_title.to_s)
variables.append(key: 'CI_COMMIT_DESCRIPTION', value: git_commit_description.to_s)
- if merge_request? && merge_request
+ if merge_request_event? && merge_request
variables.append(key: 'CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', value: source_sha.to_s)
variables.append(key: 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA', value: target_sha.to_s)
variables.concat(merge_request.predefined_variables)
@@ -673,7 +669,7 @@ module Ci
# All the merge requests for which the current pipeline runs/ran against
def all_merge_requests
@all_merge_requests ||=
- if merge_request?
+ if merge_request_event?
MergeRequest.where(id: merge_request_id)
else
MergeRequest.where(source_project_id: project_id, source_branch: ref)
@@ -718,7 +714,7 @@ module Ci
# * nil: Modified path can not be evaluated
def modified_paths
strong_memoize(:modified_paths) do
- if merge_request?
+ if merge_request_event?
merge_request.modified_paths
elsif branch_updated?
push_details.modified_paths
@@ -731,7 +727,7 @@ module Ci
end
def triggered_by_merge_request?
- merge_request? && merge_request_id.present?
+ merge_request_event? && merge_request_id.present?
end
def detached_merge_request_pipeline?
@@ -777,7 +773,7 @@ module Ci
end
def git_ref
- if merge_request?
+ if merge_request_event?
##
# In the future, we're going to change this ref to
# merge request's merged reference, such as "refs/merge-requests/:iid/merge".
diff --git a/app/models/ci/pipeline_enums.rb b/app/models/ci/pipeline_enums.rb
index 4be4fdb1ff2..571c4271475 100644
--- a/app/models/ci/pipeline_enums.rb
+++ b/app/models/ci/pipeline_enums.rb
@@ -23,7 +23,7 @@ module Ci
api: 5,
external: 6,
chat: 8,
- merge_request: 10
+ merge_request_event: 10
}
end
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index d82e11bbb89..ce26ee168ef 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -10,7 +10,7 @@ module Ci
include FromUnion
include TokenAuthenticatable
- add_authentication_token_field :token, encrypted: true, migrating: true
+ add_authentication_token_field :token, encrypted: -> { Feature.enabled?(:ci_runners_tokens_optional_encryption) ? :optional : :required }
enum access_level: {
not_protected: 0,
diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb
index 524d79014f8..64836ea4fa4 100644
--- a/app/models/ci/variable.rb
+++ b/app/models/ci/variable.rb
@@ -5,6 +5,7 @@ module Ci
extend Gitlab::Ci::Model
include HasVariable
include Presentable
+ include Maskable
belongs_to :project
diff --git a/app/models/clusters/applications/jupyter.rb b/app/models/clusters/applications/jupyter.rb
index 421a923d386..80205775b6a 100644
--- a/app/models/clusters/applications/jupyter.rb
+++ b/app/models/clusters/applications/jupyter.rb
@@ -3,7 +3,7 @@
module Clusters
module Applications
class Jupyter < ActiveRecord::Base
- VERSION = 'v0.6'.freeze
+ VERSION = '0.9-174bbd5'.freeze
self.table_name = 'clusters_applications_jupyter'
@@ -75,17 +75,22 @@ module Clusters
"gitlab" => {
"clientId" => oauth_application.uid,
"clientSecret" => oauth_application.secret,
- "callbackUrl" => callback_url
+ "callbackUrl" => callback_url,
+ "gitlabProjectIdWhitelist" => [project_id]
}
},
"singleuser" => {
"extraEnv" => {
- "GITLAB_CLUSTER_ID" => cluster.id
+ "GITLAB_CLUSTER_ID" => cluster.id.to_s
}
}
}
end
+ def project_id
+ cluster&.project&.id
+ end
+
def gitlab_url
Gitlab.config.gitlab.url
end
diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb
index 683b45331f6..ee964fb7c93 100644
--- a/app/models/clusters/concerns/application_core.rb
+++ b/app/models/clusters/concerns/application_core.rb
@@ -30,6 +30,12 @@ module Clusters
# Override if you need extra data synchronized
# from K8s after installation
end
+
+ def update_command
+ install_command.tap do |command|
+ command.version = version
+ end
+ end
end
end
end
diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb
index 46d0898014e..814fc591408 100644
--- a/app/models/clusters/platforms/kubernetes.rb
+++ b/app/models/clusters/platforms/kubernetes.rb
@@ -41,7 +41,7 @@ module Clusters
validate :no_namespace, unless: :allow_user_defined_namespace?
# We expect to be `active?` only when enabled and cluster is created (the api_url is assigned)
- validates :api_url, url: true, presence: true
+ validates :api_url, public_url: true, presence: true
validates :token, presence: true
validates :ca_cert, certificate: true, allow_blank: true, if: :ca_cert_changed?
diff --git a/app/models/commit_range.rb b/app/models/commit_range.rb
index 094747ee48d..920b1d092dd 100644
--- a/app/models/commit_range.rb
+++ b/app/models/commit_range.rb
@@ -134,25 +134,25 @@ class CommitRange
end
def sha_from
- return nil unless @commit_from
+ return unless @commit_from
@commit_from.id
end
def sha_to
- return nil unless @commit_to
+ return unless @commit_to
@commit_to.id
end
def sha_start
- return nil unless sha_from
+ return unless sha_from
exclude_start? ? sha_from + '^' : sha_from
end
def commit_start
- return nil unless sha_start
+ return unless sha_start
if exclude_start?
@commit_start ||= project.commit(sha_start)
diff --git a/app/models/concerns/blob_language_from_git_attributes.rb b/app/models/concerns/blob_language_from_git_attributes.rb
index 70213d22147..56e1276a220 100644
--- a/app/models/concerns/blob_language_from_git_attributes.rb
+++ b/app/models/concerns/blob_language_from_git_attributes.rb
@@ -5,7 +5,7 @@ module BlobLanguageFromGitAttributes
extend ActiveSupport::Concern
def language_from_gitattributes
- return nil unless project
+ return unless project
repository = project.repository
repository.gitattribute(path, 'gitlab-language')
diff --git a/app/models/concerns/ci/contextable.rb b/app/models/concerns/ci/contextable.rb
new file mode 100644
index 00000000000..4986a42dbd2
--- /dev/null
+++ b/app/models/concerns/ci/contextable.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+module Ci
+ ##
+ # This module implements methods that provide context in form of
+ # essential CI/CD variables that can be used by a build / bridge job.
+ #
+ module Contextable
+ ##
+ # Variables in the environment name scope.
+ #
+ def scoped_variables(environment: expanded_environment_name)
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ variables.concat(predefined_variables)
+ variables.concat(project.predefined_variables)
+ variables.concat(pipeline.predefined_variables)
+ variables.concat(runner.predefined_variables) if runnable? && runner
+ variables.concat(project.deployment_variables(environment: environment)) if environment
+ variables.concat(yaml_variables)
+ variables.concat(user_variables)
+ variables.concat(secret_group_variables)
+ variables.concat(secret_project_variables(environment: environment))
+ variables.concat(trigger_request.user_variables) if trigger_request
+ variables.concat(pipeline.variables)
+ variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline.pipeline_schedule
+ end
+ 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
+ strong_memoize(:simple_variables) do
+ scoped_variables(environment: nil).to_runner_variables
+ end
+ end
+
+ def user_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables if user.blank?
+
+ variables.append(key: 'GITLAB_USER_ID', value: user.id.to_s)
+ variables.append(key: 'GITLAB_USER_EMAIL', value: user.email)
+ variables.append(key: 'GITLAB_USER_LOGIN', value: user.username)
+ variables.append(key: 'GITLAB_USER_NAME', value: user.name)
+ end
+ end
+
+ def predefined_variables # rubocop:disable Metrics/AbcSize
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ variables.append(key: 'CI', value: 'true')
+ variables.append(key: 'GITLAB_CI', value: 'true')
+ variables.append(key: 'GITLAB_FEATURES', value: project.licensed_features.join(','))
+ variables.append(key: 'CI_SERVER_NAME', value: 'GitLab')
+ variables.append(key: 'CI_SERVER_VERSION', value: Gitlab::VERSION)
+ variables.append(key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s)
+ variables.append(key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s)
+ variables.append(key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s)
+ variables.append(key: 'CI_SERVER_REVISION', value: Gitlab.revision)
+ variables.append(key: 'CI_JOB_NAME', value: name)
+ variables.append(key: 'CI_JOB_STAGE', value: stage)
+ variables.append(key: 'CI_COMMIT_SHA', value: sha)
+ variables.append(key: 'CI_COMMIT_SHORT_SHA', value: short_sha)
+ variables.append(key: 'CI_COMMIT_BEFORE_SHA', value: before_sha)
+ variables.append(key: 'CI_COMMIT_REF_NAME', value: ref)
+ variables.append(key: 'CI_COMMIT_REF_SLUG', value: ref_slug)
+ variables.append(key: "CI_COMMIT_TAG", value: ref) if tag?
+ variables.append(key: "CI_PIPELINE_TRIGGERED", value: 'true') if trigger_request
+ variables.append(key: "CI_JOB_MANUAL", value: 'true') if action?
+ variables.append(key: "CI_NODE_INDEX", value: self.options[:instance].to_s) if self.options&.include?(:instance)
+ variables.append(key: "CI_NODE_TOTAL", value: (self.options&.dig(:parallel) || 1).to_s)
+ variables.concat(legacy_variables)
+ end
+ end
+
+ def legacy_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ variables.append(key: 'CI_BUILD_REF', value: sha)
+ variables.append(key: 'CI_BUILD_BEFORE_SHA', value: before_sha)
+ variables.append(key: 'CI_BUILD_REF_NAME', value: ref)
+ variables.append(key: 'CI_BUILD_REF_SLUG', value: ref_slug)
+ variables.append(key: 'CI_BUILD_NAME', value: name)
+ variables.append(key: 'CI_BUILD_STAGE', value: stage)
+ variables.append(key: "CI_BUILD_TAG", value: ref) if tag?
+ variables.append(key: "CI_BUILD_TRIGGERED", value: 'true') if trigger_request
+ variables.append(key: "CI_BUILD_MANUAL", value: 'true') if action?
+ end
+ end
+
+ def secret_group_variables
+ return [] unless project.group
+
+ project.group.ci_variables_for(git_ref, project)
+ end
+
+ def secret_project_variables(environment: persisted_environment)
+ project.ci_variables_for(ref: git_ref, environment: environment)
+ end
+ end
+end
diff --git a/app/models/concerns/ci/processable.rb b/app/models/concerns/ci/processable.rb
index 1c78b1413a8..268fa8ec692 100644
--- a/app/models/concerns/ci/processable.rb
+++ b/app/models/concerns/ci/processable.rb
@@ -23,5 +23,9 @@ module Ci
def expanded_environment_name
raise NotImplementedError
end
+
+ def scoped_variables_hash
+ raise NotImplementedError
+ end
end
end
diff --git a/app/models/concerns/feature_gate.rb b/app/models/concerns/feature_gate.rb
index 3f84de54ad5..bb095f113e2 100644
--- a/app/models/concerns/feature_gate.rb
+++ b/app/models/concerns/feature_gate.rb
@@ -2,7 +2,7 @@
module FeatureGate
def flipper_id
- return nil if new_record?
+ return if new_record?
"#{self.class.name}:#{id}"
end
diff --git a/app/models/concerns/has_ref.rb b/app/models/concerns/has_ref.rb
index d7089294efc..413cd36dcaa 100644
--- a/app/models/concerns/has_ref.rb
+++ b/app/models/concerns/has_ref.rb
@@ -4,7 +4,7 @@ module HasRef
extend ActiveSupport::Concern
def branch?
- !tag?
+ !tag? && !merge_request_event?
end
def git_ref
@@ -14,4 +14,15 @@ module HasRef
Gitlab::Git::TAG_REF_PREFIX + ref.to_s
end
end
+
+ # A slugified version of the build ref, suitable for inclusion in URLs and
+ # domain names. Rules:
+ #
+ # * Lowercased
+ # * Anything not matching [a-z0-9-] is replaced with a -
+ # * Maximum length is 63 bytes
+ # * First/Last Character is not a hyphen
+ def ref_slug
+ Gitlab::Utils.slugify(ref.to_s)
+ end
end
diff --git a/app/models/concerns/has_variable.rb b/app/models/concerns/has_variable.rb
index dfbe413a878..2ec42a1029b 100644
--- a/app/models/concerns/has_variable.rb
+++ b/app/models/concerns/has_variable.rb
@@ -21,9 +21,9 @@ module HasVariable
def key=(new_key)
super(new_key.to_s.strip)
end
+ end
- def to_runner_variable
- { key: key, value: value, public: false }
- end
+ def to_runner_variable
+ { key: key, value: value, public: false }
end
end
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 670103bc3f3..c7ad182ab82 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -75,6 +75,7 @@ module Issuable
validates :author, presence: true
validates :title, presence: true, length: { maximum: 255 }
+ validate :milestone_is_valid
scope :authored, ->(user) { where(author_id: user) }
scope :recent, -> { reorder(id: :desc) }
@@ -118,6 +119,16 @@ module Issuable
def has_multiple_assignees?
assignees.count > 1
end
+
+ def milestone_available?
+ project_id == milestone&.project_id || project.ancestors_upto.compact.include?(milestone&.group)
+ end
+
+ private
+
+ def milestone_is_valid
+ errors.add(:milestone_id, message: "is invalid") if milestone_id.present? && !milestone_available?
+ end
end
class_methods do
diff --git a/app/models/concerns/maskable.rb b/app/models/concerns/maskable.rb
new file mode 100644
index 00000000000..8793f0ec965
--- /dev/null
+++ b/app/models/concerns/maskable.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Maskable
+ extend ActiveSupport::Concern
+
+ # * Single line
+ # * No escape characters
+ # * No variables
+ # * No spaces
+ # * Minimal length of 8 characters
+ # * Absolutely no fun is allowed
+ REGEX = /\A\w{8,}\z/
+
+ included do
+ validates :masked, inclusion: { in: [true, false] }
+ validates :value, format: { with: REGEX }, if: :masked?
+ end
+
+ def to_runner_variable
+ super.merge(masked: masked?)
+ end
+end
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index 055ffe04646..e65bbb8ca07 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -46,12 +46,31 @@ module Milestoneish
end
end
+ def issue_participants_visible_by_user(user)
+ User.joins(:issue_assignees)
+ .where('issue_assignees.issue_id' => issues_visible_to_user(user).select(:id))
+ .distinct
+ end
+
+ def issue_labels_visible_by_user(user)
+ Label.joins(:label_links)
+ .where('label_links.target_id' => issues_visible_to_user(user).select(:id), 'label_links.target_type' => 'Issue')
+ .distinct
+ end
+
def sorted_issues(user)
issues_visible_to_user(user).preload_associations.sort_by_attribute('label_priority')
end
- def sorted_merge_requests
- merge_requests.sort_by_attribute('label_priority')
+ def sorted_merge_requests(user)
+ merge_requests_visible_to_user(user).sort_by_attribute('label_priority')
+ end
+
+ def merge_requests_visible_to_user(user)
+ memoize_per_user(user, :merge_requests_visible_to_user) do
+ MergeRequestsFinder.new(user, issues_finder_params)
+ .execute.where(milestone_id: milestoneish_id)
+ end
end
def upcoming?
diff --git a/app/models/concerns/mirror_authentication.rb b/app/models/concerns/mirror_authentication.rb
index e3e1a0441f8..948094221e5 100644
--- a/app/models/concerns/mirror_authentication.rb
+++ b/app/models/concerns/mirror_authentication.rb
@@ -79,7 +79,7 @@ module MirrorAuthentication
end
def ssh_public_key
- return nil if ssh_private_key.blank?
+ return if ssh_private_key.blank?
comment = "git@#{::Gitlab.config.gitlab.host}"
::SSHKey.new(ssh_private_key, comment: comment).ssh_public_key
diff --git a/app/models/concerns/reactive_caching.rb b/app/models/concerns/reactive_caching.rb
index de77ca3e963..d2ead7130e5 100644
--- a/app/models/concerns/reactive_caching.rb
+++ b/app/models/concerns/reactive_caching.rb
@@ -69,7 +69,7 @@ module ReactiveCaching
def with_reactive_cache(*args, &blk)
unless within_reactive_cache_lifetime?(*args)
refresh_reactive_cache!(*args)
- return nil
+ return
end
keep_alive_reactive_cache!(*args)
diff --git a/app/models/concerns/token_authenticatable_strategies/base.rb b/app/models/concerns/token_authenticatable_strategies/base.rb
index 01fb194281a..df14e6e4754 100644
--- a/app/models/concerns/token_authenticatable_strategies/base.rb
+++ b/app/models/concerns/token_authenticatable_strategies/base.rb
@@ -39,22 +39,6 @@ module TokenAuthenticatableStrategies
instance.save! if Gitlab::Database.read_write?
end
- def fallback?
- unless options[:fallback].in?([true, false, nil])
- raise ArgumentError, 'fallback: needs to be a boolean value!'
- end
-
- options[:fallback] == true
- end
-
- def migrating?
- unless options[:migrating].in?([true, false, nil])
- raise ArgumentError, 'migrating: needs to be a boolean value!'
- end
-
- options[:migrating] == true
- end
-
def self.fabricate(model, field, options)
if options[:digest] && options[:encrypted]
raise ArgumentError, 'Incompatible options set!'
diff --git a/app/models/concerns/token_authenticatable_strategies/encrypted.rb b/app/models/concerns/token_authenticatable_strategies/encrypted.rb
index 152491aa6e9..2c7fa2c5b3c 100644
--- a/app/models/concerns/token_authenticatable_strategies/encrypted.rb
+++ b/app/models/concerns/token_authenticatable_strategies/encrypted.rb
@@ -2,28 +2,18 @@
module TokenAuthenticatableStrategies
class Encrypted < Base
- def initialize(*)
- super
-
- if migrating? && fallback?
- raise ArgumentError, '`fallback` and `migrating` options are not compatible!'
- end
- end
-
def find_token_authenticatable(token, unscoped = false)
return if token.blank?
- if fully_encrypted?
- return find_by_encrypted_token(token, unscoped)
- end
-
- if fallback?
+ if required?
+ find_by_encrypted_token(token, unscoped)
+ elsif optional?
find_by_encrypted_token(token, unscoped) ||
find_by_plaintext_token(token, unscoped)
elsif migrating?
find_by_plaintext_token(token, unscoped)
else
- raise ArgumentError, 'Unknown encryption phase!'
+ raise ArgumentError, "Unknown encryption strategy: #{encrypted_strategy}!"
end
end
@@ -41,8 +31,8 @@ module TokenAuthenticatableStrategies
return super if instance.has_attribute?(encrypted_field)
- if fully_encrypted?
- raise ArgumentError, 'Using encrypted strategy when encrypted field is missing!'
+ if required?
+ raise ArgumentError, 'Using required encryption strategy when encrypted field is missing!'
else
insecure_strategy.ensure_token(instance)
end
@@ -53,8 +43,7 @@ module TokenAuthenticatableStrategies
encrypted_token = instance.read_attribute(encrypted_field)
token = Gitlab::CryptoHelper.aes256_gcm_decrypt(encrypted_token)
-
- token || (insecure_strategy.get_token(instance) if fallback?)
+ token || (insecure_strategy.get_token(instance) if optional?)
end
def set_token(instance, token)
@@ -62,16 +51,35 @@ module TokenAuthenticatableStrategies
instance[encrypted_field] = Gitlab::CryptoHelper.aes256_gcm_encrypt(token)
instance[token_field] = token if migrating?
- instance[token_field] = nil if fallback?
+ instance[token_field] = nil if optional?
token
end
- def fully_encrypted?
- !migrating? && !fallback?
+ def required?
+ encrypted_strategy == :required
+ end
+
+ def migrating?
+ encrypted_strategy == :migrating
+ end
+
+ def optional?
+ encrypted_strategy == :optional
end
protected
+ def encrypted_strategy
+ value = options[:encrypted]
+ value = value.call if value.is_a?(Proc)
+
+ unless value.in?([:required, :optional, :migrating])
+ raise ArgumentError, 'encrypted: needs to be a :required, :optional or :migrating!'
+ end
+
+ value
+ end
+
def find_by_plaintext_token(token, unscoped)
insecure_strategy.find_token_authenticatable(token, unscoped)
end
@@ -89,7 +97,7 @@ module TokenAuthenticatableStrategies
def token_set?(instance)
raw_token = instance.read_attribute(encrypted_field)
- unless fully_encrypted?
+ unless required?
raw_token ||= insecure_strategy.get_token(instance)
end
diff --git a/app/models/diff_note.rb b/app/models/diff_note.rb
index 279603496b0..805092e527a 100644
--- a/app/models/diff_note.rb
+++ b/app/models/diff_note.rb
@@ -41,6 +41,14 @@ class DiffNote < Note
create_note_diff_file(creation_params)
end
+ # Returns the diff file from `position`
+ def latest_diff_file
+ strong_memoize(:latest_diff_file) do
+ position.diff_file(project.repository)
+ end
+ end
+
+ # Returns the diff file from `original_position`
def diff_file
strong_memoize(:diff_file) do
enqueue_diff_file_creation_job if should_create_diff_file?
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 87bdb52b58b..3d909cc8e5c 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -119,7 +119,7 @@ class Environment < ActiveRecord::Base
def first_deployment_for(commit_sha)
ref = project.repository.ref_name_for_sha(ref_path, commit_sha)
- return nil unless ref
+ return unless ref
deployment_iid = ref.split('/').last
deployments.find_by(iid: deployment_iid)
@@ -130,7 +130,7 @@ class Environment < ActiveRecord::Base
end
def formatted_external_url
- return nil unless external_url
+ return unless external_url
external_url.gsub(%r{\A.*?://}, '')
end
diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb
index 57283a78ea9..1e2bd3bda7f 100644
--- a/app/models/error_tracking/project_error_tracking_setting.rb
+++ b/app/models/error_tracking/project_error_tracking_setting.rb
@@ -2,19 +2,30 @@
module ErrorTracking
class ProjectErrorTrackingSetting < ActiveRecord::Base
+ include Gitlab::Utils::StrongMemoize
include ReactiveCaching
+ API_URL_PATH_REGEXP = %r{
+ \A
+ (?<prefix>/api/0/projects/+)
+ (?:
+ (?<organization>[^/]+)/+
+ (?<project>[^/]+)/*
+ )?
+ \z
+ }x
+
self.reactive_cache_key = ->(setting) { [setting.class.model_name.singular, setting.project_id] }
belongs_to :project
validates :api_url, length: { maximum: 255 }, public_url: true, url: { enforce_sanitization: true, ascii_only: true }, allow_nil: true
- validates :api_url, presence: true, if: :enabled
+ validates :api_url, presence: { message: 'is a required field' }, if: :enabled
validate :validate_api_url_path, if: :enabled
- validates :token, presence: true, if: :enabled
+ validates :token, presence: { message: 'is a required field' }, if: :enabled
attr_encrypted :token,
mode: :per_attribute_iv,
@@ -23,6 +34,11 @@ module ErrorTracking
after_save :clear_reactive_cache!
+ def api_url=(value)
+ super
+ clear_memoization(:api_url_slugs)
+ end
+
def project_name
super || project_name_from_slug
end
@@ -40,6 +56,8 @@ module ErrorTracking
end
def self.build_api_url_from(api_host:, project_slug:, organization_slug:)
+ return if api_host.blank?
+
uri = Addressable::URI.parse("#{api_host}/api/0/projects/#{organization_slug}/#{project_slug}/")
uri.path = uri.path.squeeze('/')
@@ -100,34 +118,39 @@ module ErrorTracking
end
def project_slug_from_api_url
- extract_slug(:project)
+ api_url_slug(:project)
end
def organization_slug_from_api_url
- extract_slug(:organization)
+ api_url_slug(:organization)
+ end
+
+ def api_url_slug(capture)
+ slugs = strong_memoize(:api_url_slugs) { extract_api_url_slugs || {} }
+ slugs[capture]
end
- def extract_slug(capture)
+ def extract_api_url_slugs
return if api_url.blank?
begin
url = Addressable::URI.parse(api_url)
rescue Addressable::URI::InvalidURIError
- return nil
+ return
end
- @slug_match ||= url.path.match(%r{^/api/0/projects/+(?<organization>[^/]+)/+(?<project>[^/|$]+)}) || {}
- @slug_match[capture]
+ url.path.match(API_URL_PATH_REGEXP)
end
def validate_api_url_path
return if api_url.blank?
- begin
- unless Addressable::URI.parse(api_url).path.starts_with?('/api/0/projects')
- errors.add(:api_url, 'path needs to start with /api/0/projects')
- end
- rescue Addressable::URI::InvalidURIError
+ unless api_url_slug(:prefix)
+ return errors.add(:api_url, 'is invalid')
+ end
+
+ unless api_url_slug(:organization)
+ errors.add(:project, 'is a required field')
end
end
end
diff --git a/app/models/group.rb b/app/models/group.rb
index 52f503404af..495bfe04499 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -56,7 +56,7 @@ class Group < Namespace
validates :two_factor_grace_period, presence: true, numericality: { greater_than_or_equal_to: 0 }
- add_authentication_token_field :runners_token, encrypted: true, migrating: true
+ add_authentication_token_field :runners_token, encrypted: -> { Feature.enabled?(:groups_tokens_optional_encryption) ? :optional : :required }
after_create :post_create_hook
after_destroy :post_destroy_hook
diff --git a/app/models/individual_note_discussion.rb b/app/models/individual_note_discussion.rb
index b4a661ae5b4..3b6b68a9c5f 100644
--- a/app/models/individual_note_discussion.rb
+++ b/app/models/individual_note_discussion.rb
@@ -14,7 +14,7 @@ class IndividualNoteDiscussion < Discussion
end
def can_convert_to_discussion?
- noteable.supports_replying_to_individual_notes? && Feature.enabled?(:reply_to_individual_notes)
+ noteable.supports_replying_to_individual_notes? && Feature.enabled?(:reply_to_individual_notes, default_enabled: true)
end
def convert_to_discussion!(save: false)
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 071ad50fddc..deab53d25e7 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -64,6 +64,7 @@ class Issue < ActiveRecord::Base
scope :order_closest_future_date, -> { reorder('CASE WHEN issues.due_date >= CURRENT_DATE THEN 0 ELSE 1 END ASC, ABS(CURRENT_DATE - issues.due_date) ASC') }
scope :preload_associations, -> { preload(:labels, project: :namespace) }
+ scope :with_api_entity_associations, -> { preload(:timelogs, :assignees, :author, :notes, :labels, project: [:route, { namespace: :route }] ) }
scope :public_only, -> { where(confidential: false) }
scope :confidential_only, -> { where(confidential: true) }
diff --git a/app/models/label_note.rb b/app/models/label_note.rb
index 680952cf421..d6814f4a948 100644
--- a/app/models/label_note.rb
+++ b/app/models/label_note.rb
@@ -81,7 +81,7 @@ class LabelNote < Note
deleted = label_refs.count - existing_refs.count
deleted_str = deleted == 0 ? nil : "#{deleted} deleted"
- return nil unless refs_str || deleted_str
+ return unless refs_str || deleted_str
label_list_str = [refs_str, deleted_str].compact.join(' + ')
suffix = 'label'.pluralize(deleted > 0 ? deleted : existing_refs.count)
diff --git a/app/models/legacy_diff_note.rb b/app/models/legacy_diff_note.rb
index 00dec6bb92b..e2c75bc7ee9 100644
--- a/app/models/legacy_diff_note.rb
+++ b/app/models/legacy_diff_note.rb
@@ -73,7 +73,7 @@ class LegacyDiffNote < Note
private
def find_diff
- return nil unless noteable
+ return unless noteable
return @diff if defined?(@diff)
@diff = noteable.raw_diffs(Commit.max_diff_options).find do |d|
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1468ae1c34a..acf80addc6a 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -71,7 +71,7 @@ class MergeRequest < ActiveRecord::Base
serialize :merge_params, Hash # rubocop:disable Cop/ActiveRecordSerialize
- after_create :ensure_merge_request_diff, unless: :importing?
+ after_create :ensure_merge_request_diff
after_update :clear_memoized_shas
after_update :reload_diff_if_branch_changed
after_save :ensure_metrics
@@ -184,11 +184,21 @@ class MergeRequest < ActiveRecord::Base
scope :assigned, -> { where("assignee_id IS NOT NULL") }
scope :unassigned, -> { where("assignee_id IS NULL") }
scope :assigned_to, ->(u) { where(assignee_id: u.id)}
+ scope :with_api_entity_associations, -> {
+ preload(:author, :assignee, :notes, :labels, :milestone, :timelogs,
+ latest_merge_request_diff: [:merge_request_diff_commits],
+ metrics: [:latest_closed_by, :merged_by],
+ target_project: [:route, { namespace: :route }],
+ source_project: [:route, { namespace: :route }])
+ }
participant :assignee
after_save :keep_around_commit
+ alias_attribute :project, :target_project
+ alias_attribute :project_id, :target_project_id
+
def self.reference_prefix
'!'
end
@@ -847,10 +857,6 @@ class MergeRequest < ActiveRecord::Base
target_project != source_project
end
- def project
- target_project
- end
-
# If the merge request closes any issues, save this information in the
# `MergeRequestsClosingIssues` model. This is a performance optimization.
# Calculating this information for a number of merge requests requires
@@ -1154,35 +1160,16 @@ class MergeRequest < ActiveRecord::Base
Gitlab::Ci::Variables::Collection.new.tap do |variables|
variables.append(key: 'CI_MERGE_REQUEST_ID', value: id.to_s)
variables.append(key: 'CI_MERGE_REQUEST_IID', value: iid.to_s)
-
- variables.append(key: 'CI_MERGE_REQUEST_REF_PATH',
- value: ref_path.to_s)
-
- variables.append(key: 'CI_MERGE_REQUEST_PROJECT_ID',
- value: project.id.to_s)
-
- variables.append(key: 'CI_MERGE_REQUEST_PROJECT_PATH',
- value: project.full_path)
-
- variables.append(key: 'CI_MERGE_REQUEST_PROJECT_URL',
- value: project.web_url)
-
- variables.append(key: 'CI_MERGE_REQUEST_TARGET_BRANCH_NAME',
- value: target_branch.to_s)
-
- if source_project
- variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_ID',
- value: source_project.id.to_s)
-
- variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH',
- value: source_project.full_path)
-
- variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_URL',
- value: source_project.web_url)
-
- variables.append(key: 'CI_MERGE_REQUEST_SOURCE_BRANCH_NAME',
- value: source_branch.to_s)
- end
+ variables.append(key: 'CI_MERGE_REQUEST_REF_PATH', value: ref_path.to_s)
+ variables.append(key: 'CI_MERGE_REQUEST_PROJECT_ID', value: project.id.to_s)
+ variables.append(key: 'CI_MERGE_REQUEST_PROJECT_PATH', value: project.full_path)
+ variables.append(key: 'CI_MERGE_REQUEST_PROJECT_URL', value: project.web_url)
+ variables.append(key: 'CI_MERGE_REQUEST_TARGET_BRANCH_NAME', value: target_branch.to_s)
+ variables.append(key: 'CI_MERGE_REQUEST_TITLE', value: title)
+ variables.append(key: 'CI_MERGE_REQUEST_ASSIGNEES', value: assignee.username) if assignee
+ variables.append(key: 'CI_MERGE_REQUEST_MILESTONE', value: milestone.title) if milestone
+ variables.append(key: 'CI_MERGE_REQUEST_LABELS', value: label_names.join(',')) if labels.present?
+ variables.concat(source_project_variables)
end
end
@@ -1389,4 +1376,15 @@ class MergeRequest < ActiveRecord::Base
source_project&.ci_pipelines
&.latest_for_merge_request(self, source_branch, diff_head_sha)
end
+
+ def source_project_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables unless source_project
+
+ variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_ID', value: source_project.id.to_s)
+ variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH', value: source_project.full_path)
+ variables.append(key: 'CI_MERGE_REQUEST_SOURCE_PROJECT_URL', value: source_project.web_url)
+ variables.append(key: 'CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', value: source_branch.to_s)
+ end
+ end
end
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index e286a4e57f2..351a662ae83 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -22,6 +22,8 @@ class MergeRequestDiff < ActiveRecord::Base
has_many :merge_request_diff_commits, -> { order(:merge_request_diff_id, :relative_order) }
+ validates :base_commit_sha, :head_commit_sha, :start_commit_sha, sha: true
+
state_machine :state, initial: :empty do
event :clean do
transition any => :without_files
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index f7592532c5b..a5c479bdc0c 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -149,7 +149,7 @@ class Namespace < ApplicationRecord
end
def find_fork_of(project)
- return nil unless project.fork_network
+ return unless project.fork_network
if Gitlab::SafeRequestStore.active?
forks_in_namespace = Gitlab::SafeRequestStore.fetch("namespaces:#{id}:forked_projects") do
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb
index 481c1d963c6..793cce191fa 100644
--- a/app/models/notification_recipient.rb
+++ b/app/models/notification_recipient.rb
@@ -119,7 +119,7 @@ class NotificationRecipient
private
def read_ability
- return nil if @skip_read_ability
+ return if @skip_read_ability
return @read_ability if instance_variable_defined?(:@read_ability)
@read_ability =
@@ -136,7 +136,7 @@ class NotificationRecipient
end
def default_project
- return nil if @target.nil?
+ return if @target.nil?
return @target if @target.is_a?(Project)
return @target.project if @target.respond_to?(:project)
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 47baf899222..4cc13f372c1 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -85,7 +85,7 @@ class Project < ActiveRecord::Base
default_value_for :snippets_enabled, gitlab_config_features.snippets
default_value_for :only_allow_merge_if_all_discussions_are_resolved, false
- add_authentication_token_field :runners_token, encrypted: true, migrating: true
+ add_authentication_token_field :runners_token, encrypted: -> { Feature.enabled?(:projects_tokens_optional_encryption) ? :optional : :required }
before_validation :mark_remote_mirrors_for_removal, if: -> { RemoteMirror.table_exists? }
@@ -1230,7 +1230,7 @@ class Project < ActiveRecord::Base
end
def fork_source
- return nil unless forked?
+ return unless forked?
forked_from_project || fork_network&.root_project
end
@@ -1679,7 +1679,7 @@ class Project < ActiveRecord::Base
end
def export_path
- return nil unless namespace.present? || hashed_storage?(:repository)
+ return unless namespace.present? || hashed_storage?(:repository)
import_export_shared.archive_path
end
@@ -1970,9 +1970,19 @@ class Project < ActiveRecord::Base
return unless storage_upgradable?
if git_transfer_in_progress?
- ProjectMigrateHashedStorageWorker.perform_in(Gitlab::ReferenceCounter::REFERENCE_EXPIRE_TIME, id)
+ HashedStorage::ProjectMigrateWorker.perform_in(Gitlab::ReferenceCounter::REFERENCE_EXPIRE_TIME, id)
else
- ProjectMigrateHashedStorageWorker.perform_async(id)
+ HashedStorage::ProjectMigrateWorker.perform_async(id)
+ end
+ end
+
+ def rollback_to_legacy_storage!
+ return if legacy_storage?
+
+ if git_transfer_in_progress?
+ HashedStorage::ProjectRollbackWorker.perform_in(Gitlab::ReferenceCounter::REFERENCE_EXPIRE_TIME, id)
+ else
+ HashedStorage::ProjectRollbackWorker.perform_async(id)
end
end
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index f700090a493..e6787236c4e 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -76,7 +76,7 @@ class ProjectFeature < ActiveRecord::Base
# This feature might not be behind a feature flag at all, so default to true
return false unless ::Feature.enabled?(feature, user, default_enabled: true)
- get_permission(user, access_level(feature))
+ get_permission(user, feature)
end
def access_level(feature)
@@ -134,12 +134,12 @@ class ProjectFeature < ActiveRecord::Base
(FEATURES - %i(pages)).each {|f| validator.call("#{f}_access_level")}
end
- def get_permission(user, level)
- case level
+ def get_permission(user, feature)
+ case access_level(feature)
when DISABLED
false
when PRIVATE
- user && (project.team.member?(user) || user.full_private_access?)
+ team_access?(user, feature)
when ENABLED
true
when PUBLIC
@@ -148,4 +148,11 @@ class ProjectFeature < ActiveRecord::Base
true
end
end
+
+ def team_access?(user, feature)
+ return unless user
+ return true if user.full_private_access?
+
+ project.team.member?(user, ProjectFeature.required_minimum_access_level(feature))
+ end
end
diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb
index 1d7877a1fb5..ad26e42a21b 100644
--- a/app/models/project_services/campfire_service.rb
+++ b/app/models/project_services/campfire_service.rb
@@ -57,7 +57,7 @@ class CampfireService < Service
# https://github.com/basecamp/campfire-api/blob/master/sections/messages.md#create-message
def speak(room_name, message, auth)
room = rooms(auth).find { |r| r["name"] == room_name }
- return nil unless room
+ return unless room
path = "/room/#{room["id"]}/speak.json"
body = {
diff --git a/app/models/project_services/irker_service.rb b/app/models/project_services/irker_service.rb
index 83fd9a34438..fb76bc89c98 100644
--- a/app/models/project_services/irker_service.rb
+++ b/app/models/project_services/irker_service.rb
@@ -112,7 +112,7 @@ class IrkerService < Service
end
def consider_uri(uri)
- return nil if uri.scheme.nil?
+ return if uri.scheme.nil?
# Authorize both irc://domain.com/#chan and irc://domain.com/chan
if uri.is_a?(URI) && uri.scheme[/^ircs?\z/] && !uri.path.nil?
diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb
index 9066a0b7f1d..f7064d5aaea 100644
--- a/app/models/project_services/jira_service.rb
+++ b/app/models/project_services/jira_service.rb
@@ -215,7 +215,7 @@ class JiraService < IssueTrackerService
end
def add_issue_solved_comment(issue, commit_id, commit_url)
- link_title = "GitLab: Solved by commit #{commit_id}."
+ link_title = "Solved by commit #{commit_id}."
comment = "Issue solved with [#{commit_id}|#{commit_url}]."
link_props = build_remote_link_props(url: commit_url, title: link_title, resolved: true)
send_message(issue, comment, link_props)
@@ -230,7 +230,7 @@ class JiraService < IssueTrackerService
project_name = data[:project][:name]
message = "[#{user_name}|#{user_url}] mentioned this issue in [a #{entity_name} of #{project_name}|#{entity_url}]:\n'#{entity_title.chomp}'"
- link_title = "GitLab: Mentioned on #{entity_name} - #{entity_title}"
+ link_title = "#{entity_name.capitalize} - #{entity_title}"
link_props = build_remote_link_props(url: entity_url, title: link_title)
unless comment_exists?(issue, message)
@@ -278,6 +278,7 @@ class JiraService < IssueTrackerService
{
GlobalID: 'GitLab',
+ relationship: 'mentioned on',
object: {
url: url,
title: title,
diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb
index 60cb2d380d5..c68a9d923c8 100644
--- a/app/models/project_services/prometheus_service.rb
+++ b/app/models/project_services/prometheus_service.rb
@@ -71,7 +71,7 @@ class PrometheusService < MonitoringService
end
def prometheus_client
- RestClient::Resource.new(api_url, max_redirects: 0) if api_url && manual_configuration? && active?
+ RestClient::Resource.new(api_url, max_redirects: 0) if should_return_client?
end
def prometheus_available?
@@ -83,6 +83,10 @@ class PrometheusService < MonitoringService
private
+ def should_return_client?
+ api_url && manual_configuration? && active? && valid?
+ end
+
def synchronize_service_state
self.active = prometheus_available? || manual_configuration?
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index d075440b147..597431be65a 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -18,13 +18,23 @@ class ProtectedBranch < ActiveRecord::Base
def self.protected?(project, ref_name)
return true if project.empty_repo? && default_branch_protected?
- refs = project.protected_branches.select(:name)
+ self.matching(ref_name, protected_refs: protected_refs(project)).present?
+ end
- self.matching(ref_name, protected_refs: refs).present?
+ def self.any_protected?(project, ref_names)
+ protected_refs(project).any? do |protected_ref|
+ ref_names.any? do |ref_name|
+ protected_ref.matches?(ref_name)
+ end
+ end
end
def self.default_branch_protected?
Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_FULL ||
Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_DEV_CAN_MERGE
end
+
+ def self.protected_refs(project)
+ project.protected_branches.select(:name)
+ end
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index cd761a29618..851175a61b7 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -79,7 +79,7 @@ class Repository
end
def raw_repository
- return nil unless full_path
+ return unless full_path
@raw_repository ||= initialize_raw_repository
end
@@ -103,7 +103,7 @@ class Repository
end
def commit(ref = nil)
- return nil unless exists?
+ return unless exists?
return ref if ref.is_a?(::Commit)
find_commit(ref || root_ref)
diff --git a/app/models/ssh_host_key.rb b/app/models/ssh_host_key.rb
index fd23cc9ac87..b6fb39ee81f 100644
--- a/app/models/ssh_host_key.rb
+++ b/app/models/ssh_host_key.rb
@@ -27,7 +27,7 @@ class SshHostKey
def self.find_by(opts = {})
opts = HashWithIndifferentAccess.new(opts)
- return nil unless opts.key?(:id)
+ return unless opts.key?(:id)
project_id, url = opts[:id].split(':', 2)
project = Project.find_by(id: project_id)
diff --git a/app/models/suggestion.rb b/app/models/suggestion.rb
index 7eee4fbbe5f..09034646bff 100644
--- a/app/models/suggestion.rb
+++ b/app/models/suggestion.rb
@@ -19,11 +19,6 @@ class Suggestion < ApplicationRecord
position.file_path
end
- def diff_file
- repository = project.repository
- position.diff_file(repository)
- end
-
# For now, suggestions only serve as a way to send patches that
# will change a single line (being able to apply multiple in the same place),
# which explains `from_line` and `to_line` being the same line.
diff --git a/app/models/todo.rb b/app/models/todo.rb
index d9b86d941b6..2b0dee875a3 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -31,7 +31,13 @@ class Todo < ActiveRecord::Base
belongs_to :note
belongs_to :project
belongs_to :group
- belongs_to :target, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
+ belongs_to :target, -> {
+ if self.klass.respond_to?(:with_api_entity_associations)
+ self.with_api_entity_associations
+ else
+ self
+ end
+ }, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
belongs_to :user
delegate :name, :email, to: :author, prefix: true, allow_nil: true
@@ -52,6 +58,7 @@ class Todo < ActiveRecord::Base
scope :for_type, -> (type) { where(target_type: type) }
scope :for_target, -> (id) { where(target_id: id) }
scope :for_commit, -> (id) { where(commit_id: id) }
+ scope :with_api_entity_associations, -> { preload(:target, :author, :note, group: :route, project: [:route, { namespace: :route }]) }
state_machine :state, initial: :pending do
event :done do
diff --git a/app/models/user.rb b/app/models/user.rb
index ee51c35d576..778c9e631bd 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -470,7 +470,7 @@ class User < ApplicationRecord
end
def by_login(login)
- return nil unless login
+ return unless login
if login.include?('@'.freeze)
unscoped.iwhere(email: login).take
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index b1d6d461928..64daba81dcf 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -132,7 +132,7 @@ class WikiPage
# The GitLab Commit instance for this page.
def version
- return nil unless persisted?
+ return unless persisted?
@version ||= @page.version
end
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index 16c58730878..d412a591fdc 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -68,6 +68,10 @@ class GlobalPolicy < BasePolicy
enable :read_users_list
end
+ rule { ~anonymous }.policy do
+ enable :read_instance_metadata
+ end
+
rule { admin }.policy do
enable :read_custom_attribute
enable :update_custom_attribute
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 298769c0eb8..e74e5f008d7 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -53,7 +53,6 @@ class GroupPolicy < BasePolicy
rule { admin }.enable :read_group
rule { has_projects }.policy do
- enable :read_group
enable :read_list
enable :read_label
end
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 533782104ac..cf257ed47c8 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -278,6 +278,7 @@ class ProjectPolicy < BasePolicy
enable :admin_cluster
enable :create_environment_terminal
enable :destroy_release
+ enable :destroy_artifacts
enable :daily_statistics
end
@@ -300,6 +301,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))
end
rule { merge_requests_disabled | repository_disabled }.policy do
@@ -463,7 +466,7 @@ class ProjectPolicy < BasePolicy
when ProjectFeature::DISABLED
false
when ProjectFeature::PRIVATE
- guest? || admin?
+ admin? || team_access_level >= ProjectFeature.required_minimum_access_level(feature)
else
true
end
diff --git a/app/presenters/blobs/unfold_presenter.rb b/app/presenters/blobs/unfold_presenter.rb
new file mode 100644
index 00000000000..7b13db3bb74
--- /dev/null
+++ b/app/presenters/blobs/unfold_presenter.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'gt_one_coercion'
+
+module Blobs
+ class UnfoldPresenter < BlobPresenter
+ include Virtus.model
+ include Gitlab::Utils::StrongMemoize
+
+ attribute :full, Boolean, default: false
+ attribute :since, GtOneCoercion
+ attribute :to, GtOneCoercion
+ attribute :bottom, Boolean
+ attribute :unfold, Boolean, default: true
+ attribute :offset, Integer
+ attribute :indent, Integer, default: 0
+
+ def initialize(blob, params)
+ @subject = blob
+ @all_lines = highlight.lines
+ super(params)
+
+ if full?
+ self.attributes = { since: 1, to: @all_lines.size, bottom: false, unfold: false, offset: 0, indent: 0 }
+ end
+ end
+
+ # Converts a String array to Gitlab::Diff::Line array, with match line added
+ def diff_lines
+ diff_lines = lines.map do |line|
+ Gitlab::Diff::Line.new(line, nil, nil, nil, nil, rich_text: line)
+ end
+
+ add_match_line(diff_lines)
+
+ diff_lines
+ end
+
+ def lines
+ strong_memoize(:lines) do
+ lines = @all_lines
+ lines = lines[since - 1..to - 1] unless full?
+ lines.map(&:html_safe)
+ end
+ end
+
+ def match_line_text
+ return '' if bottom?
+
+ lines_length = lines.length - 1
+ line = [since, lines_length].join(',')
+ "@@ -#{line}+#{line} @@"
+ end
+
+ private
+
+ def add_match_line(diff_lines)
+ return unless unfold?
+
+ if bottom? && to < @all_lines.size
+ old_pos = to - offset
+ new_pos = to
+ elsif since != 1
+ old_pos = new_pos = since
+ end
+
+ # Match line is not needed when it reaches the top limit or bottom limit of the file.
+ return unless new_pos
+
+ match_line = Gitlab::Diff::Line.new(match_line_text, 'match', nil, old_pos, new_pos)
+
+ bottom? ? diff_lines.push(match_line) : diff_lines.unshift(match_line)
+ end
+ end
+end
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
index d60281c8a0b..29656b17183 100644
--- a/app/presenters/ci/build_runner_presenter.rb
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -35,7 +35,7 @@ module Ci
specs = []
if git_depth > 0
- specs << refspec_for_branch(ref) if branch? || merge_request?
+ specs << refspec_for_branch(ref) if branch? || merge_request_event?
specs << refspec_for_tag(ref) if tag?
else
specs << refspec_for_branch
diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb
index d94d9118eee..34bdf156623 100644
--- a/app/presenters/clusterable_presenter.rb
+++ b/app/presenters/clusterable_presenter.rb
@@ -44,6 +44,10 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated
raise NotImplementedError
end
+ def update_applications_cluster_path(cluster, application)
+ raise NotImplementedError
+ end
+
def cluster_path(cluster, params = {})
raise NotImplementedError
end
diff --git a/app/presenters/group_clusterable_presenter.rb b/app/presenters/group_clusterable_presenter.rb
index ef6bbc0d109..f5b0bb64487 100644
--- a/app/presenters/group_clusterable_presenter.rb
+++ b/app/presenters/group_clusterable_presenter.rb
@@ -14,6 +14,11 @@ class GroupClusterablePresenter < ClusterablePresenter
install_applications_group_cluster_path(clusterable, cluster, application)
end
+ override :update_applications_cluster_path
+ def update_applications_cluster_path(cluster, application)
+ update_applications_group_cluster_path(clusterable, cluster, application)
+ end
+
override :cluster_path
def cluster_path(cluster, params = {})
group_cluster_path(clusterable, cluster, params)
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb
index c59e73f824c..af164858408 100644
--- a/app/presenters/merge_request_presenter.rb
+++ b/app/presenters/merge_request_presenter.rb
@@ -98,6 +98,12 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
end
end
+ def target_branch_path
+ if target_branch_exists?
+ project_branch_path(project, target_branch)
+ end
+ end
+
def source_branch_path
if source_branch_exists?
project_branch_path(source_project, source_branch)
diff --git a/app/presenters/project_clusterable_presenter.rb b/app/presenters/project_clusterable_presenter.rb
index 63e69b91b11..8661ee02b68 100644
--- a/app/presenters/project_clusterable_presenter.rb
+++ b/app/presenters/project_clusterable_presenter.rb
@@ -14,6 +14,11 @@ class ProjectClusterablePresenter < ClusterablePresenter
install_applications_project_cluster_path(clusterable, cluster, application)
end
+ override :update_applications_cluster_path
+ def update_applications_cluster_path(cluster, application)
+ update_applications_project_cluster_path(clusterable, cluster, application)
+ end
+
override :cluster_path
def cluster_path(cluster, params = {})
project_cluster_path(clusterable, cluster, params)
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index 4cac90c2567..000b7c433a2 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -315,6 +315,10 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
project.tag_list.take(MAX_TOPICS_TO_SHOW) # rubocop: disable CodeReuse/ActiveRecord
end
+ def topics_not_shown
+ project.tag_list - topics_to_show
+ end
+
def count_of_extra_topics_not_shown
if project.tag_list.count > MAX_TOPICS_TO_SHOW
project.tag_list.count - MAX_TOPICS_TO_SHOW
diff --git a/app/serializers/acts_as_taggable_on/tag_entity.rb b/app/serializers/acts_as_taggable_on/tag_entity.rb
new file mode 100644
index 00000000000..d4e4b69f8fa
--- /dev/null
+++ b/app/serializers/acts_as_taggable_on/tag_entity.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class ActsAsTaggableOn::TagEntity < Grape::Entity
+ expose :id
+ expose :name
+end
diff --git a/app/serializers/acts_as_taggable_on/tag_serializer.rb b/app/serializers/acts_as_taggable_on/tag_serializer.rb
new file mode 100644
index 00000000000..87f53606aa1
--- /dev/null
+++ b/app/serializers/acts_as_taggable_on/tag_serializer.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class ActsAsTaggableOn::TagSerializer < BaseSerializer
+ entity ActsAsTaggableOn::TagEntity
+end
diff --git a/app/serializers/concerns/user_status_tooltip.rb b/app/serializers/concerns/user_status_tooltip.rb
index aa6e67e3351..633b117d392 100644
--- a/app/serializers/concerns/user_status_tooltip.rb
+++ b/app/serializers/concerns/user_status_tooltip.rb
@@ -11,7 +11,7 @@ module UserStatusTooltip
expose :user_status_if_loaded, as: :status_tooltip_html
def user_status_if_loaded
- return nil unless object.association(:status).loaded?
+ return unless object.association(:status).loaded?
user_status(object)
end
diff --git a/app/serializers/diff_file_base_entity.rb b/app/serializers/diff_file_base_entity.rb
index ede9e04b722..d8630165e49 100644
--- a/app/serializers/diff_file_base_entity.rb
+++ b/app/serializers/diff_file_base_entity.rb
@@ -27,9 +27,13 @@ class DiffFileBaseEntity < Grape::Entity
next unless merge_request.source_project
- project_edit_blob_path(merge_request.source_project,
- tree_join(merge_request.source_branch, diff_file.new_path),
- options)
+ if Feature.enabled?(:web_ide_default)
+ ide_edit_path(merge_request.source_project, merge_request.source_branch, diff_file.new_path)
+ else
+ project_edit_blob_path(merge_request.source_project,
+ tree_join(merge_request.source_branch, diff_file.new_path),
+ options)
+ end
end
expose :old_path_html do |diff_file|
diff --git a/app/serializers/diff_file_entity.rb b/app/serializers/diff_file_entity.rb
index 01ee7af37ed..13711070a46 100644
--- a/app/serializers/diff_file_entity.rb
+++ b/app/serializers/diff_file_entity.rb
@@ -7,7 +7,7 @@ class DiffFileEntity < DiffFileBaseEntity
expose :added_lines
expose :removed_lines
- expose :load_collapsed_diff_url, if: -> (diff_file, options) { diff_file.viewer.collapsed? && options[:merge_request] } do |diff_file|
+ expose :load_collapsed_diff_url, if: -> (diff_file, options) { options[:merge_request] } do |diff_file|
merge_request = options[:merge_request]
project = merge_request.target_project
@@ -57,6 +57,10 @@ class DiffFileEntity < DiffFileBaseEntity
diff_file.diff_lines_for_serializer
end
+ expose :is_fully_expanded, if: -> (diff_file, _) { Feature.enabled?(:expand_diff_full_file) && diff_file.text? } do |diff_file|
+ diff_file.fully_expanded?
+ end
+
# Used for parallel diffs
expose :parallel_diff_lines, using: DiffLineParallelEntity, if: -> (diff_file, _) { diff_file.text? }
end
diff --git a/app/serializers/merge_request_for_pipeline_entity.rb b/app/serializers/merge_request_for_pipeline_entity.rb
new file mode 100644
index 00000000000..7779ddfd65a
--- /dev/null
+++ b/app/serializers/merge_request_for_pipeline_entity.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class MergeRequestForPipelineEntity < Grape::Entity
+ include RequestAwareEntity
+
+ expose :iid
+
+ expose :path do |merge_request|
+ project_merge_request_path(merge_request.project, merge_request)
+ end
+
+ expose :title
+ expose :source_branch
+ expose :source_branch_path
+ expose :target_branch
+ expose :target_branch_path
+end
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index 29b1a6c244b..5ac1e590d39 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -23,11 +23,12 @@ class PipelineEntity < Grape::Entity
expose :latest?, as: :latest
expose :stuck?, as: :stuck
expose :auto_devops_source?, as: :auto_devops
- expose :merge_request?, as: :merge_request
+ expose :merge_request_event?, as: :merge_request
expose :has_yaml_errors?, as: :yaml_errors
expose :can_retry?, as: :retryable
expose :can_cancel?, as: :cancelable
expose :failure_reason?, as: :failure_reason
+ expose :detached_merge_request_pipeline?, as: :detached
end
expose :details do
@@ -36,6 +37,10 @@ class PipelineEntity < Grape::Entity
expose :finished_at
end
+ expose :merge_request, if: -> (*) { has_presentable_merge_request? }, with: MergeRequestForPipelineEntity do |pipeline|
+ pipeline.merge_request.present(current_user: request.current_user)
+ end
+
expose :ref do
expose :name do |pipeline|
pipeline.ref
@@ -49,7 +54,7 @@ class PipelineEntity < Grape::Entity
expose :tag?, as: :tag
expose :branch?, as: :branch
- expose :merge_request?, as: :merge_request
+ expose :merge_request_event?, as: :merge_request
end
expose :commit, using: CommitEntity
@@ -81,6 +86,11 @@ class PipelineEntity < Grape::Entity
pipeline.cancelable?
end
+ def has_presentable_merge_request?
+ pipeline.triggered_by_merge_request? &&
+ can?(request.current_user, :read_merge_request, pipeline.merge_request)
+ end
+
def detailed_status
pipeline.detailed_status(request.current_user)
end
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 7451433a841..dbbeca9431d 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -15,6 +15,7 @@ class PipelineSerializer < BaseSerializer
:manual_actions,
:scheduled_actions,
:artifacts,
+ :merge_request,
{
pending_builds: :project,
project: [:route, { namespace: :route }],
diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb
index 2e4643ed668..9146eb96533 100644
--- a/app/services/application_settings/update_service.rb
+++ b/app/services/application_settings/update_service.rb
@@ -38,7 +38,7 @@ module ApplicationSettings
def performance_bar_allowed_group_id
performance_bar_enabled = !params.key?(:performance_bar_enabled) || params.delete(:performance_bar_enabled)
group_full_path = params.delete(:performance_bar_allowed_group_path)
- return nil unless Gitlab::Utils.to_boolean(performance_bar_enabled)
+ return unless Gitlab::Utils.to_boolean(performance_bar_enabled)
Group.find_by_full_path(group_full_path)&.id if group_full_path.present?
end
diff --git a/app/services/boards/visits/latest_service.rb b/app/services/boards/visits/latest_service.rb
index 9e4c77a6317..d13e25b4f12 100644
--- a/app/services/boards/visits/latest_service.rb
+++ b/app/services/boards/visits/latest_service.rb
@@ -4,13 +4,15 @@ module Boards
module Visits
class LatestService < Boards::BaseService
def execute
- return nil unless current_user
+ return unless current_user
- if parent.is_a?(Group)
- BoardGroupRecentVisit.latest(current_user, parent)
- else
- BoardProjectRecentVisit.latest(current_user, parent)
- end
+ recent_visit_model.latest(current_user, parent, count: params[:count])
+ end
+
+ private
+
+ def recent_visit_model
+ parent.is_a?(Group) ? BoardGroupRecentVisit : BoardProjectRecentVisit
end
end
end
diff --git a/app/services/clusters/applications/base_helm_service.rb b/app/services/clusters/applications/base_helm_service.rb
index 8a71730d5ec..c38b2656260 100644
--- a/app/services/clusters/applications/base_helm_service.rb
+++ b/app/services/clusters/applications/base_helm_service.rb
@@ -46,6 +46,10 @@ module Clusters
@install_command ||= app.install_command
end
+ def update_command
+ @update_command ||= app.update_command
+ end
+
def upgrade_command(new_values = "")
app.upgrade_command(new_values)
end
diff --git a/app/services/clusters/applications/base_service.rb b/app/services/clusters/applications/base_service.rb
new file mode 100644
index 00000000000..cbd1cf03ae1
--- /dev/null
+++ b/app/services/clusters/applications/base_service.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Applications
+ class BaseService
+ InvalidApplicationError = Class.new(StandardError)
+
+ attr_reader :cluster, :current_user, :params
+
+ def initialize(cluster, user, params = {})
+ @cluster = cluster
+ @current_user = user
+ @params = params.dup
+ end
+
+ def execute(request)
+ instantiate_application.tap do |application|
+ if application.has_attribute?(:hostname)
+ application.hostname = params[:hostname]
+ end
+
+ if application.has_attribute?(:email)
+ application.email = params[:email]
+ end
+
+ if application.respond_to?(:oauth_application)
+ application.oauth_application = create_oauth_application(application, request)
+ end
+
+ worker = worker_class(application)
+
+ application.make_scheduled!
+
+ worker.perform_async(application.name, application.id)
+ end
+ end
+
+ protected
+
+ def worker_class(application)
+ raise NotImplementedError
+ end
+
+ def builders
+ raise NotImplementedError
+ end
+
+ def project_builders
+ raise NotImplementedError
+ end
+
+ def instantiate_application
+ builder.call(@cluster) || raise(InvalidApplicationError, "invalid application: #{application_name}")
+ end
+
+ def builder
+ builders[application_name] || raise(InvalidApplicationError, "invalid application: #{application_name}")
+ end
+
+ def application_name
+ params[:application]
+ end
+
+ def create_oauth_application(application, request)
+ oauth_application_params = {
+ name: params[:application],
+ redirect_uri: application.callback_url,
+ scopes: 'api read_user openid',
+ owner: current_user
+ }
+
+ ::Applications::CreateService.new(current_user, oauth_application_params).execute(request)
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/applications/create_service.rb b/app/services/clusters/applications/create_service.rb
index 12f8c849d41..bd7c31bb981 100644
--- a/app/services/clusters/applications/create_service.rb
+++ b/app/services/clusters/applications/create_service.rb
@@ -2,47 +2,11 @@
module Clusters
module Applications
- class CreateService
- InvalidApplicationError = Class.new(StandardError)
-
- attr_reader :cluster, :current_user, :params
-
- def initialize(cluster, user, params = {})
- @cluster = cluster
- @current_user = user
- @params = params.dup
- end
-
- def execute(request)
- create_application.tap do |application|
- if application.has_attribute?(:hostname)
- application.hostname = params[:hostname]
- end
-
- if application.has_attribute?(:email)
- application.email = params[:email]
- end
-
- if application.respond_to?(:oauth_application)
- application.oauth_application = create_oauth_application(application, request)
- end
-
- worker = application.updateable? ? ClusterUpgradeAppWorker : ClusterInstallAppWorker
-
- application.make_scheduled!
-
- worker.perform_async(application.name, application.id)
- end
- end
-
+ class CreateService < Clusters::Applications::BaseService
private
- def create_application
- builder.call(@cluster)
- end
-
- def builder
- builders[application_name] || raise(InvalidApplicationError, "invalid application: #{application_name}")
+ def worker_class(application)
+ application.updateable? ? ClusterUpgradeAppWorker : ClusterInstallAppWorker
end
def builders
@@ -65,21 +29,6 @@ module Clusters
"knative" => -> (cluster) { cluster.application_knative || cluster.build_application_knative }
}
end
-
- def application_name
- params[:application]
- end
-
- def create_oauth_application(application, request)
- oauth_application_params = {
- name: params[:application],
- redirect_uri: application.callback_url,
- scopes: 'api read_user openid',
- owner: current_user
- }
-
- ::Applications::CreateService.new(current_user, oauth_application_params).execute(request)
- end
end
end
end
diff --git a/app/services/clusters/applications/install_service.rb b/app/services/clusters/applications/install_service.rb
index 5a65dc4ef59..5bd3623a558 100644
--- a/app/services/clusters/applications/install_service.rb
+++ b/app/services/clusters/applications/install_service.rb
@@ -6,19 +6,17 @@ module Clusters
def execute
return unless app.scheduled?
- begin
- app.make_installing!
- helm_api.install(install_command)
+ app.make_installing!
+ helm_api.install(install_command)
- ClusterWaitForAppInstallationWorker.perform_in(
- ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)
- rescue Kubeclient::HttpError => e
- log_error(e)
- app.make_errored!("Kubernetes error: #{e.error_code}")
- rescue StandardError => e
- log_error(e)
- app.make_errored!("Can't start installation process.")
- end
+ ClusterWaitForAppInstallationWorker.perform_in(
+ ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)
+ rescue Kubeclient::HttpError => e
+ log_error(e)
+ app.make_errored!("Kubernetes error: #{e.error_code}")
+ rescue StandardError => e
+ log_error(e)
+ app.make_errored!("Can't start installation process.")
end
end
end
diff --git a/app/services/clusters/applications/patch_service.rb b/app/services/clusters/applications/patch_service.rb
new file mode 100644
index 00000000000..20c739af7a2
--- /dev/null
+++ b/app/services/clusters/applications/patch_service.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Applications
+ class PatchService < BaseHelmService
+ def execute
+ return unless app.scheduled?
+
+ app.make_updating!
+
+ helm_api.update(update_command)
+
+ ClusterWaitForAppInstallationWorker.perform_in(
+ ClusterWaitForAppInstallationWorker::INTERVAL, app.name, app.id)
+ rescue Kubeclient::HttpError => e
+ log_error(e)
+ app.make_update_errored!("Kubernetes error: #{e.error_code}")
+ rescue StandardError => e
+ log_error(e)
+ app.make_update_errored!("Can't start update process.")
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/applications/update_service.rb b/app/services/clusters/applications/update_service.rb
new file mode 100644
index 00000000000..a9d4e609992
--- /dev/null
+++ b/app/services/clusters/applications/update_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Applications
+ class UpdateService < Clusters::Applications::BaseService
+ private
+
+ def worker_class(application)
+ ClusterPatchAppWorker
+ end
+
+ def builders
+ {
+ "helm" => -> (cluster) { cluster.application_helm },
+ "ingress" => -> (cluster) { cluster.application_ingress },
+ "cert_manager" => -> (cluster) { cluster.application_cert_manager }
+ }.tap do |hash|
+ hash.merge!(project_builders) if cluster.project_type?
+ end
+ end
+
+ # These applications will need extra configuration to enable them to work
+ # with groups of projects
+ def project_builders
+ {
+ "prometheus" => -> (cluster) { cluster.application_prometheus },
+ "runner" => -> (cluster) { cluster.application_runner },
+ "jupyter" => -> (cluster) { cluster.application_jupyter },
+ "knative" => -> (cluster) { cluster.application_knative }
+ }
+ end
+ end
+ end
+end
diff --git a/app/services/commits/create_service.rb b/app/services/commits/create_service.rb
index 34593e12bd5..bb34a3d3352 100644
--- a/app/services/commits/create_service.rb
+++ b/app/services/commits/create_service.rb
@@ -11,6 +11,7 @@ module Commits
@start_project = params[:start_project] || @project
@start_branch = params[:start_branch]
@branch_name = params[:branch_name]
+ @force = params[:force] || false
end
def execute
@@ -42,10 +43,14 @@ module Commits
@start_branch != @branch_name || @start_project != @project
end
+ def force?
+ !!@force
+ end
+
def validate!
validate_permissions!
validate_on_branch!
- validate_branch_existance!
+ validate_branch_existence!
validate_new_branch_name! if different_branch?
end
@@ -64,14 +69,14 @@ module Commits
end
end
- def validate_branch_existance!
- if !project.empty_repo? && different_branch? && repository.branch_exists?(@branch_name)
+ def validate_branch_existence!
+ if !project.empty_repo? && different_branch? && repository.branch_exists?(@branch_name) && !force?
raise_error("A branch called '#{@branch_name}' already exists. Switch to that branch in order to make changes")
end
end
def validate_new_branch_name!
- result = ValidateNewBranchService.new(project, current_user).execute(@branch_name)
+ result = ValidateNewBranchService.new(project, current_user).execute(@branch_name, force: force?)
if result[:status] == :error
raise_error("Something went wrong when we tried to create '#{@branch_name}' for you: #{result[:message]}")
diff --git a/app/services/error_tracking/list_projects_service.rb b/app/services/error_tracking/list_projects_service.rb
index c6e8be0f2be..4e92353a13c 100644
--- a/app/services/error_tracking/list_projects_service.rb
+++ b/app/services/error_tracking/list_projects_service.rb
@@ -28,8 +28,8 @@ module ErrorTracking
(project.error_tracking_setting || project.build_error_tracking_setting).tap do |setting|
setting.api_url = ErrorTracking::ProjectErrorTrackingSetting.build_api_url_from(
api_host: params[:api_host],
- organization_slug: nil,
- project_slug: nil
+ organization_slug: 'org',
+ project_slug: 'proj'
)
setting.token = params[:token]
diff --git a/app/services/files/multi_service.rb b/app/services/files/multi_service.rb
index 927634c2159..c1bc26c330a 100644
--- a/app/services/files/multi_service.rb
+++ b/app/services/files/multi_service.rb
@@ -46,7 +46,8 @@ module Files
author_email: @author_email,
author_name: @author_name,
start_project: @start_project,
- start_branch_name: @start_branch
+ start_branch_name: @start_branch,
+ force: force?
)
rescue ArgumentError => e
raise_error(e)
diff --git a/app/services/groups/nested_create_service.rb b/app/services/groups/nested_create_service.rb
index f01f5656296..01bd685712b 100644
--- a/app/services/groups/nested_create_service.rb
+++ b/app/services/groups/nested_create_service.rb
@@ -12,7 +12,7 @@ module Groups
end
def execute
- return nil unless group_path
+ return unless group_path
if namespace = namespace_or_group(group_path)
return namespace
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index f64e327416a..94185605ab9 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -35,7 +35,10 @@ module Groups
def proceed_to_transfer
Group.transaction do
update_group_attributes
+ ensure_ownership
end
+
+ true
end
def ensure_allowed_transfer
@@ -95,6 +98,13 @@ module Groups
end
# rubocop: enable CodeReuse/ActiveRecord
+ def ensure_ownership
+ return if @new_parent_group
+ return unless @group.owners.empty?
+
+ @group.add_owner(current_user)
+ end
+
def raise_transfer_error(message)
raise TransferError, ERROR_MESSAGES[message]
end
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index ef991eaf234..f35ad2a9d8b 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -89,7 +89,7 @@ class IssuableBaseService < BaseService
return unless labels
- params[:label_ids] = labels.split(",").map do |label_name|
+ params[:label_ids] = labels.map do |label_name|
label = Labels::FindOrCreateService.new(
current_user,
parent,
@@ -387,4 +387,10 @@ class IssuableBaseService < BaseService
def parent
project
end
+
+ # we need to check this because milestone from milestone_id param is displayed on "new" page
+ # where private project milestone could leak without this check
+ def ensure_milestone_available(issuable)
+ issuable.milestone_id = nil unless issuable.milestone_available?
+ end
end
diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb
index 3fb2c2b3007..61615ac2058 100644
--- a/app/services/issues/build_service.rb
+++ b/app/services/issues/build_service.rb
@@ -6,7 +6,9 @@ module Issues
def execute
filter_resolve_discussion_params
- @issue = project.issues.new(issue_params)
+ @issue = project.issues.new(issue_params).tap do |issue|
+ ensure_milestone_available(issue)
+ end
end
def issue_params_with_info_from_discussions
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index ac51fee0b3f..11ede5223e5 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -67,7 +67,7 @@ module MergeRequests
Ci::CreatePipelineService
.new(merge_request.source_project, user, ref: merge_request.source_branch)
- .execute(:merge_request,
+ .execute(:merge_request_event,
ignore_skip_ci: true,
save_on_errors: false,
merge_request: merge_request)
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 48419da98ad..109c964e577 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -19,6 +19,7 @@ module MergeRequests
merge_request.target_project = find_target_project
merge_request.target_branch = find_target_branch
merge_request.can_be_created = projects_and_branches_valid?
+ ensure_milestone_available(merge_request)
# compare branches only if branches are valid, otherwise
# compare_branches may raise an error
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb
index 8241e408ce5..b29e0b1759e 100644
--- a/app/services/merge_requests/merge_service.rb
+++ b/app/services/merge_requests/merge_service.rb
@@ -76,8 +76,7 @@ module MergeRequests
def try_merge
repository.merge(current_user, source, merge_request, commit_message)
rescue Gitlab::Git::PreReceiveError => e
- handle_merge_error(log_message: e.message)
- raise_error('Something went wrong during merge pre-receive hook')
+ raise_error("Something went wrong during merge pre-receive hook: #{e.message}")
rescue => e
handle_merge_error(log_message: e.message)
raise_error('Something went wrong during merge')
diff --git a/app/services/merge_requests/merge_to_ref_service.rb b/app/services/merge_requests/merge_to_ref_service.rb
index 586652ae44e..69cc441f1bb 100644
--- a/app/services/merge_requests/merge_to_ref_service.rb
+++ b/app/services/merge_requests/merge_to_ref_service.rb
@@ -20,7 +20,12 @@ module MergeRequests
raise_error('Conflicts detected during merge') unless commit_id
- success(commit_id: commit_id)
+ commit = project.commit(commit_id)
+ target_id, source_id = commit.parent_ids
+
+ success(commit_id: commit.id,
+ target_id: target_id,
+ source_id: source_id)
rescue MergeError => error
error(error.message)
end
@@ -38,12 +43,8 @@ module MergeRequests
error =
if Feature.disabled?(:merge_to_tmp_merge_ref_path, project)
'Feature is not enabled'
- elsif !merge_method_supported?
- "#{project.human_merge_method} to #{target_ref} is currently not supported."
elsif !hooks_validation_pass?(merge_request)
hooks_validation_error(merge_request)
- elsif @merge_request.should_be_rebased?
- 'Fast-forward merge is not possible. Please update your source branch.'
elsif !@merge_request.mergeable_to_ref?
"Merge request is not mergeable to #{target_ref}"
elsif !source
@@ -68,9 +69,5 @@ module MergeRequests
rescue Gitlab::Git::PreReceiveError => error
raise MergeError, error.message
end
-
- def merge_method_supported?
- [:merge, :rebase_merge].include?(project.merge_method)
- end
end
end
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 5a6e7338b42..1b46f6d8a72 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -21,7 +21,7 @@ module Notes
if quick_actions_service.supported?(note)
options = { merge_request_diff_head_sha: merge_request_diff_head_sha }
- content, command_params = quick_actions_service.extract_commands(note, options)
+ content, update_params = quick_actions_service.execute(note, options)
only_commands = content.empty?
@@ -43,16 +43,17 @@ module Notes
Suggestions::CreateService.new(note).execute
end
- if command_params.present?
- quick_actions_service.execute(command_params, note)
+ if quick_actions_service.commands_executed_count.to_i > 0
+ if update_params.present?
+ quick_actions_service.apply_updates(update_params, note)
+ note.commands_changes = update_params
+ end
# We must add the error after we call #save because errors are reset
# when #save is called
if only_commands
note.errors.add(:commands_only, 'Commands applied')
end
-
- note.commands_changes = command_params
end
note
diff --git a/app/services/notes/quick_actions_service.rb b/app/services/notes/quick_actions_service.rb
index 985a03060bd..0852a708240 100644
--- a/app/services/notes/quick_actions_service.rb
+++ b/app/services/notes/quick_actions_service.rb
@@ -1,7 +1,18 @@
# frozen_string_literal: true
+# QuickActionsService class
+#
+# Executes quick actions commands extracted from note text
+#
+# Most commands returns parameters to be applied later
+# using QuickActionService#apply_updates
+#
module Notes
class QuickActionsService < BaseService
+ attr_reader :interpret_service
+
+ delegate :commands_executed_count, to: :interpret_service, allow_nil: true
+
UPDATE_SERVICES = {
'Issue' => Issues::UpdateService,
'MergeRequest' => MergeRequests::UpdateService,
@@ -25,18 +36,21 @@ module Notes
self.class.supported?(note)
end
- def extract_commands(note, options = {})
+ def execute(note, options = {})
return [note.note, {}] unless supported?(note)
- QuickActions::InterpretService.new(project, current_user, options)
- .execute(note.note, note.noteable)
+ @interpret_service = QuickActions::InterpretService.new(project, current_user, options)
+
+ @interpret_service.execute(note.note, note.noteable)
end
- def execute(command_params, note)
- return if command_params.empty?
+ # Applies updates extracted to note#noteable
+ # The update parameters are extracted on self#execute
+ def apply_updates(update_params, note)
+ return if update_params.empty?
return unless supported?(note)
- self.class.noteable_update_service(note).new(note.parent, current_user, command_params).execute(note.noteable)
+ self.class.noteable_update_service(note).new(note.parent, current_user, update_params).execute(note.noteable)
end
end
end
diff --git a/app/services/projects/download_service.rb b/app/services/projects/download_service.rb
index dd297c9ba43..aba175eb79b 100644
--- a/app/services/projects/download_service.rb
+++ b/app/services/projects/download_service.rb
@@ -11,7 +11,7 @@ module Projects
end
def execute
- return nil unless valid_url?(@url)
+ return unless valid_url?(@url)
uploader = FileUploader.new(@project)
uploader.download!(@url)
diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb
index 1392775f805..e3d5bea0852 100644
--- a/app/services/projects/group_links/create_service.rb
+++ b/app/services/projects/group_links/create_service.rb
@@ -4,13 +4,19 @@ module Projects
module GroupLinks
class CreateService < BaseService
def execute(group)
- return false unless group
+ return error('Not Found', 404) unless group && can?(current_user, :read_namespace, group)
- project.project_group_links.create(
+ link = project.project_group_links.new(
group: group,
group_access: params[:link_group_access],
expires_at: params[:expires_at]
)
+
+ if link.save
+ success(link: link)
+ else
+ error(link.errors.full_messages.to_sentence, 409)
+ end
end
end
end
diff --git a/app/services/projects/hashed_storage/base_attachment_service.rb b/app/services/projects/hashed_storage/base_attachment_service.rb
new file mode 100644
index 00000000000..828ab616bab
--- /dev/null
+++ b/app/services/projects/hashed_storage/base_attachment_service.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module Projects
+ module HashedStorage
+ AttachmentMigrationError = Class.new(StandardError)
+
+ AttachmentCannotMoveError = Class.new(StandardError)
+
+ class BaseAttachmentService < BaseService
+ # Returns the disk_path value before the execution
+ attr_reader :old_disk_path
+
+ # Returns the disk_path value after the execution
+ attr_reader :new_disk_path
+
+ # Returns the logger currently in use
+ attr_reader :logger
+
+ # Return whether this operation was skipped or not
+ #
+ # @return [Boolean] true if skipped of false otherwise
+ def skipped?
+ @skipped
+ end
+
+ protected
+
+ def move_folder!(old_path, new_path)
+ unless File.directory?(old_path)
+ logger.info("Skipped attachments move from '#{old_path}' to '#{new_path}', source path doesn't exist or is not a directory (PROJECT_ID=#{project.id})")
+ @skipped = true
+
+ return true
+ end
+
+ if File.exist?(new_path)
+ logger.error("Cannot move attachments from '#{old_path}' to '#{new_path}', target path already exist (PROJECT_ID=#{project.id})")
+ raise AttachmentCannotMoveError, "Target path '#{new_path}' already exists"
+ end
+
+ # Create base path folder on the new storage layout
+ FileUtils.mkdir_p(File.dirname(new_path))
+
+ FileUtils.mv(old_path, new_path)
+ logger.info("Project attachments moved from '#{old_path}' to '#{new_path}' (PROJECT_ID=#{project.id})")
+
+ true
+ end
+ end
+ end
+end
diff --git a/app/services/projects/hashed_storage/base_repository_service.rb b/app/services/projects/hashed_storage/base_repository_service.rb
index 761c81d776f..f97a28b8c3b 100644
--- a/app/services/projects/hashed_storage/base_repository_service.rb
+++ b/app/services/projects/hashed_storage/base_repository_service.rb
@@ -2,11 +2,8 @@
module Projects
module HashedStorage
- # Returned when there is an error with the Hashed Storage migration
- RepositoryMigrationError = Class.new(StandardError)
-
- # Returned when there is an error with the Hashed Storage rollback
- RepositoryRollbackError = Class.new(StandardError)
+ # Returned when repository can't be made read-only because there is already a git transfer in progress
+ RepositoryInUseError = Class.new(StandardError)
class BaseRepositoryService < BaseService
include Gitlab::ShellAdapter
@@ -38,7 +35,10 @@ module Projects
# project was not originally empty.
if !from_exists && !to_exists
logger.warn "Can't find a repository on either source or target paths for #{project.full_path} (ID=#{project.id}) ..."
- return false
+
+ # We return true so we still reflect the change in the database.
+ # Next time the repository is (re)created it will be under the new storage layout
+ return true
elsif !from_exists
# Repository have been moved already.
return true
@@ -52,6 +52,16 @@ module Projects
move_repository(new_disk_path, old_disk_path)
move_repository("#{new_disk_path}.wiki", old_wiki_disk_path)
end
+
+ def try_to_set_repository_read_only!
+ # Mitigate any push operation to start during migration
+ unless project.set_repository_read_only!
+ migration_error = "Target repository '#{old_disk_path}' cannot be made read-only as there is a git transfer in progress"
+ logger.error migration_error
+
+ raise RepositoryInUseError, migration_error
+ end
+ end
end
end
end
diff --git a/app/services/projects/hashed_storage/migrate_attachments_service.rb b/app/services/projects/hashed_storage/migrate_attachments_service.rb
index 03e0685d2cd..9eaeb6eb4e7 100644
--- a/app/services/projects/hashed_storage/migrate_attachments_service.rb
+++ b/app/services/projects/hashed_storage/migrate_attachments_service.rb
@@ -2,62 +2,37 @@
module Projects
module HashedStorage
- AttachmentMigrationError = Class.new(StandardError)
-
- class MigrateAttachmentsService < BaseService
- attr_reader :logger, :old_disk_path, :new_disk_path
-
+ class MigrateAttachmentsService < BaseAttachmentService
def initialize(project, old_disk_path, logger: nil)
@project = project
@logger = logger || Rails.logger
@old_disk_path = old_disk_path
- @new_disk_path = project.disk_path
@skipped = false
end
def execute
origin = FileUploader.absolute_base_dir(project)
- # It's possible that old_disk_path does not match project.disk_path. For example, that happens when we rename a project
+ # It's possible that old_disk_path does not match project.disk_path.
+ # For example, that happens when we rename a project
origin.sub!(/#{Regexp.escape(project.full_path)}\z/, old_disk_path)
project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:attachments]
target = FileUploader.absolute_base_dir(project)
- result = move_folder!(origin, target)
- project.save!
-
- if result && block_given?
- yield
- end
-
- result
- end
-
- def skipped?
- @skipped
- end
+ @new_disk_path = project.disk_path
- private
+ result = move_folder!(origin, target)
- def move_folder!(old_path, new_path)
- unless File.directory?(old_path)
- logger.info("Skipped attachments migration from '#{old_path}' to '#{new_path}', source path doesn't exist or is not a directory (PROJECT_ID=#{project.id})")
- @skipped = true
- return true
- end
+ if result
+ project.save!
- if File.exist?(new_path)
- logger.error("Cannot migrate attachments from '#{old_path}' to '#{new_path}', target path already exist (PROJECT_ID=#{project.id})")
- raise AttachmentMigrationError, "Target path '#{new_path}' already exist"
+ yield if block_given?
+ else
+ # Rollback changes
+ project.rollback!
end
- # Create hashed storage base path folder
- FileUtils.mkdir_p(File.dirname(new_path))
-
- FileUtils.mv(old_path, new_path)
- logger.info("Migrated project attachments from '#{old_path}' to '#{new_path}' (PROJECT_ID=#{project.id})")
-
- true
+ result
end
end
end
diff --git a/app/services/projects/hashed_storage/migrate_repository_service.rb b/app/services/projects/hashed_storage/migrate_repository_service.rb
index 9c672283c7e..5afa8732c0a 100644
--- a/app/services/projects/hashed_storage/migrate_repository_service.rb
+++ b/app/services/projects/hashed_storage/migrate_repository_service.rb
@@ -15,7 +15,7 @@ module Projects
result = move_repository(old_disk_path, new_disk_path)
if move_wiki
- result &&= move_repository("#{old_wiki_disk_path}", "#{new_disk_path}.wiki")
+ result &&= move_repository(old_wiki_disk_path, "#{new_disk_path}.wiki")
end
if result
@@ -35,18 +35,6 @@ module Projects
result
end
-
- private
-
- def try_to_set_repository_read_only!
- # Mitigate any push operation to start during migration
- unless project.set_repository_read_only!
- migration_error = "Target repository '#{old_disk_path}' cannot be made read-only as there is a git transfer in progress"
- logger.error migration_error
-
- raise RepositoryMigrationError, migration_error
- end
- end
end
end
end
diff --git a/app/services/projects/hashed_storage/rollback_attachments_service.rb b/app/services/projects/hashed_storage/rollback_attachments_service.rb
new file mode 100644
index 00000000000..6c370ac47e9
--- /dev/null
+++ b/app/services/projects/hashed_storage/rollback_attachments_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Projects
+ module HashedStorage
+ class RollbackAttachmentsService < BaseAttachmentService
+ def initialize(project, logger: nil)
+ @project = project
+ @logger = logger || Rails.logger
+ @old_disk_path = project.disk_path
+ end
+
+ def execute
+ origin = FileUploader.absolute_base_dir(project)
+ project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
+ target = FileUploader.absolute_base_dir(project)
+
+ @new_disk_path = FileUploader.base_dir(project)
+
+ result = move_folder!(origin, target)
+
+ if result
+ project.save!
+
+ yield if block_given?
+ else
+ # Rollback changes
+ project.rollback!
+ end
+
+ result
+ end
+ end
+ end
+end
diff --git a/app/services/projects/hashed_storage/rollback_repository_service.rb b/app/services/projects/hashed_storage/rollback_repository_service.rb
new file mode 100644
index 00000000000..b5c971c70a5
--- /dev/null
+++ b/app/services/projects/hashed_storage/rollback_repository_service.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Projects
+ module HashedStorage
+ class RollbackRepositoryService < BaseRepositoryService
+ def execute
+ try_to_set_repository_read_only!
+
+ @old_storage_version = project.storage_version
+ project.storage_version = nil
+ project.ensure_storage_path_exists
+
+ @new_disk_path = project.disk_path
+
+ result = move_repository(old_disk_path, new_disk_path)
+
+ if move_wiki
+ result &&= move_repository(old_wiki_disk_path, "#{new_disk_path}.wiki")
+ end
+
+ if result
+ project.write_repository_config
+ project.track_project_repository
+ else
+ rollback_folder_move
+ project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
+ end
+
+ project.repository_read_only = false
+ project.save!
+
+ if result && block_given?
+ yield
+ end
+
+ result
+ end
+ end
+ end
+end
diff --git a/app/services/projects/hashed_storage/rollback_service.rb b/app/services/projects/hashed_storage/rollback_service.rb
new file mode 100644
index 00000000000..25767f5de5e
--- /dev/null
+++ b/app/services/projects/hashed_storage/rollback_service.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Projects
+ module HashedStorage
+ class RollbackService < BaseService
+ attr_reader :logger, :old_disk_path
+
+ def initialize(project, old_disk_path, logger: nil)
+ @project = project
+ @old_disk_path = old_disk_path
+ @logger = logger || Rails.logger
+ end
+
+ def execute
+ # Rollback attachments from Hashed Storage to Legacy
+ if project.hashed_storage?(:attachments)
+ return false unless rollback_attachments
+ end
+
+ # Rollback repository from Hashed Storage to Legacy
+ if project.hashed_storage?(:repository)
+ rollback_repository
+ end
+ end
+
+ private
+
+ def rollback_attachments
+ HashedStorage::RollbackAttachmentsService.new(project, logger: logger).execute
+ end
+
+ def rollback_repository
+ HashedStorage::RollbackRepositoryService.new(project, old_disk_path, logger: logger).execute
+ end
+ end
+ end
+end
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index abd6d8de750..aedf79c86d7 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -12,7 +12,28 @@ module Projects
private
def project_update_params
- params.slice(:error_tracking_setting_attributes)
+ error_tracking_params
+ end
+
+ def error_tracking_params
+ settings = params[:error_tracking_setting_attributes]
+ return {} if settings.blank?
+
+ api_url = ErrorTracking::ProjectErrorTrackingSetting.build_api_url_from(
+ api_host: settings[:api_host],
+ project_slug: settings.dig(:project, :slug),
+ organization_slug: settings.dig(:project, :organization_slug)
+ )
+
+ {
+ error_tracking_setting_attributes: {
+ api_url: api_url,
+ token: settings[:token],
+ enabled: settings[:enabled],
+ project_name: settings.dig(:project, :name),
+ organization_name: settings.dig(:project, :organization_name)
+ }
+ }
end
end
end
diff --git a/app/services/push_event_payload_service.rb b/app/services/push_event_payload_service.rb
index bb1259787af..fe366ac225b 100644
--- a/app/services/push_event_payload_service.rb
+++ b/app/services/push_event_payload_service.rb
@@ -46,7 +46,7 @@ class PushEventPayloadService
def commit_title
commit = @push_data.fetch(:commits).last
- return nil unless commit && commit[:message]
+ return unless commit && commit[:message]
raw_msg = commit[:message]
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 5c58caee8cd..131efb8925e 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -7,6 +7,11 @@ module QuickActions
attr_reader :issuable
+ # Counts how many commands have been executed.
+ # Used to display relevant feedback on UI when a note
+ # with only commands has been processed.
+ attr_accessor :commands_executed_count
+
SHRUG = '¯\\_(ツ)_/¯'.freeze
TABLEFLIP = '(╯°□°)╯︵ â”»â”â”»'.freeze
diff --git a/app/services/suggestions/apply_service.rb b/app/services/suggestions/apply_service.rb
index 1f720fc835f..f778c5aa5f5 100644
--- a/app/services/suggestions/apply_service.rb
+++ b/app/services/suggestions/apply_service.rb
@@ -15,7 +15,13 @@ module Suggestions
return error('The file has been changed')
end
- params = file_update_params(suggestion)
+ diff_file = suggestion.note.latest_diff_file
+
+ unless diff_file
+ return error('The file was not found')
+ end
+
+ params = file_update_params(suggestion, diff_file)
result = ::Files::UpdateService.new(suggestion.project, @current_user, params).execute
if result[:status] == :success
@@ -38,8 +44,8 @@ module Suggestions
suggestion.position.head_sha == suggestion.noteable.source_branch_sha
end
- def file_update_params(suggestion)
- blob = suggestion.diff_file.new_blob
+ def file_update_params(suggestion, diff_file)
+ blob = diff_file.new_blob
file_path = suggestion.file_path
branch_name = suggestion.branch
file_content = new_file_content(suggestion, blob)
diff --git a/app/services/suggestions/create_service.rb b/app/services/suggestions/create_service.rb
index 77e958cbe0c..c7ac2452c53 100644
--- a/app/services/suggestions/create_service.rb
+++ b/app/services/suggestions/create_service.rb
@@ -9,6 +9,10 @@ module Suggestions
def execute
return unless @note.supports_suggestion?
+ diff_file = @note.latest_diff_file
+
+ return unless diff_file
+
suggestions = Banzai::SuggestionsParser.parse(@note.note)
# For single line suggestion we're only looking forward to
@@ -20,7 +24,7 @@ module Suggestions
rows =
suggestions.map.with_index do |suggestion, index|
- from_content = changing_lines(comment_line, comment_line)
+ from_content = changing_lines(diff_file, comment_line, comment_line)
# The parsed suggestion doesn't have information about the correct
# ending characters (we may have a line break, or not), so we take
@@ -44,8 +48,8 @@ module Suggestions
private
- def changing_lines(from_line, to_line)
- @note.diff_file.new_blob_lines_between(from_line, to_line).join
+ def changing_lines(diff_file, from_line, to_line)
+ diff_file.new_blob_lines_between(from_line, to_line).join
end
def line_break_chars(line)
diff --git a/app/services/upload_service.rb b/app/services/upload_service.rb
index 41ca95b3b6f..403944557a2 100644
--- a/app/services/upload_service.rb
+++ b/app/services/upload_service.rb
@@ -6,7 +6,7 @@ class UploadService
end
def execute
- return nil unless @file && @file.size <= max_attachment_size
+ return unless @file && @file.size <= max_attachment_size
uploader = @uploader_class.new(@model, nil, @uploader_context)
uploader.store!(@file)
diff --git a/app/services/validate_new_branch_service.rb b/app/services/validate_new_branch_service.rb
index c19e2ec2043..3f4a59e5cee 100644
--- a/app/services/validate_new_branch_service.rb
+++ b/app/services/validate_new_branch_service.rb
@@ -3,14 +3,14 @@
require_relative 'base_service'
class ValidateNewBranchService < BaseService
- def execute(branch_name)
+ def execute(branch_name, force: false)
valid_branch = Gitlab::GitRefValidator.validate(branch_name)
unless valid_branch
return error('Branch name is invalid')
end
- if project.repository.branch_exists?(branch_name)
+ if project.repository.branch_exists?(branch_name) && !force
return error('Branch already exists')
end
diff --git a/app/uploaders/file_mover.rb b/app/uploaders/file_mover.rb
index a7f8615e9ba..236b7ed2b3d 100644
--- a/app/uploaders/file_mover.rb
+++ b/app/uploaders/file_mover.rb
@@ -11,6 +11,8 @@ class FileMover
end
def execute
+ return unless valid?
+
move
if update_markdown
@@ -21,6 +23,12 @@ class FileMover
private
+ def valid?
+ Pathname.new(temp_file_path).realpath.to_path.start_with?(
+ (Pathname(temp_file_uploader.root) + temp_file_uploader.base_dir).to_path
+ )
+ end
+
def move
FileUtils.mkdir_p(File.dirname(file_path))
FileUtils.move(temp_file_path, file_path)
diff --git a/app/validators/sha_validator.rb b/app/validators/sha_validator.rb
new file mode 100644
index 00000000000..085fca4d65d
--- /dev/null
+++ b/app/validators/sha_validator.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class ShaValidator < ActiveModel::EachValidator
+ def validate_each(record, attribute, value)
+ return if value.blank? || value.match(/\A\h{40}\z/)
+
+ record.errors.add(attribute, 'is not a valid SHA')
+ end
+end
diff --git a/app/views/admin/appearances/_system_header_footer_form.html.haml b/app/views/admin/appearances/_system_header_footer_form.html.haml
index ca9d6adebeb..4301ebd05af 100644
--- a/app/views/admin/appearances/_system_header_footer_form.html.haml
+++ b/app/views/admin/appearances/_system_header_footer_form.html.haml
@@ -13,6 +13,15 @@
.form-group
= form.label :footer_message, _('Footer message'), class: 'col-form-label label-bold'
= form.text_area :footer_message, placeholder: _('State your message to activate'), class: "form-control js-autosize"
+ .form-group
+ .form-check
+ = form.check_box :email_header_and_footer_enabled, class: 'form-check-input'
+ = form.label :email_header_and_footer_enabled, class: 'label-bold' do
+ = _('Enable header and footer in emails')
+
+ .hint
+ = _('Add header and footer to emails. Please note that color settings will only be applied within the application interface')
+
.form-group.js-toggle-colors-container
%button.btn.btn-link.js-toggle-colors-link{ type: 'button' }
= _('Customize colors')
diff --git a/app/views/admin/runners/index.html.haml b/app/views/admin/runners/index.html.haml
index 81380587fd2..2e23b748edb 100644
--- a/app/views/admin/runners/index.html.haml
+++ b/app/views/admin/runners/index.html.haml
@@ -92,6 +92,25 @@
= button_tag class: %w[btn btn-link] do
= runner_type.titleize
+ #js-dropdown-admin-runner-type.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ - Ci::Runner::AVAILABLE_TYPES.each do |runner_type|
+ %li.filter-dropdown-item{ data: { value: runner_type } }
+ = button_tag class: %w[btn btn-link] do
+ = runner_type.titleize
+
+ #js-dropdown-runner-tag.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'none' } }
+ %button.btn.btn-link
+ = _('No Tag')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.btn.btn-link.js-data-value
+ %span.dropdown-light-content
+ {{name}}
+
= button_tag class: %w[clear-search hidden] do
= icon('times')
.filter-dropdown-container
diff --git a/app/views/ci/status/_icon.html.haml b/app/views/ci/status/_icon.html.haml
new file mode 100644
index 00000000000..f38bdb2e5ed
--- /dev/null
+++ b/app/views/ci/status/_icon.html.haml
@@ -0,0 +1,16 @@
+- status = local_assigns.fetch(:status)
+- size = local_assigns.fetch(:size, 16)
+- type = local_assigns.fetch(:type, 'pipeline')
+- tooltip_placement = local_assigns.fetch(:tooltip_placement, "left")
+- path = local_assigns.fetch(:path, status.has_details? ? status.details_path : nil)
+- css_classes = "ci-status-link ci-status-icon ci-status-icon-#{status.group} has-tooltip"
+- title = s_("PipelineStatusTooltip|Pipeline: %{ci_status}") % {ci_status: status.label}
+- if type == 'commit'
+ - title = s_("PipelineStatusTooltip|Commit: %{ci_status}") % {ci_status: status.label}
+
+- if path
+ = link_to path, class: css_classes, title: title, data: { placement: tooltip_placement } do
+ = sprite_icon(status.icon, size: size)
+- else
+ %span{ class: css_classes, title: title, data: { placement: tooltip_placement } }
+ = sprite_icon(status.icon, size: size)
diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml
index 1ef76ef801e..7d381c6d4a6 100644
--- a/app/views/clusters/clusters/show.html.haml
+++ b/app/views/clusters/clusters/show.html.haml
@@ -15,6 +15,7 @@
install_runner_path: clusterable.install_applications_cluster_path(@cluster, :runner),
install_jupyter_path: clusterable.install_applications_cluster_path(@cluster, :jupyter),
install_knative_path: clusterable.install_applications_cluster_path(@cluster, :knative),
+ update_knative_path: clusterable.update_applications_cluster_path(@cluster, :knative),
toggle_status: @cluster.enabled? ? 'true': 'false',
has_rbac: @cluster.platform_kubernetes_rbac? ? 'true': 'false',
cluster_type: @cluster.cluster_type,
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index 39d0f620283..2f635757902 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -25,6 +25,8 @@
.settings-content
= render 'groups/settings/permissions'
+= render_if_exists 'groups/insights', expanded: expanded
+
%section.settings.no-animate#js-badge-settings{ class: ('expanded' if expanded) }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' }
diff --git a/app/views/layouts/_mailer.html.haml b/app/views/layouts/_mailer.html.haml
index 26fd34347ec..e13490ed410 100644
--- a/app/views/layouts/_mailer.html.haml
+++ b/app/views/layouts/_mailer.html.haml
@@ -52,6 +52,7 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
%tr.header
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
+ = html_header_message
= header_logo
%tr
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
@@ -72,3 +73,6 @@
= _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link }
= yield :additional_footer
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
+ = html_footer_message
diff --git a/app/views/layouts/empty_mailer.html.haml b/app/views/layouts/empty_mailer.html.haml
new file mode 100644
index 00000000000..a25dcefd445
--- /dev/null
+++ b/app/views/layouts/empty_mailer.html.haml
@@ -0,0 +1,5 @@
+= html_header_message
+
+= yield
+
+= html_footer_message
diff --git a/app/views/layouts/empty_mailer.text.erb b/app/views/layouts/empty_mailer.text.erb
new file mode 100644
index 00000000000..6ab0dbead07
--- /dev/null
+++ b/app/views/layouts/empty_mailer.text.erb
@@ -0,0 +1,5 @@
+<%= text_header_message %>
+
+<%= yield -%>
+
+<%= text_footer_message %>
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
index 8e11174f8d7..f8032f3262b 100644
--- a/app/views/layouts/mailer.text.erb
+++ b/app/views/layouts/mailer.text.erb
@@ -1,4 +1,8 @@
+<%= text_header_message %>
+
<%= yield -%>
-- <%# signature marker %>
<%= _("You're receiving this email because of your account on %{host}.") % { host: Gitlab.config.gitlab.host } %>
+
+<%= text_footer_message %>
diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml
index 1c3e05e07f4..8dff12c1b7f 100644
--- a/app/views/layouts/notify.html.haml
+++ b/app/views/layouts/notify.html.haml
@@ -7,6 +7,7 @@
= yield :head
%body
.content
+ = html_header_message
= yield
.footer{ style: "margin-top: 10px;" }
%p
@@ -30,3 +31,4 @@
adjust your notification settings.
= email_action @target_url
+ = html_footer_message
diff --git a/app/views/layouts/notify.text.erb b/app/views/layouts/notify.text.erb
index 9dc490efa9a..248916fba63 100644
--- a/app/views/layouts/notify.text.erb
+++ b/app/views/layouts/notify.text.erb
@@ -1,3 +1,5 @@
+<%= text_header_message %>
+
<%= yield -%>
-- <%# signature marker %>
@@ -10,3 +12,5 @@
<% end -%>
<%= "You're receiving this email because #{notification_reason_text(@reason)}." %>
+
+<%= text_footer_message -%>
diff --git a/app/views/notify/issue_moved_email.html.haml b/app/views/notify/issue_moved_email.html.haml
index 472c31e9a5e..b766cb1a523 100644
--- a/app/views/notify/issue_moved_email.html.haml
+++ b/app/views/notify/issue_moved_email.html.haml
@@ -1,6 +1,9 @@
%p
Issue was moved to another project.
-%p
- New issue:
- = link_to project_issue_url(@new_project, @new_issue) do
- = @new_issue.title
+- if @can_access_project
+ %p
+ New issue:
+ = link_to project_issue_url(@new_project, @new_issue) do
+ = @new_issue.title
+- else
+ You don't have access to the project.
diff --git a/app/views/notify/issue_moved_email.text.erb b/app/views/notify/issue_moved_email.text.erb
index 66ede43635b..985e689aa9d 100644
--- a/app/views/notify/issue_moved_email.text.erb
+++ b/app/views/notify/issue_moved_email.text.erb
@@ -1,4 +1,8 @@
Issue was moved to another project.
+<% if @can_access_project %>
New issue location:
<%= project_issue_url(@new_project, @new_issue) %>
+<% else %>
+You don't have access to the project.
+<% end %>
diff --git a/app/views/profiles/active_sessions/_active_session.html.haml b/app/views/profiles/active_sessions/_active_session.html.haml
index 23ef31a0c85..2bf514d72a5 100644
--- a/app/views/profiles/active_sessions/_active_session.html.haml
+++ b/app/views/profiles/active_sessions/_active_session.html.haml
@@ -23,9 +23,3 @@
%strong Signed in
on
= l(active_session.created_at, format: :short)
-
- - unless is_current_session
- .float-right
- = link_to profile_active_session_path(active_session.session_id), data: { confirm: 'Are you sure? The device will be signed out of GitLab.' }, method: :delete, class: "btn btn-danger prepend-left-10" do
- %span.sr-only Revoke
- Revoke
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index bba303c906c..1d7287410ea 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,5 +1,6 @@
- empty_repo = @project.empty_repo?
- show_auto_devops_callout = show_auto_devops_callout?(@project)
+- max_project_topic_length = 15
.project-home-panel{ class: ("empty-project" if empty_repo) }
.row.append-bottom-8
.home-panel-title-row.col-md-12.col-lg-6.d-flex
@@ -19,15 +20,21 @@
%span.access-request-links.prepend-left-8
= render 'shared/members/access_request_links', source: @project
- if @project.tag_list.present?
- %span.home-panel-topic-list.d-inline-flex.prepend-left-8.has-tooltip{ data: { container: 'body' }, title: @project.has_extra_topics? ? @project.tag_list.join(', ') : nil }
+ %span.home-panel-topic-list.d-inline-flex.prepend-left-8
= sprite_icon('tag', size: 16, css_class: 'icon append-right-4')
- @project.topics_to_show.each do |topic|
- %a{ class: 'badge badge-pill badge-secondary append-right-5 str-truncated-30', href: explore_projects_path(tag: topic) }
- = topic.titleize
+ - project_topics_classes = "badge badge-pill badge-secondary append-right-5"
+ - explore_project_topic_path = explore_projects_path(tag: topic)
+ - if topic.length > max_project_topic_length
+ %a{ class: "#{ project_topics_classes } str-truncated-30 has-tooltip", data: { container: "body" }, title: topic, href: explore_project_topic_path }
+ = topic.titleize
+ - else
+ %a{ class: project_topics_classes, href: explore_project_topic_path }
+ = topic.titleize
- if @project.has_extra_topics?
- .text-nowrap
+ .text-nowrap.has-tooltip{ data: { container: 'body' }, title: @project.has_extra_topics? ? @project.topics_not_shown.join(', ') : nil }
= _("+ %{count} more") % { count: @project.count_of_extra_topics_not_shown }
diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml
index 03ba1104507..830cfa80d58 100644
--- a/app/views/projects/_md_preview.html.haml
+++ b/app/views/projects/_md_preview.html.haml
@@ -12,10 +12,10 @@
%ul.nav.nav-tabs.nav-links.clearfix
%li.md-header-tab.active
%button.js-md-write-button{ tabindex: -1 }
- Write
+ = _("Write")
%li.md-header-tab
%button.js-md-preview-button{ tabindex: -1 }
- Preview
+ = _("Preview")
%li.md-header-toolbar.active
= render 'projects/blob/markdown_buttons', show_fullscreen_button: true
diff --git a/app/views/projects/_merge_request_merge_settings.html.haml b/app/views/projects/_merge_request_merge_settings.html.haml
index f178c94e008..6ac2e06afa5 100644
--- a/app/views/projects/_merge_request_merge_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_settings.html.haml
@@ -9,6 +9,7 @@
%span.descr
Pipelines need to be configured to enable this feature.
= link_to icon('question-circle'), help_page_path('user/project/merge_requests/merge_when_pipeline_succeeds', anchor: 'only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds'), target: '_blank'
+ = render_if_exists 'projects/merge_pipelines_settings', form: form
.form-check
= form.check_box :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-input'
= form.label :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-label' do
diff --git a/app/views/projects/blob/_markdown_buttons.html.haml b/app/views/projects/blob/_markdown_buttons.html.haml
index 1d6acd86108..28d1ff97825 100644
--- a/app/views/projects/blob/_markdown_buttons.html.haml
+++ b/app/views/projects/blob/_markdown_buttons.html.haml
@@ -1,13 +1,13 @@
.md-header-toolbar.active
- = markdown_toolbar_button({ icon: "bold", data: { "md-tag" => "**" }, title: s_("MarkdownToolbar|Add bold text") })
- = markdown_toolbar_button({ icon: "italic", data: { "md-tag" => "*" }, title: s_("MarkdownToolbar|Add italic text") })
- = markdown_toolbar_button({ icon: "quote", data: { "md-tag" => "> ", "md-prepend" => true }, title: s_("MarkdownToolbar|Insert a quote") })
- = markdown_toolbar_button({ icon: "code", data: { "md-tag" => "`", "md-block" => "```" }, title: s_("MarkdownToolbar|Insert code") })
- = markdown_toolbar_button({ icon: "link", data: { "md-tag" => "[{text}](url)", "md-select" => "url" }, title: s_("MarkdownToolbar|Add a link") })
- = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "* ", "md-prepend" => true }, title: s_("MarkdownToolbar|Add a bullet list") })
- = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: s_("MarkdownToolbar|Add a numbered list") })
- = markdown_toolbar_button({ icon: "task-done", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: s_("MarkdownToolbar|Add a task list") })
- = markdown_toolbar_button({ icon: "table", data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| cell | cell |\n| cell | cell |", "md-prepend" => true }, title: s_("MarkdownToolbar|Add a table") })
+ = markdown_toolbar_button({ icon: "bold", data: { "md-tag" => "**" }, title: _("Add bold text") })
+ = markdown_toolbar_button({ icon: "italic", data: { "md-tag" => "*" }, title: _("Add italic text") })
+ = markdown_toolbar_button({ icon: "quote", data: { "md-tag" => "> ", "md-prepend" => true }, title: _("Insert a quote") })
+ = markdown_toolbar_button({ icon: "code", data: { "md-tag" => "`", "md-block" => "```" }, title: _("Insert code") })
+ = markdown_toolbar_button({ icon: "link", data: { "md-tag" => "[{text}](url)", "md-select" => "url" }, title: _("Add a link") })
+ = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "* ", "md-prepend" => true }, title: _("Add a bullet list") })
+ = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: _("Add a numbered list") })
+ = markdown_toolbar_button({ icon: "task-done", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: _("Add a task list") })
+ = markdown_toolbar_button({ icon: "table", data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| cell | cell |\n| cell | cell |", "md-prepend" => true }, title: _("Add a table") })
- if show_fullscreen_button
- %button.toolbar-btn.toolbar-fullscreen-btn.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, "aria-label": "Go full screen", title: s_("MarkdownToolbar|Go full screen"), data: { container: "body" } }
+ %button.toolbar-btn.toolbar-fullscreen-btn.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, "aria-label": "Go full screen", title: _("Go full screen"), data: { container: "body" } }
= sprite_icon("screen-full")
diff --git a/app/views/projects/blob/viewers/_dependency_manager.html.haml b/app/views/projects/blob/viewers/_dependency_manager.html.haml
index 87aa7c1dbf8..5970d41fdab 100644
--- a/app/views/projects/blob/viewers/_dependency_manager.html.haml
+++ b/app/views/projects/blob/viewers/_dependency_manager.html.haml
@@ -3,9 +3,4 @@
This project manages its dependencies using
%strong= viewer.manager_name
- - if viewer.package_name
- and defines a #{viewer.package_type} named
- %strong<
- = link_to_if viewer.package_url.present?, viewer.package_name, viewer.package_url, target: '_blank', rel: 'noopener noreferrer'
-
= link_to 'Learn more', viewer.manager_url, target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml
index 159d9e44e17..09f05b30433 100644
--- a/app/views/projects/buttons/_clone.html.haml
+++ b/app/views/projects/buttons/_clone.html.haml
@@ -7,7 +7,7 @@
= sprite_icon("arrow-down", css_class: "icon")
%ul.p-3.dropdown-menu.dropdown-menu-right.dropdown-menu-large.dropdown-menu-selectable.clone-options-dropdown.qa-clone-options
- if ssh_enabled?
- %li.pb-2
+ %li
%label.label-bold
= _('Clone with SSH')
.input-group
@@ -16,7 +16,7 @@
= clipboard_button(target: '#ssh_project_clone', title: _("Copy URL to clipboard"), class: "input-group-text btn-default btn-clipboard")
= render_if_exists 'projects/buttons/geo'
- if http_enabled?
- %li
+ %li.pt-2
%label.label-bold
= _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase }
.input-group
@@ -24,5 +24,6 @@
.input-group-append
= clipboard_button(target: '#http_project_clone', title: _("Copy URL to clipboard"), class: "input-group-text btn-default btn-clipboard")
= render_if_exists 'projects/buttons/geo'
+ = render_if_exists 'projects/buttons/kerberos_clone_field'
= render_if_exists 'shared/geo_info_modal', project: project
diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml
index bdf021fd87f..59f0afd59e6 100644
--- a/app/views/projects/cycle_analytics/show.html.haml
+++ b/app/views/projects/cycle_analytics/show.html.haml
@@ -10,7 +10,7 @@
.wrapper{ "v-show" => "!isLoading && !hasError" }
.card
.card-header
- {{ __('Pipeline Health') }}
+ {{ __('Recent Project Activity') }}
.content-block
.container-fluid
.row
diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml
index f4c91377ecb..e45c5be76de 100644
--- a/app/views/projects/deployments/_actions.haml
+++ b/app/views/projects/deployments/_actions.haml
@@ -11,4 +11,4 @@
- next unless can?(current_user, :update_build, action)
%li
= link_to [:play, @project.namespace.becomes(Namespace), @project, action], method: :post, rel: 'nofollow', class: 'btn' do
- %span= action.name.humanize
+ %span= action.name
diff --git a/app/views/projects/deployments/_confirm_rollback_modal.html.haml b/app/views/projects/deployments/_confirm_rollback_modal.html.haml
new file mode 100644
index 00000000000..ff40e404e5f
--- /dev/null
+++ b/app/views/projects/deployments/_confirm_rollback_modal.html.haml
@@ -0,0 +1,23 @@
+- commit_sha = link_to deployment.short_sha, project_commit_path(@project, deployment.sha), class: "commit-sha has-tooltip", title: h(deployment.commit_title)
+.modal.ws-normal.fade{ tabindex: -1, id: "confirm-rollback-modal-#{deployment.id}" }
+ .modal-dialog
+ .modal-content
+ .modal-header
+ %h4.modal-title.d-flex.mw-100
+ - if deployment.last?
+ = s_("Environments|Re-deploy environment %{environment_name}?") % {environment_name: @environment.name}
+ - else
+ = s_("Environments|Rollback environment %{environment_name}?") % {environment_name: @environment.name}
+ .modal-body
+ - if deployment.last?
+ %p= s_('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?').html_safe % {commit_id: commit_sha}
+ - else
+ %p
+ = s_('Environments|This action will run the job defined by staging 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?').html_safe % {commit_id: commit_sha}
+ .modal-footer
+ = button_tag _('Cancel'), type: 'button', class: 'btn btn-cancel', data: { dismiss: 'modal' }
+ = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-danger' do
+ - if deployment.last?
+ = s_('Environments|Re-deploy')
+ - else
+ = s_('Environments|Rollback')
diff --git a/app/views/projects/deployments/_rollback.haml b/app/views/projects/deployments/_rollback.haml
index 1bd538a08ff..d6bf8d564de 100644
--- a/app/views/projects/deployments/_rollback.haml
+++ b/app/views/projects/deployments/_rollback.haml
@@ -1,7 +1,8 @@
- if can?(current_user, :create_deployment, deployment)
- tooltip = deployment.last? ? s_('Environments|Re-deploy to environment') : s_('Environments|Rollback environment')
- = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build has-tooltip', title: tooltip do
+ = button_tag class: 'btn btn-default btn-build has-tooltip', type: 'button', data: { toggle: 'modal', target: "#confirm-rollback-modal-#{deployment.id}" }, title: tooltip do
- if deployment.last?
= sprite_icon('repeat')
- else
= sprite_icon('redo')
+ = render 'projects/deployments/confirm_rollback_modal', deployment: deployment
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index 1a489bfa275..a6a8ca489a9 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -1,17 +1,15 @@
-- breadcrumb_title "General Settings"
-- page_title "General"
+- breadcrumb_title _("General Settings")
+- page_title _("General")
- @content_class = "limit-container-width" unless fluid_layout
- expanded = Rails.env.test?
.project-edit-container
%section.settings.general-settings.no-animate#js-general-project-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
- General project
- %button.btn.js-settings-toggle{ type: 'button' }
- = expanded ? 'Collapse' : 'Expand'
- %p
- Update your project name, description, avatar, and other general settings.
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Naming, tags, avatar')
+ %button.btn.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
+ %p= _('Update your project name, tags, description and avatar.')
+
.settings-content
.project-edit-errors
= form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit-project" }, authenticity_token: true do |f|
@@ -63,12 +61,10 @@
%section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded) }
.settings-header
- %h4
- Permissions
- %button.btn.js-settings-toggle{ type: 'button' }
- = expanded ? 'Collapse' : 'Expand'
- %p
- Enable or disable certain project features and choose access levels.
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Visibility, project features, permissions')
+ %button.btn.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
+ %p= _('Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions.')
+
.settings-content
= form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "sharing-permissions-form" }, authenticity_token: true do |f|
%input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' }
@@ -81,12 +77,10 @@
%section.qa-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)] }
.settings-header
- %h4
- Merge request
- %button.btn.js-settings-toggle{ type: 'button' }
- = expanded ? 'Collapse' : 'Expand'
- %p
- Customize your merge request restrictions.
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Merge requests')
+ %button.btn.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
+ %p= _('Choose your merge method, set up a default merge request description template.')
+
.settings-content
= render_if_exists 'shared/promotions/promote_mr_features'
@@ -97,11 +91,10 @@
= render_if_exists 'projects/merge_request_approvals_settings', expanded: expanded
- = render_if_exists 'projects/service_desk_settings'
%section.settings.no-animate{ class: ('expanded' if expanded) }
.settings-header
- %h4
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= s_('ProjectSettings|Badges')
%button.btn.js-settings-toggle{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
@@ -111,16 +104,15 @@
.settings-content
= render 'shared/badges/badge_settings'
+ = render_if_exists 'projects/service_desk_settings'
= render 'export', project: @project
%section.qa-advanced-settings.settings.advanced-settings.no-animate#js-project-advanced-settings{ class: ('expanded' if expanded) }
.settings-header
- %h4
- Advanced
- %button.btn.js-settings-toggle{ type: 'button' }
- = expanded ? 'Collapse' : 'Expand'
- %p
- Perform advanced options such as housekeeping, archiving, renaming, transferring, or removing your project.
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Advanced')
+ %button.btn.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
+ %p= _('Housekeeping, export, path, transfer, remove, archive.')
+
.settings-content
.sub-section
%h4 Housekeeping
diff --git a/app/views/projects/issues/_merge_requests.html.haml b/app/views/projects/issues/_merge_requests.html.haml
index 310e339ac8d..6a66c2e57cc 100644
--- a/app/views/projects/issues/_merge_requests.html.haml
+++ b/app/views/projects/issues/_merge_requests.html.haml
@@ -27,7 +27,7 @@
= merge_request.to_reference
%span.mr-ci-status.flex-md-grow-1.justify-content-end.d-flex.ml-md-2
- if merge_request.can_read_pipeline?
- = render_pipeline_status(merge_request.head_pipeline, tooltip_placement: 'bottom')
+ = render 'ci/status/icon', status: merge_request.head_pipeline.detailed_status(current_user), tooltip_placement: 'bottom'
- elsif has_any_head_pipeline
= icon('blank fw')
diff --git a/app/views/projects/issues/_related_branches.html.haml b/app/views/projects/issues/_related_branches.html.haml
index ffdd96870ef..6da4956a036 100644
--- a/app/views/projects/issues/_related_branches.html.haml
+++ b/app/views/projects/issues/_related_branches.html.haml
@@ -8,7 +8,7 @@
- pipeline = @project.pipeline_for(branch, target.sha) if target
- if can?(current_user, :read_pipeline, pipeline)
%span.related-branch-ci-status
- = render_pipeline_status(pipeline)
+ = render 'ci/status/icon', status: pipeline.detailed_status(current_user)
%span.related-branch-info
%strong
= link_to branch, project_compare_path(@project, from: @project.default_branch, to: branch), class: "ref-name"
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index 90916191d97..b8e0b66e277 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -48,7 +48,7 @@
CLOSED
- if can?(current_user, :read_pipeline, merge_request.head_pipeline)
%li.issuable-pipeline-status.d-none.d-sm-inline-block
- = render_pipeline_status(merge_request.head_pipeline)
+ = render 'ci/status/icon', status: merge_request.head_pipeline.detailed_status(current_user)
- if merge_request.open? && merge_request.broken?
%li.issuable-pipeline-broken.d-none.d-sm-inline-block
= link_to merge_request_path(merge_request), class: "has-tooltip", title: _('Cannot be merged automatically') do
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index 21b105e6f80..c031815200b 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -57,7 +57,7 @@
%td
- if mirror.last_error.present?
.badge.mirror-error-badge{ data: { toggle: 'tooltip', html: 'true' }, title: html_escape(mirror.last_error.try(:strip)) }= _('Error')
- %td.mirror-action-buttons
+ %td
.btn-group.mirror-actions-group.pull-right{ role: 'group' }
- if mirror.ssh_key_auth?
= clipboard_button(text: mirror.ssh_public_key, class: 'btn btn-default', title: _('Copy SSH public key'))
diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml
index 9c2efd6aa35..55adeb345ab 100644
--- a/app/views/projects/pipelines/_info.html.haml
+++ b/app/views/projects/pipelines/_info.html.haml
@@ -48,7 +48,7 @@
content: "<a class='autodevops-link' href='#{popover_content_url}' target='_blank' rel='noopener noreferrer nofollow'>#{popover_content_text}</a>",
} }
Auto DevOps
- - if @pipeline.merge_request?
+ - if @pipeline.merge_request_event?
%span.js-pipeline-url-mergerequest.badge.badge-info.has-tooltip{ title: "This pipeline is run in a merge request context" }
merge request
- if @pipeline.stuck?
diff --git a/app/views/projects/protected_branches/shared/_index.html.haml b/app/views/projects/protected_branches/shared/_index.html.haml
index 539b184e5c2..4997770321e 100644
--- a/app/views/projects/protected_branches/shared/_index.html.haml
+++ b/app/views/projects/protected_branches/shared/_index.html.haml
@@ -12,7 +12,7 @@
%p
By default, protected branches are designed to:
%ul
- %li prevent their creation, if not already created, from everybody except Maintainers
+ %li prevent their creation, if not already created, from everybody except users who are allowed to merge
%li prevent pushes from everybody except Maintainers
%li prevent <strong>anyone</strong> from force pushing to the branch
%li prevent <strong>anyone</strong> from deleting the branch
diff --git a/app/views/projects/settings/operations/_error_tracking.html.haml b/app/views/projects/settings/operations/_error_tracking.html.haml
index 4911e8d3770..6b15331db01 100644
--- a/app/views/projects/settings/operations/_error_tracking.html.haml
+++ b/app/views/projects/settings/operations/_error_tracking.html.haml
@@ -8,23 +8,11 @@
= _('Error Tracking')
%p
= _('To link Sentry to GitLab, enter your Sentry URL and Auth Token.')
+ = link_to _('More information'), help_page_path('user/project/operations/error_tracking'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = form_for @project, url: project_settings_operations_path(@project), method: :patch do |f|
- = form_errors(@project)
- .form-group
- = f.fields_for :error_tracking_setting_attributes, setting do |form|
- .form-check.form-group
- = form.check_box :enabled, class: 'form-check-input'
- = form.label :enabled, _('Active'), class: 'form-check-label'
- .form-group
- = form.label :api_url, _('Sentry API URL'), class: 'label-bold'
- = form.url_field :api_url, class: 'form-control', placeholder: _('http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/')
- %p.form-text.text-muted
- = _('Enter your Sentry API URL')
- .form-group
- = form.label :token, _('Auth Token'), class: 'label-bold'
- = form.text_field :token, class: 'form-control'
- %p.form-text.text-muted
- = _('Find and manage Auth Tokens in your Sentry account settings page.')
-
- = f.submit _('Save changes'), class: 'btn btn-success'
+ .js-error-tracking-form{ data: { list_projects_endpoint: list_projects_project_error_tracking_index_path(@project, format: :json),
+ operations_settings_endpoint: project_settings_operations_path(@project),
+ project: error_tracking_setting_project_json,
+ api_host: setting.api_host,
+ enabled: setting.enabled.to_json,
+ token: setting.token } }
diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml
index feeaf799f51..8ee1407d9d9 100644
--- a/app/views/projects/tags/show.html.haml
+++ b/app/views/projects/tags/show.html.haml
@@ -23,7 +23,7 @@
= link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn btn-edit controls-item has-tooltip', title: s_('TagsPage|Edit release notes') do
= icon("pencil")
= link_to project_tree_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse files') do
- = icon('files-o')
+ = sprite_icon('folder-open')
= link_to project_commits_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse commits') do
= icon('history')
.btn-container.controls-item
diff --git a/app/views/shared/_mobile_clone_panel.html.haml b/app/views/shared/_mobile_clone_panel.html.haml
index 6e2527bd1a1..1e6b6f7c79b 100644
--- a/app/views/shared/_mobile_clone_panel.html.haml
+++ b/app/views/shared/_mobile_clone_panel.html.haml
@@ -13,3 +13,4 @@
- if http_enabled?
%li
= dropdown_item_with_description(http_copy_label, project.http_url_to_repo, href: project.http_url_to_repo, data: { clone_type: 'http' })
+ = render_if_exists 'shared/mobile_kerberos_clone'
diff --git a/app/views/shared/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_form.html.haml
index 913c065e188..eb7808573b9 100644
--- a/app/views/shared/deploy_keys/_form.html.haml
+++ b/app/views/shared/deploy_keys/_form.html.haml
@@ -15,7 +15,7 @@
%p.light
Paste a machine public key here. Read more about how to generate it
= link_to 'here', help_page_path('ssh/README')
- = form.text_area :key, class: 'form-control thin_area', rows: 5
+ = form.text_area :key, class: 'form-control thin-area', rows: 5
- else
= form.label :fingerprint, class: 'col-form-label col-sm-2'
.col-sm-10
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index 40b8374848e..e75f0a184ea 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -32,7 +32,7 @@
= milestone_progress_bar(milestone)
= link_to pluralize(milestone.total_issues_count(current_user), 'Issue'), issues_path
&middot;
- = link_to pluralize(milestone.merge_requests.size, 'Merge Request'), merge_requests_path
+ = link_to pluralize(milestone.merge_requests_visible_to_user(current_user).size, 'Merge Request'), merge_requests_path
.float-lg-right.light #{milestone.percent_complete(current_user)}% complete
.col-sm-2
.milestone-actions.d-flex.justify-content-sm-start.justify-content-md-end
diff --git a/app/views/shared/milestones/_tabs.html.haml b/app/views/shared/milestones/_tabs.html.haml
index 55460acab8f..b877f66c71e 100644
--- a/app/views/shared/milestones/_tabs.html.haml
+++ b/app/views/shared/milestones/_tabs.html.haml
@@ -12,7 +12,7 @@
%li.nav-item
= link_to '#tab-merge-requests', class: 'nav-link', 'data-toggle' => 'tab', 'data-endpoint': milestone_merge_request_tab_path(milestone) do
Merge Requests
- %span.badge.badge-pill= milestone.merge_requests.size
+ %span.badge.badge-pill= milestone.merge_requests_visible_to_user(current_user).size
- else
%li.nav-item
= link_to '#tab-merge-requests', class: 'nav-link active', 'data-toggle' => 'tab', 'data-endpoint': milestone_merge_request_tab_path(milestone) do
@@ -21,11 +21,11 @@
%li.nav-item
= link_to '#tab-participants', class: 'nav-link', 'data-toggle' => 'tab', 'data-endpoint': milestone_participants_tab_path(milestone) do
Participants
- %span.badge.badge-pill= milestone.participants.count
+ %span.badge.badge-pill= milestone.issue_participants_visible_by_user(current_user).count
%li.nav-item
= link_to '#tab-labels', class: 'nav-link', 'data-toggle' => 'tab', 'data-endpoint': milestone_labels_tab_path(milestone) do
Labels
- %span.badge.badge-pill= milestone.labels.count
+ %span.badge.badge-pill= milestone.issue_labels_visible_by_user(current_user).count
- issues = milestone.sorted_issues(current_user)
- show_project_name = local_assigns.fetch(:show_project_name, false)
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
index f1a87faa7ac..d2b1be29eb9 100644
--- a/app/views/shared/projects/_project.html.haml
+++ b/app/views/shared/projects/_project.html.haml
@@ -85,7 +85,8 @@
= sprite_icon('issues', size: 14, css_class: 'append-right-4')
= number_with_delimiter(project.open_issues_count)
- if pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project)
+ - 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_project_pipeline_status(project.pipeline_status, tooltip_placement: 'top')
+ = render 'ci/status/icon', status: project.commit.last_pipeline.detailed_status(current_user), type: 'commit', tooltip_placement: 'top', path: pipeline_path
.updated-note
%span Updated #{updated_tooltip}
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 337f39b2091..b2d88567e0e 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -23,6 +23,7 @@
- cronjob:prune_web_hook_logs
- gcp_cluster:cluster_install_app
+- gcp_cluster:cluster_patch_app
- gcp_cluster:cluster_upgrade_app
- gcp_cluster:cluster_provision
- gcp_cluster:cluster_wait_for_app_installation
@@ -47,6 +48,9 @@
- github_importer:github_import_stage_import_repository
- hashed_storage:hashed_storage_migrator
+- hashed_storage:hashed_storage_rollbacker
+- hashed_storage:hashed_storage_project_migrate
+- hashed_storage:hashed_storage_project_rollback
- mail_scheduler:mail_scheduler_issue_due
- mail_scheduler:mail_scheduler_notification_service
@@ -126,7 +130,6 @@
- project_cache
- project_destroy
- project_export
-- project_migrate_hashed_storage
- project_service
- propagate_service_template
- reactive_caching
diff --git a/app/workers/cluster_patch_app_worker.rb b/app/workers/cluster_patch_app_worker.rb
new file mode 100644
index 00000000000..0549e81ed05
--- /dev/null
+++ b/app/workers/cluster_patch_app_worker.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ClusterPatchAppWorker
+ include ApplicationWorker
+ include ClusterQueue
+ include ClusterApplications
+
+ def perform(app_name, app_id)
+ find_application(app_name, app_id) do |app|
+ Clusters::Applications::PatchService.new(app).execute
+ end
+ end
+end
diff --git a/app/workers/hashed_storage/base_worker.rb b/app/workers/hashed_storage/base_worker.rb
new file mode 100644
index 00000000000..816e0504db6
--- /dev/null
+++ b/app/workers/hashed_storage/base_worker.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module HashedStorage
+ class BaseWorker
+ include ExclusiveLeaseGuard
+
+ LEASE_TIMEOUT = 30.seconds.to_i
+ LEASE_KEY_SEGMENT = 'project_migrate_hashed_storage_worker'.freeze
+
+ protected
+
+ def lease_key
+ # we share the same lease key for both migration and rollback so they don't run simultaneously
+ "#{LEASE_KEY_SEGMENT}:#{project_id}"
+ end
+
+ def lease_timeout
+ LEASE_TIMEOUT
+ end
+ end
+end
diff --git a/app/workers/hashed_storage/project_migrate_worker.rb b/app/workers/hashed_storage/project_migrate_worker.rb
new file mode 100644
index 00000000000..f00a459a097
--- /dev/null
+++ b/app/workers/hashed_storage/project_migrate_worker.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module HashedStorage
+ class ProjectMigrateWorker < BaseWorker
+ include ApplicationWorker
+
+ queue_namespace :hashed_storage
+
+ attr_reader :project_id
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def perform(project_id, old_disk_path = nil)
+ @project_id = project_id # we need to set this in order to create the lease_key
+
+ try_obtain_lease do
+ project = Project.without_deleted.find_by(id: project_id)
+ break unless project
+
+ old_disk_path ||= project.disk_path
+
+ ::Projects::HashedStorage::MigrationService.new(project, old_disk_path, logger: logger).execute
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/workers/hashed_storage/project_rollback_worker.rb b/app/workers/hashed_storage/project_rollback_worker.rb
new file mode 100644
index 00000000000..55e1d7ab23e
--- /dev/null
+++ b/app/workers/hashed_storage/project_rollback_worker.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module HashedStorage
+ class ProjectRollbackWorker < BaseWorker
+ include ApplicationWorker
+
+ queue_namespace :hashed_storage
+
+ attr_reader :project_id
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def perform(project_id, old_disk_path = nil)
+ @project_id = project_id # we need to set this in order to create the lease_key
+
+ try_obtain_lease do
+ project = Project.without_deleted.find_by(id: project_id)
+ break unless project
+
+ old_disk_path ||= project.disk_path
+
+ ::Projects::HashedStorage::RollbackService.new(project, old_disk_path, logger: logger).execute
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/workers/hashed_storage/rollbacker_worker.rb b/app/workers/hashed_storage/rollbacker_worker.rb
new file mode 100644
index 00000000000..a4da8443787
--- /dev/null
+++ b/app/workers/hashed_storage/rollbacker_worker.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module HashedStorage
+ class RollbackerWorker
+ include ApplicationWorker
+
+ queue_namespace :hashed_storage
+
+ # @param [Integer] start initial ID of the batch
+ # @param [Integer] finish last ID of the batch
+ def perform(start, finish)
+ migrator = Gitlab::HashedStorage::Migrator.new
+ migrator.bulk_rollback(start: start, finish: finish)
+ end
+ end
+end
diff --git a/app/workers/pipeline_metrics_worker.rb b/app/workers/pipeline_metrics_worker.rb
index c2fbfd2b3a5..0ddad43b8d5 100644
--- a/app/workers/pipeline_metrics_worker.rb
+++ b/app/workers/pipeline_metrics_worker.rb
@@ -30,6 +30,6 @@ class PipelineMetricsWorker
# rubocop: enable CodeReuse/ActiveRecord
def merge_requests(pipeline)
- pipeline.merge_requests.map(&:id)
+ pipeline.merge_requests_as_head_pipeline.map(&:id)
end
end
diff --git a/app/workers/project_migrate_hashed_storage_worker.rb b/app/workers/project_migrate_hashed_storage_worker.rb
deleted file mode 100644
index 1c8f313e6e9..00000000000
--- a/app/workers/project_migrate_hashed_storage_worker.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-class ProjectMigrateHashedStorageWorker
- include ApplicationWorker
-
- LEASE_TIMEOUT = 30.seconds.to_i
- LEASE_KEY_SEGMENT = 'project_migrate_hashed_storage_worker'.freeze
-
- # rubocop: disable CodeReuse/ActiveRecord
- def perform(project_id, old_disk_path = nil)
- uuid = lease_for(project_id).try_obtain
-
- if uuid
- project = Project.find_by(id: project_id)
- return if project.nil? || project.pending_delete?
-
- old_disk_path ||= project.disk_path
-
- ::Projects::HashedStorage::MigrationService.new(project, old_disk_path, logger: logger).execute
- else
- return false
- end
-
- ensure
- cancel_lease_for(project_id, uuid) if uuid
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def lease_for(project_id)
- Gitlab::ExclusiveLease.new(lease_key(project_id), timeout: LEASE_TIMEOUT)
- end
-
- private
-
- def lease_key(project_id)
- # we share the same lease key for both migration and rollback so they don't run simultaneously
- "#{LEASE_KEY_SEGMENT}:#{project_id}"
- end
-
- def cancel_lease_for(project_id, uuid)
- Gitlab::ExclusiveLease.cancel(lease_key(project_id), uuid)
- end
-end
diff --git a/babel.config.js b/babel.config.js
index e3de8ef2d83..78d14095b0b 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -40,8 +40,12 @@ if (BABEL_ENV === 'karma' || BABEL_ENV === 'coverage') {
// Jest is running in node environment
if (BABEL_ENV === 'jest') {
- plugins.push('transform-es2015-modules-commonjs');
- plugins.push('dynamic-import-node');
+ plugins.push('@babel/plugin-transform-modules-commonjs');
+ /*
+ without the following, babel-plugin-istanbul throws an error:
+ https://gitlab.com/gitlab-org/gitlab-ce/issues/58390
+ */
+ plugins.push('babel-plugin-dynamic-import-node');
}
module.exports = { presets, plugins };
diff --git a/bin/background_jobs b/bin/background_jobs
index f28e2f722dc..9d12422b81a 100755
--- a/bin/background_jobs
+++ b/bin/background_jobs
@@ -38,7 +38,14 @@ start_no_deamonize()
start_sidekiq()
{
- exec bundle exec sidekiq -C "${sidekiq_config}" -e $RAILS_ENV -P $sidekiq_pidfile "$@"
+ cmd="exec"
+ chpst=$(which chpst)
+
+ if [ -n "$chpst" ]; then
+ cmd="${cmd} ${chpst} -P"
+ fi
+
+ ${cmd} bundle exec sidekiq -C "${sidekiq_config}" -e $RAILS_ENV -P $sidekiq_pidfile "$@"
}
load_ok()
diff --git a/changelogs/unreleased/10095-job-getters.yml b/changelogs/unreleased/10095-job-getters.yml
new file mode 100644
index 00000000000..f12fc8b26ec
--- /dev/null
+++ b/changelogs/unreleased/10095-job-getters.yml
@@ -0,0 +1,5 @@
+---
+title: Removes EE differences for jobs/getters.js
+merge_request:
+author:
+type: other
diff --git a/changelogs/unreleased/10097-number-utils.yml b/changelogs/unreleased/10097-number-utils.yml
new file mode 100644
index 00000000000..417008f6539
--- /dev/null
+++ b/changelogs/unreleased/10097-number-utils.yml
@@ -0,0 +1,5 @@
+---
+title: Moves EE util into the CE file
+merge_request: 25680
+author:
+type: other
diff --git a/changelogs/unreleased/13784-simple-masking-of-protected-variables-in-logs.yml b/changelogs/unreleased/13784-simple-masking-of-protected-variables-in-logs.yml
new file mode 100644
index 00000000000..5c3b6833235
--- /dev/null
+++ b/changelogs/unreleased/13784-simple-masking-of-protected-variables-in-logs.yml
@@ -0,0 +1,5 @@
+---
+title: Add support for masking CI variables.
+merge_request: 25293
+author:
+type: added
diff --git a/changelogs/unreleased/20084-update-the-spinner-component.yml b/changelogs/unreleased/20084-update-the-spinner-component.yml
new file mode 100644
index 00000000000..c93648e4f54
--- /dev/null
+++ b/changelogs/unreleased/20084-update-the-spinner-component.yml
@@ -0,0 +1,5 @@
+---
+title: Add a spinner icon which is rendered using pure css
+merge_request: 25186
+author:
+type: changed
diff --git a/changelogs/unreleased/27333-re-deploy-rollback-button-should-ask-for-confirmation-before-executing.yml b/changelogs/unreleased/27333-re-deploy-rollback-button-should-ask-for-confirmation-before-executing.yml
new file mode 100644
index 00000000000..8c5f05c3575
--- /dev/null
+++ b/changelogs/unreleased/27333-re-deploy-rollback-button-should-ask-for-confirmation-before-executing.yml
@@ -0,0 +1,5 @@
+---
+title: Add Confirmation Modal to Rollback on Environment
+merge_request: 25110
+author:
+type: added
diff --git a/changelogs/unreleased/2802-security-add-public-internal-groups-as-members-to-your-project-idor.yml b/changelogs/unreleased/2802-security-add-public-internal-groups-as-members-to-your-project-idor.yml
new file mode 100644
index 00000000000..27ad151cd06
--- /dev/null
+++ b/changelogs/unreleased/2802-security-add-public-internal-groups-as-members-to-your-project-idor.yml
@@ -0,0 +1,6 @@
+---
+title: Remove the possibility to share a project with a group that a user is not a member
+ of
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/32714-copying-comment-with-ordered-list-includes-extraneous-newlines.yml b/changelogs/unreleased/32714-copying-comment-with-ordered-list-includes-extraneous-newlines.yml
new file mode 100644
index 00000000000..d0bb4225ce4
--- /dev/null
+++ b/changelogs/unreleased/32714-copying-comment-with-ordered-list-includes-extraneous-newlines.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed "Copying comment with ordered list includes extraneous newlines"
+merge_request: 25695
+author:
+type: fixed
diff --git a/changelogs/unreleased/37673-minor-issue-with-apostrophe-single-quote-when-clicking-assign-to-me.yml b/changelogs/unreleased/37673-minor-issue-with-apostrophe-single-quote-when-clicking-assign-to-me.yml
new file mode 100644
index 00000000000..a470f917d53
--- /dev/null
+++ b/changelogs/unreleased/37673-minor-issue-with-apostrophe-single-quote-when-clicking-assign-to-me.yml
@@ -0,0 +1,5 @@
+---
+title: Fix username escaping when using assign to me for issues
+merge_request: 24673
+author:
+type: fixed
diff --git a/changelogs/unreleased/40396-sidekiq-in-process-group.yml b/changelogs/unreleased/40396-sidekiq-in-process-group.yml
new file mode 100644
index 00000000000..e41557e20d0
--- /dev/null
+++ b/changelogs/unreleased/40396-sidekiq-in-process-group.yml
@@ -0,0 +1,5 @@
+---
+title: 'sidekiq: terminate child processes at shutdown'
+merge_request: 25669
+author:
+type: added
diff --git a/changelogs/unreleased/40396-use-pgroups-for-background-jobs.yml b/changelogs/unreleased/40396-use-pgroups-for-background-jobs.yml
new file mode 100644
index 00000000000..578c780e1a1
--- /dev/null
+++ b/changelogs/unreleased/40396-use-pgroups-for-background-jobs.yml
@@ -0,0 +1,5 @@
+---
+title: 'If chpst is available, make fron-source installations run sidekiq as a process group leader'
+merge_request: 25654
+author:
+type: other
diff --git a/changelogs/unreleased/41888-access-personal-snippets-by-api.yml b/changelogs/unreleased/41888-access-personal-snippets-by-api.yml
new file mode 100644
index 00000000000..3561a01ec5f
--- /dev/null
+++ b/changelogs/unreleased/41888-access-personal-snippets-by-api.yml
@@ -0,0 +1,5 @@
+---
+title: Allow all snippets to be accessed by API
+merge_request: 25772
+author:
+type: added
diff --git a/changelogs/unreleased/45035-force-push-api.yml b/changelogs/unreleased/45035-force-push-api.yml
new file mode 100644
index 00000000000..05f5a36ac38
--- /dev/null
+++ b/changelogs/unreleased/45035-force-push-api.yml
@@ -0,0 +1,5 @@
+---
+title: Accept force option to overwrite branch on commit via API
+merge_request: 25286
+author:
+type: added
diff --git a/changelogs/unreleased/45305-ci-status-icon-mismatch-on-merge-requests-page-and-the-mr-itself.yml b/changelogs/unreleased/45305-ci-status-icon-mismatch-on-merge-requests-page-and-the-mr-itself.yml
new file mode 100644
index 00000000000..64ab76a2b05
--- /dev/null
+++ b/changelogs/unreleased/45305-ci-status-icon-mismatch-on-merge-requests-page-and-the-mr-itself.yml
@@ -0,0 +1,5 @@
+---
+title: Fix pipeline status icon mismatch
+merge_request: 25407
+author:
+type: fixed
diff --git a/changelogs/unreleased/47869-jobs-tab-border-top-in-pipeline-s-page-is-1px-off.yml b/changelogs/unreleased/47869-jobs-tab-border-top-in-pipeline-s-page-is-1px-off.yml
new file mode 100644
index 00000000000..e08d2a99369
--- /dev/null
+++ b/changelogs/unreleased/47869-jobs-tab-border-top-in-pipeline-s-page-is-1px-off.yml
@@ -0,0 +1,5 @@
+---
+title: Resolve Jobs tab border top in pipeline's page is 1px off
+merge_request: 24878
+author:
+type: fixed
diff --git a/changelogs/unreleased/49397-move-files-in-ide.yml b/changelogs/unreleased/49397-move-files-in-ide.yml
new file mode 100644
index 00000000000..488091d383c
--- /dev/null
+++ b/changelogs/unreleased/49397-move-files-in-ide.yml
@@ -0,0 +1,5 @@
+---
+title: Resolve Move files in the Web IDE
+merge_request: 25431
+author:
+type: added
diff --git a/changelogs/unreleased/49663-branch-to-mr-connection.yml b/changelogs/unreleased/49663-branch-to-mr-connection.yml
new file mode 100644
index 00000000000..d92ed6fd3bf
--- /dev/null
+++ b/changelogs/unreleased/49663-branch-to-mr-connection.yml
@@ -0,0 +1,5 @@
+---
+title: Link to most recent MR from a branch
+merge_request: 25689
+author:
+type: added
diff --git a/changelogs/unreleased/51971-milestones-visibility.yml b/changelogs/unreleased/51971-milestones-visibility.yml
new file mode 100644
index 00000000000..818f0071e6c
--- /dev/null
+++ b/changelogs/unreleased/51971-milestones-visibility.yml
@@ -0,0 +1,5 @@
+---
+title: Check if desired milestone for an issue is available
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/52459-display-job-names-consistently-on-pipelines-and-environments-list.yml b/changelogs/unreleased/52459-display-job-names-consistently-on-pipelines-and-environments-list.yml
new file mode 100644
index 00000000000..816fee1ccfc
--- /dev/null
+++ b/changelogs/unreleased/52459-display-job-names-consistently-on-pipelines-and-environments-list.yml
@@ -0,0 +1,5 @@
+---
+title: Display job names consistently on pipelines and environments list
+merge_request: 24984
+author:
+type: fixed
diff --git a/changelogs/unreleased/52792-align-mirror-repository-button.yml b/changelogs/unreleased/52792-align-mirror-repository-button.yml
new file mode 100644
index 00000000000..e8ce9ee0a4e
--- /dev/null
+++ b/changelogs/unreleased/52792-align-mirror-repository-button.yml
@@ -0,0 +1,5 @@
+---
+title: Add right padding to the repository mirror action buttons
+merge_request: 25606
+author:
+type: fixed
diff --git a/changelogs/unreleased/52877-ios-publishing-blog-post-and-gitlab-ci-yml-template.yml b/changelogs/unreleased/52877-ios-publishing-blog-post-and-gitlab-ci-yml-template.yml
new file mode 100644
index 00000000000..13529348c60
--- /dev/null
+++ b/changelogs/unreleased/52877-ios-publishing-blog-post-and-gitlab-ci-yml-template.yml
@@ -0,0 +1,5 @@
+---
+title: Add iOS-fastlane template for .gitlab-ci.yml
+merge_request: 25395
+author:
+type: changed
diff --git a/changelogs/unreleased/53336-improve-web-ide-launch-performance.yml b/changelogs/unreleased/53336-improve-web-ide-launch-performance.yml
new file mode 100644
index 00000000000..65439f5a6c2
--- /dev/null
+++ b/changelogs/unreleased/53336-improve-web-ide-launch-performance.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Web IDE launch performance
+merge_request: 25700
+author:
+type: performance
diff --git a/changelogs/unreleased/53361-fresh-protected-branches.yml b/changelogs/unreleased/53361-fresh-protected-branches.yml
new file mode 100644
index 00000000000..55080e719b7
--- /dev/null
+++ b/changelogs/unreleased/53361-fresh-protected-branches.yml
@@ -0,0 +1,5 @@
+---
+title: Allow creation of branches that match a wildcard protection, except directly through git
+merge_request: 24969
+author:
+type: added
diff --git a/changelogs/unreleased/53413-externalize-markdown-toolbar-tooltips.yml b/changelogs/unreleased/53413-externalize-markdown-toolbar-tooltips.yml
new file mode 100644
index 00000000000..c460760c10b
--- /dev/null
+++ b/changelogs/unreleased/53413-externalize-markdown-toolbar-tooltips.yml
@@ -0,0 +1,5 @@
+---
+title: Externalize markdown toolbar buttons tooltips
+merge_request: 25529
+author:
+type: fixed
diff --git a/changelogs/unreleased/53966-make-hashed-storage-migration-safer-and-more-inviting.yml b/changelogs/unreleased/53966-make-hashed-storage-migration-safer-and-more-inviting.yml
new file mode 100644
index 00000000000..556a238ff7d
--- /dev/null
+++ b/changelogs/unreleased/53966-make-hashed-storage-migration-safer-and-more-inviting.yml
@@ -0,0 +1,5 @@
+---
+title: Hashed Storage rollback mechanism
+merge_request: 23955
+author:
+type: added
diff --git a/changelogs/unreleased/54643-lower_issuable_finder_complexity.yml b/changelogs/unreleased/54643-lower_issuable_finder_complexity.yml
new file mode 100644
index 00000000000..f7f8e4d0e1f
--- /dev/null
+++ b/changelogs/unreleased/54643-lower_issuable_finder_complexity.yml
@@ -0,0 +1,5 @@
+---
+title: Speed up group issue search counts
+merge_request: 25411
+author:
+type: performance
diff --git a/changelogs/unreleased/56251-fix-issue-board-weekday-shift.yml b/changelogs/unreleased/56251-fix-issue-board-weekday-shift.yml
new file mode 100644
index 00000000000..bedc488ebd4
--- /dev/null
+++ b/changelogs/unreleased/56251-fix-issue-board-weekday-shift.yml
@@ -0,0 +1,5 @@
+---
+title: "Fix weekday shift in issue board cards for UTC+X timezones by removing local timezone to UTC conversion"
+merge_request: 25512
+author: Elias Werberich
+type: fixed
diff --git a/changelogs/unreleased/56809-graphql-version-api.yml b/changelogs/unreleased/56809-graphql-version-api.yml
new file mode 100644
index 00000000000..72a4b4e5819
--- /dev/null
+++ b/changelogs/unreleased/56809-graphql-version-api.yml
@@ -0,0 +1,5 @@
+---
+title: Add metadata about the GitLab server to GraphQL
+merge_request: 24636
+author:
+type: added
diff --git a/changelogs/unreleased/56851-error-tracking-page-seems-broken.yml b/changelogs/unreleased/56851-error-tracking-page-seems-broken.yml
new file mode 100644
index 00000000000..ff4aebb9381
--- /dev/null
+++ b/changelogs/unreleased/56851-error-tracking-page-seems-broken.yml
@@ -0,0 +1,5 @@
+---
+title: Fix error tracking list page
+merge_request: 24806
+author:
+type: fixed
diff --git a/changelogs/unreleased/56863-system-messages-in-email.yml b/changelogs/unreleased/56863-system-messages-in-email.yml
new file mode 100644
index 00000000000..21a90aa95ee
--- /dev/null
+++ b/changelogs/unreleased/56863-system-messages-in-email.yml
@@ -0,0 +1,5 @@
+---
+title: Show header and footer system messages in email
+merge_request: 25474
+author:
+type: added
diff --git a/changelogs/unreleased/56937-edit-knative-domain.yml b/changelogs/unreleased/56937-edit-knative-domain.yml
new file mode 100644
index 00000000000..7147a4e06b1
--- /dev/null
+++ b/changelogs/unreleased/56937-edit-knative-domain.yml
@@ -0,0 +1,5 @@
+---
+title: Edit Knative domain after it has been deployed
+merge_request: 25386
+author:
+type: added
diff --git a/changelogs/unreleased/57085-introduce-zoom-and-scroll-functionality-on-metrics-charts.yml b/changelogs/unreleased/57085-introduce-zoom-and-scroll-functionality-on-metrics-charts.yml
new file mode 100644
index 00000000000..1d07666dfb1
--- /dev/null
+++ b/changelogs/unreleased/57085-introduce-zoom-and-scroll-functionality-on-metrics-charts.yml
@@ -0,0 +1,5 @@
+---
+title: Add zoom and scroll to metrics dashboard
+merge_request: 25388
+author:
+type: added
diff --git a/changelogs/unreleased/57534_filter_impersonated_sessions.yml b/changelogs/unreleased/57534_filter_impersonated_sessions.yml
new file mode 100644
index 00000000000..80aea0ab1bc
--- /dev/null
+++ b/changelogs/unreleased/57534_filter_impersonated_sessions.yml
@@ -0,0 +1,6 @@
+---
+title: Do not display impersonated sessions under active sessions and remove ability
+ to revoke session
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/57612-github-importer-ignores-milestone-due_date.yml b/changelogs/unreleased/57612-github-importer-ignores-milestone-due_date.yml
new file mode 100644
index 00000000000..0d5cd057ade
--- /dev/null
+++ b/changelogs/unreleased/57612-github-importer-ignores-milestone-due_date.yml
@@ -0,0 +1,5 @@
+---
+title: Capture due date when importing milestones from Github
+merge_request: 25182
+author: dstanley
+type: changed
diff --git a/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml b/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml
new file mode 100644
index 00000000000..781446b86d7
--- /dev/null
+++ b/changelogs/unreleased/57734-improve-label-dropdown-selection-performance.yml
@@ -0,0 +1,5 @@
+---
+title: Improve label select rendering
+merge_request: 25281
+author:
+type: performance
diff --git a/changelogs/unreleased/57788-project-labels-tooltip-missing.yml b/changelogs/unreleased/57788-project-labels-tooltip-missing.yml
new file mode 100644
index 00000000000..9146af0e0f3
--- /dev/null
+++ b/changelogs/unreleased/57788-project-labels-tooltip-missing.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug where project topics truncate
+merge_request: 25398
+author:
+type: fixed
diff --git a/changelogs/unreleased/57829-issuable-meta-line-ui-broken-on-mobile.yml b/changelogs/unreleased/57829-issuable-meta-line-ui-broken-on-mobile.yml
new file mode 100644
index 00000000000..b4b305e76d0
--- /dev/null
+++ b/changelogs/unreleased/57829-issuable-meta-line-ui-broken-on-mobile.yml
@@ -0,0 +1,5 @@
+---
+title: Fix author layouts in issuable meta line UIs on mobile
+merge_request: 25332
+author: Takuya Noguchi
+type: fixed
diff --git a/changelogs/unreleased/57991-frontend-pagination-needs-to-handle-cases-where-the-x-total-pages-header-isn-t-present.yml b/changelogs/unreleased/57991-frontend-pagination-needs-to-handle-cases-where-the-x-total-pages-header-isn-t-present.yml
new file mode 100644
index 00000000000..2e18377a4cf
--- /dev/null
+++ b/changelogs/unreleased/57991-frontend-pagination-needs-to-handle-cases-where-the-x-total-pages-header-isn-t-present.yml
@@ -0,0 +1,5 @@
+---
+title: "Improve the JS pagination to handle the case when the `X-Total` and `X-Total-Pages` headers aren't present"
+merge_request: 25601
+author:
+type: fixed
diff --git a/changelogs/unreleased/58023-add-Saturday-to-localization-first-day-of-the-week.yml b/changelogs/unreleased/58023-add-Saturday-to-localization-first-day-of-the-week.yml
new file mode 100644
index 00000000000..69d927dc5e4
--- /dev/null
+++ b/changelogs/unreleased/58023-add-Saturday-to-localization-first-day-of-the-week.yml
@@ -0,0 +1,5 @@
+---
+title: Add Saturday to Localization first day of the week
+merge_request: 25509
+author: Ahmad Haghighi
+type: added
diff --git a/changelogs/unreleased/58274-folder-icon-in-tags-page.yml b/changelogs/unreleased/58274-folder-icon-in-tags-page.yml
new file mode 100644
index 00000000000..db8128b8dfd
--- /dev/null
+++ b/changelogs/unreleased/58274-folder-icon-in-tags-page.yml
@@ -0,0 +1,5 @@
+---
+title: Use 'folder-open' from sprite icons for Browse Files button in Tag page
+merge_request: 25635
+author:
+type: fixed
diff --git a/changelogs/unreleased/58369-hide-squash-commit.yml b/changelogs/unreleased/58369-hide-squash-commit.yml
new file mode 100644
index 00000000000..e44b483b3a1
--- /dev/null
+++ b/changelogs/unreleased/58369-hide-squash-commit.yml
@@ -0,0 +1,5 @@
+---
+title: Resolve showing squash commit edit issue when only single commit is present
+merge_request: 25807
+author:
+type: fixed
diff --git a/changelogs/unreleased/58570-fix-running-pipline-that-is-imported-via-dotnetcore-template.yml b/changelogs/unreleased/58570-fix-running-pipline-that-is-imported-via-dotnetcore-template.yml
new file mode 100644
index 00000000000..b81dc151b44
--- /dev/null
+++ b/changelogs/unreleased/58570-fix-running-pipline-that-is-imported-via-dotnetcore-template.yml
@@ -0,0 +1,5 @@
+---
+title: Clean up vendored templates
+merge_request: 25794
+author:
+type: changed
diff --git a/changelogs/unreleased/8711-prep-frontend-single-repo.yml b/changelogs/unreleased/8711-prep-frontend-single-repo.yml
new file mode 100644
index 00000000000..9c16e16a84b
--- /dev/null
+++ b/changelogs/unreleased/8711-prep-frontend-single-repo.yml
@@ -0,0 +1,5 @@
+---
+title: Creates a helper function to check if repo is EE
+merge_request: 25647
+author:
+type: other
diff --git a/changelogs/unreleased/add-project-level-config-for-prospective-merge-pipelines-ce.yml b/changelogs/unreleased/add-project-level-config-for-prospective-merge-pipelines-ce.yml
new file mode 100644
index 00000000000..39d7ead9af4
--- /dev/null
+++ b/changelogs/unreleased/add-project-level-config-for-prospective-merge-pipelines-ce.yml
@@ -0,0 +1,5 @@
+---
+title: Add project level config for merge pipelines
+merge_request: 25385
+author:
+type: added
diff --git a/changelogs/unreleased/add_ldap_tls_options.yml b/changelogs/unreleased/add_ldap_tls_options.yml
new file mode 100644
index 00000000000..c3678cb8fb6
--- /dev/null
+++ b/changelogs/unreleased/add_ldap_tls_options.yml
@@ -0,0 +1,5 @@
+---
+title: Allow raw `tls_options` to be passed in LDAP configuration
+merge_request: 20678
+author:
+type: changed
diff --git a/changelogs/unreleased/allow-to-recursively-include.yml b/changelogs/unreleased/allow-to-recursively-include.yml
new file mode 100644
index 00000000000..edfbfcb0146
--- /dev/null
+++ b/changelogs/unreleased/allow-to-recursively-include.yml
@@ -0,0 +1,5 @@
+---
+title: Allow to recursively expand includes
+merge_request: 24356
+author:
+type: added
diff --git a/changelogs/unreleased/auto-devops-tags.yml b/changelogs/unreleased/auto-devops-tags.yml
new file mode 100644
index 00000000000..1b96d457776
--- /dev/null
+++ b/changelogs/unreleased/auto-devops-tags.yml
@@ -0,0 +1,5 @@
+---
+title: Adds Auto DevOps build job for tags
+merge_request: 25718
+author: walkafwalka
+type: added
diff --git a/changelogs/unreleased/bvl-graphql-csrf.yml b/changelogs/unreleased/bvl-graphql-csrf.yml
new file mode 100644
index 00000000000..d1e5b56c751
--- /dev/null
+++ b/changelogs/unreleased/bvl-graphql-csrf.yml
@@ -0,0 +1,5 @@
+---
+title: Allow GraphQL requests without CSRF token
+merge_request: 25719
+author:
+type: fixed
diff --git a/changelogs/unreleased/enable-markup-highlighting.yml b/changelogs/unreleased/enable-markup-highlighting.yml
new file mode 100644
index 00000000000..33fcf784f7d
--- /dev/null
+++ b/changelogs/unreleased/enable-markup-highlighting.yml
@@ -0,0 +1,5 @@
+---
+title: Enable syntax highlighting to other supported markups
+merge_request: 25761
+author:
+type: other
diff --git a/changelogs/unreleased/expand-diff-to-full-file.yml b/changelogs/unreleased/expand-diff-to-full-file.yml
new file mode 100644
index 00000000000..f41a6be22e8
--- /dev/null
+++ b/changelogs/unreleased/expand-diff-to-full-file.yml
@@ -0,0 +1,5 @@
+---
+title: Allow expanding a diff to display full file
+merge_request: 24406
+author:
+type: added
diff --git a/changelogs/unreleased/expose-additional-merge-request-pipeline-variables.yml b/changelogs/unreleased/expose-additional-merge-request-pipeline-variables.yml
new file mode 100644
index 00000000000..399f60ef219
--- /dev/null
+++ b/changelogs/unreleased/expose-additional-merge-request-pipeline-variables.yml
@@ -0,0 +1,5 @@
+---
+title: Expose additional merge request pipeline variables
+merge_request: 24595
+author: Hiroyuki Sato
+type: added
diff --git a/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml b/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml
new file mode 100644
index 00000000000..e5cbc87ba24
--- /dev/null
+++ b/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml
@@ -0,0 +1,5 @@
+---
+title: Expose merge request entity for pipelines
+merge_request: 25679
+author:
+type: added
diff --git a/changelogs/unreleased/feature-api-delete-job-artifacts.yml b/changelogs/unreleased/feature-api-delete-job-artifacts.yml
new file mode 100644
index 00000000000..ddbbe3c2650
--- /dev/null
+++ b/changelogs/unreleased/feature-api-delete-job-artifacts.yml
@@ -0,0 +1,5 @@
+---
+title: Extend the Gitlab API for deletion of job_artifacts of a single job.
+merge_request: 25522
+author: rroger
+type: added
diff --git a/changelogs/unreleased/feature-gb-add-serverless-cicd-template.yml b/changelogs/unreleased/feature-gb-add-serverless-cicd-template.yml
new file mode 100644
index 00000000000..ebb71f00c4b
--- /dev/null
+++ b/changelogs/unreleased/feature-gb-add-serverless-cicd-template.yml
@@ -0,0 +1,5 @@
+---
+title: Simplify CI/CD configuration on serverless projects
+merge_request: 25523
+author:
+type: added
diff --git a/changelogs/unreleased/feature-runner-tag-filter-for-admin-view.yml b/changelogs/unreleased/feature-runner-tag-filter-for-admin-view.yml
new file mode 100644
index 00000000000..86df4595e7b
--- /dev/null
+++ b/changelogs/unreleased/feature-runner-tag-filter-for-admin-view.yml
@@ -0,0 +1,5 @@
+---
+title: Add a tag filter to the admin runners view
+merge_request: 19740
+author: Alexis Reigel
+type: added
diff --git a/changelogs/unreleased/fix-38010-sidebar-loads-and-collapses.yml b/changelogs/unreleased/fix-38010-sidebar-loads-and-collapses.yml
new file mode 100644
index 00000000000..af80a069fde
--- /dev/null
+++ b/changelogs/unreleased/fix-38010-sidebar-loads-and-collapses.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed navigation sidebar flashing open on page load
+merge_request: 24555
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-blob-editor-deleting-content.yml b/changelogs/unreleased/fix-blob-editor-deleting-content.yml
new file mode 100644
index 00000000000..d5b7bbc7b1c
--- /dev/null
+++ b/changelogs/unreleased/fix-blob-editor-deleting-content.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed blob editor deleting file content for certain file paths
+merge_request:
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-gb-fix-bridge-jobs-variables-policy.yml b/changelogs/unreleased/fix-gb-fix-bridge-jobs-variables-policy.yml
new file mode 100644
index 00000000000..8a98a39fdc2
--- /dev/null
+++ b/changelogs/unreleased/fix-gb-fix-bridge-jobs-variables-policy.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bridge jobs only/except variables policy
+merge_request: 25710
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-group-without-owner.yml b/changelogs/unreleased/fix-group-without-owner.yml
new file mode 100644
index 00000000000..884f1b3a08a
--- /dev/null
+++ b/changelogs/unreleased/fix-group-without-owner.yml
@@ -0,0 +1,5 @@
+---
+title: fix group without owner after transfer
+merge_request: 25573
+author: Peter Marko
+type: fixed
diff --git a/changelogs/unreleased/gokhanap-master-patch-03762.yml b/changelogs/unreleased/gokhanap-master-patch-03762.yml
new file mode 100644
index 00000000000..22ab453e359
--- /dev/null
+++ b/changelogs/unreleased/gokhanap-master-patch-03762.yml
@@ -0,0 +1,5 @@
+---
+title: 'commit page info-well overflow fix #56436'
+merge_request: 24799
+author: Gokhan Apaydin
+type: fixed
diff --git a/changelogs/unreleased/gt-update-activity-filter-for-issues.yml b/changelogs/unreleased/gt-update-activity-filter-for-issues.yml
new file mode 100644
index 00000000000..f9be54ea8a9
--- /dev/null
+++ b/changelogs/unreleased/gt-update-activity-filter-for-issues.yml
@@ -0,0 +1,5 @@
+---
+title: Update activity filter for issues
+merge_request: 23423
+author: George Tsiolis
+type: changed
diff --git a/changelogs/unreleased/jira-link-mention-compact.yml b/changelogs/unreleased/jira-link-mention-compact.yml
new file mode 100644
index 00000000000..f75f3ce183c
--- /dev/null
+++ b/changelogs/unreleased/jira-link-mention-compact.yml
@@ -0,0 +1,5 @@
+---
+title: "Jira: make issue links title compact"
+merge_request: 25609
+author: Elan Ruusamäe @glensc
+type: changed
diff --git a/changelogs/unreleased/osw-fetch-latest-version-when-creating-suggestions.yml b/changelogs/unreleased/osw-fetch-latest-version-when-creating-suggestions.yml
new file mode 100644
index 00000000000..4e01a13d781
--- /dev/null
+++ b/changelogs/unreleased/osw-fetch-latest-version-when-creating-suggestions.yml
@@ -0,0 +1,5 @@
+---
+title: Always fetch MR latest version when creating suggestions
+merge_request: 25441
+author:
+type: fixed
diff --git a/changelogs/unreleased/osw-merge-to-ref-changes-for-ci-team.yml b/changelogs/unreleased/osw-merge-to-ref-changes-for-ci-team.yml
new file mode 100644
index 00000000000..dfccd6194d4
--- /dev/null
+++ b/changelogs/unreleased/osw-merge-to-ref-changes-for-ci-team.yml
@@ -0,0 +1,5 @@
+---
+title: Make merge to refs/merge-requests/:iid/merge not raise when FF-only enabled
+merge_request: 25653
+author:
+type: fixed
diff --git a/changelogs/unreleased/refactor-merge-request-between-pipeline-and-build.yml b/changelogs/unreleased/refactor-merge-request-between-pipeline-and-build.yml
new file mode 100644
index 00000000000..bf78f8d84a6
--- /dev/null
+++ b/changelogs/unreleased/refactor-merge-request-between-pipeline-and-build.yml
@@ -0,0 +1,5 @@
+---
+title: Add suffix (`_event`) to merge request source
+merge_request: 25508
+author:
+type: other
diff --git a/changelogs/unreleased/restrict-jupyter-login.yml b/changelogs/unreleased/restrict-jupyter-login.yml
new file mode 100644
index 00000000000..2c20ef3d7ac
--- /dev/null
+++ b/changelogs/unreleased/restrict-jupyter-login.yml
@@ -0,0 +1,5 @@
+---
+title: Project level filtering for JupyterHub
+merge_request: 25684
+author: Amit Rathi (amit1rrr)
+type: changed
diff --git a/changelogs/unreleased/security-2774-milestones-detail.yml b/changelogs/unreleased/security-2774-milestones-detail.yml
new file mode 100644
index 00000000000..faf56fee01e
--- /dev/null
+++ b/changelogs/unreleased/security-2774-milestones-detail.yml
@@ -0,0 +1,5 @@
+---
+title: Display only information visible to current user on the Milestone page
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-2797-milestone-mrs.yml b/changelogs/unreleased/security-2797-milestone-mrs.yml
new file mode 100644
index 00000000000..5bb104ec403
--- /dev/null
+++ b/changelogs/unreleased/security-2797-milestone-mrs.yml
@@ -0,0 +1,5 @@
+---
+title: Show only merge requests visible to user on milestone detail page
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-2798-fix-boards-policy.yml b/changelogs/unreleased/security-2798-fix-boards-policy.yml
new file mode 100644
index 00000000000..10e8ac3a787
--- /dev/null
+++ b/changelogs/unreleased/security-2798-fix-boards-policy.yml
@@ -0,0 +1,5 @@
+---
+title: Disable issue boards API when issues are disabled
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-2799-emails.yml b/changelogs/unreleased/security-2799-emails.yml
new file mode 100644
index 00000000000..dbf1207810e
--- /dev/null
+++ b/changelogs/unreleased/security-2799-emails.yml
@@ -0,0 +1,5 @@
+---
+title: Don't show new issue link after move when a user does not have permissions
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-50334.yml b/changelogs/unreleased/security-50334.yml
new file mode 100644
index 00000000000..828ef82b517
--- /dev/null
+++ b/changelogs/unreleased/security-50334.yml
@@ -0,0 +1,5 @@
+---
+title: Fix git clone revealing private repo's presence
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-55468-check-validity-before-querying.yml b/changelogs/unreleased/security-55468-check-validity-before-querying.yml
new file mode 100644
index 00000000000..8bb11a97f52
--- /dev/null
+++ b/changelogs/unreleased/security-55468-check-validity-before-querying.yml
@@ -0,0 +1,5 @@
+---
+title: Fix blind SSRF in Prometheus integration by checking URL before querying
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-56348.yml b/changelogs/unreleased/security-56348.yml
new file mode 100644
index 00000000000..a289e4e9077
--- /dev/null
+++ b/changelogs/unreleased/security-56348.yml
@@ -0,0 +1,5 @@
+---
+title: Check snippet attached file to be moved is within designated directory
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-commit-private-related-mr.yml b/changelogs/unreleased/security-commit-private-related-mr.yml
new file mode 100644
index 00000000000..c4de200b0d8
--- /dev/null
+++ b/changelogs/unreleased/security-commit-private-related-mr.yml
@@ -0,0 +1,5 @@
+---
+title: Don't allow non-members to see private related MRs.
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-fj-diff-import-file-read-fix.yml b/changelogs/unreleased/security-fj-diff-import-file-read-fix.yml
new file mode 100644
index 00000000000..e98d4e89712
--- /dev/null
+++ b/changelogs/unreleased/security-fj-diff-import-file-read-fix.yml
@@ -0,0 +1,5 @@
+---
+title: Fix arbitrary file read via diffs during import
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-id-fix-mr-visibility.yml b/changelogs/unreleased/security-id-fix-mr-visibility.yml
new file mode 100644
index 00000000000..8f41d191acc
--- /dev/null
+++ b/changelogs/unreleased/security-id-fix-mr-visibility.yml
@@ -0,0 +1,5 @@
+---
+title: Display the correct number of MRs a user has access to
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-id-restricted-access-to-private-repo.yml b/changelogs/unreleased/security-id-restricted-access-to-private-repo.yml
new file mode 100644
index 00000000000..7d7478d297b
--- /dev/null
+++ b/changelogs/unreleased/security-id-restricted-access-to-private-repo.yml
@@ -0,0 +1,5 @@
+---
+title: Forbid creating discussions for users with restricted access
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-issue_54789_2.yml b/changelogs/unreleased/security-issue_54789_2.yml
new file mode 100644
index 00000000000..8ecb72a2ae3
--- /dev/null
+++ b/changelogs/unreleased/security-issue_54789_2.yml
@@ -0,0 +1,5 @@
+---
+title: Do not disclose milestone titles for unauthorized users
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-kubernetes-google-login-csrf.yml b/changelogs/unreleased/security-kubernetes-google-login-csrf.yml
new file mode 100644
index 00000000000..2f87100a8dd
--- /dev/null
+++ b/changelogs/unreleased/security-kubernetes-google-login-csrf.yml
@@ -0,0 +1,5 @@
+---
+title: Validate session key when authorizing with GCP to create a cluster
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-kubernetes-local-ssrf.yml b/changelogs/unreleased/security-kubernetes-local-ssrf.yml
new file mode 100644
index 00000000000..7a2ad092339
--- /dev/null
+++ b/changelogs/unreleased/security-kubernetes-local-ssrf.yml
@@ -0,0 +1,5 @@
+---
+title: Block local URLs for Kubernetes integration
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-mermaid.yml b/changelogs/unreleased/security-mermaid.yml
new file mode 100644
index 00000000000..ec42b5a1615
--- /dev/null
+++ b/changelogs/unreleased/security-mermaid.yml
@@ -0,0 +1,5 @@
+---
+title: Limit mermaid rendering to 5K characters
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-osw-stop-linking-to-packages.yml b/changelogs/unreleased/security-osw-stop-linking-to-packages.yml
new file mode 100644
index 00000000000..078f06140fe
--- /dev/null
+++ b/changelogs/unreleased/security-osw-stop-linking-to-packages.yml
@@ -0,0 +1,5 @@
+---
+title: Stop linking to unrecognized package sources
+merge_request: 55518
+author:
+type: security
diff --git a/changelogs/unreleased/security-protect-private-repo-information.yml b/changelogs/unreleased/security-protect-private-repo-information.yml
new file mode 100644
index 00000000000..8b1a528206d
--- /dev/null
+++ b/changelogs/unreleased/security-protect-private-repo-information.yml
@@ -0,0 +1,5 @@
+---
+title: Fix leaking private repository information in API
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-shared-project-private-group.yml b/changelogs/unreleased/security-shared-project-private-group.yml
new file mode 100644
index 00000000000..3b21daa5491
--- /dev/null
+++ b/changelogs/unreleased/security-shared-project-private-group.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed ability to see private groups by users not belonging to given group
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-tags-oracle.yml b/changelogs/unreleased/security-tags-oracle.yml
new file mode 100644
index 00000000000..eb8ad6f646c
--- /dev/null
+++ b/changelogs/unreleased/security-tags-oracle.yml
@@ -0,0 +1,5 @@
+---
+title: Prevent releases links API to leak tag existance
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/sh-bump-fog-gem.yml b/changelogs/unreleased/sh-bump-fog-gem.yml
new file mode 100644
index 00000000000..6a26d5c6488
--- /dev/null
+++ b/changelogs/unreleased/sh-bump-fog-gem.yml
@@ -0,0 +1,5 @@
+---
+title: Fixes issue with AWS V4 signatures not working with some S3 providers
+merge_request: 21788
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-optimize-calendar-activities.yml b/changelogs/unreleased/sh-optimize-calendar-activities.yml
new file mode 100644
index 00000000000..b8500357e17
--- /dev/null
+++ b/changelogs/unreleased/sh-optimize-calendar-activities.yml
@@ -0,0 +1,5 @@
+---
+title: Eliminate most N+1 queries loading UserController#calendar_activities
+merge_request: 25697
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-optimize-todos-api.yml b/changelogs/unreleased/sh-optimize-todos-api.yml
new file mode 100644
index 00000000000..936ac31b853
--- /dev/null
+++ b/changelogs/unreleased/sh-optimize-todos-api.yml
@@ -0,0 +1,5 @@
+---
+title: Significantly reduce N+1 queries in /api/v4/todos endpoint
+merge_request: 25711
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-rugged-commit-is-ancestor.yml b/changelogs/unreleased/sh-rugged-commit-is-ancestor.yml
new file mode 100644
index 00000000000..0f62176b4a5
--- /dev/null
+++ b/changelogs/unreleased/sh-rugged-commit-is-ancestor.yml
@@ -0,0 +1,5 @@
+---
+title: Bring back Rugged implementation of CommitIsAncestor
+merge_request: 25702
+author:
+type: other
diff --git a/changelogs/unreleased/sh-rugged-find-commit.yml b/changelogs/unreleased/sh-rugged-find-commit.yml
new file mode 100644
index 00000000000..85b5936c9ba
--- /dev/null
+++ b/changelogs/unreleased/sh-rugged-find-commit.yml
@@ -0,0 +1,5 @@
+---
+title: Bring back Rugged implementation of find_commit
+merge_request: 25477
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-rugged-get-tree-entry.yml b/changelogs/unreleased/sh-rugged-get-tree-entry.yml
new file mode 100644
index 00000000000..4d46b764022
--- /dev/null
+++ b/changelogs/unreleased/sh-rugged-get-tree-entry.yml
@@ -0,0 +1,5 @@
+---
+title: Bring back Rugged implementation of TreeEntry
+merge_request: 25706
+author:
+type: other
diff --git a/changelogs/unreleased/sh-rugged-tree-entries.yml b/changelogs/unreleased/sh-rugged-tree-entries.yml
new file mode 100644
index 00000000000..fca1f204b9b
--- /dev/null
+++ b/changelogs/unreleased/sh-rugged-tree-entries.yml
@@ -0,0 +1,5 @@
+---
+title: Bring back Rugged implementation of GetTreeEntries
+merge_request: 25674
+author:
+type: other
diff --git a/changelogs/unreleased/sh-show-pre-receive-error-merge.yml b/changelogs/unreleased/sh-show-pre-receive-error-merge.yml
new file mode 100644
index 00000000000..5e662b34773
--- /dev/null
+++ b/changelogs/unreleased/sh-show-pre-receive-error-merge.yml
@@ -0,0 +1,5 @@
+---
+title: Show pre-receive error message when merge fails
+merge_request: 25708
+author:
+type: fixed
diff --git a/changelogs/unreleased/shell-8-7.yml b/changelogs/unreleased/shell-8-7.yml
new file mode 100644
index 00000000000..c2dd0c1f1bb
--- /dev/null
+++ b/changelogs/unreleased/shell-8-7.yml
@@ -0,0 +1,5 @@
+---
+title: Update GitLab Shell to v8.7.1
+merge_request: 25801
+author:
+type: other
diff --git a/changelogs/unreleased/table-fix-scroll-and-block.yml b/changelogs/unreleased/table-fix-scroll-and-block.yml
new file mode 100644
index 00000000000..e6def0468b8
--- /dev/null
+++ b/changelogs/unreleased/table-fix-scroll-and-block.yml
@@ -0,0 +1,5 @@
+---
+title: Fix large table horizontal scroll and prevent side-by-side tables
+merge_request: 25520
+author: Dany Jupille
+type: fixed
diff --git a/changelogs/unreleased/tr-error-tracking-project-selection.yml b/changelogs/unreleased/tr-error-tracking-project-selection.yml
new file mode 100644
index 00000000000..36cfe4556bb
--- /dev/null
+++ b/changelogs/unreleased/tr-error-tracking-project-selection.yml
@@ -0,0 +1,5 @@
+---
+title: Error tracking configuration - add a Sentry project selection dropdown
+merge_request: 24701
+author:
+type: changed
diff --git a/changelogs/unreleased/use-encrypted-runner-tokens.yml b/changelogs/unreleased/use-encrypted-runner-tokens.yml
new file mode 100644
index 00000000000..e01978557bf
--- /dev/null
+++ b/changelogs/unreleased/use-encrypted-runner-tokens.yml
@@ -0,0 +1,5 @@
+---
+title: Use encrypted runner tokens
+merge_request: 25532
+author:
+type: security
diff --git a/changelogs/unreleased/winh-enable-reply_to_individual_notes.yml b/changelogs/unreleased/winh-enable-reply_to_individual_notes.yml
new file mode 100644
index 00000000000..a9c280320dc
--- /dev/null
+++ b/changelogs/unreleased/winh-enable-reply_to_individual_notes.yml
@@ -0,0 +1,5 @@
+---
+title: Add button to start discussion from single comment
+merge_request: 25575
+author:
+type: added
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 1a5b9ec3f02..47c76d8bc49 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -227,7 +227,7 @@ production: &base
# endpoint: 'http://127.0.0.1:9000' # default: nil
# path_style: true # Use 'host/bucket_name/object' instead of 'bucket_name.host/object'
- ## Packages (maven repository so far)
+ ## Packages (maven repository, npm registry, etc...)
packages:
enabled: false
@@ -379,19 +379,54 @@ production: &base
# "start_tls" or "simple_tls". Defaults to true.
verify_certificates: true
- # Specifies the path to a file containing a PEM-format CA certificate,
- # e.g. if you need to use an internal CA.
- #
- # Example: '/etc/ca.pem'
- #
- ca_file: ''
-
- # Specifies the SSL version for OpenSSL to use, if the OpenSSL default
- # is not appropriate.
- #
- # Example: 'TLSv1_1'
- #
- ssl_version: ''
+ # OpenSSL::SSL::SSLContext options.
+ tls_options:
+ # Specifies the path to a file containing a PEM-format CA certificate,
+ # e.g. if you need to use an internal CA.
+ #
+ # Example: '/etc/ca.pem'
+ #
+ ca_file: ''
+
+ # Specifies the SSL version for OpenSSL to use, if the OpenSSL default
+ # is not appropriate.
+ #
+ # Example: 'TLSv1_1'
+ #
+ ssl_version: ''
+
+ # Specific SSL ciphers to use in communication with LDAP servers.
+ #
+ # Example: 'ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2'
+ ciphers: ''
+
+ # Client certificate
+ #
+ # Example:
+ # cert: |
+ # -----BEGIN CERTIFICATE-----
+ # MIIDbDCCAlSgAwIBAgIGAWkJxLmKMA0GCSqGSIb3DQEBCwUAMHcxFDASBgNVBAoTC0dvb2dsZSBJ
+ # bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQDEwtMREFQIENsaWVudDEPMA0GA1UE
+ # CxMGR1N1aXRlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTAeFw0xOTAyMjAwNzE4
+ # rntnF4d+0dd7zP3jrWkbdtoqjLDT/5D7NYRmVCD5vizV98FJ5//PIHbD1gL3a9b2MPAc6k7NV8tl
+ # ...
+ # 4SbuJPAiJxC1LQ0t39dR6oMCAMab3hXQqhL56LrR6cRBp6Mtlphv7alu9xb/x51y2x+g2zWtsf80
+ # Jrv/vKMsIh/sAyuogb7hqMtp55ecnKxceg==
+ # -----END CERTIFICATE -----
+ cert: ''
+
+ # Client private key
+ # key: |
+ # -----BEGIN PRIVATE KEY-----
+ # MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3DmJtLRmJGY4xU1QtI3yjvxO6
+ # bNuyE4z1NF6Xn7VSbcAaQtavWQ6GZi5uukMo+W5DHVtEkgDwh92ySZMuJdJogFbNvJvHAayheCdN
+ # 7mCQ2UUT9jGXIbmksUn9QMeJVXTZjgJWJzPXToeUdinx9G7+lpVa62UATEd1gaI3oyL72WmpDy/C
+ # rntnF4d+0dd7zP3jrWkbdtoqjLDT/5D7NYRmVCD5vizV98FJ5//PIHbD1gL3a9b2MPAc6k7NV8tl
+ # ...
+ # +9IhSYX+XIg7BZOVDeYqlPfxRvQh8vy3qjt/KUihmEPioAjLaGiihs1Fk5ctLk9A2hIUyP+sEQv9
+ # l6RG+a/mW+0rCWn8JAd464Ps9hE=
+ # -----END PRIVATE KEY-----
+ key: ''
# Set a timeout, in seconds, for LDAP queries. This helps avoid blocking
# a request if the LDAP server becomes unresponsive.
@@ -653,8 +688,8 @@ production: &base
# # Turns on AWS Server-Side Encryption with Amazon S3-Managed Keys for backups, this is optional
# # encryption: 'AES256'
# # Turns on AWS Server-Side Encryption with Amazon Customer-Provided Encryption Keys for backups, this is optional
- # # This should be set to the 256-bit, base64-encoded encryption key for Amazon S3 to use to encrypt or decrypt your data.
- # # 'encryption' must also be set in order for this to have any effect.
+ # # This should be set to the 256-bit, base64-encoded encryption key for Amazon S3 to use to encrypt or decrypt your data.
+ # # 'encryption' must also be set in order for this to have any effect.
# # encryption_key: '<base64 key>'
# # Specifies Amazon S3 storage class to use for backups, this is optional
# # storage_class: 'STANDARD'
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 1344b3cb1f6..03800f3d9d2 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -40,6 +40,24 @@ if Settings.ldap['enabled'] || Rails.env.test?
# Since GitLab 10.0, verify_certificates defaults to true for security.
server['verify_certificates'] = true if server['verify_certificates'].nil?
+ # Expose ability to set `tls_options` directly. Deprecate `ca_file` and
+ # `ssl_version` in favor of `tls_options` hash option.
+ server['tls_options'] ||= {}
+
+ if server['ssl_version'] || server['ca_file']
+ Rails.logger.warn 'DEPRECATED: LDAP options `ssl_version` and `ca_file` should be nested within `tls_options`'
+ end
+
+ if server['ssl_version']
+ server['tls_options']['ssl_version'] ||= server['ssl_version']
+ server.delete('ssl_version')
+ end
+
+ if server['ca_file']
+ server['tls_options']['ca_file'] ||= server['ca_file']
+ server.delete('ca_file')
+ end
+
Settings.ldap['servers'][key] = server
end
end
diff --git a/config/initializers/fog_core_patch.rb b/config/initializers/fog_core_patch.rb
new file mode 100644
index 00000000000..d3d02216d45
--- /dev/null
+++ b/config/initializers/fog_core_patch.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+#
+# fog-core v2 changed the namespace format:
+#
+# Old: Fog::<service>::<provider> (e.g. Fog::Storage::AWS).
+# New: Fog::<provider>::<service> (e.g. Fog::AWS::Storage)
+#
+# To preserve backwards compatibility, fog-core v2.1.0 tries to load the
+# old schema first, but falls back to the older version if that
+# fails. This creates misleading warnings with fog-aws. See
+# https://github.com/fog/fog-aws/issues/504#issuecomment-468067991 for
+# more details.
+#
+# fog-core v2.1.2 reverses the load order
+# (https://github.com/fog/fog-core/pull/229), which works for fog-aws
+# but causes a stream of deprecation warnings for fog-google.
+# fog-google locked the dependency on fog-core v2.1.0 as a result
+# (https://github.com/fog/fog-google/issues/421) until the new namespace
+# is supported.
+#
+# Since we currently have some Fog gems that have not been updated, this
+# monkey patch makes a smarter decision about which namespace to try
+# first. This squelches a significant number of warning messages.
+#
+# Since this patch is mostly cosmetic, it can be removed safely at any
+# time, but it's probably best to wait until the following issues are
+# closed:
+#
+# fog-google: https://github.com/fog/fog-google/issues/421
+# fog-rackspace: https://github.com/fog/fog-rackspace/issues/29
+# fog-aliyun: https://github.com/fog/fog-aliyun/issues/23
+module Fog
+ module ServicesMixin
+ # Gems that have not yet updated with the new fog-core namespace
+ LEGACY_FOG_PROVIDERS = %w(google rackspace aliyun).freeze
+
+ def service_provider_constant(service_name, provider_name)
+ args = service_provider_search_args(service_name, provider_name)
+ Fog.const_get(args.first).const_get(*const_get_args(args.second))
+ rescue NameError # Try to find the constant from in an alternate location
+ Fog.const_get(args.second).const_get(*const_get_args(args.first))
+ end
+
+ def service_provider_search_args(service_name, provider_name)
+ if LEGACY_FOG_PROVIDERS.include?(provider_name.downcase)
+ [service_name, provider_name]
+ else
+ [provider_name, service_name]
+ end
+ end
+ end
+end
diff --git a/config/initializers/graphql.rb b/config/initializers/graphql.rb
index 1ed93019329..e653556231d 100644
--- a/config/initializers/graphql.rb
+++ b/config/initializers/graphql.rb
@@ -1,4 +1,4 @@
# frozen_string_literal: true
GraphQL::Field.accepts_definitions(authorize: GraphQL::Define.assign_metadata_key(:authorize))
-Types::BaseField.accepts_definition(:authorize)
+GraphQL::Schema::Field.accepts_definition(:authorize)
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 69a60a65e77..2e4aa9c1053 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -22,7 +22,7 @@ Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add Gitlab::SidekiqMiddleware::ArgumentsLogger if ENV['SIDEKIQ_LOG_ARGUMENTS'] && !enable_json_logs
- chain.add Gitlab::SidekiqMiddleware::Shutdown
+ chain.add Gitlab::SidekiqMiddleware::MemoryKiller if ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS']
chain.add Gitlab::SidekiqMiddleware::RequestStoreMiddleware unless ENV['SIDEKIQ_REQUEST_STORE'] == '0'
chain.add Gitlab::SidekiqMiddleware::BatchLoader
chain.add Gitlab::SidekiqMiddleware::CorrelationLogger
@@ -77,6 +77,9 @@ Sidekiq.configure_server do |config|
# Avoid autoload issue such as 'Mail::Parsers::AddressStruct'
# https://github.com/mikel/mail/issues/912#issuecomment-214850355
Mail.eager_autoload!
+
+ # Ensure the whole process group is terminated if possible
+ Gitlab::SidekiqSignals.install!(Sidekiq::CLI::SIGNAL_HANDLERS)
end
Sidekiq.configure_client do |config|
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e8dbc033a7c..eb3b7771968 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -10,6 +10,10 @@ en:
target: Target issue
group:
path: Group URL
+ project/error_tracking_setting:
+ token: "Auth Token"
+ project: "Project"
+ api_url: "Sentry API URL"
errors:
messages:
label_already_exists_at_group_level: "already exists at group level for %{group}. Please choose another one."
diff --git a/config/routes.rb b/config/routes.rb
index 484e05114be..53c6225eff1 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -101,6 +101,7 @@ Rails.application.routes.draw do
member do
scope :applications do
post '/:application', to: 'clusters/applications#create', as: :install_applications
+ patch '/:application', to: 'clusters/applications#update', as: :update_applications
end
get :cluster_status, format: :json
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index af333bdc748..a01003b6039 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -120,6 +120,10 @@ namespace :admin do
get :resume
get :pause
end
+
+ collection do
+ get :tag_list, format: :json
+ end
end
resources :jobs, only: :index do
diff --git a/config/routes/git_http.rb b/config/routes/git_http.rb
index ec5c68f81df..a959d40881b 100644
--- a/config/routes/git_http.rb
+++ b/config/routes/git_http.rb
@@ -40,7 +40,7 @@ scope(path: '*namespace_id/:project_id',
# /info/refs?service=git-receive-pack, but nothing else.
#
git_http_handshake = lambda do |request|
- ::Constraints::ProjectUrlConstrainer.new.matches?(request) &&
+ ::Constraints::ProjectUrlConstrainer.new.matches?(request, existence_check: false) &&
(request.query_string.blank? ||
request.query_string.match(/\Aservice=git-(upload|receive)-pack\z/))
end
diff --git a/config/routes/group.rb b/config/routes/group.rb
index a0aeebe4b91..b3015529c6e 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -67,7 +67,7 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
end
end
- resources :boards, only: [:index, :show]
+ resources :boards, only: [:index, :show], constraints: { id: /\d+/ }
resources :runners, only: [:index, :edit, :update, :destroy, :show] do
member do
diff --git a/config/routes/project.rb b/config/routes/project.rb
index b4ebc7df4fe..d60a5cc9ae8 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -394,8 +394,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
get 'noteable/:target_type/:target_id/notes' => 'notes#index', as: 'noteable_notes'
- # On CE only index and show are needed
- resources :boards, only: [:index, :show]
+ resources :boards, only: [:index, :show], constraints: { id: /\d+/ }
resources :todos, only: [:create]
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 1f40363e126..cef123b86ae 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -68,6 +68,7 @@
- [background_migration, 1]
- [gcp_cluster, 1]
- [project_migrate_hashed_storage, 1]
+ - [project_rollback_hashed_storage, 1]
- [hashed_storage, 1]
- [pages_domain_verification, 1]
- [object_storage_upload, 1]
diff --git a/config/webpack.config.js b/config/webpack.config.js
index cf9e77d2424..64e6ec49219 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -245,6 +245,17 @@ module.exports = {
jQuery: 'jquery',
}),
+ new webpack.NormalModuleReplacementPlugin(/^ee_component\/(.*)\.vue/, function(resource) {
+ if (Object.keys(module.exports.resolve.alias).indexOf('ee') >= 0) {
+ resource.request = resource.request.replace(/^ee_component/, 'ee');
+ } else {
+ resource.request = path.join(
+ ROOT_PATH,
+ 'app/assets/javascripts/vue_shared/components/empty_component.js'
+ );
+ }
+ }),
+
// compression can require a lot of compute time and is disabled in CI
IS_PRODUCTION && !NO_COMPRESSION && new CompressionPlugin(),
diff --git a/db/migrate/20190206193120_add_index_to_tags.rb b/db/migrate/20190206193120_add_index_to_tags.rb
new file mode 100644
index 00000000000..5257ebba003
--- /dev/null
+++ b/db/migrate/20190206193120_add_index_to_tags.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexToTags < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'index_tags_on_name_trigram'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :tags, :name, name: INDEX_NAME, using: :gin, opclasses: { name: :gin_trgm_ops }
+ end
+
+ def down
+ remove_concurrent_index_by_name(:tags, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb b/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb
new file mode 100644
index 00000000000..2a2a216da7d
--- /dev/null
+++ b/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddMergePipelinesEnabledToCiCdSettings < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ add_column :project_ci_cd_settings, :merge_pipelines_enabled, :boolean
+ end
+end
diff --git a/db/migrate/20190218134158_add_masked_to_ci_variables.rb b/db/migrate/20190218134158_add_masked_to_ci_variables.rb
new file mode 100644
index 00000000000..b4999d5b4a9
--- /dev/null
+++ b/db/migrate/20190218134158_add_masked_to_ci_variables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddMaskedToCiVariables < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_column_with_default :ci_variables, :masked, :boolean, default: false, allow_null: false
+ end
+
+ def down
+ remove_column :ci_variables, :masked
+ end
+end
diff --git a/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb b/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb
new file mode 100644
index 00000000000..8633875b341
--- /dev/null
+++ b/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddMaskedToCiGroupVariables < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_column_with_default :ci_group_variables, :masked, :boolean, default: false, allow_null: false
+ end
+
+ def down
+ remove_column :ci_group_variables, :masked
+ end
+end
diff --git a/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb b/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb
new file mode 100644
index 00000000000..85b9e0580f4
--- /dev/null
+++ b/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddEmailHeaderAndFooterEnabledFlagToAppearancesTable < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ DOWNTIME = false
+
+ def up
+ add_column_with_default(:appearances, :email_header_and_footer_enabled, :boolean, default: false)
+ end
+
+ def down
+ remove_column(:appearances, :email_header_and_footer_enabled)
+ end
+end
diff --git a/db/migrate/20190225160300_steal_encrypt_runners_tokens.rb b/db/migrate/20190225160300_steal_encrypt_runners_tokens.rb
new file mode 100644
index 00000000000..18c0d2a2e1b
--- /dev/null
+++ b/db/migrate/20190225160300_steal_encrypt_runners_tokens.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class StealEncryptRunnersTokens < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # This cleans after `EncryptRunnersTokens`
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ Gitlab::BackgroundMigration.steal('EncryptRunnersTokens')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20190225160301_add_runner_tokens_indexes.rb b/db/migrate/20190225160301_add_runner_tokens_indexes.rb
new file mode 100644
index 00000000000..3230c2809de
--- /dev/null
+++ b/db/migrate/20190225160301_add_runner_tokens_indexes.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class AddRunnerTokensIndexes < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ # It seems that `ci_runners.token_encrypted` and `projects.runners_token_encrypted`
+ # are non-unique
+
+ def up
+ add_concurrent_index :ci_runners, :token_encrypted
+ add_concurrent_index :projects, :runners_token_encrypted
+ add_concurrent_index :namespaces, :runners_token_encrypted, unique: true
+ end
+
+ def down
+ remove_concurrent_index :ci_runners, :token_encrypted
+ remove_concurrent_index :projects, :runners_token_encrypted
+ remove_concurrent_index :namespaces, :runners_token_encrypted, unique: true
+ end
+end
diff --git a/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb b/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb
new file mode 100644
index 00000000000..6af7902e0c4
--- /dev/null
+++ b/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class MigrateProjectMigrateSidekiqQueue < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ DOWNTIME = false
+
+ def up
+ sidekiq_queue_migrate 'project_migrate_hashed_storage', to: 'hashed_storage:hashed_storage_project_migrate'
+ end
+
+ def down
+ sidekiq_queue_migrate 'hashed_storage:hashed_storage_project_migrate', to: 'project_migrate_hashed_storage'
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0e850f412ed..c782524c391 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20190220150130) do
+ActiveRecord::Schema.define(version: 20190301081611) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -44,6 +44,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.text "message_background_color"
t.text "message_font_color"
t.string "favicon"
+ t.boolean "email_header_and_footer_enabled", default: false, null: false
end
create_table "application_setting_terms", force: :cascade do |t|
@@ -405,6 +406,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.boolean "protected", default: false, null: false
t.datetime_with_timezone "created_at", null: false
t.datetime_with_timezone "updated_at", null: false
+ t.boolean "masked", default: false, null: false
t.index ["group_id", "key"], name: "index_ci_group_variables_on_group_id_and_key", unique: true, using: :btree
end
@@ -554,6 +556,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.index ["locked"], name: "index_ci_runners_on_locked", using: :btree
t.index ["runner_type"], name: "index_ci_runners_on_runner_type", using: :btree
t.index ["token"], name: "index_ci_runners_on_token", using: :btree
+ t.index ["token_encrypted"], name: "index_ci_runners_on_token_encrypted", using: :btree
end
create_table "ci_stages", force: :cascade do |t|
@@ -602,6 +605,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.integer "project_id", null: false
t.boolean "protected", default: false, null: false
t.string "environment_scope", default: "*", null: false
+ t.boolean "masked", default: false, null: false
t.index ["project_id", "key", "environment_scope"], name: "index_ci_variables_on_project_id_and_key_and_environment_scope", unique: true, using: :btree
end
@@ -1380,6 +1384,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.index ["path"], name: "index_namespaces_on_path_trigram", using: :gin, opclasses: {"path"=>"gin_trgm_ops"}
t.index ["require_two_factor_authentication"], name: "index_namespaces_on_require_two_factor_authentication", using: :btree
t.index ["runners_token"], name: "index_namespaces_on_runners_token", unique: true, using: :btree
+ t.index ["runners_token_encrypted"], name: "index_namespaces_on_runners_token_encrypted", unique: true, using: :btree
t.index ["type"], name: "index_namespaces_on_type", using: :btree
end
@@ -1573,6 +1578,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
create_table "project_ci_cd_settings", force: :cascade do |t|
t.integer "project_id", null: false
t.boolean "group_runners_enabled", default: true, null: false
+ t.boolean "merge_pipelines_enabled"
t.index ["project_id"], name: "index_project_ci_cd_settings_on_project_id", unique: true, using: :btree
end
@@ -1748,6 +1754,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.index ["repository_storage", "created_at"], name: "idx_project_repository_check_partial", where: "(last_repository_check_at IS NULL)", using: :btree
t.index ["repository_storage"], name: "index_projects_on_repository_storage", using: :btree
t.index ["runners_token"], name: "index_projects_on_runners_token", using: :btree
+ t.index ["runners_token_encrypted"], name: "index_projects_on_runners_token_encrypted", using: :btree
t.index ["star_count"], name: "index_projects_on_star_count", using: :btree
t.index ["visibility_level"], name: "index_projects_on_visibility_level", using: :btree
end
@@ -2051,6 +2058,7 @@ ActiveRecord::Schema.define(version: 20190220150130) do
t.string "name"
t.integer "taggings_count", default: 0
t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree
+ t.index ["name"], name: "index_tags_on_name_trigram", using: :gin, opclasses: {"name"=>"gin_trgm_ops"}
end
create_table "term_agreements", force: :cascade do |t|
diff --git a/doc/README.md b/doc/README.md
index 14e8d2edb90..ecc214d97c8 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -38,6 +38,7 @@ Have a look at some of our most popular documentation resources:
| [GitLab CI/CD examples](ci/examples/README.md) | Get up to speed quickly with common CI/CD scenarios. |
| [GitLab Container Registry](user/project/container_registry.md) | Host containers within GitLab. |
| [GitLab Pages](user/project/pages/index.md) | Host static websites for your projects with GitLab. |
+| [GitLab.com settings](user/gitlab_com/index.md) | Settings for [GitLab.com](#gitlabcom). |
| [Kubernetes integration](user/project/clusters/index.md) | Use GitLab with Kubernetes. |
| [SSH authentication](ssh/README.md) | Secure your network communications. |
| [Using Docker images](ci/docker/using_docker_images.md) | Build and test your applications with Docker. |
@@ -288,6 +289,7 @@ The following documentation relates to the DevOps **Configure** stage:
| [Installing Applications](user/project/clusters/index.md#installing-applications) | Deploy Helm, Ingress, and Prometheus on Kubernetes. |
| [Mattermost slash commands](user/project/integrations/mattermost_slash_commands.md) | Enable and use slash commands from within Mattermost. |
| [Protected variables](ci/variables/README.md#protected-variables) | Restrict variables to protected branches and tags. |
+| [Serverless](user/project/clusters/serverless/index.md) | Run serverless workloads on Kubernetes. |
| [Slack slash commands](user/project/integrations/slack_slash_commands.md) | Enable and use slash commands from within Slack. |
<div align="right">
diff --git a/doc/administration/auth/how_to_configure_ldap_gitlab_ce/index.md b/doc/administration/auth/how_to_configure_ldap_gitlab_ce/index.md
index 0d03b481881..15276d364a0 100644
--- a/doc/administration/auth/how_to_configure_ldap_gitlab_ce/index.md
+++ b/doc/administration/auth/how_to_configure_ldap_gitlab_ce/index.md
@@ -14,7 +14,7 @@ Managing a large number of users in GitLab can become a burden for system admini
In this guide we will focus on configuring GitLab with Active Directory. [Active Directory](https://en.wikipedia.org/wiki/Active_Directory) is a popular LDAP compatible directory service provided by Microsoft, included in all modern Windows Server operating systems.
-GitLab has supported LDAP integration since [version 2.2](https://about.gitlab.com/2012/02/22/gitlab-version-2-2/). With GitLab LDAP [group syncing](#group-syncing-ee) being added to GitLab Enterprise Edition in [version 6.0](https://about.gitlab.com/2013/08/20/gitlab-6-dot-0-released/). LDAP integration has become one of the most popular features in GitLab.
+GitLab has supported LDAP integration since [version 2.2](https://about.gitlab.com/2012/02/22/gitlab-version-2-2/). With GitLab LDAP [group syncing](https://docs.gitlab.com/ee/administration/auth/how_to_configure_ldap_gitlab_ee/index.html#group-sync) being added to GitLab Enterprise Edition in [version 6.0](https://about.gitlab.com/2013/08/20/gitlab-6-dot-0-released/). LDAP integration has become one of the most popular features in GitLab.
## Getting started
@@ -111,7 +111,7 @@ The initial configuration of LDAP in GitLab requires changes to the `gitlab.rb`
The two Active Directory specific values are `active_directory: true` and `uid: 'sAMAccountName'`. `sAMAccountName` is an attribute returned by Active Directory used for GitLab usernames. See the example output from `ldapsearch` for a full list of attributes a "person" object (user) has in **AD** - [`ldapsearch` example](#using-ldapsearch-unix)
-> Both group_base and admin_group configuration options are only available in GitLab Enterprise Edition. See [GitLab EE - LDAP Features](#gitlab-enterprise-edition---ldap-features)
+> Both group_base and admin_group configuration options are only available in GitLab Enterprise Edition. See [GitLab EE - LDAP Features](https://docs.gitlab.com/ee/administration/auth/how_to_configure_ldap_gitlab_ee/index.html#gitlab-enterprise-edition---ldap-features)
### Example `gitlab.rb` LDAP
diff --git a/doc/administration/auth/ldap.md b/doc/administration/auth/ldap.md
index d5d0d99ac24..440c2b1285a 100644
--- a/doc/administration/auth/ldap.md
+++ b/doc/administration/auth/ldap.md
@@ -81,6 +81,9 @@ library. `tls` corresponds to StartTLS, not to be confused with regular TLS.
Normally, if you specify `ssl` it will be on port 636, while `tls` (StartTLS)
would be on port 389. `plain` also operates on port 389.
+NOTE: **Note:**
+LDAP users must have an email address set, regardless of whether it is used to log in.
+
**Omnibus configuration**
```ruby
@@ -136,14 +139,54 @@ main:
##
verify_certificates: true
- ##
- ## Specifies the SSL version for OpenSSL to use, if the OpenSSL default
- ## is not appropriate.
- ##
- ## Example: 'TLSv1_1'
- ##
- ##
- ssl_version: ''
+ # OpenSSL::SSL::SSLContext options.
+ tls_options:
+ # Specifies the path to a file containing a PEM-format CA certificate,
+ # e.g. if you need to use an internal CA.
+ #
+ # Example: '/etc/ca.pem'
+ #
+ ca_file: ''
+
+ # Specifies the SSL version for OpenSSL to use, if the OpenSSL default
+ # is not appropriate.
+ #
+ # Example: 'TLSv1_1'
+ #
+ ssl_version: ''
+
+ # Specific SSL ciphers to use in communication with LDAP servers.
+ #
+ # Example: 'ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2'
+ ciphers: ''
+
+ # Client certificate
+ #
+ # Example:
+ # cert: |
+ # -----BEGIN CERTIFICATE-----
+ # MIIDbDCCAlSgAwIBAgIGAWkJxLmKMA0GCSqGSIb3DQEBCwUAMHcxFDASBgNVBAoTC0dvb2dsZSBJ
+ # bmMuMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQDEwtMREFQIENsaWVudDEPMA0GA1UE
+ # CxMGR1N1aXRlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTAeFw0xOTAyMjAwNzE4
+ # rntnF4d+0dd7zP3jrWkbdtoqjLDT/5D7NYRmVCD5vizV98FJ5//PIHbD1gL3a9b2MPAc6k7NV8tl
+ # ...
+ # 4SbuJPAiJxC1LQ0t39dR6oMCAMab3hXQqhL56LrR6cRBp6Mtlphv7alu9xb/x51y2x+g2zWtsf80
+ # Jrv/vKMsIh/sAyuogb7hqMtp55ecnKxceg==
+ # -----END CERTIFICATE -----
+ cert: ''
+
+ # Client private key
+ # key: |
+ # -----BEGIN PRIVATE KEY-----
+ # MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3DmJtLRmJGY4xU1QtI3yjvxO6
+ # bNuyE4z1NF6Xn7VSbcAaQtavWQ6GZi5uukMo+W5DHVtEkgDwh92ySZMuJdJogFbNvJvHAayheCdN
+ # 7mCQ2UUT9jGXIbmksUn9QMeJVXTZjgJWJzPXToeUdinx9G7+lpVa62UATEd1gaI3oyL72WmpDy/C
+ # rntnF4d+0dd7zP3jrWkbdtoqjLDT/5D7NYRmVCD5vizV98FJ5//PIHbD1gL3a9b2MPAc6k7NV8tl
+ # ...
+ # +9IhSYX+XIg7BZOVDeYqlPfxRvQh8vy3qjt/KUihmEPioAjLaGiihs1Fk5ctLk9A2hIUyP+sEQv9
+ # l6RG+a/mW+0rCWn8JAd464Ps9hE=
+ # -----END PRIVATE KEY-----
+ key: ''
##
## Set a timeout, in seconds, for LDAP queries. This helps avoid blocking
diff --git a/doc/administration/auth/okta.md b/doc/administration/auth/okta.md
index 3136923fa96..638405126a5 100644
--- a/doc/administration/auth/okta.md
+++ b/doc/administration/auth/okta.md
@@ -1,6 +1,6 @@
# Okta SSO provider
-Okta is a [Single Sign-on provider][okta-sso] that can be used to authenticate
+Okta is a [Single Sign-on provider](https://www.okta.com/products/single-sign-on/) that can be used to authenticate
with GitLab.
The following documentation enables Okta as a SAML provider.
@@ -140,7 +140,7 @@ Now that the Okta app is configured, it's time to enable it in GitLab.
}
```
-1. [Reconfigure][reconf] or [restart] GitLab for Omnibus and installations
+1. [Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) or [restart](../restart_gitlab.md#installations-from-source) GitLab for Omnibus and installations
from source respectively for the changes to take effect.
You might want to try this out on an incognito browser window.
@@ -150,10 +150,5 @@ You might want to try this out on an incognito browser window.
>**Note:**
Make sure the groups exist and are assigned to the Okta app.
-You can take a look of the [SAML documentation][saml] on external groups since
+You can take a look of the [SAML documentation](../../integration/saml.md#marking-users-as-external-based-on-saml-groups) on external groups since
it works the same.
-
-[okta-sso]: https://www.okta.com/products/single-sign-on/
-[saml]: ../../integration/saml.md#external-groups
-[reconf]: ../restart_gitlab.md#omnibus-gitlab-reconfigure
-[restart]: ../restart_gitlab.md#installations-from-source
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 0414b3ec12e..72cb57fb36c 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -6,12 +6,12 @@ GitLab’s [security features](../security/README.md) may also help you meet rel
|Feature |GitLab tier |GitLab.com |
| ---------| :--------: | :-------: |
-|**[Restrict SSH Keys](../README.html#administrator-documentation)**<br>Control the technology and key length of SSH keys used to access GitLab|Core+||
-|**[Granular user roles and flexible permissions](../user/permissions.html)**<br>Manage access and permissions with five different user roles and settings for external users. Set permissions according to people's role, rather than either read or write access to a repository. Don't share the source code with people that only need access to the issue tracker.|Core+|✓|
-|**[Enforce TOS acceptance](../user/admin_area/settings/terms.html)**<br>Enforce your users accepting new terms of service by blocking GitLab traffic.|Core+||
-|**[Email all users of a project, group, or entire server](../user/admin_area/settings/terms.html)**<br>An admin 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.|Starter+||
+|**[Restrict SSH Keys](../security/ssh_keys_restrictions.md)**<br>Control the technology and key length of SSH keys used to access GitLab|Core+||
+|**[Granular user roles and flexible permissions](../user/permissions.md)**<br>Manage access and permissions with five different user roles and settings for external users. Set permissions according to people's role, rather than either read or write access to a repository. Don't share the source code with people that only need access to the issue tracker.|Core+|✓|
+|**[Enforce TOS acceptance](../user/admin_area/settings/terms.md)**<br>Enforce your users accepting new terms of service by blocking GitLab traffic.|Core+||
+|**[Email all users of a project, group, or entire server](../user/admin_area/settings/terms.md)**<br>An admin 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.|Starter+||
|**[Omnibus package supports log forwarding](https://docs.gitlab.com/omnibus/settings/logs.html#udp-log-forwarding)**<br>Forward your logs to a central system.|Starter+||
-|**[Lock project membership to group](../workflow/groups.html#lock-project-membership-to-members-of-this-group)**<br>Group owners can prevent new members from being added to projects within a group.|Starter+|✓|
+|**[Lock project membership to group](https://docs.gitlab.com/ee/user/group/index.html#member-lock-starter)**<br>Group owners can prevent new members from being added to projects within a group.|Starter+|✓|
|**[LDAP group sync](https://docs.gitlab.com/ee/administration/auth/ldap-ee.html#group-sync)**<br>GitLab Enterprise Edition gives admins 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.|Starter+||
|**[LDAP group sync filters](https://docs.gitlab.com/ee/administration/auth/ldap-ee.html#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+||
|**[Audit logs](https://docs.gitlab.com/ee/administration/audit_events.html)**<br>To maintain the integrity of your code, GitLab Enterprise Edition Premium gives admins the ability to view any modifications made within the GitLab server in an advanced audit log system, so you can control, analyze and track every change.|Premium+||
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 0795d3dad40..2d4b5c65c46 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -45,9 +45,13 @@ installations that are larger than a single machine. Most
installations will be better served with the default configuration
used by Omnibus and the GitLab source installation guide.
-Starting with GitLab 11.4, Gitaly is a replacement for NFS except
-when the [Elastic Search indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer)
-is used.
+Starting with GitLab 11.4, Gitaly is able to serve all Git requests without
+needed a shared NFS mount for Git repository data.
+Between 11.4 and 11.8 the exception was the
+[Elastic Search indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer).
+But since 11.8 the indexer uses Gitaly for data access as well. NFS can still
+be leveraged for redudancy on block level of the Git data. But only has to
+be mounted on the Gitaly server.
### Network architecture
@@ -62,14 +66,16 @@ is used.
- Gitaly addresses must be specified in such a way that they resolve
correctly for ALL Gitaly clients
- Gitaly clients are: unicorn, sidekiq, gitlab-workhorse,
- gitlab-shell, and Gitaly itself
+ gitlab-shell, Elasticsearch Indexer, and Gitaly itself
- special case: a Gitaly server must be able to make RPC calls **to
itself** via its own (Gitaly address, Gitaly token) pair as
specified in `gitlab-rails/config/gitlab.yml`
- Gitaly servers must not be exposed to the public internet
-Gitaly network traffic is unencrypted so you should use a firewall to
-restrict access to your Gitaly server.
+Gitaly network traffic is unencrypted by default, but supports
+[TLS](#tls-support). Authentication is done through a static token. For
+security in depth, its recommended to use a firewall to restrict access
+to your Gitaly server.
Below we describe how to configure a Gitaly server at address
`gitaly.internal:8075` with secret token `abc123secret`. We assume
@@ -194,17 +200,16 @@ server from reaching the Gitaly server then all Gitaly requests will
fail.
We assume that your Gitaly server can be reached at
-`gitaly.internal:8075` from your GitLab server, and that your GitLab
-NFS shares are mounted at `/mnt/gitlab/default` and
-`/mnt/gitlab/storage1` respectively.
+`gitaly.internal:8075` from your GitLab server, and that Gitaly can read and
+write to `/mnt/gitlab/default` and `/mnt/gitlab/storage1` respectively.
Omnibus installations:
```ruby
# /etc/gitlab/gitlab.rb
git_data_dirs({
- 'default' => { 'path' => '/mnt/gitlab/default', 'gitaly_address' => 'tcp://gitaly.internal:8075' },
- 'storage1' => { 'path' => '/mnt/gitlab/storage1', 'gitaly_address' => 'tcp://gitaly.internal:8075' },
+ 'default' => { 'gitaly_address' => 'tcp://gitaly.internal:8075' },
+ 'storage1' => { 'gitaly_address' => 'tcp://gitaly.internal:8075' },
})
gitlab_rails['gitaly_token'] = 'abc123secret'
@@ -218,10 +223,8 @@ gitlab:
repositories:
storages:
default:
- path: /mnt/gitlab/default/repositories
gitaly_address: tcp://gitaly.internal:8075
storage1:
- path: /mnt/gitlab/storage1/repositories
gitaly_address: tcp://gitaly.internal:8075
gitaly:
@@ -236,7 +239,7 @@ repository from your GitLab server over HTTP.
## TLS support
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22602) in GitLab 11.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22602) in GitLab 11.8.
Gitaly supports TLS credentials for GRPC authentication. To be able to communicate
with a Gitaly instance that listens for secure connections you will need to use `tls://` url
diff --git a/doc/administration/high_availability/nfs.md b/doc/administration/high_availability/nfs.md
index 74b0e2c8184..78ebf8a083b 100644
--- a/doc/administration/high_availability/nfs.md
+++ b/doc/administration/high_availability/nfs.md
@@ -37,6 +37,28 @@ options:
circumstances it could lead to data loss if a failure occurs before data has
synced.
+### Improving NFS performance with GitLab
+
+If you are using NFS to share Git data, we recommend that you enable a
+number of feature flags that will allow GitLab application processes to
+access Git data directly instead of going through the [Gitaly
+service](../gitaly/index.md). Depending on your workload and disk
+performance, these flags may help improve performance. See [the
+issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/57317) for more
+details.
+
+To do this, run the Rake task:
+
+```sh
+gitlab-rake gitlab:features:enable_rugged
+```
+
+If you need to undo this setting for some reason, run:
+
+```sh
+gitlab-rake gitlab:features:disable_rugged
+```
+
### Known issues
On some customer systems, we have seen NFS clients slow precipitously due to
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 6e08d4633cd..b723edfc78f 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.
- [Job artifacts](job_artifacts.md): Enable, disable, and configure job artifacts (a set of files and directories which are outputted by a job when it completes successfully).
- [Job traces](job_traces.md): Information about the job traces (logs).
- [Register Shared and specific Runners](../ci/runners/README.md#registering-a-shared-runner): Learn how to register and configure Shared and specific Runners to your own instance.
-- [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.
+- [Shared Runners pipelines quota](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#shared-runners-pipeline-minutes-quota-starter-only): Limit the usage of pipeline minutes for Shared Runners. **[STARTER ONLY]**
- [Enable/disable Auto DevOps](../topics/autodevops/index.md#enablingdisabling-auto-devops): Enable or disable Auto DevOps for your instance.
## Git configuration options
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index 25ae535d1ec..8522d046a92 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -274,7 +274,7 @@ you can flip the feature flag from a Rails console.
## Set the maximum file size of the artifacts
Provided the artifacts are enabled, you can change the maximum file size of the
-artifacts through the [Admin area settings](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size).
+artifacts through the [Admin area settings](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size-core-only).
## Storage statistics
diff --git a/doc/administration/monitoring/prometheus/index.md b/doc/administration/monitoring/prometheus/index.md
index 8f65cd6418c..20d7ef9bb74 100644
--- a/doc/administration/monitoring/prometheus/index.md
+++ b/doc/administration/monitoring/prometheus/index.md
@@ -17,7 +17,7 @@ access to high quality time-series monitoring of GitLab services.
## Overview
Prometheus works by periodically connecting to data sources and collecting their
-performance metrics via the [various exporters](#prometheus-exporters). To view
+performance metrics via the [various exporters](#bundled-software-metrics). To view
and work with the monitoring data, you can either
[connect directly to Prometheus](#viewing-performance-metrics) or utilize a
dashboard tool like [Grafana].
diff --git a/doc/administration/operations/sidekiq_memory_killer.md b/doc/administration/operations/sidekiq_memory_killer.md
index cbffd883774..8eac42f2fe2 100644
--- a/doc/administration/operations/sidekiq_memory_killer.md
+++ b/doc/administration/operations/sidekiq_memory_killer.md
@@ -17,6 +17,11 @@ With the default settings, the MemoryKiller will cause a Sidekiq restart no
more often than once every 15 minutes, with the restart causing about one
minute of delay for incoming background jobs.
+Some background jobs rely on long-running external processes. To ensure these
+are cleanly terminated when Sidekiq is restarted, each Sidekiq process should be
+run as a process group leader (e.g., using `chpst -P`). If using Omnibus or the
+`bin/background_jobs` script with `runit` installed, this is handled for you.
+
## Configuring the MemoryKiller
The MemoryKiller is controlled using environment variables.
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index 60800d445b8..2100f7cd707 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -137,7 +137,7 @@ The Pages daemon doesn't listen to the outside world.
```
gitlab_pages_enabled=true
- gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090
+ gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090"
```
1. Copy the `gitlab-pages` Nginx configuration file:
diff --git a/doc/administration/raketasks/uploads/migrate.md b/doc/administration/raketasks/uploads/migrate.md
index b5c40478ea5..fd8ea8d3162 100644
--- a/doc/administration/raketasks/uploads/migrate.md
+++ b/doc/administration/raketasks/uploads/migrate.md
@@ -2,7 +2,7 @@
## Migrate to Object Storage
-After [configuring the object storage](../../uploads.md#using-object-storage) for GitLab's uploads, you may use this task to migrate existing uploads from the local storage to the remote storage.
+After [configuring the object storage](../../uploads.md#using-object-storage-core-only) for GitLab's uploads, you may use this task to migrate existing uploads from the local storage to the remote storage.
>**Note:**
All of the processing will be done in a background worker and requires **no downtime**.
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 8b725e50f58..7cf8f20a9dc 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -31,7 +31,7 @@ panel.
If the repository check fails for some repository you should look up the error
in `repocheck.log`:
-- in the [admin panel](logs.md#repocheck-log)
+- in the [admin panel](logs.md#repochecklog)
- or on disk, see:
- `/var/log/gitlab/gitlab-rails` for Omnibus installations
- `/home/git/gitlab/log` for installations from source
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index 9dfe085425f..8c0c7a36736 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -53,7 +53,7 @@ _The uploads are stored by default in
> **Notes:**
>
> - [Introduced][ee-3867] in [GitLab Premium][eep] 10.5.
-> - [Introduced][ce17358] in [GitLab Core][ce] 10.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/17358) in [GitLab Core][ce] 10.7.
> - Since version 11.1, we support direct_upload to S3.
If you don't want to use the local disk where GitLab is installed to store the
@@ -152,4 +152,3 @@ _The uploads are stored by default in
[eep]: https://about.gitlab.com/gitlab-ee/ "GitLab Premium"
[ce]: https://about.gitlab.com/gitlab-ce/ "GitLab Community Edition"
[ee-3867]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/3867
-[ce-17358]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/17358
diff --git a/doc/api/README.md b/doc/api/README.md
index 48d9ad8f30d..7ec7955c596 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -274,7 +274,7 @@ personal access tokens, and to using the [Sudo](#sudo) feature, since the user's
password/token may not be known or may change over time.
For more information, refer to the
-[users API](users.md#retrieve-user-impersonation-tokens) docs.
+[users API](users.md#create-an-impersonation-token) docs.
Impersonation tokens are used exactly like regular personal access tokens, and can be passed in either the
`private_token` parameter or the `Private-Token` header.
diff --git a/doc/api/commits.md b/doc/api/commits.md
index 8d36ae7d559..442178aedff 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -79,6 +79,7 @@ POST /projects/:id/repository/commits
| `author_email` | string | no | Specify the commit author's email address |
| `author_name` | string | no | Specify the commit author's name |
| `stats` | boolean | no | Include commit stats. Default is true |
+| `force` | boolean | no | When `true` overwrites the target branch with a new commit based on the `start_branch` |
| `actions[]` Attribute | Type | Required | Description |
| --------------------- | ---- | -------- | ----------- |
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 085e321b35f..877cd99723a 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -10,7 +10,7 @@ GET /projects/:id/jobs
| 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. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
```sh
@@ -142,8 +142,8 @@ GET /projects/:id/pipelines/:pipeline_id/jobs
| 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. |
-| `pipeline_id` | integer | yes | The ID of a pipeline. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `pipeline_id` | integer | yes | ID of a pipeline. |
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
```sh
@@ -275,8 +275,8 @@ GET /projects/:id/jobs/:job_id
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
```sh
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8"
@@ -350,8 +350,8 @@ GET /projects/:id/jobs/:job_id/artifacts
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
Example requests:
@@ -385,7 +385,7 @@ Parameters
| 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. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
| `job` | string | yes | The name of the job. |
@@ -420,7 +420,7 @@ Parameters
| 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. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id ` | integer | yes | The unique job identifier. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
@@ -454,7 +454,7 @@ Parameters:
| 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. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
| `job` | string | yes | The name of the job. |
@@ -483,8 +483,8 @@ GET /projects/:id/jobs/:job_id/trace
| 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. |
-| job_id | integer | yes | The ID of a job. |
+| id | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| job_id | integer | yes | ID of a job. |
```sh
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8/trace"
@@ -507,8 +507,8 @@ POST /projects/:id/jobs/:job_id/cancel
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
```sh
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/cancel"
@@ -555,8 +555,8 @@ POST /projects/:id/jobs/:job_id/retry
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
```sh
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/retry"
@@ -605,8 +605,8 @@ Parameters
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
Example of request
@@ -658,8 +658,8 @@ Parameters
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
Example request:
@@ -699,6 +699,33 @@ Example response:
}
```
+## Delete artifacts
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/25522) in GitLab 11.9.
+
+Delete artifacts of a job.
+
+```
+DELETE /projects/:id/jobs/:job_id/artifacts
+```
+
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `job_id` | integer | yes | ID of a job. |
+
+
+Example request:
+
+```sh
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/artifacts"
+```
+
+NOTE: **Note:**
+At least Maintainer role is required to delete artifacts.
+
+If the artifacts were deleted successfully, a response with status `204 No Content` is returned.
+
## Play a job
Triggers a manual action to start a job.
@@ -709,8 +736,8 @@ POST /projects/:id/jobs/:job_id/play
| 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. |
-| `job_id` | integer | yes | The ID of a job. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | yes | ID of a job. |
```sh
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/play"
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 35c18649fec..7d7215e6b80 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -13,13 +13,15 @@ GET /runners
GET /runners?scope=active
GET /runners?type=project_type
GET /runners?status=active
+GET /runners?tag_list=tag1,tag2
```
-| Attribute | Type | Required | Description |
-|-----------|---------|----------|---------------------|
-| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online`, `offline`; showing all runners if none provided |
-| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
-| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| Attribute | Type | Required | Description |
+|-------------|----------------|----------|---------------------|
+| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online`, `offline`; showing all runners if none provided |
+| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
+| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| `tag_list` | Array[String] | no | List of of the runner's tags |
```
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/runners"
@@ -62,13 +64,15 @@ GET /runners/all
GET /runners/all?scope=online
GET /runners/all?type=project_type
GET /runners/all?status=active
+GET /runners/all?tag_list=tag1,tag2
```
-| Attribute | Type | Required | Description |
-|-----------|---------|----------|---------------------|
-| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of runners to show, one of: `specific`, `shared`, `active`, `paused`, `online`, `offline`; showing all runners if none provided |
-| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
-| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| Attribute | Type | Required | Description |
+|-------------|----------------|----------|---------------------|
+| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of runners to show, one of: `specific`, `shared`, `active`, `paused`, `online`, `offline`; showing all runners if none provided |
+| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
+| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| `tag_list` | Array[String] | no | List of of the runner's tags |
```
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/runners/all"
@@ -347,14 +351,16 @@ GET /projects/:id/runners
GET /projects/:id/runners?scope=active
GET /projects/:id/runners?type=project_type
GET /projects/:id/runners?status=active
+GET /projects/:id/runners?tag_list=tag1,tag2
```
-| 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 |
-| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online`, `offline`; showing all runners if none provided |
-| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
-| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| 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 |
+| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online`, `offline`; showing all runners if none provided |
+| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
+| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
+| `tag_list` | Array[String] | no | List of of the runner's tags |
```
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/9/runners"
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 2e0a2a09133..c2a1f7feefd 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -161,7 +161,7 @@ are listed in the descriptions of the relevant settings.
| `email_author_in_body` | boolean | no | 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. |
| `enabled_git_access_protocol` | string | no | Enabled protocols for Git access. Allowed values are: `ssh`, `http`, and `nil` to allow both protocols. |
| `enforce_terms` | boolean | no | (**If enabled, requires:** `terms`) Enforce application ToS to all users. |
-| `first_day_of_week` | integer | no | Start day of the week for calendar views and date pickers. Valid values are `0` (default) for Sunday and `1` for Monday. |
+| `first_day_of_week` | integer | no | Start day of the week for calendar views and date pickers. Valid values are `0` (default) for Sunday, `1` for Monday, and `6` for Saturday. |
| `gitaly_timeout_default` | integer | no | Default Gitaly timeout, in seconds. This timeout is not enforced for git fetch/push operations or Sidekiq jobs. Set to `0` to disable timeouts. |
| `gitaly_timeout_fast` | integer | no | Gitaly fast operation timeout, in seconds. Some Gitaly operations are expected to be fast. If they exceed this threshold, there may be a problem with a storage shard and 'failing fast' can help maintain the stability of the GitLab instance. Set to `0` to disable timeouts. |
| `gitaly_timeout_medium` | integer | no | Medium Gitaly timeout, in seconds. This should be a value between the Fast and the Default timeout. Set to `0` to disable timeouts. |
diff --git a/doc/articles/index.md b/doc/articles/index.md
index 87ee17bb6de..162db11d6ac 100644
--- a/doc/articles/index.md
+++ b/doc/articles/index.md
@@ -4,8 +4,8 @@ comments: false
# Technical articles list (deprecated)
-[Technical articles](../development/documentation/index.md#technical-articles) are
-topic-related documentation, written with an user-friendly approach and language, aiming
+Technical articles are
+topic-related documentation, written with a user-friendly approach and language, aiming
to provide the community with guidance on specific processes to achieve certain objectives.
The list of technical articles was [deprecated](https://gitlab.com/gitlab-org/gitlab-ce/issues/41138) in favor of having them linked from their topic-related documentation:
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index a462c75f2f5..4f9efb57b8d 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -17,7 +17,7 @@ used to create and test an image:
```bash
docker build -t my-image dockerfiles/
-docker run my-docker-image /script/to/run/tests
+docker run my-image /script/to/run/tests
docker tag my-image my-registry:5000/my-image
docker push my-registry:5000/my-image
```
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index 6fe352df48a..6c9831dacfd 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -79,19 +79,23 @@ future GitLab releases.**
| **CI_JOB_STAGE** | 9.0 | 0.5 | The name of the stage as defined in `.gitlab-ci.yml` |
| **CI_JOB_TOKEN** | 9.0 | 1.2 | Token used for authenticating with the [GitLab Container Registry][registry] and downloading [dependent repositories][dependent-repositories] |
| **CI_JOB_URL** | 11.1 | 0.5 | Job details URL |
-| **CI_MERGE_REQUEST_ID** | 11.6 | all | The ID of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_IID** | 11.6 | all | The IID of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_PROJECT_ID** | 11.6 | all | The ID of the project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_PROJECT_PATH** | 11.6 | all | The path of the project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) (e.g. `namespace/awesome-project`) |
-| **CI_MERGE_REQUEST_PROJECT_URL** | 11.6 | all | The URL of the project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) (e.g. `http://192.168.10.15:3000/namespace/awesome-project`) |
-| **CI_MERGE_REQUEST_REF_PATH** | 11.6 | all | The ref path of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md). (e.g. `refs/merge-requests/1/head`) |
-| **CI_MERGE_REQUEST_SOURCE_BRANCH_NAME** | 11.6 | all | The source branch name of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_SOURCE_BRANCH_SHA** | 11.9 | all | The HEAD sha of the source branch of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_SOURCE_PROJECT_ID** | 11.6 | all | The ID of the source project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_SOURCE_PROJECT_PATH** | 11.6 | all | The path of the source project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_SOURCE_PROJECT_URL** | 11.6 | all | The URL of the source project of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_TARGET_BRANCH_NAME** | 11.6 | all | The target branch name of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
-| **CI_MERGE_REQUEST_TARGET_BRANCH_SHA** | 11.9 | all | The HEAD sha of the target branch of the merge request if it's [pipelines for merge requests](../merge_request_pipelines/index.md) |
+| **CI_MERGE_REQUEST_ID** | 11.6 | all | The ID of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) |
+| **CI_MERGE_REQUEST_IID** | 11.6 | all | The IID of the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md) |
+| **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) |
+| **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) (e.g. `namespace/awesome-project`) |
+| **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) (e.g. `http://192.168.10.15:3000/namespace/awesome-project`) |
+| **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). (e.g. `refs/merge-requests/1/head`) |
+| **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) |
+| **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) |
+| **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) |
+| **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) |
+| **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) |
+| **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) |
+| **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) |
+| **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) |
+| **CI_MERGE_REQUEST_ASSIGNEES** | 11.9 | all | Comma-separated list of usernames of assignees for the merge request if [the pipelines are for merge requests](../merge_request_pipelines/index.md). [Multiple assignees for merge requests](https://gitlab.com/gitlab-org/gitlab-ee/issues/2004) is scheduled for a future release |
+| **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) |
+| **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) |
| **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_API_V4_URL** | 11.7 | all | The GitLab API v4 root URL |
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index e5668c140fa..12b2df65fdd 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -618,9 +618,9 @@ action fails, the pipeline will eventually succeed.
Manual actions are considered to be write actions, so permissions for
[protected branches](../../user/project/protected_branches.md) are used when
-user wants to trigger an action. In other words, in order to trigger a manual
-action assigned to a branch that the pipeline is running for, user needs to
-have ability to merge to this branch.
+a user wants to trigger an action. In other words, in order to trigger a manual
+action assigned to a branch that the pipeline is running for, the user needs to
+have the ability to merge to this branch.
### `when:delayed`
@@ -1594,6 +1594,9 @@ You can only use files that are currently tracked by Git on the same branch
your configuration file is on. In other words, when using a `include:local`, make
sure that both `.gitlab-ci.yml` and the local file are on the same branch.
+All [nested includes](#nested-includes) will be executed in the scope of the same project,
+so it is possible to use local, project, remote or template includes.
+
NOTE: **Note:**
Including local files through Git submodules paths is not supported.
@@ -1635,6 +1638,10 @@ include:
file: '/templates/.gitlab-ci-template.yml'
```
+All nested includes will be executed in the scope of the target project,
+so it is possible to used local (relative to target project), project, remote
+or template includes.
+
### `include:template`
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/53445) in GitLab 11.7.
@@ -1650,6 +1657,9 @@ include:
- template: Auto-DevOps.gitlab-ci.yml
```
+All nested includes will be executed only with the permission of the user,
+so it is possible to use project, remote or template includes.
+
### `include:remote`
`include:remote` can be used to include a file from a different location,
@@ -1662,10 +1672,16 @@ include:
- remote: 'https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml'
```
-NOTE: **Note for GitLab admins:**
-In order to include files from another repository inside your local network,
-you may need to enable the **Allow requests to the local network from hooks and services** checkbox
-located in the **Admin area > Settings > Network > Outbound requests** section.
+All nested includes will be executed without context as public user, so only another remote,
+or public project, or template is allowed.
+
+### Nested includes
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/53903) in GitLab 11.7.
+
+Nested includes allow you to compose a set of includes.
+A total of 50 includes is allowed.
+Duplicate includes are considered a configuration error.
### `include` examples
@@ -1834,6 +1850,51 @@ In this case, if `install_dependencies` and `deploy` were not repeated in
`.gitlab-ci.yml`, they would not be part of the script for the `production`
job in the combined CI configuration.
+#### Using nested includes
+
+The examples below show how includes can be nested from different sources
+using a combination of different methods.
+
+In this example, `.gitlab-ci.yml` includes local the file `/.gitlab-ci/another-config.yml`:
+
+```yaml
+include:
+ - local: /.gitlab-ci/another-config.yml
+```
+
+The `/.gitlab-ci/another-config.yml` includes a template and the `/templates/docker-workflow.yml` file
+from another project:
+
+```yaml
+include:
+ - template: Bash.gitlab-ci.yml
+ - project: /group/my-project
+ file: /templates/docker-workflow.yml
+```
+
+The `/templates/docker-workflow.yml` present in `/group/my-project` includes two local files
+of the `/group/my-project`:
+
+```yaml
+include:
+ - local: : /templates/docker-build.yml
+ - local: : /templates/docker-testing.yml
+```
+
+Our `/templates/docker-build.yml` present in `/group/my-project` adds a `docker-build` job:
+
+```yaml
+docker-build:
+ script: docker build -t my-image .
+```
+
+Our second `/templates/docker-test.yml` present in `/group/my-project` adds a `docker-test` job:
+
+```yaml
+docker-test:
+ script: docker run my-image /run/tests.sh
+```
+
## `extends`
> Introduced in GitLab 11.3.
diff --git a/doc/customization/system_header_and_footer_messages.md b/doc/customization/system_header_and_footer_messages.md
index cf7d8b3f3e8..9d6931c730d 100644
--- a/doc/customization/system_header_and_footer_messages.md
+++ b/doc/customization/system_header_and_footer_messages.md
@@ -7,6 +7,10 @@ Navigate to the **Admin** area and go to the **Appearance** page.
Under **System header and footer** insert your header message and/or footer message.
Both background and font color of the header and footer are customizable.
+You can also apply the header and footer messages to gitlab emails,
+by checking the **Enable header and footer in emails** checkbox.
+Note that color settings will only be applied within the app interface and not to emails
+
![appearance](system_header_and_footer_messages/appearance.png)
After saving, all GitLab pages will contain the custom system header and/or footer messages:
diff --git a/doc/customization/system_header_and_footer_messages/appearance.png b/doc/customization/system_header_and_footer_messages/appearance.png
index 14667f751c4..fd315bb6c07 100644
--- a/doc/customization/system_header_and_footer_messages/appearance.png
+++ b/doc/customization/system_header_and_footer_messages/appearance.png
Binary files differ
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index e22552fd3a3..ae880e3deb6 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -65,14 +65,14 @@ Gitaly is a service designed by GitLab to remove our need for NFS for Git storag
- Omnibus configuration options
- Layer: Monitoring
-GitLab Monitor is a process disigned in house that allows us to export metrics about GitLab application internals to prometheus. You can read more [in the project's readme](https://gitlab.com/gitlab-org/gitlab-monitor)
+GitLab Monitor is a process designed in house that allows us to export metrics about GitLab application internals to prometheus. You can read more [in the project's readme](https://gitlab.com/gitlab-org/gitlab-monitor)
### gitlab-workhorse
- Omnibus configuration options
- Layer: Core Service (Processor)
-[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) is a program designed at GitLab to help alieviate pressure from unicorn. You can read more about the [historical reasons for developing](https://about.gitlab.com/2016/04/12/a-brief-history-of-gitlab-workhorse/). It's designed to act as a smart reverse proxy to help speed up GitLab as a whole.
+[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) is a program designed at GitLab to help alleviate pressure from unicorn. You can read more about the [historical reasons for developing](https://about.gitlab.com/2016/04/12/a-brief-history-of-gitlab-workhorse/). It's designed to act as a smart reverse proxy to help speed up GitLab as a whole.
### logrotate
diff --git a/doc/development/changelog.md b/doc/development/changelog.md
index cd0a1f46d27..6efed36edf0 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -135,21 +135,13 @@ If you're working on the GitLab EE repository, the entry will be added to
| Argument | Shorthand | Purpose |
| ----------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------- |
-| [`--amend`] | | Amend the previous commit |
-| [`--force`] | `-f` | Overwrite an existing entry |
-| [`--merge-request`] | `-m` | Set merge request ID |
-| [`--dry-run`] | `-n` | Don't actually write anything, just print |
-| [`--git-username`] | `-u` | Use Git user.name configuration as the author |
-| [`--type`] | `-t` | The category of the change, valid options are: `added`, `fixed`, `changed`, `deprecated`, `removed`, `security`, `performance`, `other` |
-| [`--help`] | `-h` | Print help message |
-
-[`--amend`]: #-amend
-[`--force`]: #-force-or-f
-[`--merge-request`]: #-merge-request-or-m
-[`--dry-run`]: #-dry-run-or-n
-[`--git-username`]: #-git-username-or-u
-[`--type`]: #-type-or-t
-[`--help`]: #-help
+| [`--amend`](#--amend) | | Amend the previous commit |
+| [`--force`](#--force-or--f) | `-f` | Overwrite an existing entry |
+| [`--merge-request`](#--merge-request-or--m) | `-m` | Set merge request ID |
+| [`--dry-run`](#--dry-run-or--n) | `-n` | Don't actually write anything, just print |
+| [`--git-username`](#--git-username-or--u) | `-u` | Use Git user.name configuration as the author |
+| [`--type`](#--type-or--t) | `-t` | The category of the change, valid options are: `added`, `fixed`, `changed`, `deprecated`, `removed`, `security`, `performance`, `other` |
+| `--help` | `-h` | Print help message |
##### `--amend`
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 4e766f37871..8b14c3b20ea 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -179,7 +179,7 @@ the feature you contribute through all of these steps.
1. Added to [the website](https://gitlab.com/gitlab-com/www-gitlab-com/), if relevant
1. Community questions answered
1. Answers to questions radiated (in docs/wiki/support etc.)
-1. [Black-box tests/end-to-end tests](../testing_guide/testing_levels.md#black-box-tests-or-end-to-end-tests) added if required. Please contact [the quality team](https://about.gitlab.com/handbook/engineering/quality/#teams) with any questions
+1. [Black-box tests/end-to-end tests](../testing_guide/testing_levels.md#black-box-tests-at-the-system-level-aka-end-to-end-tests) added if required. Please contact [the quality team](https://about.gitlab.com/handbook/engineering/quality/#teams) with any questions
If you add a dependency in GitLab (such as an operating system package) please
consider updating the following and note the applicability of each in your
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
new file mode 100644
index 00000000000..038e3de10d7
--- /dev/null
+++ b/doc/development/distributed_tracing.md
@@ -0,0 +1,182 @@
+# Distributed Tracing - development guidelines
+
+GitLab is instrumented for distributed tracing.
+
+According to [Open Tracing](https://opentracing.io/docs/overview/what-is-tracing/):
+
+> Distributed tracing, also called distributed request tracing, is a method used to profile and
+> monitor applications, especially those built using a microservices architecture. Distributed
+> tracing helps to pinpoint where failures occur and what causes poor performance.
+
+Distributed tracing is especially helpful in understanding the lifecycle of a request as it passes
+through the different components of the GitLab application. At present, Workhorse, Rails, Sidekiq,
+and Gitaly support tracing instrumentation.
+
+Distributed tracing adds minimal overhead when disabled, but imposes only small overhead when
+enabled and is therefore capable in any environment, including production. For this reason, it can
+be useful in diagnosing production issues, particularly performance problems.
+
+## Enabling distributed tracing
+
+GitLab uses the `GITLAB_TRACING` environment variable to configure distributed tracing. The same
+configuration is used for all components (e.g., Workhorse, Rails, etc).
+
+When `GITLAB_TRACING` is not set, the application will not be instrumented, meaning that there is
+no overhead at all.
+
+To enable `GITLAB_TRACING`, a valid _"configuration-string"_ value should be set, with a URL-like
+form:
+
+```console
+GITLAB_TRACING=opentracing://<driver>?<param_name>=<param_value>&<param_name_2>=<param_value_2>
+```
+
+In this example, we have the following hypothetical values:
+
+- `driver`: the driver. [GitLab supports
+ `jaeger`](https://docs.gitlab.com/ee/user/project/operations/tracing.html). In future, other
+ tracing implementations may also be supported.
+- `param_name`, `param_value`: these are driver specific configuration values. Configuration
+ parameters for Jaeger are documented [further on in this
+ document](#2-configure-the-gitlab_tracing-environment-variable) they should be URL encoded.
+ Multiple values should be separated by `&` characters like a URL.
+
+## Using Jaeger in the GitLab Development Kit
+
+The first tracing implementation that GitLab supports is Jaeger, and the [GitLab Development
+Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/) supports distributed tracing with
+Jaeger out-of-the-box.
+
+The easiest way to access tracing from a GDK environment is through the
+[performance-bar](../administration/monitoring/performance/performance_bar.md). This can be shown
+by typing `p` `b` in the browser window.
+
+![Jaeger Search UI](img/distributed_tracing_performance_bar.png)
+
+Once the performance bar is enabled, click on the **Trace** link in the performance bar to go to
+the Jaeger UI.
+
+The Jaeger search UI will return a query for the `Correlation-ID` of the current request. Normally,
+this search should return a single trace result. Clicking this result will show the detail of the
+trace in a hierarchical time-line.
+
+![Jaeger Search UI](img/distributed_tracing_jaeger_ui.png)
+
+## Using Jaeger without the GitLab Developer Kit
+
+Distributed Tracing can be enabled in non-GDK development environments as well as production or
+staging environments, for troubleshooting. Please note that at this time, this functionality is
+experimental, and not supported in production environments at present. In this first release, it is intended to be
+used for debugging in development environments only.
+
+Jaeger tracing can be enabled through a three-step process:
+
+1. [Start Jaeger](#1-start-jaeger).
+1. [Configure the `GITLAB_TRACING` environment variable](#2-configure-the-gitlab_tracing-environment-variable).
+1. [Start the GitLab application](#3-start-the-gitlab-application).
+1. [Go to the Jaeger Search UI in your browser](#4-open-the-jaeger-search-ui).
+
+### 1. Start Jaeger
+
+Jaeger has many configuration options, but is very easy to start in an "all-in-one" mode which uses
+memory for trace storage (and is therefore non-persistent). The main advantage of "all-in-one" mode
+being ease of use.
+
+For more detailed configuration options, refer to the [Jaeger
+documentation](https://www.jaegertracing.io/docs/1.9/getting-started/).
+
+#### Using Docker
+
+If you have Docker available, the easier approach to running the Jaeger all-in-one is through
+Docker, using the following command:
+
+```console
+$ docker run \
+ --rm \
+ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
+ -p 5775:5775/udp \
+ -p 6831:6831/udp \
+ -p 6832:6832/udp \
+ -p 5778:5778 \
+ -p 16686:16686 \
+ -p 14268:14268 \
+ -p 9411:9411 \
+ jaegertracing/all-in-one:latest
+```
+
+#### Using the Jaeger process
+
+Without Docker, the all-in-one process is still easy to setup.
+
+1. Download the [latest Jaeger release](https://github.com/jaegertracing/jaeger/releases) for your
+ platform.
+1. Extract the archive and run the `bin/all-in-one` process.
+
+This should start the process with the default listening ports.
+
+### 2. Configure the `GITLAB_TRACING` environment variable
+
+Once you have Jaeger running, you'll need to configure the `GITLAB_TRACING` variable with the
+appropriate configuration string.
+
+**TL;DR:** If you are running everything on the same host, use the following value:
+
+```console
+$ export GITLAB_TRACING="opentracing://jaeger?http_endpoint=http%3A%2F%2Flocalhost%3A14268%2Fapi%2Ftraces&sampler=const&sampler_param=1"
+```
+
+This configuration string uses the Jaeger driver `opentracing://jaeger` with the following options:
+
+| Name | Value | Description |
+|------|-------|-------------|
+| `http_endpoint` | `http://localhost:14268/api/traces` | Configures Jaeger to send trace information to the HTTP endpoint running on `http://localhost:14268/`. Alternatively, the `upd_endpoint` can be used. |
+| `sampler` | `const` | Configures Jaeger to use the constant sampler (either on or off). |
+| `sampler_param` | `1` | Configures the `const` sampler to sample _all_ traces. Using `0` would sample _no_ traces. |
+
+**Other parameter values are also possible:**
+
+| Name | Example | Description |
+|------|-------|-------------|
+| `udp_endpoint` | `localhost:6831` | This is the default. Configures Jaeger to send trace information to the UDP listener on port `6831` using compact thrift protocol. Note that we've experienced some issues with the [Jaeger Client for Ruby](https://github.com/salemove/jaeger-client-ruby) when using this protocol. |
+| `sampler` | `probabalistic` | Configures Jaeger to use a probabilistic random sampler. The rate of samples is configured by the `sampler_param` value. |
+| `sampler_param` | `0.01` | Use a ratio of `0.01` to configure the `probabalistic` sampler to randomly sample _1%_ of traces. |
+
+NOTE: **Note:**
+The same `GITLAB_TRACING` value should to be configured in the environment
+variables for all GitLab processes, including Workhorse, Gitaly, Rails, and Sidekiq.
+
+### 3. Start the GitLab application
+
+Once the `GITLAB_TRACING` environment variable is exported to all GitLab services, start the
+application.
+
+When `GITLAB_TRACING` is configured properly, the application will log this on startup:
+
+```console
+13:41:53 gitlab-workhorse.1 | 2019/02/12 13:41:53 Tracing enabled
+...
+13:41:54 gitaly.1 | 2019/02/12 13:41:54 Tracing enabled
+...
+```
+
+If `GITLAB_TRACING` is not configured correctly, this will also be logged:
+
+```console
+13:43:45 gitaly.1 | 2019/02/12 13:43:45 skipping tracing configuration step: tracer: unable to load driver mytracer
+```
+
+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).
+
+If no log messages about tracing are emitted, the `GITLAB_TRACING` environment variable is likely
+not set.
+
+### 4. Open the Jaeger Search UI
+
+By default, the Jaeger search UI is available at <http://localhost:16686/search>.
+
+TIP: **Tip:**
+Don't forget that you will need to generate traces by using the application before
+they appear in the Jaeger UI.
+
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index 652fe3ea711..a4da34a50ce 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -511,10 +511,10 @@ Currently, the following tests are in place:
1. `docs lint`: Check that all internal (relative) links work correctly and
that all cURL examples in API docs use the full switches. It's recommended
- to [check locally](#previewing-locally) before pushing to GitLab by executing the command
+ to [check locally](#previewing-the-changes-live) before pushing to GitLab by executing the command
`bundle exec nanoc check internal_links` on your local
[`gitlab-docs`](https://gitlab.com/gitlab-com/gitlab-docs) directory.
-1. [`ee_compat_check`](../automatic_ce_ee_merge.md#avoiding-ce-gt-ee-merge-conflicts-beforehand) (runs on CE only):
+1. [`ee_compat_check`](../automatic_ce_ee_merge.md#avoiding-ce-ee-merge-conflicts-beforehand) (runs on CE only):
When you submit a merge request to GitLab Community Edition (CE),
there is this additional job that runs against Enterprise Edition (EE)
and checks if your changes can apply cleanly to the EE codebase.
diff --git a/doc/development/documentation/site_architecture/global_nav.md b/doc/development/documentation/site_architecture/global_nav.md
index 0aa3c41a225..f2f4f5f0e1c 100644
--- a/doc/development/documentation/site_architecture/global_nav.md
+++ b/doc/development/documentation/site_architecture/global_nav.md
@@ -62,7 +62,7 @@ the consent of one of the technical writers.
The global nav is built from two files:
- [Data](#data-file)
-- [Layout](#layout-file)
+- [Layout](#layout-file-logic)
The data file feeds the layout with the links to the docs. The layout organizes
the data among the nav in containers properly [styled](#css-classes).
diff --git a/doc/development/documentation/styleguide.md b/doc/development/documentation/styleguide.md
index 7a3a8f25c2d..0c51d3832aa 100644
--- a/doc/development/documentation/styleguide.md
+++ b/doc/development/documentation/styleguide.md
@@ -36,7 +36,7 @@ gem will support all [GFM markup](../../user/markdown.md) in the future. For now
use regular markdown markup, following the rules on this style guide. For a complete
Kramdown reference, check the [GitLab Markdown Kramdown Guide](https://about.gitlab.com/handbook/product/technical-writing/markdown-guide/).
Use Kramdown markup wisely: do not overuse its specific markup (e.g., `{:.class}`) as it will not render properly in
-[`/help`](#gitlab-help).
+[`/help`](index.md#gitlab-help).
## Content
@@ -236,6 +236,24 @@ For other punctuation rules, please refer to the
E.g., instead of writing something like `Read more about GitLab Issue Boards [here](LINK)`,
write `Read more about [GitLab Issue Boards](LINK)`.
+### Links to confidential issues
+
+Don't link directly to [confidential issues](../../user/project/issues/confidential_issues.md). These will fail for:
+
+- Those without sufficient permissions.
+- Automated link checkers.
+
+Instead:
+
+- Mention in the text that the information is contained in a confidential issue. This will reduce confusion.
+- Provide a link in back ticks (`` ` ``) so that those with access to the issue can easily navigate to it.
+
+Example:
+
+```md
+For more information, see the [confidential issue](https://docs.gitlab.com/ee/user/project/issues/confidential_issues.html) `https://gitlab.com/gitlab-org/gitlab-ce/issues/<issue_number>`.
+```
+
### Unlinking emails
By default, all email addresses will render in an email tag on docs.gitlab.com.
@@ -612,7 +630,7 @@ In this case:
- The code blocks are indented one or more spaces under the list item to render
correctly.
- Different highlighting languages are used for each config in the code block.
-- The [references](#references) guide is used for reconfigure/restart.
+- The [GitLab Restart](#gitlab-restart) section is used to explain a required restart/reconfigure of GitLab.
## API
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index 3e85c0e1995..41a64044c68 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -161,7 +161,7 @@ still having access the class's implementation with `super`.
There are a few gotchas with it:
-- you should always [`extend ::Gitlab::Utils::Override`] and use `override` to
+- you should always [`extend ::Gitlab::Utils::Override`](utilities.md#overridehttpsgitlabcomgitlab-orggitlab-ceblobmasterlibgitlabutilsoverriderb) and use `override` to
guard the "overrider" method to ensure that if the method gets renamed in
CE, the EE override won't be silently forgotten.
- when the "overrider" would add a line in the middle of the CE
@@ -273,8 +273,6 @@ module EE
end
```
-[`extend ::Gitlab::Utils::Override`]: utilities.md#override
-
##### Overriding CE class methods
The same applies to class methods, except we want to use
@@ -880,12 +878,104 @@ import bundle from 'ee_else_ce/protected_branches/protected_branches_bundle.js';
See the frontend guide [performance section](./fe_guide/performance.md) for
information on managing page-specific javascript within EE.
+
+## Vue code in `assets/javascript`
+### script tag
+
+#### Child Component only used in EE
+To seperate Vue template differences we should [async import the components](https://vuejs.org/v2/guide/components-dynamic-async.html#Async-Components).
+
+Doing this allows for us to load the correct component in EE whilst in CE
+we can load a empty component that renders nothing. This code **should**
+exist in the CE repository as well as the EE repository.
+
+```html
+<script>
+export default {
+ components: {
+ EEComponent: () => import('ee_component/components/test.vue'),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <ee-component />
+ </div>
+</template>
+```
+
+#### For JS code that is EE only, like props, computed properties, methods, etc, we will keep the current approach
+ - Since we [can't async load a mixin](https://github.com/vuejs/vue-loader/issues/418#issuecomment-254032223) we will use the [`ee_else_ce`](https://docs.gitlab.com/ee/development/ee_features.html#javascript-code-in-assetsjavascripts) alias we already have for webpack.
+ - This means all the EE specific props, computed properties, methods, etc that are EE only should be in a mixin in the `ee/` folder and we need to create a CE counterpart of the mixin
+
+ ##### Example:
+ ```javascript
+ import mixin from 'ee_else_ce/path/mixin';
+
+ {
+ mixins: [mixin]
+ }
+ ```
+- Computed Properties/methods and getters only used in the child import still need a counterpart in CE
+
+- For store modules, we will need a CE counterpart too.
+- You can see an MR with an example [here](https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/9762)
+
+#### `template` tag
+* **EE Child components**
+ - Since we are using the async loading to check which component to load, we'd still use the component's name, check [this example](#child-component-only-used-in-ee).
+
+* **EE extra HTML**
+ - For the templates that have extra HTML in EE we will use the `ifEE` mixin with the `v-if` directive.
+ - You can either use the `template` tag as a wrapper or directly in the element, if there is only one element to be rendered in EE:
+
+```html
+ <template v-if="ifEE">
+ <p>Several</p>
+ <p>non wrapper</p>
+ <p>elements</p>
+ <p>that are rendered</p>
+ <p>in EE only</p>
+ </template>
+```
+
+
+```html
+ <ul v-if="renderIfEE">
+ <li>One wrapped</li>
+ <li>element</li>
+ <li>that is rendered</li>
+ <li>in EE only</li>
+ </template>
+```
+
+### Non Vue Files
+For regular JS files, the approach is similar.
+
+1. We will keep using the [`ee_else_ce`](https://docs.gitlab.com/ee/development/ee_features.html#javascript-code-in-assetsjavascripts) helper, this means that EE only code should be inside the `ee/` folder.
+ 1. An EE file should be created with the EE only code, and it should extend the CE counterpart.
+1. For code inside functions that can't be extended, we will use an `if` statement with the `ifEE` helper
+
+##### Example:
+
+```javascript
+import { ifEE } from '~/lib/utils/common_utils'
+if (renderIfEE) {
+ $('.js-import-git-toggle-button').on('click', () => {
+ const $projectMirror = $('#project_mirror');
+
+ $projectMirror.attr('disabled', !$projectMirror.attr('disabled'));
+ });
+}
+```
+
## SCSS code in `assets/stylesheets`
To separate EE-specific styles in SCSS files, if a component you're adding styles for
is limited to only EE, it is better to have a separate SCSS file in appropriate directory
within `app/assets/stylesheets`.
-See [backporting changes](#backporting-changes) for instructions on how to merge changes safely.
+See [backporting changes](#backporting-changes-from-EE-to-CE) for instructions on how to merge changes safely.
In some cases, this is not entirely possible or creating dedicated SCSS file is an overkill,
e.g. a text style of some component is different for EE. In such cases,
diff --git a/doc/development/fe_guide/architecture.md b/doc/development/fe_guide/architecture.md
index aebb22caa15..c67389b169e 100644
--- a/doc/development/fe_guide/architecture.md
+++ b/doc/development/fe_guide/architecture.md
@@ -11,12 +11,9 @@ Architectural decisions should be accessible to everyone, so please document
them in the relevant Merge Request discussion or by updating our documentation
when appropriate.
-You can find the Frontend Architecture experts on the [team page][team-page].
+You can find the Frontend Architecture experts on the [team page](https://about.gitlab.com/team).
## Examples
You can find documentation about the desired architecture for a new feature
-built with Vue.js [here][vue-section].
-
-[team-page]: https://about.gitlab.com/team
-[vue-section]: vue.md#frontend.html#how-to-build-a-new-feature-with-vue-js
+built with Vue.js [here](vue.md).
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index 3cd70bd63fa..435fdf39fb4 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -122,7 +122,7 @@ Check this [page](vuex.md) for more details.
## Style guide
-Please refer to the Vue section of our [style guide](style_guide_js.md#vue-js)
+Please refer to the Vue section of our [style guide](style_guide_js.md#vuejs)
for best practices while writing your Vue components and templates.
## Testing Vue Components
@@ -132,7 +132,7 @@ Each Vue component has a unique output. This output is always present in the ren
Although we can test each method of a Vue component individually, our goal must be to test the output
of the render/template function, which represents the state at all times.
-Make use of the [axios mock adapter](axios.md#mock-axios-response-on-tests) to mock data returned.
+Make use of the [axios mock adapter](axios.md#mock-axios-response-in-tests) to mock data returned.
Here's how we would test the Todo App above:
diff --git a/doc/development/feature_flags.md b/doc/development/feature_flags.md
index 67356a12eba..3271f9a7fb3 100644
--- a/doc/development/feature_flags.md
+++ b/doc/development/feature_flags.md
@@ -26,8 +26,9 @@ the time, you should execute `/chatops run feature set my_feature_flag 50`.
## Feature flags for user applications
-GitLab does not yet support the use of feature flags in deployed user applications.
-You can follow the progress on that [in the issue on our issue tracker](https://gitlab.com/gitlab-org/gitlab-ee/issues/779).
+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](https://docs.gitlab.com/ee/user/project/operations/feature_flags.html)
## Developing with feature flags
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index d5fc403bf8b..b1785e6f803 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -5,8 +5,9 @@ Workhorse and GitLab-Shell.
## Developing new Git features
-Starting with GitLab 10.8, all new Git features should be developed in
-Gitaly.
+To read or write Git data, a request has to be made to Gitaly. This means that
+if you're developing a new feature where you need data that's not yet available
+in `lib/gitlab/git` changes have to be made to Gitaly.
> This is a new process that is not clearly defined yet. If you want
to contribute a Git feature and you're getting stuck, reach out to the
@@ -56,6 +57,44 @@ If your test-suite is failing with Gitaly issues, as a first step, try running:
rm -rf tmp/tests/gitaly
```
+## Legacy Rugged code
+
+While Gitaly can handle all Git access, many of GitLab customers still
+run Gitaly atop NFS. The legacy Rugged implementation for Git calls may
+be faster than the Gitaly RPC due to N+1 Gitaly calls and other
+reasons. See [the
+issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/57317) for more
+details.
+
+Until GitLab has eliminated most of these inefficiencies or the use of
+NFS is discontinued for Git data, Rugged implementations of some of the
+most commonly-used RPCs can be enabled via feature flags:
+
+* `rugged_find_commit`
+* `rugged_get_tree_entries`
+* `rugged_tree_entry`
+* `rugged_commit_is_ancestor`
+
+A convenience Rake task can be used to enable or disable these flags
+all together. To enable:
+
+```sh
+bundle exec rake gitlab:features:enable_rugged
+```
+
+To disable:
+
+```sh
+bundle exec rake gitlab:features:disable_rugged
+```
+
+Most of this code exists in the `lib/gitlab/git/rugged_impl` directory.
+
+NOTE: **Note:** You should NOT need to add or modify code related to
+Rugged unless explicitly discussed with the [Gitaly
+Team](https://gitlab.com/groups/gl-gitaly/group_members). This code will
+NOT work on GitLab.com or other GitLab instances that do not use NFS.
+
## `TooManyInvocationsError` errors
During development and testing, you may experience `Gitlab::GitalyClient::TooManyInvocationsError` failures.
diff --git a/doc/development/i18n/merging_translations.md b/doc/development/i18n/merging_translations.md
index 2fa7558d30b..85284d8c714 100644
--- a/doc/development/i18n/merging_translations.md
+++ b/doc/development/i18n/merging_translations.md
@@ -32,8 +32,7 @@ clicking `Pause sync` on the [Crowdin integration settings
page](https://translate.gitlab.com/project/gitlab-ee/settings#integration).
When all failures are resolved, the translations need to be double
-checked once more [as discussed in this
-issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/37850).
+checked once more as discussed in [confidential issue](https://docs.gitlab.com/ee/user/project/issues/confidential_issues.html) `https://gitlab.com/gitlab-org/gitlab-ce/issues/37850`.
## Merging translations
diff --git a/doc/development/img/distributed_tracing_jaeger_ui.png b/doc/development/img/distributed_tracing_jaeger_ui.png
new file mode 100644
index 00000000000..57517dacced
--- /dev/null
+++ b/doc/development/img/distributed_tracing_jaeger_ui.png
Binary files differ
diff --git a/doc/development/img/distributed_tracing_performance_bar.png b/doc/development/img/distributed_tracing_performance_bar.png
new file mode 100644
index 00000000000..c9998cedd2d
--- /dev/null
+++ b/doc/development/img/distributed_tracing_performance_bar.png
Binary files differ
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 2a287611bdf..0e21d45f57c 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -38,6 +38,7 @@ GitLab provides built-in tools to help improve performance and availability:
- [Profiling](profiling.md).
- [Sherlock](profiling.md#sherlock).
+- [Distributed Tracing](distributed_tracing.md)
- [GitLab Performance Monitoring](../administration/monitoring/performance/index.md).
- [Request Profiling](../administration/monitoring/performance/request_profiling.md).
- [QueryRecoder](query_recorder.md) for preventing `N+1` regressions.
diff --git a/doc/development/profiling.md b/doc/development/profiling.md
index f41d635de43..b2f3a105b23 100644
--- a/doc/development/profiling.md
+++ b/doc/development/profiling.md
@@ -10,6 +10,10 @@ There is a `Gitlab::Profiler.profile` method, and corresponding
`bin/profile-url` script, that enable profiling a GET or POST request to a
specific URL, either as an anonymous user (the default) or as a specific user.
+NOTE: **Note:** The first argument to the profiler is either a full URL
+(including the instance hostname) or an absolute path, including the
+leading slash.
+
When using the script, command-line documentation is available by passing no
arguments.
@@ -86,10 +90,8 @@ that builds on this to add some additional niceties, such as allowing
configuration with a single Yaml file for multiple URLs, and uploading of the
profile and log output to S3.
-For GitLab.com, currently the latest profiling data has been [moved from
-Redash to Looker](https://gitlab.com/gitlab-com/Product/issues/5#note_121194467).
-We are [currently investigating how to make this data
-public](https://gitlab.com/meltano/looker/issues/294).
+For GitLab.com, you can find the latest results here:
+<http://redash.gitlab.com/dashboard/gitlab-profiler-statistics>
## Sherlock
diff --git a/doc/development/rolling_out_changes_using_feature_flags.md b/doc/development/rolling_out_changes_using_feature_flags.md
index ef1aba95712..4e0d1b74bc9 100644
--- a/doc/development/rolling_out_changes_using_feature_flags.md
+++ b/doc/development/rolling_out_changes_using_feature_flags.md
@@ -135,6 +135,20 @@ want to wait several hours or even days. This is entirely up to you, just make
sure it is clearly communicated to your team, and the Production team if you
anticipate any potential problems.
+Feature gates can also be actor based, for example a feature could first be
+enabled for only the `gitlab-ce` project. The project is passed by supplying a
+`--project` flag:
+
+```
+/chatops run feature set --project=gitlab-org/gitlab-ce some_feature true
+```
+
+For groups the `--group` flag is available:
+
+```
+/chatops run feature set --group=gitlab-org some_feature true
+```
+
Once a change is deemed stable, submit a new merge request to remove the
feature flag. This ensures the change is available to all users and self-hosted
instances. Make sure to add the ~"feature flag" label to this merge request so
@@ -188,3 +202,12 @@ to be shipped. You can do this via ChatOps:
Note that you can do this at any time, even before the merge request using the
flag has been merged!
+
+### Cleaning up
+
+When a feature gate has been removed from the code base, the value still exists
+in the database. This can be removed through ChatOps:
+
+```
+/chatops run feature delete some_feature
+```
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 2c8d488877b..cfe0e6f70fc 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -40,7 +40,7 @@ bundle exec rspec spec/[path]/[to]/[spec].rb
to separate phases.
- Use `Gitlab.config.gitlab.host` rather than hard coding `'localhost'`
- Don't assert against the absolute value of a sequence-generated attribute (see
- [Gotchas](../gotchas.md#dont-assert-against-the-absolute-value-of-a-sequence-generated-attribute)).
+ [Gotchas](../gotchas.md#do-not-assert-against-the-absolute-value-of-a-sequence-generated-attribute)).
- Don't supply the `:each` argument to hooks since it's the default.
- On `before` and `after` hooks, prefer it scoped to `:context` over `:all`
- When using `evaluate_script("$('.js-foo').testSomething()")` (or `execute_script`) which acts on a given element,
@@ -168,12 +168,13 @@ instead of 30+ seconds in case of a regular `spec_helper`.
### `let` variables
-GitLab's RSpec suite has made extensive use of `let` variables to reduce
-duplication. However, this sometimes [comes at the cost of clarity][lets-not],
+GitLab's RSpec suite has made extensive use of `let`(along with it strict, non-lazy
+version `let!`) variables to reduce duplication. However, this sometimes [comes at the cost of clarity][lets-not],
so we need to set some guidelines for their use going forward:
-- `let` variables are preferable to instance variables. Local variables are
- preferable to `let` variables.
+- `let!` variables are preferable to instance variables. `let` variables
+ are preferable to `let!` variables. Local variables are preferable to
+ `let` variables.
- Use `let` to reduce duplication throughout an entire spec file.
- Don't use `let` to define variables used by a single test; define them as
local variables inside the test's `it` block.
@@ -183,6 +184,9 @@ so we need to set some guidelines for their use going forward:
- Try to avoid overriding the definition of one `let` variable with another.
- Don't define a `let` variable that's only used by the definition of another.
Use a helper method instead.
+- `let!` variables should be used only in case if strict evaluation with defined
+ order is required, otherwise `let` will suffice. Remember that `let` is lazy and won't
+ be evaluated until it is referenced.
[lets-not]: https://robots.thoughtbot.com/lets-not
diff --git a/doc/development/testing_guide/ci.md b/doc/development/testing_guide/ci.md
index 5aa668290b4..7a7fca46534 100644
--- a/doc/development/testing_guide/ci.md
+++ b/doc/development/testing_guide/ci.md
@@ -31,7 +31,11 @@ After that, the next pipeline will use the up-to-date
The GitLab test suite is [monitored] for the `master` branch, and any branch
that includes `rspec-profile` in their name.
+A [public dashboard] is available for everyone to see. Feel free to look at the
+slowest test files and try to improve them.
+
[monitored]: ../performance.md#rspec-profiling
+[public dashboard]: https://redash.gitlab.com/public/dashboards/l1WhHXaxrCWM5Ai9D7YDqHKehq6OU3bx5gssaiWe?org_slug=default
## CI setup
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 0470a071d39..5b66e513a76 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -13,6 +13,42 @@ in the future.
See the [Testing Standards and Style Guidelines](index.md) page for more
information on general testing practices at GitLab.
+## Jest
+
+GitLab has started to migrate tests to the (Jest)[https://jestjs.io]
+testing framework. You can read a [detailed evaluation](https://gitlab.com/gitlab-org/gitlab-ce/issues/49171)
+of Jest compared to our use of Karma and Jasmine. In summary, it will allow us
+to improve the performance and consistency of our frontend tests.
+
+Jest tests can be found in `/spec/frontend` and `/ee/spec/frontend` in EE.
+
+It is not yet a requirement to use Jest. You can view the
+[epic](https://gitlab.com/groups/gitlab-org/-/epics/873) of issues
+we need to solve before being able to use Jest for all our needs.
+
+### Timeout error
+
+The default timeout for Jest is set in
+[`/spec/frontend/test_setup.js`](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/spec/frontend/test_setup.js).
+
+If your test exceeds that time, it will fail.
+
+If you cannot improve the performance of the tests, you can increase the timeout
+for a specific test using
+[`jest.setTimeout`](https://jestjs.io/docs/en/jest-object#jestsettimeouttimeout).
+
+```javascript
+beforeAll(() => {
+ jest.setTimeout(500);
+});
+
+describe('Component', () => {
+ // ...
+});
+```
+
+Remember that the performance of each test depends on the environment.
+
## Karma test suite
GitLab uses the [Karma][karma] test runner with [Jasmine] as its test
@@ -134,7 +170,7 @@ placeholders, and recalling when they are called and the arguments that are
passed to them. These tools should be used liberally, to test for expected
behavior, to mock responses, and to block unwanted side effects (such as a
method that would generate a network request or alter `window.location`). The
-documentation for these methods can be found in the [jasmine introduction page](https://jasmine.github.io/2.0/introduction.html#section-Spies).
+documentation for these methods can be found in the [Jasmine introduction page](https://jasmine.github.io/2.0/introduction.html#section-Spies).
Sometimes you may need to spy on a method that is directly imported by another
module. GitLab has a custom `spyOnDependency` method which utilizes
@@ -168,7 +204,7 @@ export of a module who's import you want to stub, rather than an object which
contains a method you wish to stub (if the module does not have a default
export, one is be generated by the babel plugin). The second parameter is the
name of the import you wish to change. The result of the function is a Spy
-object which can be treated like any other jasmine spy object.
+object which can be treated like any other Jasmine spy object.
Further documentation on the babel rewire pluign API can be found on
[its repository Readme doc](https://github.com/speedskater/babel-plugin-rewire#babel-plugin-rewire).
@@ -177,6 +213,14 @@ Further documentation on the babel rewire pluign API can be found on
If you cannot avoid using [`setTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout) in tests, please use the [Jasmine mock clock](https://jasmine.github.io/api/2.9/Clock.html).
+#### Migrating flaky Karma tests to Jest
+
+Some of our Karma tests are flaky because they access the properties of a shared scope.
+This also means that they are not easily parallelized.
+
+Migrating flaky Karma tests to Jest will help significantly as each test is executed
+in an isolated scope, improving performance and predictability.
+
### Vue.js unit tests
See this [section][vue-test].
@@ -194,21 +238,21 @@ is sufficient (and saves you some time).
### Live testing and focused testing
-While developing locally, it may be helpful to keep karma running so that you
+While developing locally, it may be helpful to keep Karma running so that you
can get instant feedback on as you write tests and modify code. To do this
-you can start karma with `yarn run karma-start`. It will compile the javascript
+you can start Karma with `yarn run karma-start`. It will compile the javascript
assets and run a server at `http://localhost:9876/` where it will automatically
run the tests on any browser which connects to it. You can enter that url on
multiple browsers at once to have it run the tests on each in parallel.
-While karma is running, any changes you make will instantly trigger a recompile
+While Karma is running, any changes you make will instantly trigger a recompile
and retest of the entire test suite, so you can see instantly if you've broken
-a test with your changes. You can use [jasmine focused][jasmine-focus] or
-excluded tests (with `fdescribe` or `xdescribe`) to get karma to run only the
+a test with your changes. You can use [Jasmine focused][jasmine-focus] or
+excluded tests (with `fdescribe` or `xdescribe`) to get Karma to run only the
tests you want while you're working on a specific feature, but make sure to
remove these directives when you commit your code.
-It is also possible to only run karma on specific folders or files by filtering
+It is also possible to only run Karma on specific folders or files by filtering
the run tests via the argument `--filter-spec` or short `-f`:
```bash
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index 703e342fc13..fda3ff57316 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -95,6 +95,14 @@ You can also manually start the `review-qa-all`: it runs the full QA suite.
Note that both jobs first wait for the `review-deploy` job to be finished.
+## Performance Metrics
+
+On every [pipeline][gitlab-pipeline] during the `test` stage, the
+`review-performance` job is automatically started: this job does basic
+browser performance testing using [Sitespeed.io Container](https://docs.gitlab.com/ee/user/project/merge_requests/browser_performance_testing.html) .
+
+This job waits for the `review-deploy` job to be finished.
+
## How to?
### Log into my Review App?
diff --git a/doc/development/testing_guide/testing_levels.md b/doc/development/testing_guide/testing_levels.md
index a7a3459719b..5d46833a1e2 100644
--- a/doc/development/testing_guide/testing_levels.md
+++ b/doc/development/testing_guide/testing_levels.md
@@ -46,7 +46,7 @@ They're useful to test permissions, redirections, what view is rendered etc.
| `app/mailers/` | `spec/mailers/` | RSpec | |
| `lib/api/` | `spec/requests/api/` | RSpec | |
| `lib/ci/api/` | `spec/requests/ci/api/` | RSpec | |
-| `app/assets/javascripts/` | `spec/javascripts/` | Karma | More details in the [JavaScript](#javascript) section. |
+| `app/assets/javascripts/` | `spec/javascripts/` | Karma | More details in the [Karma JavaScript test suite](frontend_testing.md#karma-test-suite) section. |
### About controller tests
@@ -210,7 +210,7 @@ trade-off:
- Integration tests are a bit more expensive, but don't abuse them. A system test
is often better than an integration test that is stubbing a lot of internals.
- System tests are expensive (compared to unit tests), even more if they require
- a JavaScript driver. Make sure to follow the guidelines in the [Speed](#test-speed)
+ a JavaScript driver. Make sure to follow the guidelines in the [Speed](best_practices.md#test-speed)
section.
Another way to see it is to think about the "cost of tests", this is well
diff --git a/doc/gitlab-basics/create-project.md b/doc/gitlab-basics/create-project.md
index 978ffde84ad..3d4259ab7d3 100644
--- a/doc/gitlab-basics/create-project.md
+++ b/doc/gitlab-basics/create-project.md
@@ -42,7 +42,7 @@ Project templates can pre-populate your project with necessary files to get you
There are two types of project templates:
-- [Built-in templates](#builtin-templates), sourced from the [`project-templates`](https://gitlab.com/gitlab-org/project-templates) group.
+- [Built-in templates](#built-in-templates), sourced from the [`project-templates`](https://gitlab.com/gitlab-org/project-templates) group.
- [Custom project templates](#custom-project-templates-premium-only), for custom templates configured by GitLab administrators and users.
### Built-in templates
diff --git a/doc/gitlab-basics/create-your-ssh-keys.md b/doc/gitlab-basics/create-your-ssh-keys.md
index 8c2f48fb1e2..da7853d7d34 100644
--- a/doc/gitlab-basics/create-your-ssh-keys.md
+++ b/doc/gitlab-basics/create-your-ssh-keys.md
@@ -1,10 +1,9 @@
# How to create your SSH Keys
-1. The first thing you need to do is go to your [command line](start-using-git.md)
- and follow the [instructions](../ssh/README.md) to generate your SSH key pair.
+1. Go to your [command line](start-using-git.md) and follow the [instructions](../ssh/README.md) to generate your SSH key pair.
-1. Once you do that, login to GitLab with your credentials.
-1. On the upper right corner, click on your avatar and go to your **Profile settings**.
+1. Log in to GitLab with your credentials.
+1. In the upper-right corner, click your avatar and then click **Settings**.
![Profile settings dropdown](img/profile_settings.png)
@@ -22,8 +21,8 @@
![SSH key title](img/profile_settings_ssh_keys_title.png)
-1. Finally, click on **Add key** to add it to GitLab. You will be able to see
- its fingerprint, its title and creation date.
+1. Finally, click **Add key** to add it to GitLab. You will be able to see
+ its fingerprint, title, and creation date.
![SSH key single page](img/profile_settings_ssh_keys_single_key.png)
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 51d2a232dc0..2fcc9b90157 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -379,6 +379,10 @@ size depends on your needs and you can always migrate to a bigger volume later.
You will be able to [set up that volume](#setting-up-the-ebs-volume)
after the instance is created.
+CAUTION: **Caution:**
+We **do not** recommend using the AWS Elastic File System (EFS), as it can result
+in [significantly degraded performance](../../administration/high_availability/nfs.html#avoid-using-awss-elastic-file-system-efs).
+
### Configure security group
As a last step, configure the security group:
@@ -606,7 +610,7 @@ To back up GitLab:
To restore GitLab, first review the [restore documentation](../../raketasks/backup_restore.md#restore),
and primarily the restore prerequisites. Then, follow the steps under the
-[Omnibus installations section](../../raketasks/backup_restore.md#restore-for-omnibus-installations).
+[Omnibus installations section](../../raketasks/backup_restore.md#restore-for-omnibus-gitlab-installations).
## Updating GitLab
diff --git a/doc/install/docker.md b/doc/install/docker.md
index d0129f0f5c4..4568a949b0a 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -2,7 +2,7 @@
[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.
-GitLab provides official Docker images to allowing you to easily take advantage of the benefits of containerization while operating your GitLab instance.
+GitLab provides official Docker images allowing you to easily take advantage of the benefits of containerization while operating your GitLab instance.
## Omnibus GitLab based images
diff --git a/doc/install/installation.md b/doc/install/installation.md
index fb24d4fa0ef..61f544deabe 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -9,7 +9,8 @@ On heavily used GitLab instances the memory usage of the Sidekiq background work
Omnibus packages solve this by [letting the Sidekiq terminate gracefully](../administration/operations/sidekiq_memory_killer.md) if it uses too much memory.
After this termination Runit will detect Sidekiq is not running and will start it.
-Since installations from source don't have Runit, Sidekiq can't be terminated and its memory usage will grow over time.
+Since installations from source don't use Runit for process supervision, Sidekiq
+can't be terminated and its memory usage will grow over time.
## Select Version to Install
@@ -72,7 +73,8 @@ Install the required packages (needed to compile Ruby and native extensions to R
```sh
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
+ libxslt-dev libcurl4-openssl-dev libicu-dev logrotate rsync python-docutils pkg-config cmake \
+ runit
```
Ubuntu 14.04 (Trusty Tahr) doesn't have the `libre2-dev` package available, but
diff --git a/doc/install/kubernetes/preparation/tiller.md b/doc/install/kubernetes/preparation/tiller.md
index 00b0737402b..684df14ac2c 100644
--- a/doc/install/kubernetes/preparation/tiller.md
+++ b/doc/install/kubernetes/preparation/tiller.md
@@ -7,7 +7,7 @@ Helm consists of two parts, the `helm` client and a `tiller` server inside Kuber
NOTE: **Note:**
If you are not able to run Tiller in your cluster, for example on OpenShift, it
-is possible to use [Tiller locally](https://gitlab.com/charts/gitlab/tree/master/doc/helm#local-tiller)
+is possible to use [Tiller locally](https://docs.gitlab.com/charts/installation/tools.html#local-tiller)
and avoid deploying it into the cluster. This should only be used when Tiller
cannot be normally deployed.
diff --git a/doc/install/openshift_and_gitlab/index.md b/doc/install/openshift_and_gitlab/index.md
index 509020d1975..77bd9e9f7a9 100644
--- a/doc/install/openshift_and_gitlab/index.md
+++ b/doc/install/openshift_and_gitlab/index.md
@@ -11,7 +11,7 @@ date: 2016-06-28
CAUTION: **Deprecated:**
This article is deprecated. Use the official Kubernetes Helm charts for
installing GitLab to OpenShift. Check out the
-[official installation docs](https://gitlab.com/charts/gitlab/blob/master/doc/cloud/openshift.md)
+[official installation docs](https://docs.gitlab.com/charts/installation/cloud/openshift.html)
for details.
## Introduction
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index c1f2297f3be..8ab7189c2a6 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -51,6 +51,8 @@ Apart from a local hard drive you can also mount a volume that supports the netw
If you have enough RAM memory 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: **Note:** Since file system performance may affect GitLab's overall performance, we do not recommend using EFS for storage. See the [relevant documentation](../administration/high_availability/nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
+
### CPU
- 1 core supports up to 100 users but the application can be a bit slower due to having all workers and background jobs running on the same core
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 4db986197f3..69bbd05c367 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -199,7 +199,7 @@ from the Omniauth provider's documentation.
sudo -u git -H bundle install --without development test mysql --path vendor/bundle --no-deployment
- > These are the same commands you used in the [Install Gems section](#install-gems) with `--path vendor/bundle --no-deployment` instead of `--deployment`.
+ > These are the same commands you used during initial installation in the [Install Gems section](../install/installation.md#install-gems) with `--path vendor/bundle --no-deployment` instead of `--deployment`.
- Start GitLab:
diff --git a/doc/project_services/bamboo.md b/doc/project_services/bamboo.md
index 5b171080c72..a1ff8909f87 100644
--- a/doc/project_services/bamboo.md
+++ b/doc/project_services/bamboo.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/bamboo.md'
+---
+
This document was moved to [user/project/integrations/bamboo.md](../user/project/integrations/bamboo.md).
diff --git a/doc/project_services/bugzilla.md b/doc/project_services/bugzilla.md
index e67055d5616..1abf1b28939 100644
--- a/doc/project_services/bugzilla.md
+++ b/doc/project_services/bugzilla.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/bugzilla.md'
+---
+
This document was moved to [user/project/integrations/bugzilla.md](../user/project/integrations/bugzilla.md).
diff --git a/doc/project_services/emails_on_push.md b/doc/project_services/emails_on_push.md
index a2e831ada34..c5ab8aa5c70 100644
--- a/doc/project_services/emails_on_push.md
+++ b/doc/project_services/emails_on_push.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/emails_on_push.md'
+---
+
This document was moved to [user/project/integrations/emails_on_push.md](../user/project/integrations/emails_on_push.md).
diff --git a/doc/project_services/irker.md b/doc/project_services/irker.md
index 7f0850dcc24..af47abab117 100644
--- a/doc/project_services/irker.md
+++ b/doc/project_services/irker.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/irker.md'
+---
+
This document was moved to [user/project/integrations/irker.md](../user/project/integrations/irker.md).
diff --git a/doc/project_services/jira.md b/doc/project_services/jira.md
index 63614feba82..6a0108f400f 100644
--- a/doc/project_services/jira.md
+++ b/doc/project_services/jira.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/jira.md'
+---
+
This document was moved to [user/project/integrations/jira.md](../user/project/integrations/jira.md).
diff --git a/doc/project_services/kubernetes.md b/doc/project_services/kubernetes.md
index 0497a13c2b7..cfe36fcd1b2 100644
--- a/doc/project_services/kubernetes.md
+++ b/doc/project_services/kubernetes.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/kubernetes.md'
+---
+
This document was moved to [user/project/integrations/kubernetes.md](../user/project/integrations/kubernetes.md).
diff --git a/doc/project_services/mattermost.md b/doc/project_services/mattermost.md
index 554a028853e..de9f4d14cf7 100644
--- a/doc/project_services/mattermost.md
+++ b/doc/project_services/mattermost.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/mattermost.md'
+---
+
This document was moved to [user/project/integrations/mattermost.md](../user/project/integrations/mattermost.md).
diff --git a/doc/project_services/mattermost_slash_commands.md b/doc/project_services/mattermost_slash_commands.md
index 7c238b5dc37..82ec34739c1 100644
--- a/doc/project_services/mattermost_slash_commands.md
+++ b/doc/project_services/mattermost_slash_commands.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/mattermost_slash_commands.md'
+---
+
This document was moved to [user/project/integrations/mattermost_slash_commands.md](../user/project/integrations/mattermost_slash_commands.md).
diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md
index 2c555c4edae..a355851a273 100644
--- a/doc/project_services/project_services.md
+++ b/doc/project_services/project_services.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/project_services.md'
+---
+
This document was moved to [user/project/integrations/project_services.md](../user/project/integrations/project_services.md).
diff --git a/doc/project_services/redmine.md b/doc/project_services/redmine.md
index 6010aa4dc75..05f28f00adc 100644
--- a/doc/project_services/redmine.md
+++ b/doc/project_services/redmine.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/redmine.md'
+---
+
This document was moved to [user/project/integrations/redmine.md](../user/project/integrations/redmine.md).
diff --git a/doc/project_services/services_templates.md b/doc/project_services/services_templates.md
index 8905d667c5a..ac6b85cc801 100644
--- a/doc/project_services/services_templates.md
+++ b/doc/project_services/services_templates.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/services_templates.md'
+---
+
This document was moved to [user/project/integrations/services_templates.md](../user/project/integrations/services_templates.md).
diff --git a/doc/project_services/slack.md b/doc/project_services/slack.md
index 1d3f98705e3..4c89ce92002 100644
--- a/doc/project_services/slack.md
+++ b/doc/project_services/slack.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/slack.md'
+---
+
This document was moved to [user/project/integrations/slack.md](../user/project/integrations/slack.md).
diff --git a/doc/project_services/slack_slash_commands.md b/doc/project_services/slack_slash_commands.md
index 9554c8decc8..ca0034256f1 100644
--- a/doc/project_services/slack_slash_commands.md
+++ b/doc/project_services/slack_slash_commands.md
@@ -1 +1,5 @@
+---
+redirect_to: '../user/project/integrations/slack_slash_commands.md'
+---
+
This document was moved to [user/project/integrations/slack_slash_commands.md](../user/project/integrations/slack_slash_commands.md).
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index df6897002c9..eef26612d5b 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -35,7 +35,7 @@ This page gathers all the resources for the topic **Authentication** within GitL
## API
-- [OAuth 2 Tokens](../../api/README.md#oauth-2-tokens)
+- [OAuth 2 Tokens](../../api/README.md#oauth2-tokens)
- [Personal access tokens](../../api/README.md#personal-access-tokens)
- [Impersonation tokens](../../api/README.md#impersonation-tokens)
- [GitLab as an OAuth2 provider](../../api/oauth2.md#gitlab-as-an-oauth2-provider)
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index 2e1df9d50d4..195dd3e8846 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -291,7 +291,7 @@ Auto Build creates a build of the application using an existing `Dockerfile` or
Heroku buildpacks.
Either way, the resulting Docker image is automatically pushed to the
-[Container Registry][container-registry] and tagged with the commit SHA.
+[Container Registry][container-registry] and tagged with the commit SHA or tag.
#### Auto Build using a Dockerfile
diff --git a/doc/update/restore_after_failure.md b/doc/update/restore_after_failure.md
index faa3a6e65cb..964a3c76c04 100644
--- a/doc/update/restore_after_failure.md
+++ b/doc/update/restore_after_failure.md
@@ -12,7 +12,7 @@ First, roll back the code or package. For source installations this involves
checking out the older version (branch or tag). For Omnibus installations this
means installing the older .deb or .rpm package. Then, restore from a backup.
Follow the instructions in the
-[Backup and Restore](../raketasks/backup_restore.md#restore-a-previously-created-backup)
+[Backup and Restore](../raketasks/backup_restore.md#restore)
documentation.
## Potential problems on the next upgrade
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index 20d8ebecc0a..b0c9aaa1eed 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -40,8 +40,8 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
### 3. Update Ruby
-NOTE: Beginning in GitLab 11.0, we only support Ruby 2.4 or higher, and dropped
-support for Ruby 2.3. Be sure to upgrade if necessary.
+NOTE: Beginning in GitLab 11.6, we only support Ruby 2.5 or higher, and dropped
+support for Ruby 2.4. Be sure to upgrade if necessary.
You can check which version you are running with `ruby -v`.
diff --git a/doc/user/account/security.md b/doc/user/account/security.md
index f4078876fab..8a8edc23529 100644
--- a/doc/user/account/security.md
+++ b/doc/user/account/security.md
@@ -1 +1,5 @@
+---
+redirect_to: '../profile/account/index.md'
+---
+
This document was moved to [profile](../profile/account/index.md).
diff --git a/doc/user/account/two_factor_authentication.md b/doc/user/account/two_factor_authentication.md
index ea2c8307860..42a66becc50 100644
--- a/doc/user/account/two_factor_authentication.md
+++ b/doc/user/account/two_factor_authentication.md
@@ -1 +1,5 @@
+---
+redirect_to: '../profile/account/two_factor_authentication.md'
+---
+
This document was moved to [profile/account/two_factor_authentication](../profile/account/two_factor_authentication.md).
diff --git a/doc/user/admin_area/monitoring/health_check.md b/doc/user/admin_area/monitoring/health_check.md
index c22982ac190..e183898dfb1 100644
--- a/doc/user/admin_area/monitoring/health_check.md
+++ b/doc/user/admin_area/monitoring/health_check.md
@@ -1,11 +1,11 @@
# Health Check
> **Notes:**
+
> - Liveness and readiness probes were [introduced][ce-10416] in GitLab 9.1.
-> - The `health_check` endpoint was [introduced][ce-3888] in GitLab 8.8 and will
-> be deprecated in GitLab 9.1. Read more in the [old behavior](#old-behavior)
-> section.
-> - [Access token](#access-token) has been deprecated in GitLab 9.4
+> - The `health_check` endpoint was [introduced][ce-3888] in GitLab 8.8 and was
+> be deprecated in GitLab 9.1.
+> - [Access token](#access-token-deprecated) has been deprecated in GitLab 9.4
> in favor of [IP whitelist](#ip-whitelist)
GitLab provides liveness and readiness probes to indicate service health and
@@ -16,21 +16,19 @@ traffic until the system is ready or restart the container as needed.
## IP whitelist
-To access monitoring resources, the client IP needs to be included in a whitelist.
+To access monitoring resources, the requesting client IP needs to be included in a whitelist.
[Read how to add IPs to a whitelist for the monitoring endpoints][admin].
## Using the endpoints
-With default whitelist settings, the probes can be accessed from localhost:
+With default whitelist settings, the probes can be accessed from localhost using the following URLs:
- `http://localhost/-/health`
- `http://localhost/-/readiness`
- `http://localhost/-/liveness`
-The first endpoint, `/-/health/`, only checks whether the application server is running. It does
--not verify the database or other services are running. A successful response will return
-a 200 status code with the following message:
+The first endpoint, `health`, only checks whether the application server is running. It does not verify the database or other services are running. A successful response will return a 200 status code with the following message:
```
GitLab OK
@@ -38,9 +36,9 @@ GitLab OK
The readiness and liveness probes will provide a report of system health in JSON format.
-Readiness example output:
+`readiness` probe example output:
-```
+```json
{
"queues_check" : {
"status" : "ok"
@@ -60,9 +58,9 @@ Readiness example output:
}
```
-Liveness example output:
+`liveness` probe example output:
-```
+```json
{
"cache_check" : {
"status" : "ok"
diff --git a/doc/user/group/clusters/index.md b/doc/user/group/clusters/index.md
index 8d223d1c5f0..8cdfb13a97b 100644
--- a/doc/user/group/clusters/index.md
+++ b/doc/user/group/clusters/index.md
@@ -56,7 +56,7 @@ group. That way you can have different clusters for different environments,
like dev, staging, production, etc.
Add another cluster similar to the first one and make sure to
-[set an environment scope](#environment-scopes) that will
+[set an environment scope](#environment-scopes-premium) that will
differentiate the new cluster from the rest.
## Base domain
@@ -133,4 +133,4 @@ The following features are not currently available for group-level clusters:
1. Terminals (see [related issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/55487)).
1. Pod logs (see [related issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/55488)).
-1. Deployment boards (see [related issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/55488)).
+1. Deployment boards (see [related issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/55489)).
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 300e0115c60..c1f50bcc593 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -154,7 +154,7 @@ There are two different ways to add a new project to a group:
## Transfer projects into groups
-Learn how to [transfer a project into a group](../project/index.md#transfer-an-existing-project-into-a-group).
+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
@@ -181,6 +181,7 @@ Please make sure to understand that:
- You can only transfer the group to a group you manage.
- You will need to update your local repositories to point to the new location.
- 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.
+- Only explicit group membership is transferred, not the inherited membership. If this would leave the group without an owner, the transferring user is added as owner instead.
## Group settings
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index b6f8f55978b..3cecefe11f5 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -1,8 +1,8 @@
# Subgroups
NOTE: **Note:**
-[Introduced][ce-2772] in GitLab 9.0. Not available when using MySQL as external
-database (support removed in GitLab 9.3 [due to performance reasons][issue]).
+[Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/2772) in GitLab 9.0. Not available when using MySQL as external
+database (support removed in GitLab 9.3 [due to performance reasons](https://gitlab.com/gitlab-org/gitlab-ce/issues/30472#note_27747600)).
With subgroups (aka nested groups or hierarchical groups) you can have
up to 20 levels of nested groups, which among other things can help you to:
@@ -13,7 +13,7 @@ up to 20 levels of nested groups, which among other things can help you to:
- **Organize large projects.** For large projects, subgroups makes it
potentially easier to separate permissions on parts of the source code.
- **Make it easier to manage people and control visibility.** Give people
- different [permissions][] depending on their group [membership](#membership).
+ different [permissions](../../permissions.md#group-members-permissions) depending on their group [membership](#membership).
## Database Requirements
@@ -80,9 +80,9 @@ structure.
NOTE: **Note:**
You need to be an Owner of a group in order to be able to create a subgroup. For
-more information check the [permissions table][permissions].
+more information check the [permissions table](../../permissions.md#group-members-permissions).
For a list of words that are not allowed to be used as group names see the
-[reserved names][reserved].
+[reserved names](../../reserved_names.md).
Users can always create subgroups if they are explicitly added as an Owner to
a parent group even if group creation is disabled by an administrator in their
settings.
@@ -176,6 +176,6 @@ Here's a list of what you can't do with subgroups:
`group/subgroup01/subgroup03`.
[ce-2772]: https://gitlab.com/gitlab-org/gitlab-ce/issues/2772
-[permissions]: ../../permissions.md#group
+[permissions]: ../../permissions.md#group-members-permissions
[reserved]: ../../reserved_names.md
[issue]: https://gitlab.com/gitlab-org/gitlab-ce/issues/30472#note_27747600
diff --git a/doc/user/index.md b/doc/user/index.md
index 71378920ed4..b84879601ff 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -8,13 +8,13 @@ Welcome to GitLab! We're glad to have you here!
As a GitLab user you'll have access to all the features
your [subscription](https://about.gitlab.com/pricing/)
-includes, except [GitLab administrator](../README.md#administrator-documentation)
+includes, except [GitLab administrator](../administration/index.md)
settings, unless you have admin privileges to install, configure,
and upgrade your GitLab instance.
Admin privileges for [GitLab.com](https://gitlab.com/) are restricted to the GitLab team.
-For more information on configuring GitLab self-managed instances, see [Administrator documentation](../README.md#administrator-documentation).
+For more information on configuring GitLab self-managed instances, see [Administrator documentation](../administration/index.md).
## Overview
diff --git a/doc/user/instance_statistics/convdev.md b/doc/user/instance_statistics/convdev.md
index 52b99b69a02..247be1fb392 100644
--- a/doc/user/instance_statistics/convdev.md
+++ b/doc/user/instance_statistics/convdev.md
@@ -1,27 +1,26 @@
# Conversational Development Index
-> [Introduced][ce-30469] in GitLab 9.3.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/30469) in GitLab 9.3.
+
+NOTE: **NOTE**
+Your GitLab instance's [usage ping](../admin_area/settings/usage_statistics.md#usage-ping-core-only) must be activated in order to use this feature.
The Conversational Development Index (ConvDev Index) gives you an overview of your entire
instance's adoption of [Concurrent DevOps](https://about.gitlab.com/concurrent-devops/)
-from planning to monitoring. It displays the usage of these GitLab features over
+from planning to monitoring.
+
+This displays the usage of these GitLab features over
the last 30 days, averaged over the number of active users in that time period. It also
provides a Lead score per feature, which is calculated based on GitLab's analysis
-of top-performing instances based on [usage ping data][ping] that GitLab has
-collected. Your score is compared to the lead score, expressed as a percentage.
-Your overall index score is an average of all your feature score percentages.
+of top-performing instances based on [usage ping data](../admin_area/settings/usage_statistics.md#usage-ping-core-only) that GitLab has
+collected. Your score is compared to the lead score of each feature and then expressed as a percentage at the bottom of said feature.
+Your overall index score is an average of all your feature score percentages - this percentage value is presented above all the of features on the page.
![ConvDev index](img/convdev_index.png)
The page also provides helpful links to articles and GitLab docs, to help you
improve your scores.
-Your GitLab instance's [usage ping][ping] must be activated in order to use this feature.
Usage ping data is aggregated on GitLab's servers for analysis. Your usage
-information is **not sent** to any other GitLab instances.
-
-If you have just started using GitLab, it may take a few weeks for data to be
+information is **not sent** to any other GitLab instances. If you have just started using GitLab, it may take a few weeks for data to be
collected before this feature is available.
-
-[ce-30469]: https://gitlab.com/gitlab-org/gitlab-ce/issues/30469
-[ping]: ../admin_area/settings/usage_statistics.md#usage-ping
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index ea3e9d0cce9..833b9b66102 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -14,7 +14,7 @@ be able to create issues, leave comments, and clone or download the project code
When a member leaves the team all the assigned [Issues](project/issues/index.md) and [Merge Requests](project/merge_requests/index.md)
will be unassigned automatically.
-GitLab [administrators](../README.md#administrator-documentation) receive all permissions.
+GitLab [administrators](../administration/index.md) receive all permissions.
To add or import a user, you can follow the
[project members documentation](../user/project/members/index.md).
@@ -62,6 +62,8 @@ The following table depicts the various user permission levels in a project.
| Lock issue discussions | | ✓ | ✓ | ✓ | ✓ |
| Create issue from vulnerability **[ULTIMATE]** | | ✓ | ✓ | ✓ | ✓ |
| View Error Tracking list | | ✓ | ✓ | ✓ | ✓ |
+| Pull from [Maven repository](https://docs.gitlab.com/ee/user/project/packages/maven_repository.html) or [NPM registry](https://docs.gitlab.com/ee/user/project/packages/npm_registry.html) **[PREMIUM]** | | ✓ | ✓ | ✓ | ✓ |
+| Publish to [Maven repository](https://docs.gitlab.com/ee/user/project/packages/maven_repository.html) or [NPM registry](https://docs.gitlab.com/ee/user/project/packages/npm_registry.html) **[PREMIUM]** | | | ✓ | ✓ | ✓ |
| Lock merge request discussions | | | ✓ | ✓ | ✓ |
| Create new environments | | | ✓ | ✓ | ✓ |
| Stop environments | | | ✓ | ✓ | ✓ |
diff --git a/doc/user/profile/account/index.md b/doc/user/profile/account/index.md
index 06667bfc5f1..56b6498e16c 100644
--- a/doc/user/profile/account/index.md
+++ b/doc/user/profile/account/index.md
@@ -1,2 +1,5 @@
+---
+redirect_to: '../index.md#profile-settings'
+---
This document was moved to [../index.md#profile-settings](../index.md#profile-settings).
diff --git a/doc/user/profile/active_sessions.md b/doc/user/profile/active_sessions.md
index 5119c0e30d0..28e3f4904a9 100644
--- a/doc/user/profile/active_sessions.md
+++ b/doc/user/profile/active_sessions.md
@@ -4,7 +4,7 @@
> in GitLab 10.8.
GitLab lists all devices that have logged into your account. This allows you to
-review the sessions and revoke any of it that you don't recognize.
+review the sessions.
## Listing all active sessions
@@ -12,9 +12,3 @@ review the sessions and revoke any of it that you don't recognize.
1. Navigate to the **Active Sessions** tab.
![Active sessions list](img/active_sessions_list.png)
-
-## Revoking a session
-
-1. Navigate to your [profile's](#profile-settings) **Settings > Active Sessions**.
-1. Click on **Revoke** besides a session. The current session cannot be
- revoked, as this would sign you out of GitLab.
diff --git a/doc/user/profile/img/active_sessions_list.png b/doc/user/profile/img/active_sessions_list.png
index 5d94dca69cc..1e242ac4710 100644
--- a/doc/user/profile/img/active_sessions_list.png
+++ b/doc/user/profile/img/active_sessions_list.png
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index a2b15d058d7..b216b9f255c 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -39,7 +39,7 @@ From there, you can:
- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
- Add and delete emails linked to your account
- Choose which email to use for notifications, web-based commits, and display on your public profile
-- Manage [SSH keys](../../ssh/README.md#ssh) to access your account via SSH
+- Manage [SSH keys](../../ssh/README.md) to access your account via SSH
- Manage your [preferences](preferences.md#syntax-highlighting-theme)
to customize your own GitLab experience
- [View your active sessions](active_sessions.md) and revoke any of them if necessary
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index db68510c46d..f399dc40164 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -103,4 +103,10 @@ Select your preferred language from a list of supported languages.
The first day of the week can be customised for calendar views and date pickers.
-You can choose **Sunday** or **Monday** as the first day of the week. If you select **System Default**, the system-wide default setting will be used.
+You can choose one of the following options as the first day of the week:
+
+- Saturday
+- Sunday
+- Monday
+
+If you select **System Default**, the system-wide default setting will be used.
diff --git a/doc/user/project/builds/artifacts.md b/doc/user/project/builds/artifacts.md
index 514c729b37d..1b0f3f61394 100644
--- a/doc/user/project/builds/artifacts.md
+++ b/doc/user/project/builds/artifacts.md
@@ -1 +1,5 @@
+---
+redirect_to: '../pipelines/job_artifacts.md'
+---
+
This document was moved to [pipelines/job_artifacts](../pipelines/job_artifacts.md).
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index e601d7b2ccc..3819dc308ec 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -41,7 +41,7 @@ integration, make sure the following requirements are met:
- A [billing account](https://cloud.google.com/billing/docs/how-to/manage-billing-account)
is set up and you have permissions to access it.
-- The Kubernetes Engine API is enabled. Follow the steps as outlined in the
+- The Kubernetes Engine API and related service are enabled. It should work immediately but may take up to 10 minutes after you create a project. For more information see the
["Before you begin" section of the Kubernetes Engine docs](https://cloud.google.com/kubernetes-engine/docs/quickstart#before-you-begin).
### Creating the cluster
@@ -69,6 +69,7 @@ new Kubernetes cluster to your project:
- **Number of nodes** - Enter the number of nodes you wish the cluster to have.
- **Machine type** - The [machine type](https://cloud.google.com/compute/docs/machine-types)
of the Virtual Machine instance that the cluster will be based on.
+ - **RBAC-enabled cluster** - Leave this checked if using default GKE creation options, see the [RBAC section](#role-based-access-control-rbac-core-only) for more information.
1. Finally, click the **Create Kubernetes cluster** button.
After a couple of minutes, your cluster will be ready to go. You can now proceed
@@ -87,7 +88,7 @@ To add an existing Kubernetes cluster to your project:
1. Click **Add an existing Kubernetes cluster** and fill in the details:
- **Kubernetes cluster name** (required) - The name you wish to give the cluster.
- **Environment scope** (required) - The
- [associated environment](#setting-the-environment-scope) to this cluster.
+ [associated environment](#setting-the-environment-scope-premium) to this cluster.
- **API URL** (required) -
It's the URL that GitLab uses to access the Kubernetes API. Kubernetes
exposes several APIs, we want the "base" URL that is common to all of them,
@@ -181,7 +182,7 @@ To add an existing Kubernetes cluster to your project:
namespace: 11 bytes
token: <authentication_token>
```
-
+
NOTE: **Note:**
For GKE clusters, you will need the
`container.clusterRoleBindings.create` permission to create a cluster
@@ -226,12 +227,19 @@ applications running on the cluster.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/24580) in GitLab 11.8.
-Domains at the cluster level permit support for multiple domains
-per [multiple Kubernetes clusters](#multiple-kubernetes-clusters-premium). When specifying a domain,
-this will be automatically set as an environment variable (`KUBE_INGRESS_BASE_DOMAIN`) during
-the [Auto DevOps](../../../topics/autodevops/index.md) stages.
+NOTE: **Note:**
+You do not need to specify a base domain on cluster settings when using GitLab Serverless. The domain in that case
+will be specified as part of the Knative installation. See [Installing Applications](#installing-applications).
+
+Specifying a base domain will automatically set `KUBE_INGRESS_BASE_DOMAIN` as an environment variable.
+If you are using [Auto DevOps](../../../topics/autodevops/index.md), this domain will be used for the different
+stages. For example, Auto Review Apps and Auto Deploy.
+
+The domain should have a wildcard DNS configured to the Ingress IP address. After ingress has been installed (see [Installing Applications](#installing-applications)),
+you can either:
-The domain should have a wildcard DNS configured to the Ingress IP address.
+- Create an `A` record that points to the Ingress IP address with your domain provider.
+- Enter a wildcard DNS address using a service such as nip.io or xip.io. For example, `192.168.1.1.xip.io`.
## Access controls
@@ -318,7 +326,7 @@ install it manually.
NOTE: **Note:**
Before starting the installation of applications, make sure that time is synchronized
between your GitLab server and your Kubernetes cluster. Otherwise, installation could fail
-and you may get errors like `Error: remote error: tls: bad certificate`
+and you may get errors like `Error: remote error: tls: bad certificate`
in the `stdout` of pods created by GitLab in your Kubernetes cluster.
GitLab provides a one-click install for various applications which can
@@ -345,7 +353,7 @@ by GitLab before installing any of the applications.
| [Cert Manager](http://docs.cert-manager.io/en/latest/) | 11.6+ | 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 [Let's Encrypt](https://letsencrypt.org/) and ensure that certificates are valid and up-to-date. | [stable/cert-manager](https://github.com/helm/charts/tree/master/stable/cert-manager) |
| [Prometheus](https://prometheus.io/docs/introduction/overview/) | 10.4+ | Prometheus is an open-source monitoring and alerting system useful to supervise your deployed applications. | [stable/prometheus](https://github.com/helm/charts/tree/master/stable/prometheus) |
| [GitLab Runner](https://docs.gitlab.com/runner/) | 10.6+ | GitLab Runner is the open source project that is used to run your jobs and send the results back to GitLab. It is used in conjunction with [GitLab CI/CD](https://about.gitlab.com/features/gitlab-ci-cd/), the open-source continuous integration service included with GitLab that coordinates the jobs. When installing the GitLab Runner via the applications, it will run in **privileged mode** by default. Make sure you read the [security implications](#security-implications) before doing so. | [runner/gitlab-runner](https://gitlab.com/charts/gitlab-runner) |
-| [JupyterHub](http://jupyter.org/) | 11.0+ | [JupyterHub](https://jupyterhub.readthedocs.io/en/stable/) is a multi-user service for managing notebooks across a team. [Jupyter Notebooks](https://jupyter-notebook.readthedocs.io/en/latest/) provide a web-based interactive programming environment used for data analysis, visualization, and machine learning. We use a [custom Jupyter image](https://gitlab.com/gitlab-org/jupyterhub-user-image/blob/master/Dockerfile) that installs additional useful packages on top of the base Jupyter. You will also see ready-to-use DevOps Runbooks built with Nurtch's [Rubix library](https://github.com/amit1rrr/rubix). More information on creating executable runbooks can be found in [our Nurtch documentation](runbooks/index.md#nurtch-executable-runbooks). **Note**: Authentication will be enabled for any user of the GitLab server via OAuth2. HTTPS will be supported in a future release. | [jupyter/jupyterhub](https://jupyterhub.github.io/helm-chart/) |
+| [JupyterHub](http://jupyter.org/) | 11.0+ | [JupyterHub](https://jupyterhub.readthedocs.io/en/stable/) is a multi-user service for managing notebooks across a team. [Jupyter Notebooks](https://jupyter-notebook.readthedocs.io/en/latest/) provide a web-based interactive programming environment used for data analysis, visualization, and machine learning. We use a [custom Jupyter image](https://gitlab.com/gitlab-org/jupyterhub-user-image/blob/master/Dockerfile) that installs additional useful packages on top of the base Jupyter. Authentication will be enabled only for [project members](../members/index.md) with [Developer or higher](../../permissions.md) access to the project. You will also see ready-to-use DevOps Runbooks built with Nurtch's [Rubix library](https://github.com/amit1rrr/rubix). More information on creating executable runbooks can be found in [our Nurtch documentation](runbooks/index.md#nurtch-executable-runbooks). | [jupyter/jupyterhub](https://jupyterhub.github.io/helm-chart/) |
| [Knative](https://cloud.google.com/knative) | 11.5+ | Knative provides a platform to create, deploy, and manage serverless workloads from a Kubernetes cluster. It is used in conjunction with, and includes [Istio](https://istio.io) to provide an external IP address for all programs hosted by Knative. You will be prompted to enter a wildcard domain where your applications will be exposed. Configure your DNS server to use the external IP address for that domain. For any application created and installed, they will be accessible as `<program_name>.<kubernetes_namespace>.<domain_name>`. This will require your kubernetes cluster to have [RBAC enabled](#role-based-access-control-rbac). | [knative/knative](https://storage.googleapis.com/triggermesh-charts)
With the exception of Knative, the applications will be installed in a dedicated
@@ -465,7 +473,7 @@ project. That way you can have different clusters for different environments,
like dev, staging, production, etc.
Simply add another cluster, like you did the first time, and make sure to
-[set an environment scope](#setting-the-environment-scope) that will
+[set an environment scope](#setting-the-environment-scope-premium) that will
differentiate the new cluster with the rest.
## Setting the environment scope **[PREMIUM]**
diff --git a/doc/user/project/clusters/runbooks/index.md b/doc/user/project/clusters/runbooks/index.md
index 512a4cb32f4..54c475a1762 100644
--- a/doc/user/project/clusters/runbooks/index.md
+++ b/doc/user/project/clusters/runbooks/index.md
@@ -4,6 +4,10 @@ Runbooks are a collection of documented procedures that explain how to
carry out a particular process, be it starting, stopping, debugging,
or troubleshooting a particular system.
+Using [Jupyter Notebooks](https://jupyter.org/) and the [Rubix library](https://github.com/Nurtch/rubix),
+users can get started writing their own executable runbooks.
+
+
## Overview
Historically, runbooks took the form of a decision tree or a detailed
@@ -36,7 +40,7 @@ To create an executable runbook, you will need:
can run the helm CLI in a safe environment.
1. **Ingress** - Ingress can provide load balancing, SSL termination, and name-based
virtual hosting. It acts as a web proxy for your applications.
-1. **JupyterHub** - JupyterHub is a multi-user service for managing notebooks across
+1. **JupyterHub** - [JupyterHub](https://jupyterhub.readthedocs.io/) is a multi-user service for managing notebooks across
a team. Jupyter Notebooks provide a web-based interactive programming environment
used for data analysis, visualization, and machine learning.
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index f7e72efa2ba..856ae03f4bc 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -19,10 +19,15 @@ For more information on Knative, visit the [Knative docs repo](https://github.co
With GitLab serverless, you can deploy both functions-as-a-service (FaaS) and serverless applications.
-## Requirements
+## Prerequisites
To run Knative on Gitlab, you will need:
+1. **Existing GitLab project:** You will need a GitLab project to associate all resources. The simplest way to get started:
+
+ - If you are planning on deploying functions, clone the [functions example project](https://gitlab.com/knative-examples/functions) to get started.
+ - If you are planning on deploying a serverless application, clone the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app) to get started.
+
1. **Kubernetes Cluster:** An RBAC-enabled Kubernetes cluster is required to deploy Knative.
The simplest way to get started is to add a cluster using [GitLab's GKE integration](../index.md#adding-and-creating-a-new-gke-cluster-via-gitlab).
The set of minimum recommended cluster specifications to run Knative is 3 nodes, 6 vCPUs, and 22.50 GB memory.
@@ -43,6 +48,8 @@ To run Knative on Gitlab, you will need:
runtime being used.
1. **`Dockerfile`** (for [applications only](#deploying-serverless-applications): Knative requires a `Dockerfile` in order to build your application. It should be included
at the root of your project's repo and expose port `8080`.
+1. **Prometheus** (optional): Installing Prometheus allows you to monitor the scale and traffic of your serverless function/application.
+ See [Installing Applications](../index.md#installing-applications) for more information.
## Installing Knative via GitLab's Kubernetes integration
@@ -56,7 +63,7 @@ The minimum recommended cluster size to run Knative is 3-nodes, 6 vCPUs, and 22.
![install-knative](img/install-knative.png)
1. After the Knative installation has finished, you can wait for the IP address to be displayed in the
- **Knative IP Address** field or retrieve the Istio Ingress IP address by running the following command:
+ **Knative IP Address** field (takes up to 5 minutes) or retrieve the Istio Ingress IP address by running the following command:
```bash
kubectl get svc --namespace=istio-system knative-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip} '
@@ -68,6 +75,11 @@ The minimum recommended cluster size to run Knative is 3-nodes, 6 vCPUs, and 22.
35.161.143.124 my-machine-name:~ my-user$
```
+ NOTE: **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/).
+
1. The ingress is now available at this address and will route incoming requests to the proper service based on the DNS
name in the request. To support this, a wildcard DNS A record should be created for the desired domain name. For example,
if your Knative base domain is `example.com` then you need to create an A record with domain `*.example.com`
@@ -94,7 +106,7 @@ Currently the following [runtimes](https://gitlab.com/triggermesh/runtimes) are
You can find and import all the files referenced in this doc in the **[functions example project](https://gitlab.com/knative-examples/functions)**.
-Follow these steps to deploy a function using the Node.js runtime to your Knative instance:
+Follow these steps to deploy a function using the Node.js runtime to your Knative instance (you can skip these steps if you've cloned the example project):
1. Create a directory that will house the function. In this example we will create a directory called `echo` at the root of the project.
@@ -102,28 +114,35 @@ Follow these steps to deploy a function using the Node.js runtime to your Knativ
- Public, continue to the next step.
- Private, you will need to [create a GitLab deploy token](../../deploy_tokens/index.md#creating-a-deploy-token) with `gitlab-deploy-token` as the name and the `read_registry` scope.
-1. `.gitlab-ci.yml`: This template allows to define the stage, environment, and
- image to be used for your functions. It must be included at the root of your repository:
+1. `.gitlab-ci.yml`: this defines a pipeline used to deploy your functions.
+ It must be included at the root of your repository:
```yaml
- stages:
- - deploy
+ include:
+ template: Serverless.gitlab-ci.yml
functions:
- stage: deploy
- environment: test
- image: gcr.io/triggermesh/tm:v0.0.9
- script:
- - tm -n "$KUBE_NAMESPACE" set registry-auth gitlab-registry --registry "$CI_REGISTRY" --username "$CI_REGISTRY_USER" --password "$CI_JOB_TOKEN" --push
- - tm -n "$KUBE_NAMESPACE" set registry-auth gitlab-registry --registry "$CI_REGISTRY" --username "$CI_DEPLOY_USER" --password "$CI_DEPLOY_PASSWORD" --pull
- - tm -n "$KUBE_NAMESPACE" deploy --wait
-
+ extends: .serverless:deploy:functions
+ environment: production
```
- The `gitlab-ci.yml` template creates a `Deploy` stage with a `functions` job that invokes the `tm` CLI with the required parameters.
+ This `.gitlab-ci.yml` creates a `functions` job that invokes some
+ predefined commands to deploy your functions to your cluster.
-2. `serverless.yml`: This file contains the metadata for your functions,
- such as name, runtime, and environment. It must be included at the root of your repository. The following is a sample `echo` function which shows the required structure for the file. You can find the relevant files for this project in the [functions example project](https://gitlab.com/knative-examples/functions).
+ `Serverless.gitlab-ci.yml` is a template that allows customization.
+ You can either import it with `include` parameter and use `extends` to
+ customize your jobs, or you can inline the entire template by choosing it
+ from **Apply a template** dropdown when editing the `.gitlab-ci.yml` file through
+ the user interface.
+
+2. `serverless.yml`: this file contains the metadata for your functions,
+ such as name, runtime, and environment.
+
+ It must be included at the root of your repository.
+ The following is a sample `echo` function which shows the required structure
+ for the file.
+
+ You can find the relevant files for this project in the [functions example project](https://gitlab.com/knative-examples/functions).
```yaml
service: my-functions
@@ -188,7 +207,7 @@ appear under **Operations > Serverless**.
This page contains all functions available for the project, the description for
accessing the function, and, if available, the function's runtime information.
The details are derived from the Knative installation inside each of the project's
-Kubernetes cluster.
+Kubernetes cluster. Click on each function to obtain detailed scale and invocation data.
The function details can be retrieved directly from Knative on the cluster:
@@ -198,14 +217,14 @@ kubectl -n "$KUBE_NAMESPACE" get services.serving.knative.dev
The sample function can now be triggered from any HTTP client using a simple `POST` call:
- 1. Using curl
+ 1. Using curl (replace the URL on the last line with the URL of your application):
```bash
curl \
--header "Content-Type: application/json" \
--request POST \
--data '{"GitLab":"FaaS"}' \
- http://functions-echo.functions-1.functions.example.net/
+ <http://functions-echo.functions-1.functions.example.com/>
```
2. Using a web-based tool (ie. postman, restlet, etc)
@@ -219,35 +238,25 @@ NOTE: **Note:**
You can reference and import the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app) to get started.
Add the following `.gitlab-ci.yml` to the root of your repository
-(you may skip this step if using the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app) mentioned above):
+(you may skip this step if you've previously cloned the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app) mentioned above):
```yaml
-stages:
- - build
- - deploy
+include:
+ template: Serverless.gitlab-ci.yml
build:
- stage: build
- image:
- name: gcr.io/kaniko-project/executor:debug
- entrypoint: [""]
- only:
- - master
- script:
- - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE
+ extends: .serverless:build:image
deploy:
- stage: deploy
- image: gcr.io/triggermesh/tm@sha256:e3ee74db94d215bd297738d93577481f3e4db38013326c90d57f873df7ab41d5
- only:
- - master
- environment: production
- script:
- - echo "$CI_REGISTRY_IMAGE"
- - tm -n "$KUBE_NAMESPACE" --config "$KUBECONFIG" deploy service "$CI_PROJECT_NAME" --from-image "$CI_REGISTRY_IMAGE" --wait
+ extends: .serverless:deploy:image
```
+`Serverless.gitlab-ci.yml` is a template that allows customization.
+You can either import it with `include` parameter and use `extends` to
+customize your jobs, or you can inline the entire template by choosing it
+from **Apply a template** dropdown when editing the `.gitlab-ci.yml` file through
+the user interface.
+
### Deploy the application with Knative
With all the pieces in place, the next time a CI pipeline runs, the Knative application will be deployed. Navigate to
diff --git a/doc/user/project/cycle_analytics.md b/doc/user/project/cycle_analytics.md
index 05127b274e0..19ab911e39f 100644
--- a/doc/user/project/cycle_analytics.md
+++ b/doc/user/project/cycle_analytics.md
@@ -3,45 +3,40 @@
> [Introduced][ce-5986] in GitLab 8.12. Further features were added in GitLab
8.14.
-Cycle Analytics measures the time it takes to go from an [idea to production] for
-each project you have. This is achieved by not only indicating the total time it
-takes to reach that point, but the total time is broken down into the
-multiple stages an idea has to pass through to be shipped.
+Cycle Analytics measures the time spent to go from an [idea to production] for
+each of your projects. Cycle Analytics displays the median time for an idea to
+reach production, along with the time typically spent in each DevOps stage along the way.
+
+Cycle Analytics is useful in order to quickly determine the velocity of a given
+project. It points to bottlenecks in the development process, enabling management
+to uncover, triage, and root-cause slowdowns in the software development life cycle.
Cycle Analytics is tightly coupled with the [GitLab flow] and
calculates a separate median for each stage.
## Overview
-You can find the Cycle Analytics page under your project's **Pipelines âž” Cycle
+You can find the Cycle Analytics page under your project's **Project âž” Cycle
Analytics** tab.
![Cycle Analytics landing page](img/cycle_analytics_landing_page.png)
-You can see that there are seven stages in total:
+There are seven stages that are tracked as part of the Cycle Analytics calculations.
- **Issue** (Tracker)
- - Median time from issue creation until given a milestone or list label
- (first assignment, any milestone, milestone date or assignee is not required)
+ - Time to schedule an issue (by milestone or by adding it to an issue board)
- **Plan** (Board)
- - Median time from giving an issue a milestone or label until pushing the
- first commit to the branch
+ - Time to first commit
- **Code** (IDE)
- - Median time from the first commit to the branch until the merge request is
- created
+ - Time to create a merge request
- **Test** (CI)
- - Median total test time for all commits/merges
+ - Time it takes GitLab CI/CD to test your code
- **Review** (Merge Request/MR)
- - Median time from merge request creation until the merge request is merged
- (closed merge requests won't be taken into account)
+ - Time spent on code review
- **Staging** (Continuous Deployment)
- - Median time from when the merge request got merged until the deploy to
- production (production is last stage/environment)
+ - Time between merging and deploying to production
- **Production** (Total)
- - Sum of all the above stages' times excluding the Test (CI) time. To clarify,
- it's not so much that CI time is "excluded", but rather CI time is already
- counted in the review stage since CI is done automatically. Most of the
- other stages are purely sequential, but **Test** is not.
+ - Total lifecycle time; i.e. the velocity of the project or team
## How the data is measured
diff --git a/doc/user/project/gpg_signed_commits/index.md b/doc/user/project/gpg_signed_commits/index.md
index 261eedeb412..bd9a5313489 100644
--- a/doc/user/project/gpg_signed_commits/index.md
+++ b/doc/user/project/gpg_signed_commits/index.md
@@ -1 +1,5 @@
+---
+redirect_to: '../repository/gpg_signed_commits/index.md'
+---
+
This document was moved to [another location](../repository/gpg_signed_commits/index.md).
diff --git a/doc/user/project/img/cycle_analytics_landing_page.png b/doc/user/project/img/cycle_analytics_landing_page.png
index 8b17fae5e05..cf46098b9a4 100644
--- a/doc/user/project/img/cycle_analytics_landing_page.png
+++ b/doc/user/project/img/cycle_analytics_landing_page.png
Binary files differ
diff --git a/doc/user/project/img/issue_boards_multiple.png b/doc/user/project/img/issue_boards_multiple.png
index 242460925f7..4b1a8356dc9 100644
--- a/doc/user/project/img/issue_boards_multiple.png
+++ b/doc/user/project/img/issue_boards_multiple.png
Binary files differ
diff --git a/doc/user/project/import/svn.md b/doc/user/project/import/svn.md
index a5923986292..4825b005a85 100644
--- a/doc/user/project/import/svn.md
+++ b/doc/user/project/import/svn.md
@@ -8,7 +8,7 @@ between the two, for more information consult your favorite search engine.
There are two approaches to SVN to Git migration:
-1. [Git/SVN Mirror](#smooth-migration-with-a-git-svn-mirror-using-subgit) which:
+1. [Git/SVN Mirror](#smooth-migration-with-a-gitsvn-mirror-using-subgit) which:
- Makes the GitLab repository to mirror the SVN project.
- Git and SVN repositories are kept in sync; you can use either one.
- Smoothens the migration process and allows to manage migration risks.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 0dc50d28cb0..4148310dc98 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -137,7 +137,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-group-s-path) or [renaming a repository](settings/index.md#renaming-a-repository):
+[changing a group path](../group/index.md#changing-a-groups-path) or [renaming a repository](settings/index.md#renaming-a-repository):
- Existing web URLs for the namespace and anything under it (e.g., projects) will
redirect to the new URLs.
diff --git a/doc/user/project/integrations/kubernetes.md b/doc/user/project/integrations/kubernetes.md
index 9342a2cbb00..ab43eb2da7e 100644
--- a/doc/user/project/integrations/kubernetes.md
+++ b/doc/user/project/integrations/kubernetes.md
@@ -1 +1,5 @@
+---
+redirect_to: '../clusters/index.md'
+---
+
This document was moved to [another location](../clusters/index.md).
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index e031dcad2c3..9c69437537a 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -152,7 +152,7 @@ trigger word followed by <kbd>help</kbd>. Example: <samp>/gitlab help</samp>
## Permissions
The permissions to run the [available commands](#available-slash-commands) derive from
-the [permissions you have on the project](../../permissions.md#project).
+the [permissions you have on the project](../../permissions.md#project-members-permissions).
## Further reading
diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md
index ed289b0c4eb..26989e2a8a4 100644
--- a/doc/user/project/integrations/prometheus.md
+++ b/doc/user/project/integrations/prometheus.md
@@ -120,7 +120,7 @@ If the "No data found" screen continues to appear, it could be due to:
- No successful deployments have occurred to this environment.
- Prometheus does not have performance data for this environment, or the metrics
are not labeled correctly. To test this, connect to the Prometheus server and
- [run a query](#gitlab-prometheus-queries), replacing `$CI_ENVIRONMENT_SLUG`
+ [run a query](prometheus_library/kubernetes.html#metrics-supported), replacing `$CI_ENVIRONMENT_SLUG`
with the name of your environment.
[autodeploy]: ../../../ci/autodeploy/index.md
diff --git a/doc/user/project/integrations/prometheus_library/metrics.md b/doc/user/project/integrations/prometheus_library/metrics.md
index 37a5388d2fc..7ace0ec5a93 100644
--- a/doc/user/project/integrations/prometheus_library/metrics.md
+++ b/doc/user/project/integrations/prometheus_library/metrics.md
@@ -1 +1,5 @@
+---
+redirect_to: 'index.md'
+---
+
This document was moved to [another location](index.md).
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 0bd565547c3..66168080087 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -173,10 +173,14 @@ or in situations where a repository is used to host the code of multiple
products.
Clicking on the current board name in the upper left corner will reveal a
-menu from where you can create another Issue Board and rename or delete the
-existing one.
+menu from where you can create another Issue Board or delete the existing one.
Using the search box at the top of the menu, you can filter the listed boards.
+When you have 10 or more boards available, a "Recent" section is also shown in the menu.
+These are shortcuts to your last 4 visited boards.
+
+![Multiple Issue Boards](img/issue_boards_multiple.png)
+
When you're revisiting an issue board in a project or group with multiple boards,
GitLab will automatically load the last board you visited.
@@ -184,8 +188,6 @@ NOTE: **Note:**
The Multiple Issue Boards feature is available for
**projects in GitLab Starter Edition** and for **groups in GitLab Premium Edition**.
-![Multiple Issue Boards](img/issue_boards_multiple.png)
-
### Configurable Issue Boards **[STARTER]**
> Introduced in [GitLab Starter Edition 10.2](https://about.gitlab.com/2017/11/22/gitlab-10-2-released/#issue-boards-configuration).
diff --git a/doc/user/project/merge_requests.md b/doc/user/project/merge_requests.md
index 84a79f04094..1d7ebc856c3 100644
--- a/doc/user/project/merge_requests.md
+++ b/doc/user/project/merge_requests.md
@@ -1 +1,5 @@
+---
+redirect_to: 'merge_requests/index.md'
+---
+
This document was moved to [merge_requests/index.md](merge_requests/index.md).
diff --git a/doc/user/project/merge_requests/maintainer_access.md b/doc/user/project/merge_requests/maintainer_access.md
index d59afecd375..fe7e1f558c7 100644
--- a/doc/user/project/merge_requests/maintainer_access.md
+++ b/doc/user/project/merge_requests/maintainer_access.md
@@ -1 +1,5 @@
+---
+redirect_to: 'allow_collaboration.md'
+---
+
This document was moved to [another location](allow_collaboration.md).
diff --git a/doc/user/project/merge_requests/merge_request_discussion_resolution.md b/doc/user/project/merge_requests/merge_request_discussion_resolution.md
index 200965875a1..a554d727ca4 100644
--- a/doc/user/project/merge_requests/merge_request_discussion_resolution.md
+++ b/doc/user/project/merge_requests/merge_request_discussion_resolution.md
@@ -1 +1,5 @@
+---
+redirect_to: '../../discussions/index.md'
+---
+
This document was moved to [another location](../../discussions/index.md).
diff --git a/doc/user/project/merge_requests/merge_when_build_succeeds.md b/doc/user/project/merge_requests/merge_when_build_succeeds.md
index 2167fdfbf7e..cf5e3af16c9 100644
--- a/doc/user/project/merge_requests/merge_when_build_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_build_succeeds.md
@@ -1,5 +1,7 @@
-This document was moved to [merge_when_pipeline_succeeds](merge_when_pipeline_succeeds.md).
+---
+redirect_to: 'merge_when_pipeline_succeeds.md'
+---
->[Introduced][ce-7135] by the "Rename MWBS service to Merge When Pipeline Succeeds" change.
+This document was moved to [merge_when_pipeline_succeeds](merge_when_pipeline_succeeds.md).
-[ce-7135]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7135
+>[Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7135) by the "Rename MWBS service to Merge When Pipeline Succeeds" change.
diff --git a/doc/user/project/operations/error_tracking.md b/doc/user/project/operations/error_tracking.md
index 41aa5b91aa7..1b319c5641c 100644
--- a/doc/user/project/operations/error_tracking.md
+++ b/doc/user/project/operations/error_tracking.md
@@ -22,8 +22,12 @@ GitLab provides an easy way to connect Sentry to your project:
1. Sign up to Sentry.io or [deploy your own](#deploying-sentry) Sentry instance.
1. [Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project.
Make sure to give the token at least the following scopes: `event:read` and `project:read`.
-1. Navigate to your project’s **Settings > Operations** and provide the Sentry API URL and auth token.
-1. Ensure that the 'Active' checkbox is set.
+1. Navigate to your project’s **Settings > Operations**.
+1. Ensure that the **Active** checkbox is set.
+1. In the **Sentry API URL** field, enter your Sentry hostname. For example, `https://sentry.example.com`.
+1. In the **Auth Token** field, enter the token you previously generated.
+1. Click the **Connect** button to test the connection to Sentry and populate the **Project** dropdown.
+1. From the **Project** dropdown, choose a Sentry project to link to your GitLab project.
1. Click **Save changes** for the changes to take effect.
1. You can now visit **Operations > Error Tracking** in your project's sidebar to [view a list](#error-tracking-list) of Sentry errors.
diff --git a/doc/user/project/pages/getting_started_part_one.md b/doc/user/project/pages/getting_started_part_one.md
index 9a95fb70964..f1e2771dcb9 100644
--- a/doc/user/project/pages/getting_started_part_one.md
+++ b/doc/user/project/pages/getting_started_part_one.md
@@ -59,7 +59,7 @@ which is highly recommendable and much faster than hardcoding.
If you set up a GitLab Pages project on GitLab.com,
it will automatically be accessible under a
-[subdomain of `namespace.gitlab.io`](introduction.md#gitlab-pages-on-gitlab-com).
+[subdomain of `namespace.gitlab.io`](introduction.md#gitlab-pages-on-gitlabcom).
The `namespace` is defined by your username on GitLab.com,
or the group name you created this project under.
diff --git a/doc/user/project/pages/getting_started_part_three.md b/doc/user/project/pages/getting_started_part_three.md
index daae2f4b5a3..756b8b698c7 100644
--- a/doc/user/project/pages/getting_started_part_three.md
+++ b/doc/user/project/pages/getting_started_part_three.md
@@ -20,13 +20,13 @@ you should consider first, which we'll cover in this guide:
1. Either if you're adding a **root domain** or a **subdomain**, for which
you'll need to set up [DNS records](#dns-records)
-1. Whether you want to add an [SSL/TLS certificate](#ssl-tls-certificates) or not
+1. Whether you want to add an [SSL/TLS certificate](#ssltls-certificates) or not
To finish the association, you need to [add your domain to your project's Pages settings](#add-your-custom-domain-to-gitlab-pages-settings).
Let's start from the beginning with [DNS records](#dns-records).
If you already know how they work and want to skip the introduction to DNS,
-you may be interested in skipping it until the [TL;DR](#tl-dr) section below.
+you may be interested in skipping it until the [TL;DR](#tldr) section below.
### DNS Records
@@ -148,7 +148,7 @@ verify your domain's ownership with a TXT record:
Once you've set the DNS record, you'll need navigate to your project's
**Setting > Pages** and click **+ New domain** to add your custom domain to
-GitLab Pages. You can choose whether to add an [SSL/TLS certificate](#ssl-tls-certificates)
+GitLab Pages. You can choose whether to add an [SSL/TLS certificate](#ssltls-certificates)
to make your website accessible under HTTPS or leave it blank. If don't add a certificate,
your site will be accessible only via HTTP:
diff --git a/doc/user/project/pages/getting_started_part_two.md b/doc/user/project/pages/getting_started_part_two.md
index 644a1c951d3..901fb226cda 100644
--- a/doc/user/project/pages/getting_started_part_two.md
+++ b/doc/user/project/pages/getting_started_part_two.md
@@ -1,5 +1,5 @@
---
-last_updated: 2018-02-16
+last_updated: 2019-03-05
author: Marcia Ramos
author_gitlab: marcia
level: beginner
@@ -21,8 +21,8 @@ To get started with GitLab Pages, you need:
Optional Features:
-1. A custom domain or subdomain
-1. A DNS pointing your (sub)domain to your Pages site
+1. A custom domain or subdomain.
+1. A DNS pointing your (sub)domain to your Pages site.
1. **Optional**: an SSL/TLS certificate so your custom
domain is accessible under HTTPS.
@@ -33,54 +33,73 @@ The optional settings, custom domain, DNS records, and SSL/TLS certificates, are
Your GitLab Pages project is a regular project created the
same way you do for the other ones. To get started with GitLab Pages, you have three ways:
-- Use one of the popular templates already in the app,
-- Fork one of the templates from Page Examples, or
-- Create a new project from scratch
-
-Let's go over each option.
+- [Use one of the popular project templates bundled with GitLab](#use-one-of-the-popular-pages-templates-bundled-with-gitlab).
+- [Fork one of the templates from Page Examples](#fork-a-project-to-get-started-from).
+- [Create a new project from scratch](#create-a-project-from-scratch).
### Use one of the popular Pages templates bundled with GitLab
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/47857)
in GitLab 11.8.
-The simplest way to create a GitLab Pages site is to use one of the most
-popular templates, which come already bundled and ready to go. To use one
-of these templates:
-
-1. From the top navigation, click the **+** button and select **New project**
-1. Select **Create from Template**
-1. Choose one of the templates starting with **Pages**
+The simplest way to create a GitLab Pages site is to
+[use one of the most popular templates](index.md#getting-started),
+which come already bundled with GitLab and are ready to go.
### Fork a project to get started from
-To make things easy for you, we've created this
-[group](https://gitlab.com/pages) of default projects
-containing the most popular SSGs templates.
-
-Watch the [video tutorial](https://youtu.be/TWqh9MtT4Bg) we've
-created for the steps below.
-
-1. [Fork a sample project](../../../gitlab-basics/fork-project.md) from the [Pages group](https://gitlab.com/pages)
-1. Trigger a build (push a change to any file)
-1. As soon as the build passes, your website will have been deployed with GitLab Pages. Your website URL will be available under your project's **Settings** > **Pages**
-1. Optionally, remove the fork relationship by navigating to your project's **Settings** > expanding **Advanced settings** and scrolling down to **Remove fork relationship**:
+If you don't find an existing project template that suits you,
+we've created this [group](https://gitlab.com/pages) of default projects
+containing the most popular SSGs templates to get you started.
+
+<table class="borderless-table center fixed-table middle width-80">
+ <tr>
+ <td style="width: 30%"><img src="img/icons/fork.png" alt="Fork" class="image-noshadow half-width"></td>
+ <td style="width: 10%">
+ <strong>
+ <i class="fa fa-angle-double-right" aria-hidden="true"></i>
+ </strong>
+ </td>
+ <td style="width: 30%"><img src="img/icons/terminal.png" alt="Deploy" class="image-noshadow half-width"></td>
+ <td style="width: 10%">
+ <strong>
+ <i class="fa fa-angle-double-right" aria-hidden="true"></i>
+ </strong>
+ </td>
+ <td style="width: 30%"><img src="img/icons/click.png" alt="Visit" class="image-noshadow half-width"></td>
+ </tr>
+ <tr>
+ <td><em>Fork an example project</em></td>
+ <td></td>
+ <td><em>Deploy your website</em></td>
+ <td></td>
+ <td><em>Visit your website's URL</em></td>
+ </tr>
+</table>
+
+**<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch a [video tutorial](https://www.youtube.com/watch?v=TWqh9MtT4Bg) with all the steps below.**
+
+1. [Fork](../../../gitlab-basics/fork-project.md) a sample project from the [GitLab Pages examples](https://gitlab.com/pages) group.
+1. From the left sidebar, navigate to your project's **CI/CD > Pipelines**
+and click **Run pipeline** to trigger GitLab CI/CD to build and deploy your
+site to the server.
+1. Once the pipeline has finished successfully, find the link to visit your
+website from your project's **Settings > Pages**.
+
+You can also take some **optional** further steps:
+
+- _Remove the fork relationship._ The fork relashionship is necessary to contribute back to the project you originally forked from. If you don't have any intentions to do so, you can remove it. To do so, navigate to your project's **Settings**, expand **Advanced settings**, and scroll down to **Remove fork relationship**:
![remove fork relationship](img/remove_fork_relationship.png)
-To turn a **project website** forked from the Pages group into a **user/group** website, you'll need to:
-
-- Rename it to `namespace.gitlab.io`: navigate to project's **Settings** > expand **Advanced settings** > and scroll down to **Rename repository**
-- Adjust your SSG's [base URL](#urls-and-baseurls) from `"project-name"` to `""`. This setting will be at a different place for each SSG, as each of them have their own structure and file tree. Most likely, it will be in the SSG's config file.
-
-> **Notes:**
->
-> Why do I need to remove the fork relationship?
->
-> Unless you want to contribute to the original project,
-you won't need it connected to the upstream. A
-[fork](https://about.gitlab.com/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/#fork)
-is useful for submitting merge requests to the upstream.
+- _Make it a user or group website._ To turn a **project website** forked
+from the Pages group into a **user/group** website, you'll need to:
+ - Rename it to `namespace.gitlab.io`: navigate to project's **Settings** >
+ expand **Advanced settings** > and scroll down to **Rename repository**.
+ - Adjust your SSG's [base URL](#urls-and-baseurls) from `"project-name"` to
+ `""`. This setting will be at a different place for each SSG, as each of them
+ have their own structure and file tree. Most likely, it will be in the SSG's
+ config file.
### Create a project from scratch
diff --git a/doc/user/project/pages/img/pages_project_templates_11-8.png b/doc/user/project/pages/img/pages_project_templates_11-8.png
new file mode 100644
index 00000000000..a645d28260b
--- /dev/null
+++ b/doc/user/project/pages/img/pages_project_templates_11-8.png
Binary files differ
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index e0b78753e21..885df9f0850 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -1,5 +1,6 @@
---
description: 'Learn how to use GitLab Pages to deploy a static website at no additional cost.'
+last_updated: 2019-03-05
---
# GitLab Pages
@@ -8,8 +9,8 @@ description: 'Learn how to use GitLab Pages to deploy a static website at no add
directly from a repository in GitLab.**
You can use it either for personal or business websites, such as
-portfolios, documentation, manifestos, and business presentations,
-and attribute any license to your content.
+portfolios, documentation, manifestos, and business presentations.
+You can also attribute any license to your content.
<table class="borderless-table center fixed-table">
<tr>
@@ -91,57 +92,33 @@ site under the HTTPS protocol.
## Getting started
-To get started with GitLab Pages, you can either [create a project from scratch](getting_started_part_two.md#create-a-project-from-scratch),
-use a [bundled template](getting_started_part_two.md#use-one-of-the-popular-pages-templates-bundled-with-gitlab), or copy any of our existing example projects:
+To get started with GitLab Pages, you can either:
-1. Choose an [example project](https://gitlab.com/pages) to [fork](../../../gitlab-basics/fork-project.md#how-to-fork-a-project):
- by forking a project, you create a copy of the codebase you're forking from to start from a template instead of starting from scratch.
-1. From the left sidebar, navigate to your project's **CI/CD > Pipelines** and click
- **Run pipeline** so that GitLab CI/CD will build and deploy your site to the server.
-1. Once the pipeline has finished successfully, find the link to visit your website from your
- project's **Settings > Pages**.
+- [Create a project from scratch](getting_started_part_two.md#create-a-project-from-scratch).
+- [Copy an existing example project](getting_started_part_two.md#fork-a-project-to-get-started-from).
+- Use a bundled project template that is ready to go ([introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/47857)
+in GitLab 11.8), as follows:
-<table class="borderless-table center fixed-table middle width-80">
- <tr>
- <td style="width: 30%"><img src="img/icons/fork.png" alt="Fork" class="image-noshadow half-width"></td>
- <td style="width: 10%">
- <strong>
- <i class="fa fa-angle-double-right" aria-hidden="true"></i>
- </strong>
- </td>
- <td style="width: 30%"><img src="img/icons/terminal.png" alt="Deploy" class="image-noshadow half-width"></td>
- <td style="width: 10%">
- <strong>
- <i class="fa fa-angle-double-right" aria-hidden="true"></i>
- </strong>
- </td>
- <td style="width: 30%"><img src="img/icons/click.png" alt="Visit" class="image-noshadow half-width"></td>
- </tr>
- <tr>
- <td><em>Fork an example project</em></td>
- <td></td>
- <td><em>Deploy your website</em></td>
- <td></td>
- <td><em>Visit your website's URL</em></td>
- </tr>
-</table>
-
-Your website is then visible on your domain, and you can modify your files
-as you wish. For every modification pushed to your repository, GitLab CI/CD will run
-a new pipeline to publish your changes to the server.
+1. From the top navigation, click the **+** button and select **New project**.
+1. Select **Create from Template**.
+1. Choose one of the templates starting with **Pages**:
-You can also take some optional further steps:
+ ![Project templates for Pages](img/pages_project_templates_11-8.png)
-- Remove the [fork relationship](getting_started_part_two.md#fork-a-project-to-get-started-from)
- (_You don't need the relationship unless you intent to contribute back to the example project you forked from_).
-- Make it a [user/group website](getting_started_part_one.md#user-and-group-websites)
+1. From the left sidebar, navigate to your project's **CI/CD > Pipelines**
+and click **Run pipeline** to trigger GitLab CI/CD to build and deploy your
+site to the server.
+1. Once the pipeline has finished successfully, find the link to visit your
+website from your project's **Settings > Pages**.
-**<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch a [video tutorial](https://www.youtube.com/watch?v=TWqh9MtT4Bg) with all the steps above!**
+Your website is then visible on your domain, and you can modify yourfiles
+as you wish. For every modification pushed to your repository, GitLab CI/CD
+will run a new pipeline to publish your changes to the server.
_Advanced options:_
- [Use a custom domain](getting_started_part_three.md#adding-your-custom-domain-to-gitlab-pages)
-- Apply [SSL/TLS certification](getting_started_part_three.md#ssl-tls-certificates) to your custom domain
+- Apply [SSL/TLS certification](getting_started_part_three.md#ssltls-certificates) to your custom domain
## Explore GitLab Pages
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index 23eb88fd305..6bb58689f38 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -11,7 +11,7 @@ With GitLab Pages you can host for free 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.
-Read [GitLab Pages on GitLab.com](#gitlab-pages-on-gitlab-com) for specific
+Read [GitLab Pages on GitLab.com](#gitlab-pages-on-gitlabcom) for specific
information, if you are using GitLab.com to host your website.
## Getting started with GitLab Pages domains
@@ -410,7 +410,7 @@ file for both the `/data` and `/data/` URL paths.
### Add a custom domain to your Pages website
For a complete guide on Pages domains, read through the article
-[GitLab Pages from A to Z: Part 3 - Setting Up Custom Domains - DNS Records and SSL/TLS Certificates](getting_started_part_three.md#setting-up-custom-domains-dns-records-and-ssl-tls-certificates)
+[GitLab Pages from A to Z: Part 3 - GitLab Pages custom domains and SSL/TLS Certificates](getting_started_part_three.md)
If this setting is enabled by your GitLab administrator, you should be able to
see the **New Domain** button when visiting your project's settings through the
@@ -451,7 +451,7 @@ private key when adding a new domain.
![Pages upload cert](img/pages_upload_cert.png)
For a complete guide on Pages domains, read through the article
-[GitLab Pages from A to Z: Part 3 - Setting Up Custom Domains - DNS Records and SSL/TLS Certificates](getting_started_part_three.md#setting-up-custom-domains-dns-records-and-ssl-tls-certificates)
+[GitLab Pages from A to Z: Part 3 - GitLab Pages custom domains and SSL/TLS Certificates](getting_started_part_three.md)
### Custom error codes pages
diff --git a/doc/user/project/pipelines/job_artifacts.md b/doc/user/project/pipelines/job_artifacts.md
index bf939dbdaa3..8b57129c9e1 100644
--- a/doc/user/project/pipelines/job_artifacts.md
+++ b/doc/user/project/pipelines/job_artifacts.md
@@ -38,7 +38,7 @@ turn are defined with the `paths` keyword. All paths to files and directories
are relative to the repository that was cloned during the build. These uploaded
artifacts will be kept in GitLab for 1 week as defined by the `expire_in`
definition. You have the option to keep the artifacts from expiring via the
-[web interface](#browsing-job-artifacts). If the expiry time is not defined,
+[web interface](#browsing-artifacts). If the expiry time is not defined,
it defaults to the [instance wide
setting](../../admin_area/settings/continuous_integration.md#default-artifacts-expiration-core-only).
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index db706e5020e..3eb8123144f 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -10,7 +10,7 @@ created protected branches.
By default, a protected branch does four simple things:
- it prevents its creation, if not already created, from everybody except users
- with Maintainer permission
+ who are allowed to merge
- it prevents pushes from everybody except users with Maintainer permission
- it prevents **anyone** from force pushing to the branch
- it prevents **anyone** from deleting the branch
@@ -94,6 +94,25 @@ all matching branches:
![Protected branch matches](img/protected_branches_matches.png)
+## Creating a protected branch
+
+> [Introduced][https://gitlab.com/gitlab-org/gitlab-ce/issues/53361] in GitLab 11.9.
+
+When a protected branch or wildcard protected branches are set to
+[**No one** is **Allowed to push**](#using-the-allowed-to-merge-and-allowed-to-push-settings),
+Developers (and users with higher [permission levels](../permissions.md)) are allowed
+to create a new protected branch, but only via the UI or through the API (to avoid
+creating protected branches accidentally from the command line or from a Git
+client application).
+
+To create a new branch through the user interface:
+
+1. Visit **Repository > Branches**.
+1. Click on **New branch**.
+1. Fill in the branch name and select an existing branch, tag, or commit that
+ the new branch will be based off. Only existing protected branches and commits
+ that are already in protected branches will be accepted.
+
## Deleting a protected branch
> [Introduced][ce-21393] in GitLab 9.3.
@@ -125,6 +144,10 @@ for details about the pipelines security model.
## Changelog
+**11.9**
+
+- [Allow protected branches to be created](https://gitlab.com/gitlab-org/gitlab-ce/issues/53361) by Developers (and users with higher permission levels) through the API and the user interface.
+
**9.2**
- Allow deletion of protected branches via the web interface [gitlab-org/gitlab-ce#21393][ce-21393]
diff --git a/doc/user/project/releases.md b/doc/user/project/releases.md
index 737842962a9..baa7a295273 100644
--- a/doc/user/project/releases.md
+++ b/doc/user/project/releases.md
@@ -1 +1,5 @@
+---
+redirect_to: 'releases/index.md'
+---
+
This document was moved to [another location](releases/index.md).
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index f05554ffc5b..13e4f2ce163 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -11,7 +11,7 @@ Read through GiLab's branching documentation:
See also:
- [Branches API](../../../../api/branches.md), for information on operating on repository branches using the GitLab API.
-- [GitLab Flow](../../../../university/training/gitlab_flow.md#gitlab-flow). Use the best of GitLab for your branching strategies.
+- [GitLab Flow](../../../../university/training/gitlab_flow.md). Use the best of GitLab for your branching strategies.
- [Getting started with Git](../../../../topics/git/index.md) and GitLab.
## Default branch
diff --git a/doc/user/project/slash_commands.md b/doc/user/project/slash_commands.md
index e9103a3f49c..1280524bc9b 100644
--- a/doc/user/project/slash_commands.md
+++ b/doc/user/project/slash_commands.md
@@ -1 +1,5 @@
+---
+redirect_to: 'quick_actions.md'
+---
+
This document was moved to [user/project/quick_actions.md](quick_actions.md).
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index 770cef42995..705983cce2a 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -96,7 +96,7 @@ quickly access issues and merge requests created or assigned to you within that
Your [todos](../../workflow/todos.md#gitlab-todos) can be searched by "to do" and "done".
You can [filter](../../workflow/todos.md#filtering-your-todos) them per project,
author, type, and action. Also, you can sort them by
-[**Label priority**](../../user/project/labels.md#prioritize-labels),
+[**Label priority**](../../user/project/labels.md#label-priority),
**Last created** and **Oldest created**.
## Projects
diff --git a/doc/workflow/groups.md b/doc/workflow/groups.md
index 06eec1ed928..c7f4647baa9 100644
--- a/doc/workflow/groups.md
+++ b/doc/workflow/groups.md
@@ -1,2 +1,5 @@
+---
+redirect_to: '../user/group/index.md'
+---
This document was moved to [another location](../user/group/index.md).
diff --git a/jest.config.js b/jest.config.js
index 225f01de303..efbf2e602c1 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -18,7 +18,6 @@ module.exports = {
moduleNameMapper: {
'^~(.*)$': '<rootDir>/app/assets/javascripts$1',
'^ee(.*)$': '<rootDir>/ee/app/assets/javascripts$1',
- '^fixtures(.*)$': '<rootDir>/spec/javascripts/fixtures$1',
'^helpers(.*)$': '<rootDir>/spec/frontend/helpers$1',
'^vendor(.*)$': '<rootDir>/vendor/assets/javascripts$1',
'\\.(jpg|jpeg|png|svg)$': '<rootDir>/spec/frontend/__mocks__/file_mock.js',
@@ -29,7 +28,7 @@ module.exports = {
cacheDirectory: '<rootDir>/tmp/cache/jest',
modulePathIgnorePatterns: ['<rootDir>/.yarn-cache/'],
reporters,
- setupTestFrameworkScriptFile: '<rootDir>/spec/frontend/test_setup.js',
+ setupFilesAfterEnv: ['<rootDir>/spec/frontend/test_setup.js'],
restoreMocks: true,
transform: {
'^.+\\.(gql|graphql)$': 'jest-transform-graphql',
diff --git a/lib/api/commits.rb b/lib/api/commits.rb
index 8defc59224d..65eb9bfb87e 100644
--- a/lib/api/commits.rb
+++ b/lib/api/commits.rb
@@ -99,6 +99,7 @@ module API
optional :author_email, type: String, desc: 'Author email for commit'
optional :author_name, type: String, desc: 'Author name for commit'
optional :stats, type: Boolean, default: true, desc: 'Include commit stats'
+ optional :force, type: Boolean, default: false, desc: 'When `true` overwrites the target branch with a new commit based on the `start_branch`'
end
post ':id/repository/commits' do
authorize_push_to_branch!(params[:branch])
@@ -318,10 +319,18 @@ module API
use :pagination
end
get ':id/repository/commits/:sha/merge_requests', requirements: API::COMMIT_ENDPOINT_REQUIREMENTS do
+ authorize! :read_merge_request, user_project
+
commit = user_project.commit(params[:sha])
not_found! 'Commit' unless commit
- present paginate(commit.merge_requests), with: Entities::MergeRequestBasic
+ commit_merge_requests = MergeRequestsFinder.new(
+ current_user,
+ project_id: user_project.id,
+ commit_sha: commit.sha
+ ).execute
+
+ present paginate(commit_merge_requests), with: Entities::MergeRequestBasic
end
desc "Get a commit's GPG signature" do
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 18f15632f2b..2cd0d93b205 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -156,7 +156,7 @@ module API
class BasicProjectDetails < ProjectIdentity
include ::API::ProjectsRelationBuilder
- expose :default_branch
+ expose :default_branch, if: -> (project, options) { Ability.allowed?(options[:current_user], :download_code, project) }
# Avoids an N+1 query: https://github.com/mbleigh/acts-as-taggable-on/issues/91#issuecomment-168273770
expose :tag_list do |project|
# project.tags.order(:name).pluck(:name) is the most suitable option
@@ -261,7 +261,7 @@ module API
expose :open_issues_count, if: lambda { |project, options| project.feature_available?(:issues, options[:current_user]) }
expose :runners_token, if: lambda { |_project, options| options[:user_can_admin_project] }
expose :public_builds, as: :public_jobs
- expose :ci_config_path
+ expose :ci_config_path, if: -> (project, options) { Ability.allowed?(options[:current_user], :download_code, project) }
expose :shared_with_groups do |project, options|
SharedGroup.represent(project.project_group_links, options)
end
@@ -270,8 +270,9 @@ module API
expose :only_allow_merge_if_all_discussions_are_resolved
expose :printing_merge_request_link_enabled
expose :merge_method
-
- expose :statistics, using: 'API::Entities::ProjectStatistics', if: :statistics
+ expose :statistics, using: 'API::Entities::ProjectStatistics', if: -> (project, options) {
+ options[:statistics] && Ability.allowed?(options[:current_user], :download_code, project)
+ }
# rubocop: disable CodeReuse/ActiveRecord
def self.preload_relation(projects_relation, options = {})
@@ -882,7 +883,8 @@ module API
expose :target_type
expose :target do |todo, options|
- todo_target_class(todo.target_type).represent(todo.target, options)
+ todo_options = options.fetch(todo.target_type, {})
+ todo_target_class(todo.target_type).represent(todo.target, todo_options)
end
expose :target_url do |todo, options|
diff --git a/lib/api/environments.rb b/lib/api/environments.rb
index 0278c6c54a5..5b0f3b914cb 100644
--- a/lib/api/environments.rb
+++ b/lib/api/environments.rb
@@ -22,7 +22,7 @@ module API
get ':id/environments' do
authorize! :read_environment, user_project
- present paginate(user_project.environments), with: Entities::Environment
+ present paginate(user_project.environments), with: Entities::Environment, current_user: current_user
end
desc 'Creates a new environment' do
@@ -40,7 +40,7 @@ module API
environment = user_project.environments.create(declared_params)
if environment.persisted?
- present environment, with: Entities::Environment
+ present environment, with: Entities::Environment, current_user: current_user
else
render_validation_error!(environment)
end
@@ -63,7 +63,7 @@ module API
update_params = declared_params(include_missing: false).extract!(:name, :external_url)
if environment.update(update_params)
- present environment, with: Entities::Environment
+ present environment, with: Entities::Environment, current_user: current_user
else
render_validation_error!(environment)
end
@@ -99,7 +99,7 @@ module API
environment.stop_with_action!(current_user)
status 200
- present environment, with: Entities::Environment
+ present environment, with: Entities::Environment, current_user: current_user
end
end
end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 54cd4cd9cdb..825fab62034 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -244,6 +244,10 @@ module API
authorize! :read_build, user_project
end
+ def authorize_destroy_artifacts!
+ authorize! :destroy_artifacts, user_project
+ end
+
def authorize_update_builds!
authorize! :update_build, user_project
end
diff --git a/lib/api/helpers/graphql_helpers.rb b/lib/api/helpers/graphql_helpers.rb
new file mode 100644
index 00000000000..94010ab1bc2
--- /dev/null
+++ b/lib/api/helpers/graphql_helpers.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ # GraphqlHelpers is used by the REST API when it is acting like a client
+ # against the graphql API. Helper code for the graphql server implementation
+ # should be in app/graphql/ or lib/gitlab/graphql/
+ module GraphqlHelpers
+ def conditionally_graphql!(fallback:, query:, context: {}, transform: nil)
+ return fallback.call unless Feature.enabled?(:graphql)
+
+ result = GitlabSchema.execute(query, context: context)
+
+ if transform
+ transform.call(result)
+ else
+ result
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/helpers/notes_helpers.rb b/lib/api/helpers/notes_helpers.rb
index 216b2c45741..795dca5cf03 100644
--- a/lib/api/helpers/notes_helpers.rb
+++ b/lib/api/helpers/notes_helpers.rb
@@ -70,14 +70,7 @@ module API
def find_noteable(parent, noteables_str, noteable_id)
noteable = public_send("find_#{parent}_#{noteables_str.singularize}", noteable_id) # rubocop:disable GitlabSecurity/PublicSend
- readable =
- if noteable.is_a?(Commit)
- # for commits there is not :read_commit policy, check if user
- # has :read_note permission on the commit's project
- can?(current_user, :read_note, user_project)
- else
- can?(current_user, noteable_read_ability_name(noteable), noteable)
- end
+ readable = can?(current_user, noteable_read_ability_name(noteable), noteable)
return not_found!(noteables_str) unless readable
@@ -89,12 +82,11 @@ module API
end
def create_note(noteable, opts)
- policy_object = noteable.is_a?(Commit) ? user_project : noteable
- authorize!(:create_note, policy_object)
+ authorize!(:create_note, noteable)
parent = noteable_parent(noteable)
- opts.delete(:created_at) unless current_user.can?(:set_note_created_at, policy_object)
+ opts.delete(:created_at) unless current_user.can?(:set_note_created_at, noteable)
opts[:updated_at] = opts[:created_at] if opts[:created_at]
diff --git a/lib/api/helpers/pagination.rb b/lib/api/helpers/pagination.rb
index d00e61678b5..94b58a64d26 100644
--- a/lib/api/helpers/pagination.rb
+++ b/lib/api/helpers/pagination.rb
@@ -149,7 +149,7 @@ module API
def conditions(pagination)
fields = pagination.fields
- return nil if fields.empty?
+ return if fields.empty?
placeholder = fields.map { '?' }
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index f43f4d961d6..b2ec4ed898e 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -28,13 +28,13 @@ module API
args[:scope] = args[:scope].underscore if args[:scope]
issues = IssuesFinder.new(current_user, args).execute
- .preload(:assignees, :labels, :notes, :timelogs, :project, :author, :closed_by)
+ .with_api_entity_associations
issues.reorder(order_options_with_tie_breaker)
end
# rubocop: enable CodeReuse/ActiveRecord
params :issues_params do
- optional :labels, type: String, desc: 'Comma-separated list of label names'
+ optional :labels, type: Array[String], coerce_with: Validations::Types::LabelsList.coerce, desc: 'Comma-separated list of label names'
optional :milestone, type: String, desc: 'Milestone title'
optional :order_by, type: String, values: %w[created_at updated_at], default: 'created_at',
desc: 'Return issues ordered by `created_at` or `updated_at` fields.'
@@ -65,7 +65,7 @@ module API
optional :assignee_ids, type: Array[Integer], desc: 'The array of user IDs to assign issue'
optional :assignee_id, type: Integer, desc: '[Deprecated] The ID of a user to assign issue'
optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign issue'
- optional :labels, type: String, desc: 'Comma-separated list of label names'
+ optional :labels, type: Array[String], coerce_with: Validations::Types::LabelsList.coerce, desc: 'Comma-separated list of label names'
optional :due_date, type: String, desc: 'Date string in the format YEAR-MONTH-DAY'
optional :confidential, type: Boolean, desc: 'Boolean parameter if the issue should be confidential'
optional :discussion_locked, type: Boolean, desc: " Boolean parameter indicating if the issue's discussion is locked"
diff --git a/lib/api/job_artifacts.rb b/lib/api/job_artifacts.rb
index 933bd067e26..e7fed55170e 100644
--- a/lib/api/job_artifacts.rb
+++ b/lib/api/job_artifacts.rb
@@ -109,6 +109,22 @@ module API
status 200
present build, with: Entities::Job
end
+
+ desc 'Delete the artifacts files from a job' do
+ detail 'This feature was introduced in GitLab 11.9'
+ end
+ params do
+ requires :job_id, type: Integer, desc: 'The ID of a job'
+ end
+ delete ':id/jobs/:job_id/artifacts' do
+ authorize_destroy_artifacts!
+ build = find_build!(params[:job_id])
+ authorize!(:destroy_artifacts, build)
+
+ build.erase_erasable_artifacts!
+
+ status :no_content
+ end
end
end
end
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 44f1e81caf2..123b7a83185 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -45,7 +45,7 @@ module API
return merge_requests if args[:view] == 'simple'
merge_requests
- .preload(:notes, :author, :assignee, :milestone, :latest_merge_request_diff, :labels, :timelogs, metrics: [:latest_closed_by, :merged_by])
+ .with_api_entity_associations
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -95,7 +95,7 @@ module API
optional :sort, type: String, values: %w[asc desc], default: 'desc',
desc: 'Return merge requests sorted in `asc` or `desc` order.'
optional :milestone, type: String, desc: 'Return merge requests for a specific milestone'
- optional :labels, type: String, desc: 'Comma-separated list of label names'
+ optional :labels, type: Array[String], coerce_with: Validations::Types::LabelsList.coerce, desc: 'Comma-separated list of label names'
optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
optional :updated_after, type: DateTime, desc: 'Return merge requests updated after the specified time'
@@ -179,8 +179,8 @@ module API
optional :description, type: String, desc: 'The description of the merge request'
optional :assignee_id, type: Integer, desc: 'The ID of a user to assign the merge request'
optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign the merge request'
- optional :labels, type: String, desc: 'Comma-separated list of label names'
- optional :remove_source_branch, type: Boolean, desc: 'Delete source branch when merging'
+ optional :labels, type: Array[String], coerce_with: Validations::Types::LabelsList.coerce, desc: 'Comma-separated list of label names'
+ optional :remove_source_branch, type: Boolean, desc: 'Remove source branch when merging'
optional :allow_collaboration, type: Boolean, desc: 'Allow commits from members who can merge to the target branch'
optional :allow_maintainer_to_push, type: Boolean, as: :allow_collaboration, desc: '[deprecated] See allow_collaboration'
optional :squash, type: Grape::API::Boolean, desc: 'When true, the commits will be squashed into a single commit on merge'
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index b23fe6cd4e7..91501ba4d36 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -184,7 +184,8 @@ module API
if project.saved?
present project, with: Entities::Project,
- user_can_admin_project: can?(current_user, :admin_project, project)
+ user_can_admin_project: can?(current_user, :admin_project, project),
+ current_user: current_user
else
if project.errors[:limit_reached].present?
error!(project.errors[:limit_reached], 403)
@@ -217,7 +218,8 @@ module API
if project.saved?
present project, with: Entities::Project,
- user_can_admin_project: can?(current_user, :admin_project, project)
+ user_can_admin_project: can?(current_user, :admin_project, project),
+ current_user: current_user
else
render_validation_error!(project)
end
@@ -281,7 +283,8 @@ module API
conflict!(forked_project.errors.messages)
else
present forked_project, with: Entities::Project,
- user_can_admin_project: can?(current_user, :admin_project, forked_project)
+ user_can_admin_project: can?(current_user, :admin_project, forked_project),
+ current_user: current_user
end
end
@@ -330,7 +333,8 @@ module API
if result[:status] == :success
present user_project, with: Entities::Project,
- user_can_admin_project: can?(current_user, :admin_project, user_project)
+ user_can_admin_project: can?(current_user, :admin_project, user_project),
+ current_user: current_user
else
render_validation_error!(user_project)
end
@@ -344,7 +348,7 @@ module API
::Projects::UpdateService.new(user_project, current_user, archived: true).execute
- present user_project, with: Entities::Project
+ present user_project, with: Entities::Project, current_user: current_user
end
desc 'Unarchive a project' do
@@ -355,7 +359,7 @@ module API
::Projects::UpdateService.new(@project, current_user, archived: false).execute
- present user_project, with: Entities::Project
+ present user_project, with: Entities::Project, current_user: current_user
end
desc 'Star a project' do
@@ -368,7 +372,7 @@ module API
current_user.toggle_star(user_project)
user_project.reload
- present user_project, with: Entities::Project
+ present user_project, with: Entities::Project, current_user: current_user
end
end
@@ -380,7 +384,7 @@ module API
current_user.toggle_star(user_project)
user_project.reload
- present user_project, with: Entities::Project
+ present user_project, with: Entities::Project, current_user: current_user
else
not_modified!
end
@@ -420,7 +424,7 @@ module API
result = ::Projects::ForkService.new(fork_from_project, current_user).execute(user_project)
if result
- present user_project.reload, with: Entities::Project
+ present user_project.reload, with: Entities::Project, current_user: current_user
else
render_api_error!("Project already forked", 409) if user_project.forked?
end
@@ -442,27 +446,24 @@ module API
end
params do
requires :group_id, type: Integer, desc: 'The ID of a group'
- requires :group_access, type: Integer, values: Gitlab::Access.values, desc: 'The group access level'
+ requires :group_access, type: Integer, values: Gitlab::Access.values, as: :link_group_access, desc: 'The group access level'
optional :expires_at, type: Date, desc: 'Share expiration date'
end
post ":id/share" do
authorize! :admin_project, user_project
group = Group.find_by_id(params[:group_id])
- unless group && can?(current_user, :read_group, group)
- not_found!('Group')
- end
-
unless user_project.allowed_to_share_with_group?
break render_api_error!("The project sharing with group is disabled", 400)
end
- link = user_project.project_group_links.new(declared_params(include_missing: false))
+ result = ::Projects::GroupLinks::CreateService.new(user_project, current_user, declared_params(include_missing: false))
+ .execute(group)
- if link.save
- present link, with: Entities::ProjectGroupLink
+ if result[:status] == :success
+ present result[:link], with: Entities::ProjectGroupLink
else
- render_api_error!(link.errors.full_messages.first, 409)
+ render_api_error!(result[:message], result[:http_status])
end
end
@@ -526,7 +527,7 @@ module API
result = ::Projects::TransferService.new(user_project, current_user).execute(namespace)
if result
- present user_project, with: Entities::Project
+ present user_project, with: Entities::Project, current_user: current_user
else
render_api_error!("Failed to transfer project #{user_project.errors.messages}", 400)
end
diff --git a/lib/api/release/links.rb b/lib/api/release/links.rb
index e3072684ef7..5d1b40e3bff 100644
--- a/lib/api/release/links.rb
+++ b/lib/api/release/links.rb
@@ -8,6 +8,8 @@ module API
RELEASE_ENDPOINT_REQUIREMETS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS
.merge(tag_name: API::NO_SLASH_URL_PART_REGEX)
+ before { authorize! :read_release, user_project }
+
params do
requires :id, type: String, desc: 'The ID of a project'
end
diff --git a/lib/api/runners.rb b/lib/api/runners.rb
index f72b33605a7..f3fea463e7f 100644
--- a/lib/api/runners.rb
+++ b/lib/api/runners.rb
@@ -17,6 +17,7 @@ module API
desc: 'The type of the runners to show'
optional :status, type: String, values: Ci::Runner::AVAILABLE_STATUSES,
desc: 'The status of the runners to show'
+ optional :tag_list, type: Array[String], desc: 'The tags of the runners to show'
use :pagination
end
get do
@@ -24,6 +25,7 @@ module API
runners = filter_runners(runners, params[:scope], allowed_scopes: Ci::Runner::AVAILABLE_STATUSES)
runners = filter_runners(runners, params[:type], allowed_scopes: Ci::Runner::AVAILABLE_TYPES)
runners = filter_runners(runners, params[:status], allowed_scopes: Ci::Runner::AVAILABLE_STATUSES)
+ runners = runners.tagged_with(params[:tag_list]) if params[:tag_list]
present paginate(runners), with: Entities::Runner
end
@@ -38,6 +40,7 @@ module API
desc: 'The type of the runners to show'
optional :status, type: String, values: Ci::Runner::AVAILABLE_STATUSES,
desc: 'The status of the runners to show'
+ optional :tag_list, type: Array[String], desc: 'The tags of the runners to show'
use :pagination
end
get 'all' do
@@ -47,6 +50,7 @@ module API
runners = filter_runners(runners, params[:scope])
runners = filter_runners(runners, params[:type], allowed_scopes: Ci::Runner::AVAILABLE_TYPES)
runners = filter_runners(runners, params[:status], allowed_scopes: Ci::Runner::AVAILABLE_STATUSES)
+ runners = runners.tagged_with(params[:tag_list]) if params[:tag_list]
present paginate(runners), with: Entities::Runner
end
@@ -139,6 +143,7 @@ module API
desc: 'The type of the runners to show'
optional :status, type: String, values: Ci::Runner::AVAILABLE_STATUSES,
desc: 'The status of the runners to show'
+ optional :tag_list, type: Array[String], desc: 'The tags of the runners to show'
use :pagination
end
get ':id/runners' do
@@ -146,6 +151,7 @@ module API
runners = filter_runners(runners, params[:scope])
runners = filter_runners(runners, params[:type], allowed_scopes: Ci::Runner::AVAILABLE_TYPES)
runners = filter_runners(runners, params[:status], allowed_scopes: Ci::Runner::AVAILABLE_STATUSES)
+ runners = runners.tagged_with(params[:tag_list]) if params[:tag_list]
present paginate(runners), with: Entities::Runner
end
diff --git a/lib/api/snippets.rb b/lib/api/snippets.rb
index 326d55afd0e..f8b37b33348 100644
--- a/lib/api/snippets.rb
+++ b/lib/api/snippets.rb
@@ -16,6 +16,10 @@ module API
def public_snippets
SnippetsFinder.new(current_user, scope: :are_public).execute
end
+
+ def snippets
+ SnippetsFinder.new(current_user).execute
+ end
end
desc 'Get a snippets list for authenticated user' do
@@ -48,7 +52,10 @@ module API
requires :id, type: Integer, desc: 'The ID of a snippet'
end
get ':id' do
- snippet = snippets_for_current_user.find(params[:id])
+ snippet = snippets.find_by_id(params[:id])
+
+ break not_found!('Snippet') unless snippet
+
present snippet, with: Entities::PersonalSnippet
end
@@ -94,9 +101,8 @@ module API
desc: 'The visibility of the snippet'
at_least_one_of :title, :file_name, :content, :visibility
end
- # rubocop: disable CodeReuse/ActiveRecord
put ':id' do
- snippet = snippets_for_current_user.find_by(id: params.delete(:id))
+ snippet = snippets_for_current_user.find_by_id(params.delete(:id))
break not_found!('Snippet') unless snippet
authorize! :update_personal_snippet, snippet
@@ -113,7 +119,6 @@ module API
render_validation_error!(snippet)
end
end
- # rubocop: enable CodeReuse/ActiveRecord
desc 'Remove snippet' do
detail 'This feature was introduced in GitLab 8.15.'
@@ -122,16 +127,14 @@ module API
params do
requires :id, type: Integer, desc: 'The ID of a snippet'
end
- # rubocop: disable CodeReuse/ActiveRecord
delete ':id' do
- snippet = snippets_for_current_user.find_by(id: params.delete(:id))
+ snippet = snippets_for_current_user.find_by_id(params.delete(:id))
break not_found!('Snippet') unless snippet
authorize! :destroy_personal_snippet, snippet
destroy_conditionally!(snippet)
end
- # rubocop: enable CodeReuse/ActiveRecord
desc 'Get a raw snippet' do
detail 'This feature was introduced in GitLab 8.15.'
@@ -139,9 +142,8 @@ module API
params do
requires :id, type: Integer, desc: 'The ID of a snippet'
end
- # rubocop: disable CodeReuse/ActiveRecord
get ":id/raw" do
- snippet = snippets_for_current_user.find_by(id: params.delete(:id))
+ snippet = snippets.find_by_id(params.delete(:id))
break not_found!('Snippet') unless snippet
env['api.format'] = :txt
@@ -149,7 +151,6 @@ module API
header['Content-Disposition'] = 'attachment'
present snippet.content
end
- # rubocop: enable CodeReuse/ActiveRecord
desc 'Get the user agent details for a snippet' do
success Entities::UserAgentDetail
@@ -157,17 +158,15 @@ module API
params do
requires :id, type: Integer, desc: 'The ID of a snippet'
end
- # rubocop: disable CodeReuse/ActiveRecord
get ":id/user_agent_detail" do
authenticated_as_admin!
- snippet = Snippet.find_by!(id: params[:id])
+ snippet = Snippet.find_by_id!(params[:id])
break not_found!('UserAgentDetail') unless snippet.user_agent_detail
present snippet.user_agent_detail, with: Entities::UserAgentDetail
end
- # rubocop: enable CodeReuse/ActiveRecord
end
end
end
diff --git a/lib/api/todos.rb b/lib/api/todos.rb
index 64ac8ece56c..d2196f05173 100644
--- a/lib/api/todos.rb
+++ b/lib/api/todos.rb
@@ -6,6 +6,8 @@ module API
before { authenticate! }
+ helpers ::Gitlab::IssuableMetadata
+
ISSUABLE_TYPES = {
'merge_requests' => ->(iid) { find_merge_request_with_access(iid) },
'issues' => ->(iid) { find_project_issue(iid) }
@@ -42,6 +44,30 @@ module API
def find_todos
TodosFinder.new(current_user, params).execute
end
+
+ def issuable_and_awardable?(type)
+ obj_type = Object.const_get(type)
+
+ (obj_type < Issuable) && (obj_type < Awardable)
+ rescue NameError
+ false
+ end
+
+ def batch_load_issuable_metadata(todos, options)
+ # This should be paginated and will cause Rails to SELECT for all the Todos
+ todos_by_type = todos.group_by(&:target_type)
+
+ todos_by_type.keys.each do |type|
+ next unless issuable_and_awardable?(type)
+
+ collection = todos_by_type[type]
+
+ next unless collection
+
+ targets = collection.map(&:target)
+ options[type] = { issuable_metadata: issuable_meta_data(targets, type) }
+ end
+ end
end
desc 'Get a todo list' do
@@ -51,7 +77,11 @@ module API
use :pagination
end
get do
- present paginate(find_todos), with: Entities::Todo, current_user: current_user
+ todos = paginate(find_todos.with_api_entity_associations)
+ options = { with: Entities::Todo, current_user: current_user }
+ batch_load_issuable_metadata(todos, options)
+
+ present todos, options
end
desc 'Mark a todo as done' do
diff --git a/lib/api/validations/types/labels_list.rb b/lib/api/validations/types/labels_list.rb
new file mode 100644
index 00000000000..47cd83c29cf
--- /dev/null
+++ b/lib/api/validations/types/labels_list.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module API
+ module Validations
+ module Types
+ class LabelsList
+ def self.coerce
+ lambda do |value|
+ case value
+ when String
+ value.split(',').map(&:strip)
+ when Array
+ value.map { |v| v.to_s.split(',').map(&:strip) }.flatten
+ when LabelsList
+ value
+ else
+ []
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/version.rb b/lib/api/version.rb
index 74cd857f447..eca1b529094 100644
--- a/lib/api/version.rb
+++ b/lib/api/version.rb
@@ -2,13 +2,29 @@
module API
class Version < Grape::API
+ helpers ::API::Helpers::GraphqlHelpers
+
before { authenticate! }
+ METADATA_QUERY = <<~EOF
+ {
+ metadata {
+ version
+ revision
+ }
+ }
+ EOF
+
desc 'Get the version information of the GitLab instance.' do
detail 'This feature was introduced in GitLab 8.13.'
end
get '/version' do
- { version: Gitlab::VERSION, revision: Gitlab.revision }
+ conditionally_graphql!(
+ query: METADATA_QUERY,
+ context: { current_user: current_user },
+ transform: ->(result) { result.dig('data', 'metadata') },
+ fallback: -> { { version: Gitlab::VERSION, revision: Gitlab.revision } }
+ )
end
end
end
diff --git a/lib/banzai/pipeline/markup_pipeline.rb b/lib/banzai/pipeline/markup_pipeline.rb
index db79a22549c..ceba082cd4f 100644
--- a/lib/banzai/pipeline/markup_pipeline.rb
+++ b/lib/banzai/pipeline/markup_pipeline.rb
@@ -7,7 +7,8 @@ module Banzai
@filters ||= FilterArray[
Filter::SanitizationFilter,
Filter::ExternalLinkFilter,
- Filter::PlantumlFilter
+ Filter::PlantumlFilter,
+ Filter::SyntaxHighlightFilter
]
end
end
diff --git a/lib/bitbucket_server/collection.rb b/lib/bitbucket_server/collection.rb
index 7e4b2277bbe..f549acbd87f 100644
--- a/lib/bitbucket_server/collection.rb
+++ b/lib/bitbucket_server/collection.rb
@@ -25,13 +25,13 @@ module BitbucketServer
end
def prev_page
- return nil unless current_page > 1
+ return unless current_page > 1
current_page - 1
end
def next_page
- return nil unless has_next_page?
+ return unless has_next_page?
current_page + 1
end
diff --git a/lib/constraints/project_url_constrainer.rb b/lib/constraints/project_url_constrainer.rb
index eadfbf7bc01..d41490d2ebd 100644
--- a/lib/constraints/project_url_constrainer.rb
+++ b/lib/constraints/project_url_constrainer.rb
@@ -2,12 +2,13 @@
module Constraints
class ProjectUrlConstrainer
- def matches?(request)
+ def matches?(request, existence_check: true)
namespace_path = request.params[:namespace_id]
project_path = request.params[:project_id] || request.params[:id]
full_path = [namespace_path, project_path].join('/')
return false unless ProjectPathValidator.valid_path?(full_path)
+ return true unless existence_check
# We intentionally allow SELECT(*) here so result of this query can be used
# as cache for further Project.find_by_full_path calls within request
diff --git a/lib/declarative_policy/rule.rb b/lib/declarative_policy/rule.rb
index f38f4f0a50f..964d35cde9e 100644
--- a/lib/declarative_policy/rule.rb
+++ b/lib/declarative_policy/rule.rb
@@ -84,7 +84,7 @@ module DeclarativePolicy
# returns nil unless it's already cached
def cached_pass?(context)
condition = context.condition(@name)
- return nil unless condition.cached?
+ return unless condition.cached?
condition.pass?
end
@@ -124,7 +124,7 @@ module DeclarativePolicy
def cached_pass?(context)
condition = delegated_context(context).condition(@name)
- return nil unless condition.cached?
+ return unless condition.cached?
condition.pass?
rescue MissingDelegate
@@ -161,7 +161,7 @@ module DeclarativePolicy
def cached_pass?(context)
runner = context.runner(@ability)
- return nil unless runner.cached?
+ return unless runner.cached?
runner.pass?
end
diff --git a/lib/event_filter.rb b/lib/event_filter.rb
index 24fdcd6fbb1..85bf9c14f26 100644
--- a/lib/event_filter.rb
+++ b/lib/event_filter.rb
@@ -33,7 +33,7 @@ class EventFilter
when TEAM
events.where(action: [Event::JOINED, Event::LEFT, Event::EXPIRED])
when ISSUE
- events.where(action: [Event::CREATED, Event::UPDATED, Event::CLOSED, Event::REOPENED])
+ events.where(action: [Event::CREATED, Event::UPDATED, Event::CLOSED, Event::REOPENED], target_type: 'Issue')
else
events
end
diff --git a/lib/gitlab.rb b/lib/gitlab.rb
index e073450283b..f42ca5a9cd6 100644
--- a/lib/gitlab.rb
+++ b/lib/gitlab.rb
@@ -58,6 +58,10 @@ module Gitlab
Rails.env.development? || org? || com?
end
+ def self.ee?
+ Object.const_defined?(:License)
+ end
+
def self.process_name
return 'sidekiq' if Sidekiq.server?
return 'console' if defined?(Rails::Console)
diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb
index 7ceb96f502b..47d63eb53cf 100644
--- a/lib/gitlab/auth/ldap/config.rb
+++ b/lib/gitlab/auth/ldap/config.rb
@@ -75,7 +75,8 @@ module Gitlab
encryption: options['encryption'],
filter: omniauth_user_filter,
name_proc: name_proc,
- disable_verify_certificates: !options['verify_certificates']
+ disable_verify_certificates: !options['verify_certificates'],
+ tls_options: tls_options
)
if has_auth?
@@ -85,9 +86,6 @@ module Gitlab
)
end
- opts[:ca_file] = options['ca_file'] if options['ca_file'].present?
- opts[:ssl_version] = options['ssl_version'] if options['ssl_version'].present?
-
opts
end
@@ -196,24 +194,28 @@ module Gitlab
end
def encryption_options
- method = translate_method(options['encryption'])
- return nil unless method
+ method = translate_method
+ return unless method
{
method: method,
- tls_options: tls_options(method)
+ tls_options: tls_options
}
end
- def translate_method(method_from_config)
- NET_LDAP_ENCRYPTION_METHOD[method_from_config.to_sym]
+ def translate_method
+ NET_LDAP_ENCRYPTION_METHOD[options['encryption']&.to_sym]
end
- def tls_options(method)
- return { verify_mode: OpenSSL::SSL::VERIFY_NONE } unless method
+ def tls_options
+ return @tls_options if defined?(@tls_options)
+
+ method = translate_method
+ return unless method
- opts = if options['verify_certificates']
- OpenSSL::SSL::SSLContext::DEFAULT_PARAMS
+ opts = if options['verify_certificates'] && method != 'plain'
+ # Dup so we don't accidentally overwrite the constant
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.dup
else
# It is important to explicitly set verify_mode for two reasons:
# 1. The behavior of OpenSSL is undefined when verify_mode is not set.
@@ -222,10 +224,35 @@ module Gitlab
{ verify_mode: OpenSSL::SSL::VERIFY_NONE }
end
- opts[:ca_file] = options['ca_file'] if options['ca_file'].present?
- opts[:ssl_version] = options['ssl_version'] if options['ssl_version'].present?
+ opts.merge!(custom_tls_options)
- opts
+ @tls_options = opts
+ end
+
+ def custom_tls_options
+ return {} unless options['tls_options']
+
+ # Dup so we don't overwrite the original value
+ custom_options = options['tls_options'].dup.delete_if { |_, value| value.nil? || value.blank? }
+ custom_options.symbolize_keys!
+
+ if custom_options[:cert]
+ begin
+ custom_options[:cert] = OpenSSL::X509::Certificate.new(custom_options[:cert])
+ rescue OpenSSL::X509::CertificateError => e
+ Rails.logger.error "LDAP TLS Options 'cert' is invalid for provider #{provider}: #{e.message}"
+ end
+ end
+
+ if custom_options[:key]
+ begin
+ custom_options[:key] = OpenSSL::PKey.read(custom_options[:key])
+ rescue OpenSSL::PKey::PKeyError => e
+ Rails.logger.error "LDAP TLS Options 'key' is invalid for provider #{provider}: #{e.message}"
+ end
+ end
+
+ custom_options
end
def auth_options
diff --git a/lib/gitlab/auth/ldap/person.rb b/lib/gitlab/auth/ldap/person.rb
index 48d134f91b0..13d67e0f871 100644
--- a/lib/gitlab/auth/ldap/person.rb
+++ b/lib/gitlab/auth/ldap/person.rb
@@ -112,7 +112,7 @@ module Gitlab
attributes = Array(config.attributes[attribute.to_s])
selected_attr = attributes.find { |attr| entry.respond_to?(attr) }
- return nil unless selected_attr
+ return unless selected_attr
entry.public_send(selected_attr) # rubocop:disable GitlabSecurity/PublicSend
end
diff --git a/lib/gitlab/auth/omniauth_identity_linker_base.rb b/lib/gitlab/auth/omniauth_identity_linker_base.rb
index 253445570f2..c620fc5d6bd 100644
--- a/lib/gitlab/auth/omniauth_identity_linker_base.rb
+++ b/lib/gitlab/auth/omniauth_identity_linker_base.rb
@@ -12,7 +12,7 @@ module Gitlab
end
def link
- save if identity.new_record?
+ save if unlinked?
end
def changed?
@@ -35,6 +35,10 @@ module Gitlab
@changed = identity.save
end
+ def unlinked?
+ identity.new_record?
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def identity
@identity ||= current_user.identities
diff --git a/lib/gitlab/auth/saml/auth_hash.rb b/lib/gitlab/auth/saml/auth_hash.rb
index 1af9fa40c3a..b0df9757bbd 100644
--- a/lib/gitlab/auth/saml/auth_hash.rb
+++ b/lib/gitlab/auth/saml/auth_hash.rb
@@ -10,11 +10,11 @@ module Gitlab
def authn_context
response_object = auth_hash.extra[:response_object]
- return nil if response_object.blank?
+ return if response_object.blank?
document = response_object.decrypted_document
document ||= response_object.document
- return nil if document.blank?
+ return if document.blank?
extract_authn_context(document)
end
diff --git a/lib/gitlab/background_migration/encrypt_columns.rb b/lib/gitlab/background_migration/encrypt_columns.rb
index b9ad8267e37..173543b7c25 100644
--- a/lib/gitlab/background_migration/encrypt_columns.rb
+++ b/lib/gitlab/background_migration/encrypt_columns.rb
@@ -91,7 +91,8 @@ module Gitlab
# No need to do anything if the plaintext is nil, or an encrypted
# value already exists
- return nil unless plaintext.present? && !ciphertext.present?
+ return unless plaintext.present?
+ return if ciphertext.present?
# attr_encrypted will calculate and set the expected value for us
instance.public_send("#{plain_column}=", plaintext) # rubocop:disable GitlabSecurity/PublicSend
diff --git a/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb b/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb
index 38fecac1bfe..42fcaa87e66 100644
--- a/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb
+++ b/lib/gitlab/background_migration/migrate_events_to_push_event_payloads.rb
@@ -24,7 +24,7 @@ module Gitlab
def commit_title
commit = commits.last
- return nil unless commit && commit[:message]
+ return unless commit && commit[:message]
index = commit[:message].index("\n")
message = index ? commit[:message][0..index] : commit[:message]
diff --git a/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb
index 4a9a62aaeb5..a84f794bfae 100644
--- a/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb
+++ b/lib/gitlab/background_migration/populate_untracked_uploads_dependencies.rb
@@ -127,7 +127,7 @@ module Gitlab
full_path = matchd[1]
project = Gitlab::BackgroundMigration::PopulateUntrackedUploadsDependencies::Project.find_by_full_path(full_path)
- return nil unless project
+ return unless project
project.id
end
diff --git a/lib/gitlab/bare_repository_import/importer.rb b/lib/gitlab/bare_repository_import/importer.rb
index 3cd327f5109..144ba2ec031 100644
--- a/lib/gitlab/bare_repository_import/importer.rb
+++ b/lib/gitlab/bare_repository_import/importer.rb
@@ -108,7 +108,7 @@ module Gitlab
end
def find_or_create_groups
- return nil unless group_path.present?
+ return unless group_path.present?
log " * Using namespace: #{group_path}"
diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb
index 75a3f17f549..441fdec8a1e 100644
--- a/lib/gitlab/bitbucket_import/importer.rb
+++ b/lib/gitlab/bitbucket_import/importer.rb
@@ -47,7 +47,7 @@ module Gitlab
# rubocop: disable CodeReuse/ActiveRecord
def find_user_id(username)
- return nil unless username
+ return unless username
return users[username] if users.key?(username)
diff --git a/lib/gitlab/bitbucket_server_import/importer.rb b/lib/gitlab/bitbucket_server_import/importer.rb
index dbbedd5dcbe..4a789ae457f 100644
--- a/lib/gitlab/bitbucket_server_import/importer.rb
+++ b/lib/gitlab/bitbucket_server_import/importer.rb
@@ -65,7 +65,7 @@ module Gitlab
end
def find_user_id(email)
- return nil unless email
+ return unless email
return users[email] if users.key?(email)
diff --git a/lib/gitlab/checks/branch_check.rb b/lib/gitlab/checks/branch_check.rb
index d06b2df36f2..ad926739752 100644
--- a/lib/gitlab/checks/branch_check.rb
+++ b/lib/gitlab/checks/branch_check.rb
@@ -9,13 +9,17 @@ module Gitlab
non_master_delete_protected_branch: 'You are not allowed to delete protected branches from this project. Only a project maintainer or owner can delete a protected branch.',
non_web_delete_protected_branch: 'You can only delete protected branches using the web interface.',
merge_protected_branch: 'You are not allowed to merge code into protected branches on this project.',
- push_protected_branch: 'You are not allowed to push code to protected branches on this project.'
+ push_protected_branch: 'You are not allowed to push code to protected branches on this project.',
+ create_protected_branch: 'You are not allowed to create protected branches on this project.',
+ invalid_commit_create_protected_branch: 'You can only use an existing protected branch ref as the basis of a new protected branch.',
+ non_web_create_protected_branch: 'You can only create protected branches using the web interface and API.'
}.freeze
LOG_MESSAGES = {
delete_default_branch_check: "Checking if default branch is being deleted...",
protected_branch_checks: "Checking if you are force pushing to a protected branch...",
protected_branch_push_checks: "Checking if you are allowed to push to the protected branch...",
+ protected_branch_creation_checks: "Checking if you are allowed to create a protected branch...",
protected_branch_deletion_checks: "Checking if you are allowed to delete the protected branch..."
}.freeze
@@ -42,13 +46,33 @@ module Gitlab
end
end
- if deletion?
+ if project.empty_repo?
+ protected_branch_push_checks
+ elsif creation? && protected_branch_creation_enabled?
+ protected_branch_creation_checks
+ elsif deletion?
protected_branch_deletion_checks
else
protected_branch_push_checks
end
end
+ def protected_branch_creation_checks
+ logger.log_timed(LOG_MESSAGES[:protected_branch_creation_checks]) do
+ unless user_access.can_merge_to_branch?(branch_name)
+ raise GitAccess::UnauthorizedError, ERROR_MESSAGES[:create_protected_branch]
+ end
+
+ unless safe_commit_for_new_protected_branch?
+ raise GitAccess::UnauthorizedError, ERROR_MESSAGES[:invalid_commit_create_protected_branch]
+ end
+
+ unless updated_from_web?
+ raise GitAccess::UnauthorizedError, ERROR_MESSAGES[:non_web_create_protected_branch]
+ end
+ end
+ end
+
def protected_branch_deletion_checks
logger.log_timed(LOG_MESSAGES[:protected_branch_deletion_checks]) do
unless user_access.can_delete_branch?(branch_name)
@@ -98,6 +122,10 @@ module Gitlab
Gitlab::Routing.url_helpers.project_project_members_url(project)
end
+ def protected_branch_creation_enabled?
+ Feature.enabled?(:protected_branch_creation, project, default_enabled: true)
+ end
+
def matching_merge_request?
Checks::MatchingMergeRequest.new(newrev, branch_name, project).match?
end
@@ -105,6 +133,10 @@ module Gitlab
def forced_push?
Gitlab::Checks::ForcePush.force_push?(project, oldrev, newrev)
end
+
+ def safe_commit_for_new_protected_branch?
+ ProtectedBranch.any_protected?(project, project.repository.branch_names_contains_sha(newrev))
+ end
end
end
end
diff --git a/lib/gitlab/ci/ansi2html.rb b/lib/gitlab/ci/ansi2html.rb
index 4dcb3869d4f..fba0de20ced 100644
--- a/lib/gitlab/ci/ansi2html.rb
+++ b/lib/gitlab/ci/ansi2html.rb
@@ -313,7 +313,7 @@ module Gitlab
def get_term_color_class(color_index, prefix)
color_name = COLOR[color_index]
- return nil if color_name.nil?
+ return if color_name.nil?
get_color_class(["term", prefix, color_name])
end
diff --git a/lib/gitlab/ci/build/artifacts/metadata.rb b/lib/gitlab/ci/build/artifacts/metadata.rb
index 08dac756cc1..d45a044686e 100644
--- a/lib/gitlab/ci/build/artifacts/metadata.rb
+++ b/lib/gitlab/ci/build/artifacts/metadata.rb
@@ -103,7 +103,7 @@ module Gitlab
def read_string(gz)
string_size = read_uint32(gz)
- return nil unless string_size
+ return unless string_size
gz.read(string_size)
end
diff --git a/lib/gitlab/ci/build/artifacts/metadata/entry.rb b/lib/gitlab/ci/build/artifacts/metadata/entry.rb
index d0a80518ae8..80e69cdcc95 100644
--- a/lib/gitlab/ci/build/artifacts/metadata/entry.rb
+++ b/lib/gitlab/ci/build/artifacts/metadata/entry.rb
@@ -44,7 +44,7 @@ module Gitlab
end
def parent
- return nil unless has_parent?
+ return unless has_parent?
self.class.new(@path.to_s.chomp(basename), @entries)
end
diff --git a/lib/gitlab/ci/build/policy/refs.rb b/lib/gitlab/ci/build/policy/refs.rb
index 0e9bb5c94bb..df5f5ffc253 100644
--- a/lib/gitlab/ci/build/policy/refs.rb
+++ b/lib/gitlab/ci/build/policy/refs.rb
@@ -29,8 +29,8 @@ module Gitlab
def matches_pattern?(pattern, pipeline)
return true if pipeline.tag? && pattern == 'tags'
return true if pipeline.branch? && pattern == 'branches'
- return true if pipeline.source == pattern
- return true if pipeline.source&.pluralize == pattern
+ return true if sanitized_source_name(pipeline) == pattern
+ return true if sanitized_source_name(pipeline)&.pluralize == pattern
# patterns can be matched only when branch or tag is used
# the pattern matching does not work for merge requests pipelines
@@ -42,6 +42,10 @@ module Gitlab
end
end
end
+
+ def sanitized_source_name(pipeline)
+ @sanitized_source_name ||= pipeline&.source&.delete_suffix('_event')
+ end
end
end
end
diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb
index 5875479183e..15643fa03ac 100644
--- a/lib/gitlab/ci/config.rb
+++ b/lib/gitlab/ci/config.rb
@@ -84,7 +84,8 @@ module Gitlab
Config::External::Processor.new(config,
project: project,
sha: sha || project.repository.root_ref_sha,
- user: user).perform
+ user: user,
+ expandset: Set.new).perform
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/base.rb b/lib/gitlab/ci/config/external/file/base.rb
index a747886093c..2ffbb214a92 100644
--- a/lib/gitlab/ci/config/external/file/base.rb
+++ b/lib/gitlab/ci/config/external/file/base.rb
@@ -12,7 +12,7 @@ module Gitlab
YAML_WHITELIST_EXTENSION = /.+\.(yml|yaml)$/i.freeze
- Context = Struct.new(:project, :sha, :user)
+ Context = Struct.new(:project, :sha, :user, :expandset)
def initialize(params, context)
@params = params
@@ -43,13 +43,27 @@ module Gitlab
end
def to_hash
- @hash ||= Gitlab::Config::Loader::Yaml.new(content).load!
- rescue Gitlab::Config::Loader::FormatError
- nil
+ expanded_content_hash
end
protected
+ def expanded_content_hash
+ return unless content_hash
+
+ strong_memoize(:expanded_content_yaml) do
+ expand_includes(content_hash)
+ end
+ end
+
+ def content_hash
+ strong_memoize(:content_yaml) do
+ Gitlab::Config::Loader::Yaml.new(content).load!
+ end
+ rescue Gitlab::Config::Loader::FormatError
+ nil
+ end
+
def validate!
validate_location!
validate_content! if errors.none?
@@ -73,6 +87,14 @@ module Gitlab
errors.push("Included file `#{location}` does not have valid YAML syntax!")
end
end
+
+ def expand_includes(hash)
+ External::Processor.new(hash, **expand_context).perform
+ end
+
+ def expand_context
+ { project: nil, sha: nil, user: nil, expandset: context.expandset }
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/local.rb b/lib/gitlab/ci/config/external/file/local.rb
index 2535d178ba8..229a06451e8 100644
--- a/lib/gitlab/ci/config/external/file/local.rb
+++ b/lib/gitlab/ci/config/external/file/local.rb
@@ -31,6 +31,13 @@ module Gitlab
def fetch_local_content
context.project.repository.blob_data_at(context.sha, location)
end
+
+ def expand_context
+ super.merge(
+ project: context.project,
+ sha: context.sha,
+ user: context.user)
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/project.rb b/lib/gitlab/ci/config/external/file/project.rb
index e75540dbe5a..b828f77835c 100644
--- a/lib/gitlab/ci/config/external/file/project.rb
+++ b/lib/gitlab/ci/config/external/file/project.rb
@@ -64,6 +64,13 @@ module Gitlab
project.commit(ref_name).try(:sha)
end
end
+
+ def expand_context
+ super.merge(
+ project: project,
+ sha: sha,
+ user: context.user)
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/mapper.rb b/lib/gitlab/ci/config/external/mapper.rb
index 108bfd5eb43..aff5c5b9651 100644
--- a/lib/gitlab/ci/config/external/mapper.rb
+++ b/lib/gitlab/ci/config/external/mapper.rb
@@ -7,6 +7,8 @@ module Gitlab
class Mapper
include Gitlab::Utils::StrongMemoize
+ MAX_INCLUDES = 50
+
FILE_CLASSES = [
External::File::Remote,
External::File::Template,
@@ -14,25 +16,34 @@ module Gitlab
External::File::Project
].freeze
- AmbigiousSpecificationError = Class.new(StandardError)
+ Error = Class.new(StandardError)
+ AmbigiousSpecificationError = Class.new(Error)
+ DuplicateIncludesError = Class.new(Error)
+ TooManyIncludesError = Class.new(Error)
+
+ def initialize(values, project:, sha:, user:, expandset:)
+ raise Error, 'Expanded needs to be `Set`' unless expandset.is_a?(Set)
- def initialize(values, project:, sha:, user:)
@locations = Array.wrap(values.fetch(:include, []))
@project = project
@sha = sha
@user = user
+ @expandset = expandset
end
def process
+ return [] if locations.empty?
+
locations
.compact
.map(&method(:normalize_location))
+ .each(&method(:verify_duplicates!))
.map(&method(:select_first_matching))
end
private
- attr_reader :locations, :project, :sha, :user
+ attr_reader :locations, :project, :sha, :user, :expandset
# convert location if String to canonical form
def normalize_location(location)
@@ -51,6 +62,23 @@ module Gitlab
end
end
+ def verify_duplicates!(location)
+ if expandset.count >= MAX_INCLUDES
+ raise TooManyIncludesError, "Maximum of #{MAX_INCLUDES} nested includes are allowed!"
+ end
+
+ # We scope location to context, as this allows us to properly support
+ # relative incldues, and similarly looking relative in another project
+ # does not trigger duplicate error
+ scoped_location = location.merge(
+ context_project: project,
+ context_sha: sha)
+
+ unless expandset.add?(scoped_location)
+ raise DuplicateIncludesError, "Include `#{location.to_json}` was already included!"
+ end
+ end
+
def select_first_matching(location)
matching = FILE_CLASSES.map do |file_class|
file_class.new(location, context)
@@ -63,7 +91,7 @@ module Gitlab
def context
strong_memoize(:context) do
- External::File::Base::Context.new(project, sha, user)
+ External::File::Base::Context.new(project, sha, user, expandset)
end
end
end
diff --git a/lib/gitlab/ci/config/external/processor.rb b/lib/gitlab/ci/config/external/processor.rb
index 69bc164a039..1dd2d42016a 100644
--- a/lib/gitlab/ci/config/external/processor.rb
+++ b/lib/gitlab/ci/config/external/processor.rb
@@ -7,11 +7,11 @@ module Gitlab
class Processor
IncludeError = Class.new(StandardError)
- def initialize(values, project:, sha:, user:)
+ def initialize(values, project:, sha:, user:, expandset:)
@values = values
- @external_files = External::Mapper.new(values, project: project, sha: sha, user: user).process
+ @external_files = External::Mapper.new(values, project: project, sha: sha, user: user, expandset: expandset).process
@content = {}
- rescue External::Mapper::AmbigiousSpecificationError => e
+ rescue External::Mapper::Error => e
raise IncludeError, e.message
end
diff --git a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
index c0d4d4400b3..6c99e20e7af 100644
--- a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
@@ -81,6 +81,7 @@ build:
- /build/build.sh
only:
- branches
+ - tags
test:
services:
@@ -95,6 +96,7 @@ test:
- /bin/herokuish buildpack test
only:
- branches
+ - tags
except:
variables:
- $TEST_DISABLED
@@ -112,6 +114,7 @@ code_quality:
paths: [gl-code-quality-report.json]
only:
- branches
+ - tags
except:
variables:
- $CODE_QUALITY_DISABLED
@@ -129,6 +132,7 @@ license_management:
only:
refs:
- branches
+ - tags
variables:
- $GITLAB_FEATURES =~ /\blicense_management\b/
except:
@@ -151,6 +155,7 @@ performance:
only:
refs:
- branches
+ - tags
kubernetes: active
except:
variables:
@@ -171,6 +176,7 @@ sast:
only:
refs:
- branches
+ - tags
variables:
- $GITLAB_FEATURES =~ /\bsast\b/
except:
@@ -192,6 +198,7 @@ dependency_scanning:
only:
refs:
- branches
+ - tags
variables:
- $GITLAB_FEATURES =~ /\bdependency_scanning\b/
except:
@@ -212,6 +219,7 @@ container_scanning:
only:
refs:
- branches
+ - tags
variables:
- $GITLAB_FEATURES =~ /\bcontainer_scanning\b/
except:
@@ -231,6 +239,7 @@ dast:
only:
refs:
- branches
+ - tags
kubernetes: active
variables:
- $GITLAB_FEATURES =~ /\bdast\b/
@@ -260,6 +269,7 @@ review:
only:
refs:
- branches
+ - tags
kubernetes: active
except:
refs:
@@ -283,6 +293,7 @@ stop_review:
only:
refs:
- branches
+ - tags
kubernetes: active
except:
refs:
@@ -488,8 +499,13 @@ rollout 100%:
[[ "$TRACE" ]] && set -x
auto_database_url=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${CI_ENVIRONMENT_SLUG}-postgres:5432/${POSTGRES_DB}
export DATABASE_URL=${DATABASE_URL-$auto_database_url}
- export CI_APPLICATION_REPOSITORY=$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG
- export CI_APPLICATION_TAG=$CI_COMMIT_SHA
+ if [[ -z "$CI_COMMIT_TAG" ]]; then
+ export CI_APPLICATION_REPOSITORY=$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG
+ export CI_APPLICATION_TAG=$CI_COMMIT_SHA
+ else
+ export CI_APPLICATION_REPOSITORY=$CI_REGISTRY_IMAGE
+ export CI_APPLICATION_TAG=$CI_COMMIT_TAG
+ fi
export TILLER_NAMESPACE=$KUBE_NAMESPACE
# Extract "MAJOR.MINOR" from CI_SERVER_VERSION and generate "MAJOR-MINOR-stable" for Security Products
export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
diff --git a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
new file mode 100644
index 00000000000..805df26b957
--- /dev/null
+++ b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
@@ -0,0 +1,44 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/project/merge_requests/dependency_scanning.html
+#
+# Configure the scanning tool through the environment variables.
+# List of the variables: https://gitlab.com/gitlab-org/security-products/dependency-scanning#settings
+# How to set: https://docs.gitlab.com/ee/ci/yaml/#variables
+
+stages:
+ - test
+
+dependency_scanning:
+ stage: test
+ image: docker:stable
+ variables:
+ DOCKER_DRIVER: overlay2
+ allow_failure: true
+ services:
+ - docker:stable-dind
+ script:
+ - export DS_VERSION=${SP_VERSION:-$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')}
+ - |
+ docker run \
+ --env DS_ANALYZER_IMAGES \
+ --env DS_ANALYZER_IMAGE_PREFIX \
+ --env DS_ANALYZER_IMAGE_TAG \
+ --env DS_DEFAULT_ANALYZERS \
+ --env DEP_SCAN_DISABLE_REMOTE_CHECKS \
+ --env DS_DOCKER_CLIENT_NEGOTIATION_TIMEOUT \
+ --env DS_PULL_ANALYZER_IMAGE_TIMEOUT \
+ --env DS_RUN_ANALYZER_TIMEOUT \
+ --volume "$PWD:/code" \
+ --volume /var/run/docker.sock:/var/run/docker.sock \
+ "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$DS_VERSION" /code
+ artifacts:
+ reports:
+ dependency_scanning: gl-dependency-scanning-report.json
+ dependencies: []
+ only:
+ refs:
+ - branches
+ variables:
+ - $GITLAB_FEATURES =~ /\bdependency_scanning\b/
+ except:
+ variables:
+ - $DEPENDENCY_SCANNING_DISABLED
diff --git a/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml b/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
new file mode 100644
index 00000000000..4f3d08d98fe
--- /dev/null
+++ b/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
@@ -0,0 +1,41 @@
+# GitLab Serverless template
+
+image: alpine:latest
+
+stages:
+ - build
+ - deploy
+
+.serverless:build:image:
+ variables:
+ DOCKERFILE: "Dockerfile"
+ stage: build
+ image:
+ name: gcr.io/kaniko-project/executor:debug
+ entrypoint: [""]
+ only:
+ refs:
+ - master
+ script:
+ - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
+ - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/$DOCKERFILE --destination $CI_REGISTRY_IMAGE
+
+.serverless:deploy:image:
+ stage: deploy
+ image: gcr.io/triggermesh/tm@sha256:e3ee74db94d215bd297738d93577481f3e4db38013326c90d57f873df7ab41d5
+ only:
+ refs:
+ - master
+ environment: development
+ script:
+ - echo "$CI_REGISTRY_IMAGE"
+ - tm -n "$KUBE_NAMESPACE" --config "$KUBECONFIG" deploy service "$CI_PROJECT_NAME" --from-image "$CI_REGISTRY_IMAGE" --wait
+
+.serverless:deploy:functions:
+ stage: deploy
+ environment: development
+ image: gcr.io/triggermesh/tm:v0.0.9
+ script:
+ - tm -n "$KUBE_NAMESPACE" set registry-auth gitlab-registry --registry "$CI_REGISTRY" --username "$CI_REGISTRY_USER" --password "$CI_JOB_TOKEN" --push
+ - tm -n "$KUBE_NAMESPACE" set registry-auth gitlab-registry --registry "$CI_REGISTRY" --username "$CI_DEPLOY_USER" --password "$CI_DEPLOY_PASSWORD" --pull
+ - tm -n "$KUBE_NAMESPACE" deploy --wait
diff --git a/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
new file mode 100644
index 00000000000..245e6bec60a
--- /dev/null
+++ b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
@@ -0,0 +1,28 @@
+# This is a very simple template that mainly relies on FastLane to build and distribute your app.
+# Read more about how to use this template on the blog post https://about.gitlab.com/2019/03/06/ios-publishing-with-gitlab-and-fastlane/
+# You will also need fastlane and signing configuration for this to work, along with a MacOS runner.
+# These details are provided in the blog post.
+
+# Note that when you're using the shell executor for MacOS builds, the
+# build and tests run as the identity of the runner logged in user, directly on
+# the build host. This is less secure than using container executors, so please
+# take a look at our security implications documentation at
+# https://docs.gitlab.com/runner/security/#usage-of-shell-executor for additional
+# detail on what to keep in mind in this scenario.
+
+stages:
+ - build
+
+variables:
+ LC_ALL: "en_US.UTF-8"
+ LANG: "en_US.UTF-8"
+ GIT_STRATEGY: clone
+
+build:
+ stage: build
+ script:
+ - bundle install
+ - bundle exec fastlane build
+ artifacts:
+ paths:
+ - ./*.ipa
diff --git a/lib/gitlab/ci/variables/collection.rb b/lib/gitlab/ci/variables/collection.rb
index a7b4e0348c2..f7bbb58df7e 100644
--- a/lib/gitlab/ci/variables/collection.rb
+++ b/lib/gitlab/ci/variables/collection.rb
@@ -17,6 +17,8 @@ module Gitlab
end
def concat(resources)
+ return self if resources.nil?
+
tap { resources.each { |variable| self.append(variable) } }
end
diff --git a/lib/gitlab/ci/variables/collection/item.rb b/lib/gitlab/ci/variables/collection/item.rb
index e3e4e62cc02..833aa75adb5 100644
--- a/lib/gitlab/ci/variables/collection/item.rb
+++ b/lib/gitlab/ci/variables/collection/item.rb
@@ -5,12 +5,12 @@ module Gitlab
module Variables
class Collection
class Item
- def initialize(key:, value:, public: true, file: false)
+ def initialize(key:, value:, public: true, file: false, masked: 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
+ key: key, value: value, public: public, file: file, masked: masked
}
end
@@ -27,9 +27,13 @@ module Gitlab
# don't expose `file` attribute at all (stems from what the runner
# expects).
#
+ # If the `variable_masking` feature is enabled we expose the `masked`
+ # attribute, otherwise it's not exposed.
+ #
def to_runner_variable
@variable.reject do |hash_key, hash_value|
- hash_key == :file && hash_value == false
+ (hash_key == :file && hash_value == false) ||
+ (hash_key == :masked && !Feature.enabled?(:variable_masking))
end
end
diff --git a/lib/gitlab/contributions_calendar.rb b/lib/gitlab/contributions_calendar.rb
index 5ed6427072a..f7d046600e8 100644
--- a/lib/gitlab/contributions_calendar.rb
+++ b/lib/gitlab/contributions_calendar.rb
@@ -49,6 +49,7 @@ module Gitlab
Event.contributions.where(author_id: contributor.id)
.where(created_at: date.beginning_of_day..date.end_of_day)
.where(project_id: projects)
+ .with_associations
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/cycle_analytics/plan_event_fetcher.rb b/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
index db8ac3becea..aeca9d00156 100644
--- a/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
@@ -40,11 +40,11 @@ module Gitlab
end
def first_time_reference_commit(event)
- return nil unless event && merge_request_diff_commits
+ return unless event && merge_request_diff_commits
commits = merge_request_diff_commits[event['id'].to_i]
- return nil if commits.blank?
+ return if commits.blank?
commits.find do |commit|
next unless commit[:committed_date] && event['first_mentioned_in_commit_at']
diff --git a/lib/gitlab/danger/helper.rb b/lib/gitlab/danger/helper.rb
index d3c86fdb629..d2b7ca015d4 100644
--- a/lib/gitlab/danger/helper.rb
+++ b/lib/gitlab/danger/helper.rb
@@ -123,6 +123,7 @@ module Gitlab
# Files that don't fit into any category are marked with :none
%r{\A(ee/)?changelogs/} => :none,
+ %r{\Alocale/gitlab\.pot\z} => :none,
# Fallbacks in case the above patterns miss anything
%r{\.rb\z} => :backend,
diff --git a/lib/gitlab/database/count/tablesample_count_strategy.rb b/lib/gitlab/database/count/tablesample_count_strategy.rb
index cf1cf054dbf..fedf6ca4fe1 100644
--- a/lib/gitlab/database/count/tablesample_count_strategy.rb
+++ b/lib/gitlab/database/count/tablesample_count_strategy.rb
@@ -36,7 +36,7 @@ module Gitlab
def perform_count(model, estimate)
# If we estimate 0, we may not have statistics at all. Don't use them.
- return nil unless estimate && estimate > 0
+ return unless estimate && estimate > 0
if estimate < EXACT_COUNT_THRESHOLD
# The table is considered small, the assumption here is that
diff --git a/lib/gitlab/dependency_linker/base_linker.rb b/lib/gitlab/dependency_linker/base_linker.rb
index ac2efe598b4..ffad00fa7d7 100644
--- a/lib/gitlab/dependency_linker/base_linker.rb
+++ b/lib/gitlab/dependency_linker/base_linker.rb
@@ -4,6 +4,7 @@ module Gitlab
module DependencyLinker
class BaseLinker
URL_REGEX = %r{https?://[^'" ]+}.freeze
+ GIT_INVALID_URL_REGEX = /^git\+#{URL_REGEX}/.freeze
REPO_REGEX = %r{[^/'" ]+/[^/'" ]+}.freeze
class_attribute :file_type
@@ -29,8 +30,25 @@ module Gitlab
highlighted_lines.join.html_safe
end
+ def external_url(name, external_ref)
+ return if external_ref =~ GIT_INVALID_URL_REGEX
+
+ case external_ref
+ when /\A#{URL_REGEX}\z/
+ external_ref
+ when /\A#{REPO_REGEX}\z/
+ github_url(external_ref)
+ else
+ package_url(name)
+ end
+ end
+
private
+ def package_url(_name)
+ raise NotImplementedError
+ end
+
def link_dependencies
raise NotImplementedError
end
diff --git a/lib/gitlab/dependency_linker/composer_json_linker.rb b/lib/gitlab/dependency_linker/composer_json_linker.rb
index 22d2bead891..4b8862b31ee 100644
--- a/lib/gitlab/dependency_linker/composer_json_linker.rb
+++ b/lib/gitlab/dependency_linker/composer_json_linker.rb
@@ -8,8 +8,8 @@ module Gitlab
private
def link_packages
- link_packages_at_key("require", &method(:package_url))
- link_packages_at_key("require-dev", &method(:package_url))
+ link_packages_at_key("require")
+ link_packages_at_key("require-dev")
end
def package_url(name)
diff --git a/lib/gitlab/dependency_linker/gemfile_linker.rb b/lib/gitlab/dependency_linker/gemfile_linker.rb
index 8ab219c4962..c6e02248b0a 100644
--- a/lib/gitlab/dependency_linker/gemfile_linker.rb
+++ b/lib/gitlab/dependency_linker/gemfile_linker.rb
@@ -3,8 +3,14 @@
module Gitlab
module DependencyLinker
class GemfileLinker < MethodLinker
+ class_attribute :package_keyword
+
+ self.package_keyword = :gem
self.file_type = :gemfile
+ GITHUB_REGEX = /(github:|:github\s*=>)\s*['"](?<name>[^'"]+)['"]/.freeze
+ GIT_REGEX = /(git:|:git\s*=>)\s*['"](?<name>#{URL_REGEX})['"]/.freeze
+
private
def link_dependencies
@@ -14,21 +20,35 @@ module Gitlab
def link_urls
# Link `github: "user/repo"` to https://github.com/user/repo
- link_regex(/(github:|:github\s*=>)\s*['"](?<name>[^'"]+)['"]/, &method(:github_url))
+ link_regex(GITHUB_REGEX, &method(:github_url))
# Link `git: "https://gitlab.example.com/user/repo"` to https://gitlab.example.com/user/repo
- link_regex(/(git:|:git\s*=>)\s*['"](?<name>#{URL_REGEX})['"]/, &:itself)
+ link_regex(GIT_REGEX, &:itself)
# Link `source "https://rubygems.org"` to https://rubygems.org
link_method_call('source', URL_REGEX, &:itself)
end
def link_packages
- # Link `gem "package_name"` to https://rubygems.org/gems/package_name
- link_method_call('gem') do |name|
- "https://rubygems.org/gems/#{name}"
+ packages = parse_packages
+
+ return if packages.blank?
+
+ packages.each do |package|
+ link_method_call('gem', package.name) do
+ external_url(package.name, package.external_ref)
+ end
end
end
+
+ def package_url(name)
+ "https://rubygems.org/gems/#{name}"
+ end
+
+ def parse_packages
+ parser = Gitlab::DependencyLinker::Parser::Gemfile.new(plain_text)
+ parser.parse(keyword: self.class.package_keyword)
+ end
end
end
end
diff --git a/lib/gitlab/dependency_linker/gemspec_linker.rb b/lib/gitlab/dependency_linker/gemspec_linker.rb
index b924ea86d89..94c2b375cf9 100644
--- a/lib/gitlab/dependency_linker/gemspec_linker.rb
+++ b/lib/gitlab/dependency_linker/gemspec_linker.rb
@@ -11,7 +11,7 @@ module Gitlab
link_method_call('homepage', URL_REGEX, &:itself)
link_method_call('license', &method(:license_url))
- link_method_call(%w[name add_dependency add_runtime_dependency add_development_dependency]) do |name|
+ link_method_call(%w[add_dependency add_runtime_dependency add_development_dependency]) do |name|
"https://rubygems.org/gems/#{name}"
end
end
diff --git a/lib/gitlab/dependency_linker/method_linker.rb b/lib/gitlab/dependency_linker/method_linker.rb
index d4d85bb3390..33899a931c6 100644
--- a/lib/gitlab/dependency_linker/method_linker.rb
+++ b/lib/gitlab/dependency_linker/method_linker.rb
@@ -23,18 +23,22 @@ module Gitlab
# link_method_call('name')
# # Will link `package` in `self.name = "package"`
def link_method_call(method_name, value = nil, &url_proc)
+ regex = method_call_regex(method_name, value)
+
+ link_regex(regex, &url_proc)
+ end
+
+ def method_call_regex(method_name, value = nil)
method_name = regexp_for_value(method_name)
value = regexp_for_value(value)
- regex = %r{
+ %r{
#{method_name} # Method name
\s* # Whitespace
[(=]? # Opening brace or equals sign
\s* # Whitespace
['"](?<name>#{value})['"] # Package name in quotes
}x
-
- link_regex(regex, &url_proc)
end
end
end
diff --git a/lib/gitlab/dependency_linker/package.rb b/lib/gitlab/dependency_linker/package.rb
new file mode 100644
index 00000000000..8a509bbd562
--- /dev/null
+++ b/lib/gitlab/dependency_linker/package.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DependencyLinker
+ class Package
+ attr_reader :name, :git_ref, :github_ref
+
+ def initialize(name, git_ref, github_ref)
+ @name = name
+ @git_ref = git_ref
+ @github_ref = github_ref
+ end
+
+ def external_ref
+ @git_ref || @github_ref
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/dependency_linker/package_json_linker.rb b/lib/gitlab/dependency_linker/package_json_linker.rb
index 578e25f806a..6857f2a4fa2 100644
--- a/lib/gitlab/dependency_linker/package_json_linker.rb
+++ b/lib/gitlab/dependency_linker/package_json_linker.rb
@@ -8,7 +8,6 @@ module Gitlab
private
def link_dependencies
- link_json('name', json["name"], &method(:package_url))
link_json('license', &method(:license_url))
link_json(%w[homepage url], URL_REGEX, &:itself)
@@ -16,25 +15,19 @@ module Gitlab
end
def link_packages
- link_packages_at_key("dependencies", &method(:package_url))
- link_packages_at_key("devDependencies", &method(:package_url))
+ link_packages_at_key("dependencies")
+ link_packages_at_key("devDependencies")
end
- def link_packages_at_key(key, &url_proc)
+ def link_packages_at_key(key)
dependencies = json[key]
return unless dependencies
dependencies.each do |name, version|
- link_json(name, version, link: :key, &url_proc)
-
- link_json(name) do |value|
- case value
- when /\A#{URL_REGEX}\z/
- value
- when /\A#{REPO_REGEX}\z/
- github_url(value)
- end
- end
+ external_url = external_url(name, version)
+
+ link_json(name, version, link: :key) { external_url }
+ link_json(name) { external_url }
end
end
diff --git a/lib/gitlab/dependency_linker/parser/gemfile.rb b/lib/gitlab/dependency_linker/parser/gemfile.rb
new file mode 100644
index 00000000000..7f755375cea
--- /dev/null
+++ b/lib/gitlab/dependency_linker/parser/gemfile.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DependencyLinker
+ module Parser
+ class Gemfile < MethodLinker
+ GIT_REGEX = Gitlab::DependencyLinker::GemfileLinker::GIT_REGEX
+ GITHUB_REGEX = Gitlab::DependencyLinker::GemfileLinker::GITHUB_REGEX
+
+ def initialize(plain_text)
+ @plain_text = plain_text
+ end
+
+ # Returns a list of Gitlab::DependencyLinker::Package
+ #
+ # keyword - The package definition keyword, e.g. `:gem` for
+ # Gemfile parsing, `:pod` for Podfile.
+ def parse(keyword:)
+ plain_lines.each_with_object([]) do |line, packages|
+ name = fetch(line, method_call_regex(keyword))
+
+ next unless name
+
+ git_ref = fetch(line, GIT_REGEX)
+ github_ref = fetch(line, GITHUB_REGEX)
+
+ packages << Gitlab::DependencyLinker::Package.new(name, git_ref, github_ref)
+ end
+ end
+
+ private
+
+ def fetch(line, regex, group: :name)
+ match = line.match(regex)
+ match[group] if match
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/dependency_linker/podfile_linker.rb b/lib/gitlab/dependency_linker/podfile_linker.rb
index def9b04cca9..a20d285da79 100644
--- a/lib/gitlab/dependency_linker/podfile_linker.rb
+++ b/lib/gitlab/dependency_linker/podfile_linker.rb
@@ -5,12 +5,21 @@ module Gitlab
class PodfileLinker < GemfileLinker
include Cocoapods
+ self.package_keyword = :pod
self.file_type = :podfile
private
def link_packages
- link_method_call('pod', &method(:package_url))
+ packages = parse_packages
+
+ return unless packages
+
+ packages.each do |package|
+ link_method_call('pod', package.name) do
+ external_url(package.name, package.external_ref)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/dependency_linker/podspec_linker.rb b/lib/gitlab/dependency_linker/podspec_linker.rb
index 6b1758c5a43..14abd3999c4 100644
--- a/lib/gitlab/dependency_linker/podspec_linker.rb
+++ b/lib/gitlab/dependency_linker/podspec_linker.rb
@@ -19,7 +19,7 @@ module Gitlab
link_method_call('license', &method(:license_url))
link_regex(/license\s*=\s*\{\s*(type:|:type\s*=>)\s*#{STRING_REGEX}/, &method(:license_url))
- link_method_call(%w[name dependency], &method(:package_url))
+ link_method_call('dependency', &method(:package_url))
end
end
end
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index c9d89d56884..dbee47a19ee 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -75,7 +75,7 @@ module Gitlab
end
def line_for_position(pos)
- return nil unless pos.position_type == 'text'
+ return unless pos.position_type == 'text'
# This method is normally used to find which line the diff was
# commented on, and in this context, it's normally the raw diff persisted
@@ -329,6 +329,16 @@ module Gitlab
lines
end
+ def fully_expanded?
+ return true if binary?
+
+ lines = diff_lines_for_serializer
+
+ return true if lines.nil?
+
+ lines.none? { |line| line.type.to_s == 'match' }
+ end
+
private
def total_blob_lines(blob)
diff --git a/lib/gitlab/email/reply_parser.rb b/lib/gitlab/email/reply_parser.rb
index 2743f011ca6..dc44e9d7481 100644
--- a/lib/gitlab/email/reply_parser.rb
+++ b/lib/gitlab/email/reply_parser.rb
@@ -61,7 +61,7 @@ module Gitlab
# Force encoding to UTF-8 on a Mail::Message or Mail::Part
def fix_charset(object)
- return nil if object.nil?
+ return if object.nil?
if object.charset
object.body.decoded.force_encoding(object.charset.gsub(/utf8/i, "UTF-8")).encode("UTF-8").to_s
diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb
index 431911d1eee..2c53f9b026d 100644
--- a/lib/gitlab/fogbugz_import/importer.rb
+++ b/lib/gitlab/fogbugz_import/importer.rb
@@ -239,7 +239,7 @@ module Gitlab
res = ::Projects::DownloadService.new(project, link).execute
- return nil if res.nil?
+ return if res.nil?
res[:markdown]
end
diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb
index 259a2b7911a..10df4ed72d9 100644
--- a/lib/gitlab/git/blob.rb
+++ b/lib/gitlab/git/blob.rb
@@ -23,6 +23,10 @@ module Gitlab
class << self
def find(repository, sha, path, limit: MAX_DATA_DISPLAY_SIZE)
+ tree_entry(repository, sha, path, limit)
+ end
+
+ def tree_entry(repository, sha, path, limit)
return unless path
path = path.sub(%r{\A/*}, '')
@@ -179,3 +183,5 @@ module Gitlab
end
end
end
+
+Gitlab::Git::Blob.singleton_class.prepend Gitlab::Git::RuggedImpl::Blob::ClassMethods
diff --git a/lib/gitlab/git/commit.rb b/lib/gitlab/git/commit.rb
index 5863815ca85..491e4b47196 100644
--- a/lib/gitlab/git/commit.rb
+++ b/lib/gitlab/git/commit.rb
@@ -5,6 +5,7 @@ module Gitlab
module Git
class Commit
include Gitlab::EncodingHelper
+ prepend Gitlab::Git::RuggedImpl::Commit
extend Gitlab::Git::WrapsGitalyErrors
attr_accessor :raw_commit, :head
@@ -57,20 +58,24 @@ module Gitlab
return commit_id if commit_id.is_a?(Gitlab::Git::Commit)
# Some weird thing?
- return nil unless commit_id.is_a?(String)
+ return unless commit_id.is_a?(String)
# This saves us an RPC round trip.
- return nil if commit_id.include?(':')
+ return if commit_id.include?(':')
- commit = wrapped_gitaly_errors do
- repo.gitaly_commit_client.find_commit(commit_id)
- end
+ commit = find_commit(repo, commit_id)
decorate(repo, commit) if commit
rescue Gitlab::Git::CommandError, Gitlab::Git::Repository::NoRepository, ArgumentError
nil
end
+ def find_commit(repo, commit_id)
+ wrapped_gitaly_errors do
+ repo.gitaly_commit_client.find_commit(commit_id)
+ end
+ end
+
# Get last commit for HEAD
#
# Ex.
@@ -185,6 +190,10 @@ module Gitlab
@repository = repository
@head = head
+ init_commit(raw_commit)
+ end
+
+ def init_commit(raw_commit)
case raw_commit
when Hash
init_from_hash(raw_commit)
@@ -400,3 +409,5 @@ module Gitlab
end
end
end
+
+Gitlab::Git::Commit.singleton_class.prepend Gitlab::Git::RuggedImpl::Commit::ClassMethods
diff --git a/lib/gitlab/git/ref.rb b/lib/gitlab/git/ref.rb
index eec91194949..47cfb483509 100644
--- a/lib/gitlab/git/ref.rb
+++ b/lib/gitlab/git/ref.rb
@@ -4,6 +4,7 @@ module Gitlab
module Git
class Ref
include Gitlab::EncodingHelper
+ include Gitlab::Git::RuggedImpl::Ref
# Branch or tag name
# without "refs/tags|heads" prefix
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index aea132a3dd9..35dd042ba6a 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -11,6 +11,7 @@ module Gitlab
include Gitlab::Git::WrapsGitalyErrors
include Gitlab::EncodingHelper
include Gitlab::Utils::StrongMemoize
+ prepend Gitlab::Git::RuggedImpl::Repository
SEARCH_CONTEXT_LINES = 3
REV_LIST_COMMIT_LIMIT = 2_000
@@ -275,7 +276,7 @@ module Gitlab
# senddata response.
def archive_file_path(storage_path, sha, name, format = "tar.gz")
# Build file path
- return nil unless name
+ return unless name
extension =
case format
@@ -852,17 +853,20 @@ module Gitlab
true
end
+ # rubocop:disable Metrics/ParameterLists
def multi_action(
user, branch_name:, message:, actions:,
author_email: nil, author_name: nil,
- start_branch_name: nil, start_repository: self)
+ start_branch_name: nil, start_repository: self,
+ force: false)
wrapped_gitaly_errors do
gitaly_operation_client.user_commit_files(user, branch_name,
message, actions, author_email, author_name,
- start_branch_name, start_repository)
+ start_branch_name, start_repository, force)
end
end
+ # rubocop:enable Metrics/ParameterLists
def write_config(full_path:)
return unless full_path.present?
diff --git a/lib/gitlab/git/rugged_impl/blob.rb b/lib/gitlab/git/rugged_impl/blob.rb
new file mode 100644
index 00000000000..11ee4ebda4b
--- /dev/null
+++ b/lib/gitlab/git/rugged_impl/blob.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+# NOTE: This code is legacy. Do not add/modify code here unless you have
+# discussed with the Gitaly team. See
+# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
+# for more details.
+
+module Gitlab
+ module Git
+ module RuggedImpl
+ module Blob
+ module ClassMethods
+ extend ::Gitlab::Utils::Override
+
+ override :tree_entry
+ def tree_entry(repository, sha, path, limit)
+ if Feature.enabled?(:rugged_tree_entry)
+ rugged_tree_entry(repository, sha, path, limit)
+ else
+ super
+ end
+ end
+
+ private
+
+ def rugged_tree_entry(repository, sha, path, limit)
+ return unless path
+
+ # Strip any leading / characters from the path
+ path = path.sub(%r{\A/*}, '')
+
+ rugged_commit = repository.lookup(sha)
+ root_tree = rugged_commit.tree
+
+ blob_entry = find_entry_by_path(repository, root_tree.oid, *path.split('/'))
+
+ return unless blob_entry
+
+ if blob_entry[:type] == :commit
+ submodule_blob(blob_entry, path, sha)
+ else
+ blob = repository.lookup(blob_entry[:oid])
+
+ if blob
+ new(
+ id: blob.oid,
+ name: blob_entry[:name],
+ size: blob.size,
+ # Rugged::Blob#content is expensive; don't call it if we don't have to.
+ data: limit.zero? ? '' : blob.content(limit),
+ mode: blob_entry[:filemode].to_s(8),
+ path: path,
+ commit_id: sha,
+ binary: blob.binary?
+ )
+ end
+ end
+ rescue Rugged::ReferenceError
+ nil
+ end
+
+ # Recursive search of blob id by path
+ #
+ # Ex.
+ # blog/ # oid: 1a
+ # app/ # oid: 2a
+ # models/ # oid: 3a
+ # file.rb # oid: 4a
+ #
+ #
+ # Blob.find_entry_by_path(repo, '1a', 'blog', 'app', 'file.rb') # => '4a'
+ #
+ def find_entry_by_path(repository, root_id, *path_parts)
+ root_tree = repository.lookup(root_id)
+
+ entry = root_tree.find do |entry|
+ entry[:name] == path_parts[0]
+ end
+
+ return unless entry
+
+ if path_parts.size > 1
+ return unless entry[:type] == :tree
+
+ path_parts.shift
+ find_entry_by_path(repository, entry[:oid], *path_parts)
+ else
+ [:blob, :commit].include?(entry[:type]) ? entry : nil
+ end
+ end
+
+ def submodule_blob(blob_entry, path, sha)
+ new(
+ id: blob_entry[:oid],
+ name: blob_entry[:name],
+ size: 0,
+ data: '',
+ path: path,
+ commit_id: sha
+ )
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/git/rugged_impl/commit.rb b/lib/gitlab/git/rugged_impl/commit.rb
new file mode 100644
index 00000000000..251802878c3
--- /dev/null
+++ b/lib/gitlab/git/rugged_impl/commit.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+# NOTE: This code is legacy. Do not add/modify code here unless you have
+# discussed with the Gitaly team. See
+# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
+# for more details.
+
+# rubocop:disable Gitlab/ModuleWithInstanceVariables
+module Gitlab
+ module Git
+ module RuggedImpl
+ module Commit
+ module ClassMethods
+ extend ::Gitlab::Utils::Override
+
+ def rugged_find(repo, commit_id)
+ obj = repo.rev_parse_target(commit_id)
+
+ obj.is_a?(::Rugged::Commit) ? obj : nil
+ rescue ::Rugged::Error
+ nil
+ end
+
+ override :find_commit
+ def find_commit(repo, commit_id)
+ if Feature.enabled?(:rugged_find_commit)
+ rugged_find(repo, commit_id)
+ else
+ super
+ end
+ end
+ end
+
+ extend ::Gitlab::Utils::Override
+
+ override :init_commit
+ def init_commit(raw_commit)
+ case raw_commit
+ when ::Rugged::Commit
+ init_from_rugged(raw_commit)
+ else
+ super
+ end
+ end
+
+ def init_from_rugged(commit)
+ author = commit.author
+ committer = commit.committer
+
+ @raw_commit = commit
+ @id = commit.oid
+ @message = commit.message
+ @authored_date = author[:time]
+ @committed_date = committer[:time]
+ @author_name = author[:name]
+ @author_email = author[:email]
+ @committer_name = committer[:name]
+ @committer_email = committer[:email]
+ @parent_ids = commit.parents.map(&:oid)
+ end
+ end
+ end
+ end
+end
+# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/lib/gitlab/git/rugged_impl/ref.rb b/lib/gitlab/git/rugged_impl/ref.rb
new file mode 100644
index 00000000000..b553e82dc47
--- /dev/null
+++ b/lib/gitlab/git/rugged_impl/ref.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+# NOTE: This code is legacy. Do not add/modify code here unless you have
+# discussed with the Gitaly team. See
+# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
+# for more details.
+
+module Gitlab
+ module Git
+ module RuggedImpl
+ module Ref
+ def self.dereference_object(object)
+ object = object.target while object.is_a?(::Rugged::Tag::Annotation)
+
+ object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/git/rugged_impl/repository.rb b/lib/gitlab/git/rugged_impl/repository.rb
new file mode 100644
index 00000000000..fe0120b1199
--- /dev/null
+++ b/lib/gitlab/git/rugged_impl/repository.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+# NOTE: This code is legacy. Do not add/modify code here unless you have
+# discussed with the Gitaly team. See
+# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
+# for more details.
+
+# rubocop:disable Gitlab/ModuleWithInstanceVariables
+module Gitlab
+ module Git
+ module RuggedImpl
+ module Repository
+ extend ::Gitlab::Utils::Override
+
+ FEATURE_FLAGS = %i(rugged_find_commit rugged_tree_entries rugged_tree_entry rugged_commit_is_ancestor).freeze
+
+ def alternate_object_directories
+ relative_object_directories.map { |d| File.join(path, d) }
+ end
+
+ ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES = %w[
+ GIT_OBJECT_DIRECTORY_RELATIVE
+ GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
+ ].freeze
+
+ def relative_object_directories
+ Gitlab::Git::HookEnv.all(gl_repository).values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
+ end
+
+ def rugged
+ @rugged ||= ::Rugged::Repository.new(path, alternates: alternate_object_directories)
+ rescue ::Rugged::RepositoryError, ::Rugged::OSError
+ raise ::Gitlab::Git::Repository::NoRepository.new('no repository for such path')
+ end
+
+ def cleanup
+ @rugged&.close
+ end
+
+ # Return the object that +revspec+ points to. If +revspec+ is an
+ # annotated tag, then return the tag's target instead.
+ def rev_parse_target(revspec)
+ obj = rugged.rev_parse(revspec)
+ Ref.dereference_object(obj)
+ end
+
+ override :ancestor?
+ def ancestor?(from, to)
+ if Feature.enabled?(:rugged_commit_is_ancestor)
+ rugged_is_ancestor?(from, to)
+ else
+ super
+ end
+ end
+
+ def rugged_is_ancestor?(ancestor_id, descendant_id)
+ return false if ancestor_id.nil? || descendant_id.nil?
+
+ rugged_merge_base(ancestor_id, descendant_id) == ancestor_id
+ rescue Rugged::OdbError
+ false
+ end
+
+ def rugged_merge_base(from, to)
+ rugged.merge_base(from, to)
+ rescue Rugged::ReferenceError
+ nil
+ end
+
+ # Lookup for rugged object by oid or ref name
+ def lookup(oid_or_ref_name)
+ rugged.rev_parse(oid_or_ref_name)
+ end
+ end
+ end
+ end
+end
+# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/lib/gitlab/git/rugged_impl/tree.rb b/lib/gitlab/git/rugged_impl/tree.rb
new file mode 100644
index 00000000000..0ebfd496695
--- /dev/null
+++ b/lib/gitlab/git/rugged_impl/tree.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+# NOTE: This code is legacy. Do not add/modify code here unless you have
+# discussed with the Gitaly team. See
+# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
+# for more details.
+
+module Gitlab
+ module Git
+ module RuggedImpl
+ module Tree
+ module ClassMethods
+ extend ::Gitlab::Utils::Override
+
+ override :tree_entries
+ def tree_entries(repository, sha, path, recursive)
+ if Feature.enabled?(:rugged_tree_entries)
+ tree_entries_from_rugged(repository, sha, path, recursive)
+ else
+ super
+ end
+ end
+
+ def tree_entries_from_rugged(repository, sha, path, recursive)
+ current_path_entries = get_tree_entries_from_rugged(repository, sha, path)
+ ordered_entries = []
+
+ current_path_entries.each do |entry|
+ ordered_entries << entry
+
+ if recursive && entry.dir?
+ ordered_entries.concat(tree_entries_from_rugged(repository, sha, entry.path, true))
+ end
+ end
+
+ # This was an optimization to reduce N+1 queries for Gitaly
+ # (https://gitlab.com/gitlab-org/gitaly/issues/530). It
+ # used to be done lazily in the view via
+ # TreeHelper#flatten_tree, so it's possible there's a
+ # performance impact by loading this eagerly.
+ rugged_populate_flat_path(repository, sha, path, ordered_entries)
+ end
+
+ def rugged_populate_flat_path(repository, sha, path, entries)
+ entries.each do |entry|
+ entry.flat_path = entry.path
+
+ next unless entry.dir?
+
+ entry.flat_path =
+ if path
+ File.join(path, rugged_flatten_tree(repository, sha, entry, path))
+ else
+ rugged_flatten_tree(repository, sha, entry, path)
+ end
+ end
+ end
+
+ # Returns the relative path of the first subdir that doesn't have only one directory descendant
+ def rugged_flatten_tree(repository, sha, tree, root_path)
+ subtree = tree_entries_from_rugged(repository, sha, tree.path, false)
+
+ if subtree.count == 1 && subtree.first.dir?
+ File.join(tree.name, rugged_flatten_tree(repository, sha, subtree.first, root_path))
+ else
+ tree.name
+ end
+ end
+
+ def get_tree_entries_from_rugged(repository, sha, path)
+ commit = repository.lookup(sha)
+ root_tree = commit.tree
+
+ tree = if path
+ id = find_id_by_path(repository, root_tree.oid, path)
+ if id
+ repository.lookup(id)
+ else
+ []
+ end
+ else
+ root_tree
+ end
+
+ tree.map do |entry|
+ current_path = path ? File.join(path, entry[:name]) : entry[:name]
+
+ new(
+ id: entry[:oid],
+ root_id: root_tree.oid,
+ name: entry[:name],
+ type: entry[:type],
+ mode: entry[:filemode].to_s(8),
+ path: current_path,
+ commit_id: sha
+ )
+ end
+ rescue Rugged::ReferenceError
+ []
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/git/tree.rb b/lib/gitlab/git/tree.rb
index 51542bcaaa2..7e072c5db50 100644
--- a/lib/gitlab/git/tree.rb
+++ b/lib/gitlab/git/tree.rb
@@ -18,6 +18,10 @@ module Gitlab
def where(repository, sha, path = nil, recursive = false)
path = nil if path == '' || path == '/'
+ tree_entries(repository, sha, path, recursive)
+ end
+
+ def tree_entries(repository, sha, path, recursive)
wrapped_gitaly_errors do
repository.gitaly_commit_client.tree_entries(repository, sha, path, recursive)
end
@@ -44,7 +48,7 @@ module Gitlab
entry[:name] == path_arr[0] && entry[:type] == :tree
end
- return nil unless entry
+ return unless entry
if path_arr.size > 1
path_arr.shift
@@ -95,3 +99,5 @@ module Gitlab
end
end
end
+
+Gitlab::Git::Tree.singleton_class.prepend Gitlab::Git::RuggedImpl::Tree::ClassMethods
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 5aeedb0f50d..48c113a8b14 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -164,8 +164,6 @@ module Gitlab
kwargs = yield(kwargs) if block_given?
stub(service, storage).__send__(rpc, request, kwargs) # rubocop:disable GitlabSecurity/PublicSend
- rescue GRPC::Unavailable => ex
- handle_grpc_unavailable!(ex)
ensure
duration = Gitlab::Metrics::System.monotonic_time - start
@@ -178,27 +176,6 @@ module Gitlab
add_call_details(feature: "#{service}##{rpc}", duration: duration, request: request_hash, rpc: rpc)
end
- def self.handle_grpc_unavailable!(ex)
- status = ex.to_status
- raise ex unless status.details == 'Endpoint read failed'
-
- # There is a bug in grpc 1.8.x that causes a client process to get stuck
- # always raising '14:Endpoint read failed'. The only thing that we can
- # do to recover is to restart the process.
- #
- # See https://gitlab.com/gitlab-org/gitaly/issues/1029
-
- if Sidekiq.server?
- raise Gitlab::SidekiqMiddleware::Shutdown::WantShutdown.new(ex.to_s)
- else
- # SIGQUIT requests a Unicorn worker to shut down gracefully after the current request.
- Process.kill('QUIT', Process.pid)
- end
-
- raise ex
- end
- private_class_method :handle_grpc_unavailable!
-
def self.current_transaction_labels
Gitlab::Metrics::Transaction.current&.labels || {}
end
@@ -251,7 +228,7 @@ module Gitlab
result
end
- SERVER_FEATURE_FLAGS = %w[].freeze
+ SERVER_FEATURE_FLAGS = %w[go-find-all-tags].freeze
def self.server_feature_flags
SERVER_FEATURE_FLAGS.map do |f|
@@ -267,7 +244,9 @@ module Gitlab
end
def self.feature_enabled?(feature_name)
- Feature.enabled?("gitaly_#{feature_name}")
+ Feature::FlipperFeature.table_exists? && Feature.enabled?("gitaly_#{feature_name}")
+ rescue ActiveRecord::NoDatabaseError
+ false
end
# Ensures that Gitaly is not being abuse through n+1 misuse etc
@@ -407,13 +386,13 @@ module Gitlab
# Returns the stacks that calls Gitaly the most times. Used for n+1 detection
def self.max_stacks
- return nil unless Gitlab::SafeRequestStore.active?
+ return unless Gitlab::SafeRequestStore.active?
stack_counter = Gitlab::SafeRequestStore[:stack_counter]
- return nil unless stack_counter
+ return unless stack_counter
max = max_call_count
- return nil if max.zero?
+ return if max.zero?
stack_counter.select { |_, v| v == max }.keys
end
diff --git a/lib/gitlab/gitaly_client/blob_service.rb b/lib/gitlab/gitaly_client/blob_service.rb
index 39547328210..6b8e58e6199 100644
--- a/lib/gitlab/gitaly_client/blob_service.rb
+++ b/lib/gitlab/gitaly_client/blob_service.rb
@@ -27,7 +27,7 @@ module Gitlab
data << msg.data
end
- return nil if blob.oid.blank?
+ return if blob.oid.blank?
data = data.join
diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb
index d172c798da2..2528208440e 100644
--- a/lib/gitlab/gitaly_client/operation_service.rb
+++ b/lib/gitlab/gitaly_client/operation_service.rb
@@ -62,7 +62,7 @@ module Gitlab
end
branch = response.branch
- return nil unless branch
+ return unless branch
target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target_commit)
Gitlab::Git::Branch.new(@repository, branch.name, target_commit.id, target_commit)
@@ -277,14 +277,14 @@ module Gitlab
end
end
+ # rubocop:disable Metrics/ParameterLists
def user_commit_files(
user, branch_name, commit_message, actions, author_email, author_name,
- start_branch_name, start_repository)
-
+ start_branch_name, start_repository, force = false)
req_enum = Enumerator.new do |y|
header = user_commit_files_request_header(user, branch_name,
commit_message, actions, author_email, author_name,
- start_branch_name, start_repository)
+ start_branch_name, start_repository, force)
y.yield Gitaly::UserCommitFilesRequest.new(header: header)
@@ -319,6 +319,7 @@ module Gitlab
Gitlab::Git::OperationService::BranchUpdate.from_gitaly(response.branch_update)
end
+ # rubocop:enable Metrics/ParameterLists
def user_commit_patches(user, branch_name, patches)
header = Gitaly::UserApplyPatchRequest::Header.new(
@@ -382,9 +383,10 @@ module Gitlab
Gitlab::Git::OperationService::BranchUpdate.from_gitaly(response.branch_update)
end
+ # rubocop:disable Metrics/ParameterLists
def user_commit_files_request_header(
user, branch_name, commit_message, actions, author_email, author_name,
- start_branch_name, start_repository)
+ start_branch_name, start_repository, force)
Gitaly::UserCommitFilesRequestHeader.new(
repository: @gitaly_repo,
@@ -394,9 +396,11 @@ module Gitlab
commit_author_name: encode_binary(author_name),
commit_author_email: encode_binary(author_email),
start_branch_name: encode_binary(start_branch_name),
- start_repository: start_repository.gitaly_repository
+ start_repository: start_repository.gitaly_repository,
+ force: force
)
end
+ # rubocop:enable Metrics/ParameterLists
def user_commit_files_action_header(action)
Gitaly::UserCommitFilesActionHeader.new(
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index a7e20d9429e..a08bfd0e25b 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -324,8 +324,8 @@ module Gitlab
GitalyClient.call(@storage, :repository_service, :search_files_by_name, request, timeout: GitalyClient.fast_timeout).flat_map(&:files)
end
- def search_files_by_content(ref, query, chunked_response: true)
- request = Gitaly::SearchFilesByContentRequest.new(repository: @gitaly_repo, ref: ref, query: query, chunked_response: chunked_response)
+ def search_files_by_content(ref, query)
+ request = Gitaly::SearchFilesByContentRequest.new(repository: @gitaly_repo, ref: ref, query: query)
response = GitalyClient.call(@storage, :repository_service, :search_files_by_content, request)
search_results_from_response(response)
@@ -340,18 +340,11 @@ module Gitlab
gitaly_response.each do |message|
next if message.nil?
- # Old client will ignore :chunked_response flag
- # and return messages with `matches` key.
- # This code path will be removed post 12.0 release
- if message.matches.any?
- matches += message.matches
- else
- current_match << message.match_data
-
- if message.end_of_match
- matches << current_match
- current_match = +""
- end
+ current_match << message.match_data
+
+ if message.end_of_match
+ matches << current_match
+ current_match = +""
end
end
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index 754cccb6b3f..78ef6bfc0ec 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -32,11 +32,19 @@ module Gitlab
end
def self.disk_access_denied?
+ return false if rugged_enabled?
+
!temporarily_allowed?(ALLOW_KEY) && GitalyClient.feature_enabled?(DISK_ACCESS_DENIED_FLAG)
rescue
false # Err on the side of caution, don't break gitlab for people
end
+ def self.rugged_enabled?
+ Gitlab::Git::RuggedImpl::Repository::FEATURE_FLAGS.any? do |flag|
+ Feature.enabled?(flag)
+ end
+ end
+
def initialize(storage)
raise InvalidConfigurationError, "expected a Hash, got a #{storage.class.name}" unless storage.is_a?(Hash)
raise InvalidConfigurationError, INVALID_STORAGE_MESSAGE unless storage.has_key?('path')
diff --git a/lib/gitlab/github_import/importer/milestones_importer.rb b/lib/gitlab/github_import/importer/milestones_importer.rb
index 87cf2c8b598..71ff7465d9b 100644
--- a/lib/gitlab/github_import/importer/milestones_importer.rb
+++ b/lib/gitlab/github_import/importer/milestones_importer.rb
@@ -42,6 +42,7 @@ module Gitlab
description: milestone.description,
project_id: project.id,
state: state_for(milestone),
+ due_date: milestone.due_on&.to_date,
created_at: milestone.created_at,
updated_at: milestone.updated_at
}
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 3235d3ccc4e..e00309e7946 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -25,6 +25,7 @@ module Gitlab
gon.test_env = Rails.env.test?
gon.suggested_label_colors = LabelsHelper.suggested_colors
gon.first_day_of_week = current_user&.first_day_of_week || Gitlab::CurrentSettings.first_day_of_week
+ gon.ee = Gitlab.ee?
if current_user
gon.current_user_id = current_user.id
diff --git a/lib/gitlab/hashed_storage/migrator.rb b/lib/gitlab/hashed_storage/migrator.rb
index bf463077dcc..7046b4e2a43 100644
--- a/lib/gitlab/hashed_storage/migrator.rb
+++ b/lib/gitlab/hashed_storage/migrator.rb
@@ -13,10 +13,18 @@ module Gitlab
#
# @param [Integer] start first project id for the range
# @param [Integer] finish last project id for the range
- def bulk_schedule(start:, finish:)
+ def bulk_schedule_migration(start:, finish:)
::HashedStorage::MigratorWorker.perform_async(start, finish)
end
+ # Schedule a range of projects to be bulk rolledback with #bulk_rollback asynchronously
+ #
+ # @param [Integer] start first project id for the range
+ # @param [Integer] finish last project id for the range
+ def bulk_schedule_rollback(start:, finish:)
+ ::HashedStorage::RollbackerWorker.perform_async(start, finish)
+ end
+
# Start migration of projects from specified range
#
# Flagging a project to be migrated is a synchronous action
@@ -34,6 +42,23 @@ module Gitlab
end
# rubocop: enable CodeReuse/ActiveRecord
+ # Start rollback of projects from specified range
+ #
+ # Flagging a project to be rolled back is a synchronous action
+ # but the rollback runs through async jobs
+ #
+ # @param [Integer] start first project id for the range
+ # @param [Integer] finish last project id for the range
+ # rubocop: disable CodeReuse/ActiveRecord
+ def bulk_rollback(start:, finish:)
+ projects = build_relation(start, finish)
+
+ projects.with_route.find_each(batch_size: BATCH_SIZE) do |project|
+ rollback(project)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
# Flag a project to be migrated to Hashed Storage
#
# @param [Project] project that will be migrated
@@ -45,8 +70,15 @@ module Gitlab
Rails.logger.error("#{err.message} migrating storage of #{project.full_path} (ID=#{project.id}), trace - #{err.backtrace}")
end
+ # Flag a project to be rolled-back to Legacy Storage
+ #
+ # @param [Project] project that will be rolled-back
def rollback(project)
- # TODO: implement rollback strategy
+ Rails.logger.info "Starting storage rollback of #{project.full_path} (ID=#{project.id})..."
+
+ project.rollback_to_legacy_storage!
+ rescue => err
+ Rails.logger.error("#{err.message} rolling-back storage of #{project.full_path} (ID=#{project.id}), trace - #{err.backtrace}")
end
private
diff --git a/lib/gitlab/hashed_storage/rake_helper.rb b/lib/gitlab/hashed_storage/rake_helper.rb
index 38f552fab03..87a31a37e3f 100644
--- a/lib/gitlab/hashed_storage/rake_helper.rb
+++ b/lib/gitlab/hashed_storage/rake_helper.rb
@@ -24,7 +24,7 @@ module Gitlab
end
# rubocop: disable CodeReuse/ActiveRecord
- def self.project_id_batches(&block)
+ def self.project_id_batches_migration(&block)
Project.with_unmigrated_storage.in_batches(of: batch_size, start: range_from, finish: range_to) do |relation| # rubocop: disable Cop/InBatches
ids = relation.pluck(:id)
@@ -34,6 +34,16 @@ module Gitlab
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
+ def self.project_id_batches_rollback(&block)
+ Project.with_storage_feature(:repository).in_batches(of: batch_size, start: range_from, finish: range_to) do |relation| # rubocop: disable Cop/InBatches
+ ids = relation.pluck(:id)
+
+ yield ids.min, ids.max
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
def self.legacy_attachments_relation
Upload.joins(<<~SQL).where('projects.storage_version < :version OR projects.storage_version IS NULL', version: Project::HASHED_STORAGE_FEATURES[:attachments])
JOIN projects
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index a4e60bbd828..381f1dd4e55 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -39,7 +39,7 @@ module Gitlab
private
def custom_language
- return nil unless @language
+ return unless @language
Rouge::Lexer.find_fancy(@language)
end
diff --git a/lib/gitlab/i18n/metadata_entry.rb b/lib/gitlab/i18n/metadata_entry.rb
index 3764e379681..4facd10bfc8 100644
--- a/lib/gitlab/i18n/metadata_entry.rb
+++ b/lib/gitlab/i18n/metadata_entry.rb
@@ -15,7 +15,7 @@ module Gitlab
end
def expected_forms
- return nil unless plural_information
+ return unless plural_information
plural_information['nplurals'].to_i
end
diff --git a/lib/gitlab/import_export/json_hash_builder.rb b/lib/gitlab/import_export/json_hash_builder.rb
index 477499e1688..b145f37c052 100644
--- a/lib/gitlab/import_export/json_hash_builder.rb
+++ b/lib/gitlab/import_export/json_hash_builder.rb
@@ -67,7 +67,7 @@ module Gitlab
# +value+ existing model to be included in the hash
# +parsed_hash+ the original hash
def parse_hash(value)
- return nil if already_contains_methods?(value)
+ return if already_contains_methods?(value)
@attributes_finder.parse(value) do |hash|
{ include: hash_or_merge(value, hash) }
diff --git a/lib/gitlab/import_export/merge_request_parser.rb b/lib/gitlab/import_export/merge_request_parser.rb
index 040a70d6775..deb2f59f05f 100644
--- a/lib/gitlab/import_export/merge_request_parser.rb
+++ b/lib/gitlab/import_export/merge_request_parser.rb
@@ -20,6 +20,17 @@ module Gitlab
create_target_branch unless branch_exists?(@merge_request.target_branch)
end
+ # The merge_request_diff associated with the current @merge_request might
+ # be invalid. Than means, when the @merge_request object is saved, the
+ # @merge_request.merge_request_diff won't. This can leave the merge request
+ # in an invalid state, because a merge request must have an associated
+ # merge request diff.
+ # In this change, if the associated merge request diff is invalid, we set
+ # it to nil. This change, in association with the after callback
+ # :ensure_merge_request_diff in the MergeRequest class, makes that
+ # when the merge request is going to be created and it doesn't have
+ # one, a default one will be generated.
+ @merge_request.merge_request_diff = nil unless @merge_request.merge_request_diff&.valid?
@merge_request
end
diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb
index 099b488f68e..61a1aa6da5a 100644
--- a/lib/gitlab/import_export/relation_factory.rb
+++ b/lib/gitlab/import_export/relation_factory.rb
@@ -75,7 +75,7 @@ module Gitlab
# the relation_hash, updating references with new object IDs, mapping users using
# the "members_mapper" object, also updating notes if required.
def create
- return nil if unknown_service?
+ return if unknown_service?
setup_models
diff --git a/lib/gitlab/incoming_email.rb b/lib/gitlab/incoming_email.rb
index cc0c633b943..8b346f6d7d2 100644
--- a/lib/gitlab/incoming_email.rb
+++ b/lib/gitlab/incoming_email.rb
@@ -57,7 +57,7 @@ module Gitlab
def address_regex
wildcard_address = config.address
- return nil unless wildcard_address
+ return unless wildcard_address
regex = Regexp.escape(wildcard_address)
regex = regex.sub(Regexp.escape(WILDCARD_PLACEHOLDER), '(.+)')
diff --git a/lib/gitlab/json_cache.rb b/lib/gitlab/json_cache.rb
index 1adf83739ad..24daad638f4 100644
--- a/lib/gitlab/json_cache.rb
+++ b/lib/gitlab/json_cache.rb
@@ -71,7 +71,21 @@ module Gitlab
end
def parse_entry(raw, klass)
- klass.new(raw) if valid_entry?(raw, klass)
+ return unless valid_entry?(raw, klass)
+ return klass.new(raw) unless klass.ancestors.include?(ActiveRecord::Base)
+
+ # When the cached value is a persisted instance of ActiveRecord::Base in
+ # some cases a relation can return an empty collection becauses scope.none!
+ # is being applied on ActiveRecord::Associations::CollectionAssociation#scope
+ # when the new_record? method incorrectly returns false.
+ #
+ # See https://gitlab.com/gitlab-org/gitlab-ee/issues/9903#note_145329964
+ attributes = klass.attributes_builder.build_from_database(raw, {})
+ klass.allocate.init_with("attributes" => attributes, "new_record" => new_record?(raw, klass))
+ end
+
+ def new_record?(raw, klass)
+ raw.fetch(klass.primary_key, nil).blank?
end
def valid_entry?(raw, klass)
diff --git a/lib/gitlab/kubernetes/helm/install_command.rb b/lib/gitlab/kubernetes/helm/install_command.rb
index f931248b747..e33ba9305ce 100644
--- a/lib/gitlab/kubernetes/helm/install_command.rb
+++ b/lib/gitlab/kubernetes/helm/install_command.rb
@@ -7,7 +7,8 @@ module Gitlab
include BaseCommand
include ClientCommand
- attr_reader :name, :files, :chart, :version, :repository, :preinstall, :postinstall
+ attr_reader :name, :files, :chart, :repository, :preinstall, :postinstall
+ attr_accessor :version
def initialize(name:, chart:, files:, rbac:, version: nil, repository: nil, preinstall: nil, postinstall: nil)
@name = name
diff --git a/lib/gitlab/kubernetes/kube_client.rb b/lib/gitlab/kubernetes/kube_client.rb
index 624c2c67551..de14df56555 100644
--- a/lib/gitlab/kubernetes/kube_client.rb
+++ b/lib/gitlab/kubernetes/kube_client.rb
@@ -82,6 +82,8 @@ module Gitlab
def initialize(api_prefix, **kubeclient_options)
@api_prefix = api_prefix
@kubeclient_options = kubeclient_options.merge(http_max_redirects: 0)
+
+ validate_url!
end
def create_or_update_cluster_role_binding(resource)
@@ -118,6 +120,12 @@ module Gitlab
private
+ def validate_url!
+ return if Gitlab::CurrentSettings.allow_local_requests_from_hooks_and_services?
+
+ Gitlab::UrlBlocker.validate!(api_prefix, allow_local_network: false)
+ end
+
def cluster_role_binding_exists?(resource)
get_cluster_role_binding(resource.metadata.name)
rescue ::Kubeclient::ResourceNotFoundError
diff --git a/lib/gitlab/legacy_github_import/client.rb b/lib/gitlab/legacy_github_import/client.rb
index bc952147667..bbdd094e33b 100644
--- a/lib/gitlab/legacy_github_import/client.rb
+++ b/lib/gitlab/legacy_github_import/client.rb
@@ -68,7 +68,7 @@ module Gitlab
end
def user(login)
- return nil unless login.present?
+ return unless login.present?
return @users[login] if @users.key?(login)
@users[login] = api.user(login)
diff --git a/lib/gitlab/legacy_github_import/user_formatter.rb b/lib/gitlab/legacy_github_import/user_formatter.rb
index ec0e221b1ff..889e6aaa968 100644
--- a/lib/gitlab/legacy_github_import/user_formatter.rb
+++ b/lib/gitlab/legacy_github_import/user_formatter.rb
@@ -25,7 +25,7 @@ module Gitlab
end
def find_by_email
- return nil unless email
+ return unless email
User.find_by_any_email(email)
.try(:id)
@@ -33,7 +33,7 @@ module Gitlab
# rubocop: disable CodeReuse/ActiveRecord
def find_by_external_uid
- return nil unless id
+ return unless id
identities = ::Identity.arel_table
diff --git a/lib/gitlab/quick_actions/command_definition.rb b/lib/gitlab/quick_actions/command_definition.rb
index 259345b8a9a..e7bfcb16582 100644
--- a/lib/gitlab/quick_actions/command_definition.rb
+++ b/lib/gitlab/quick_actions/command_definition.rb
@@ -48,6 +48,8 @@ module Gitlab
def execute(context, arg)
return if noop? || !available?(context)
+ count_commands_executed_in(context)
+
execute_block(action_block, context, arg)
end
@@ -73,6 +75,13 @@ module Gitlab
private
+ def count_commands_executed_in(context)
+ return unless context.respond_to?(:commands_executed_count=)
+
+ context.commands_executed_count ||= 0
+ context.commands_executed_count += 1
+ end
+
def execute_block(block, context, arg)
if arg.present?
parsed = parse_params(arg, context)
diff --git a/lib/gitlab/sidekiq_middleware/memory_killer.rb b/lib/gitlab/sidekiq_middleware/memory_killer.rb
new file mode 100644
index 00000000000..ed2c7ee9a2d
--- /dev/null
+++ b/lib/gitlab/sidekiq_middleware/memory_killer.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module SidekiqMiddleware
+ class MemoryKiller
+ # Default the RSS limit to 0, meaning the MemoryKiller is disabled
+ MAX_RSS = (ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'] || 0).to_s.to_i
+ # Give Sidekiq 15 minutes of grace time after exceeding the RSS limit
+ GRACE_TIME = (ENV['SIDEKIQ_MEMORY_KILLER_GRACE_TIME'] || 15 * 60).to_s.to_i
+ # Wait 30 seconds for running jobs to finish during graceful shutdown
+ SHUTDOWN_WAIT = (ENV['SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT'] || 30).to_s.to_i
+
+ # Create a mutex used to ensure there will be only one thread waiting to
+ # shut Sidekiq down
+ MUTEX = Mutex.new
+
+ def call(worker, job, queue)
+ yield
+
+ current_rss = get_rss
+
+ return unless MAX_RSS > 0 && current_rss > MAX_RSS
+
+ Thread.new do
+ # Return if another thread is already waiting to shut Sidekiq down
+ next unless MUTEX.try_lock
+
+ Sidekiq.logger.warn "Sidekiq worker PID-#{pid} current RSS #{current_rss}"\
+ " exceeds maximum RSS #{MAX_RSS} after finishing job #{worker.class} JID-#{job['jid']}"
+ Sidekiq.logger.warn "Sidekiq worker PID-#{pid} will stop fetching new jobs in #{GRACE_TIME} seconds, and will be shut down #{SHUTDOWN_WAIT} seconds later"
+
+ # Wait `GRACE_TIME` to give the memory intensive job time to finish.
+ # Then, tell Sidekiq to stop fetching new jobs.
+ wait_and_signal(GRACE_TIME, 'SIGTSTP', 'stop fetching new jobs')
+
+ # Wait `SHUTDOWN_WAIT` to give already fetched jobs time to finish.
+ # Then, tell Sidekiq to gracefully shut down by giving jobs a few more
+ # moments to finish, killing and requeuing them if they didn't, and
+ # then terminating itself. Sidekiq will replicate the TERM to all its
+ # children if it can.
+ wait_and_signal(SHUTDOWN_WAIT, 'SIGTERM', 'gracefully shut down')
+
+ # Wait for Sidekiq to shutdown gracefully, and kill it if it didn't.
+ # Kill the whole pgroup, so we can be sure no children are left behind
+ wait_and_signal_pgroup(Sidekiq.options[:timeout] + 2, 'SIGKILL', 'die')
+ end
+ end
+
+ private
+
+ def get_rss
+ output, status = Gitlab::Popen.popen(%W(ps -o rss= -p #{pid}), Rails.root.to_s)
+ return 0 unless status.zero?
+
+ output.to_i
+ end
+
+ # If this sidekiq process is pgroup leader, signal to the whole pgroup
+ def wait_and_signal_pgroup(time, signal, explanation)
+ return wait_and_signal(time, signal, explanation) unless Process.getpgrp == pid
+
+ Sidekiq.logger.warn "waiting #{time} seconds before sending Sidekiq worker PGRP-#{pid} #{signal} (#{explanation})"
+ sleep(time)
+
+ Sidekiq.logger.warn "sending Sidekiq worker PGRP-#{pid} #{signal} (#{explanation})"
+ Process.kill(signal, "-#{pid}")
+ end
+
+ def wait_and_signal(time, signal, explanation)
+ Sidekiq.logger.warn "waiting #{time} seconds before sending Sidekiq worker PID-#{pid} #{signal} (#{explanation})"
+ sleep(time)
+
+ Sidekiq.logger.warn "sending Sidekiq worker PID-#{pid} #{signal} (#{explanation})"
+ Process.kill(signal, pid)
+ end
+
+ def pid
+ Process.pid
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sidekiq_middleware/shutdown.rb b/lib/gitlab/sidekiq_middleware/shutdown.rb
deleted file mode 100644
index 19f3be83bce..00000000000
--- a/lib/gitlab/sidekiq_middleware/shutdown.rb
+++ /dev/null
@@ -1,135 +0,0 @@
-# frozen_string_literal: true
-
-require 'mutex_m'
-
-module Gitlab
- module SidekiqMiddleware
- class Shutdown
- extend Mutex_m
-
- # Default the RSS limit to 0, meaning the MemoryKiller is disabled
- MAX_RSS = (ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'] || 0).to_s.to_i
- # Give Sidekiq 15 minutes of grace time after exceeding the RSS limit
- GRACE_TIME = (ENV['SIDEKIQ_MEMORY_KILLER_GRACE_TIME'] || 15 * 60).to_s.to_i
- # Wait 30 seconds for running jobs to finish during graceful shutdown
- SHUTDOWN_WAIT = (ENV['SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT'] || 30).to_s.to_i
-
- # This exception can be used to request that the middleware start shutting down Sidekiq
- WantShutdown = Class.new(StandardError)
-
- ShutdownWithoutRaise = Class.new(WantShutdown)
- private_constant :ShutdownWithoutRaise
-
- # For testing only, to avoid race conditions (?) in Rspec mocks.
- attr_reader :trace
-
- # We store the shutdown thread in a class variable to ensure that there
- # can be only one shutdown thread in the process.
- def self.create_shutdown_thread
- mu_synchronize do
- break unless @shutdown_thread.nil?
-
- @shutdown_thread = Thread.new { yield }
- end
- end
-
- # For testing only: so we can wait for the shutdown thread to finish.
- def self.shutdown_thread
- mu_synchronize { @shutdown_thread }
- end
-
- # For testing only: so that we can reset the global state before each test.
- def self.clear_shutdown_thread
- mu_synchronize { @shutdown_thread = nil }
- end
-
- def initialize
- @trace = Queue.new if Rails.env.test?
- end
-
- def call(worker, job, queue)
- shutdown_exception = nil
-
- begin
- yield
- check_rss!
- rescue WantShutdown => ex
- shutdown_exception = ex
- end
-
- return unless shutdown_exception
-
- self.class.create_shutdown_thread do
- do_shutdown(worker, job, shutdown_exception)
- end
-
- raise shutdown_exception unless shutdown_exception.is_a?(ShutdownWithoutRaise)
- end
-
- private
-
- def do_shutdown(worker, job, shutdown_exception)
- Sidekiq.logger.warn "Sidekiq worker PID-#{pid} shutting down because of #{shutdown_exception} after job "\
- "#{worker.class} JID-#{job['jid']}"
- Sidekiq.logger.warn "Sidekiq worker PID-#{pid} will stop fetching new jobs in #{GRACE_TIME} seconds, and will be shut down #{SHUTDOWN_WAIT} seconds later"
-
- # Wait `GRACE_TIME` to give the memory intensive job time to finish.
- # Then, tell Sidekiq to stop fetching new jobs.
- wait_and_signal(GRACE_TIME, 'SIGTSTP', 'stop fetching new jobs')
-
- # Wait `SHUTDOWN_WAIT` to give already fetched jobs time to finish.
- # Then, tell Sidekiq to gracefully shut down by giving jobs a few more
- # moments to finish, killing and requeuing them if they didn't, and
- # then terminating itself.
- wait_and_signal(SHUTDOWN_WAIT, 'SIGTERM', 'gracefully shut down')
-
- # Wait for Sidekiq to shutdown gracefully, and kill it if it didn't.
- wait_and_signal(Sidekiq.options[:timeout] + 2, 'SIGKILL', 'die')
- end
-
- def check_rss!
- return unless MAX_RSS > 0
-
- current_rss = get_rss
- return unless current_rss > MAX_RSS
-
- raise ShutdownWithoutRaise.new("current RSS #{current_rss} exceeds maximum RSS #{MAX_RSS}")
- end
-
- def get_rss
- output, status = Gitlab::Popen.popen(%W(ps -o rss= -p #{pid}), Rails.root.to_s)
- return 0 unless status.zero?
-
- output.to_i
- end
-
- def wait_and_signal(time, signal, explanation)
- Sidekiq.logger.warn "waiting #{time} seconds before sending Sidekiq worker PID-#{pid} #{signal} (#{explanation})"
- sleep(time)
-
- Sidekiq.logger.warn "sending Sidekiq worker PID-#{pid} #{signal} (#{explanation})"
- kill(signal, pid)
- end
-
- def pid
- Process.pid
- end
-
- def sleep(time)
- if Rails.env.test?
- @trace << [:sleep, time]
- else
- Kernel.sleep(time)
- end
- end
-
- def kill(signal, pid)
- if Rails.env.test?
- @trace << [:kill, signal, pid]
- else
- Process.kill(signal, pid)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/sidekiq_signals.rb b/lib/gitlab/sidekiq_signals.rb
new file mode 100644
index 00000000000..82462544d07
--- /dev/null
+++ b/lib/gitlab/sidekiq_signals.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ # As a process group leader, we can ensure that children of sidekiq are killed
+ # at the same time as sidekiq itself, to stop long-lived children from being
+ # reparented to init and "escaping". To do this, we override the default
+ # handlers used by sidekiq for INT and TERM signals
+ module SidekiqSignals
+ REPLACE_SIGNALS = %w[INT TERM].freeze
+
+ SIDEKIQ_CHANGED_MESSAGE =
+ "Intercepting signal handlers: #{REPLACE_SIGNALS.join(", ")} failed. " \
+ "Sidekiq should have registered them, but appears not to have done so."
+
+ def self.install!(sidekiq_handlers)
+ # This only works if we're process group leader
+ return unless Process.getpgrp == Process.pid
+
+ raise SIDEKIQ_CHANGED_MESSAGE unless
+ REPLACE_SIGNALS == sidekiq_handlers.keys & REPLACE_SIGNALS
+
+ REPLACE_SIGNALS.each do |signal|
+ old_handler = sidekiq_handlers[signal]
+ sidekiq_handlers[signal] = ->(cli) do
+ blindly_signal_pgroup!(signal)
+ old_handler.call(cli)
+ end
+ end
+ end
+
+ # The process group leader can forward INT and TERM signals to the whole
+ # group. However, the forwarded signal is *also* received by the leader,
+ # which could lead to an infinite loop. We can avoid this by temporarily
+ # ignoring the forwarded signal. This may cause us to miss some repeated
+ # signals from outside the process group, but that isn't fatal.
+ def self.blindly_signal_pgroup!(signal)
+ old_trap = trap(signal, 'IGNORE')
+ begin
+ Process.kill(signal, 0)
+ ensure
+ trap(signal, old_trap)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sql/pattern.rb b/lib/gitlab/sql/pattern.rb
index 92388262035..07d0acdbae9 100644
--- a/lib/gitlab/sql/pattern.rb
+++ b/lib/gitlab/sql/pattern.rb
@@ -33,7 +33,7 @@ module Gitlab
# `LOWER(column) = query` instead of using `ILIKE`.
def fuzzy_arel_match(column, query, lower_exact_match: false)
query = query.squish
- return nil unless query.present?
+ return unless query.present?
words = select_fuzzy_words(query)
diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb
index fbefb5f7f0e..3e2bb11c35f 100644
--- a/lib/gitlab/template/gitlab_ci_yml_template.rb
+++ b/lib/gitlab/template/gitlab_ci_yml_template.rb
@@ -28,11 +28,6 @@ module Gitlab
def finder(project = nil)
Gitlab::Template::Finders::GlobalTemplateFinder.new(self.base_dir, self.extension, self.categories)
end
-
- def dropdown_names(context)
- categories = context == 'autodeploy' ? ['Auto deploy'] : %w(General Pages)
- super().slice(*categories)
- end
end
end
end
diff --git a/lib/gitlab/tracing/jaeger_factory.rb b/lib/gitlab/tracing/jaeger_factory.rb
index 2682007302a..93520d5667b 100644
--- a/lib/gitlab/tracing/jaeger_factory.rb
+++ b/lib/gitlab/tracing/jaeger_factory.rb
@@ -60,7 +60,7 @@ module Gitlab
elsif udp_endpoint.present?
sender = get_udp_sender(encoder, udp_endpoint)
else
- return nil
+ return
end
Jaeger::Reporters::RemoteReporter.new(
diff --git a/lib/gitlab/tree_summary.rb b/lib/gitlab/tree_summary.rb
index 453d78e2f7b..8518a13cd1c 100644
--- a/lib/gitlab/tree_summary.rb
+++ b/lib/gitlab/tree_summary.rb
@@ -95,7 +95,7 @@ module Gitlab
end
def cache_commit(commit)
- return nil unless commit.present?
+ return unless commit.present?
resolved_commits[commit.id] ||= commit
end
diff --git a/lib/gitlab/user_access.rb b/lib/gitlab/user_access.rb
index 980a8014409..9ef23cf849f 100644
--- a/lib/gitlab/user_access.rb
+++ b/lib/gitlab/user_access.rb
@@ -118,8 +118,8 @@ module Gitlab
protected_refs: project.protected_tags)
end
- request_cache def protected?(kind, project, ref)
- kind.protected?(project, ref)
+ request_cache def protected?(kind, project, refs)
+ kind.protected?(project, refs)
end
end
end
diff --git a/lib/system_check/app/git_user_default_ssh_config_check.rb b/lib/system_check/app/git_user_default_ssh_config_check.rb
index 6cd53779bfd..a331f88873b 100644
--- a/lib/system_check/app/git_user_default_ssh_config_check.rb
+++ b/lib/system_check/app/git_user_default_ssh_config_check.rb
@@ -53,7 +53,7 @@ module SystemCheck
end
def ssh_dir
- return nil unless home_dir
+ return unless home_dir
File.join(home_dir, '.ssh')
end
diff --git a/lib/tasks/gemojione.rake b/lib/tasks/gemojione.rake
index 560a52053d8..c24207b134a 100644
--- a/lib/tasks/gemojione.rake
+++ b/lib/tasks/gemojione.rake
@@ -30,33 +30,28 @@ namespace :gemojione do
# We don't have `node_modules` available in built versions of GitLab
FileUtils.cp_r(Rails.root.join('node_modules', 'emoji-unicode-version', 'emoji-unicode-version-map.json'), File.join(Rails.root, 'fixtures', 'emojis'))
- dir = Gemojione.images_path
resultant_emoji_map = {}
Gitlab::Emoji.emojis.each do |name, emoji_hash|
# Ignore aliases
unless Gitlab::Emoji.emojis_aliases.key?(name)
- fpath = File.join(dir, "#{emoji_hash['unicode']}.png")
- hash_digest = Digest::SHA256.file(fpath).hexdigest
-
category = emoji_hash['category']
if name == 'gay_pride_flag'
category = 'flags'
end
entry = {
- category: category,
- moji: emoji_hash['moji'],
- description: emoji_hash['description'],
- unicodeVersion: Gitlab::Emoji.emoji_unicode_version(name),
- digest: hash_digest
+ c: category,
+ e: emoji_hash['moji'],
+ d: emoji_hash['description'],
+ u: Gitlab::Emoji.emoji_unicode_version(name)
}
resultant_emoji_map[name] = entry
end
end
- out = File.join(Rails.root, 'fixtures', 'emojis', 'digests.json')
+ out = File.join(Rails.root, 'public', '-', 'emojis', '1', 'emojis.json')
File.open(out, 'w') do |handle|
handle.write(JSON.pretty_generate(resultant_emoji_map))
end
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index 3a1a36e36ce..3977fc7ad8c 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -61,7 +61,7 @@ namespace :gitlab do
Rake::Task['gitlab:backup:uploads:restore'].invoke unless backup.skipped?('uploads')
Rake::Task['gitlab:backup:builds:restore'].invoke unless backup.skipped?('builds')
Rake::Task['gitlab:backup:artifacts:restore'].invoke unless backup.skipped?('artifacts')
- Rake::Task["gitlab:backup:pages:restore"].invoke unless backup.skipped?('pages')
+ Rake::Task['gitlab:backup:pages:restore'].invoke unless backup.skipped?('pages')
Rake::Task['gitlab:backup:lfs:restore'].invoke unless backup.skipped?('lfs')
Rake::Task['gitlab:backup:registry:restore'].invoke unless backup.skipped?('registry')
Rake::Task['gitlab:shell:setup'].invoke
diff --git a/lib/tasks/gitlab/features.rake b/lib/tasks/gitlab/features.rake
new file mode 100644
index 00000000000..d115961108e
--- /dev/null
+++ b/lib/tasks/gitlab/features.rake
@@ -0,0 +1,24 @@
+namespace :gitlab do
+ namespace :features do
+ desc 'GitLab | Features | Enable direct Git access via Rugged for NFS'
+ task enable_rugged: :environment do
+ set_rugged_feature_flags(true)
+ puts 'All Rugged feature flags were enabled.'
+ end
+
+ task disable_rugged: :environment do
+ set_rugged_feature_flags(false)
+ puts 'All Rugged feature flags were disabled.'
+ end
+ end
+
+ def set_rugged_feature_flags(status)
+ Gitlab::Git::RuggedImpl::Repository::FEATURE_FLAGS.each do |flag|
+ if status
+ Feature.enable(flag)
+ else
+ Feature.disable(flag)
+ end
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/storage.rake b/lib/tasks/gitlab/storage.rake
index f9ce3e1d338..a2136ce1b92 100644
--- a/lib/tasks/gitlab/storage.rake
+++ b/lib/tasks/gitlab/storage.rake
@@ -36,8 +36,54 @@ namespace :gitlab do
print "Enqueuing migration of #{legacy_projects_count} projects in batches of #{helper.batch_size}"
- helper.project_id_batches do |start, finish|
- storage_migrator.bulk_schedule(start: start, finish: finish)
+ helper.project_id_batches_migration do |start, finish|
+ storage_migrator.bulk_schedule_migration(start: start, finish: finish)
+
+ print '.'
+ end
+
+ puts ' Done!'
+ end
+
+ desc 'GitLab | Storage | Rollback existing projects to Legacy Storage'
+ task rollback_to_legacy: :environment do
+ if Gitlab::Database.read_only?
+ warn 'This task requires database write access. Exiting.'
+
+ next
+ end
+
+ storage_migrator = Gitlab::HashedStorage::Migrator.new
+ helper = Gitlab::HashedStorage::RakeHelper
+
+ if helper.range_single_item?
+ project = Project.with_storage_feature(:repository).find_by(id: helper.range_from)
+
+ unless project
+ warn "There are no projects that can be rolledback with ID=#{helper.range_from}"
+
+ next
+ end
+
+ puts "Enqueueing storage rollback of #{project.full_path} (ID=#{project.id})..."
+ storage_migrator.rollback(project)
+
+ next
+ end
+
+ hashed_projects_count = Project.with_storage_feature(:repository).count
+
+ if hashed_projects_count == 0
+ warn 'There are no projects that can have storage rolledback. Nothing to do!'
+
+ next
+ end
+
+ print "Enqueuing rollback of #{hashed_projects_count} projects in batches of #{helper.batch_size}"
+
+ helper.project_id_batches_rollback do |start, finish|
+ puts "Start: #{start} FINISH: #{finish}"
+ storage_migrator.bulk_schedule_rollback(start: start, finish: finish)
print '.'
end
diff --git a/lib/tasks/karma.rake b/lib/tasks/karma.rake
index 62a12174efa..53325d492d1 100644
--- a/lib/tasks/karma.rake
+++ b/lib/tasks/karma.rake
@@ -2,7 +2,7 @@ unless Rails.env.production?
namespace :karma do
desc 'GitLab | Karma | Generate fixtures for JavaScript tests'
RSpec::Core::RakeTask.new(:fixtures, [:pattern]) do |t, args|
- args.with_defaults(pattern: 'spec/javascripts/fixtures/*.rb')
+ args.with_defaults(pattern: '{spec,ee/spec}/javascripts/fixtures/*.rb')
ENV['NO_KNAPSACK'] = 'true'
t.pattern = args[:pattern]
t.rspec_opts = '--format documentation'
diff --git a/lib/unfold_form.rb b/lib/unfold_form.rb
deleted file mode 100644
index 05bb3ed7f1c..00000000000
--- a/lib/unfold_form.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-require_relative 'gt_one_coercion'
-
-class UnfoldForm
- include Virtus.model
-
- attribute :since, GtOneCoercion
- attribute :to, GtOneCoercion
- attribute :bottom, Boolean
- attribute :unfold, Boolean, default: true
- attribute :offset, Integer
- attribute :indent, Integer, default: 0
-end
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index 71f89268a38..af98becc19e 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:11\n"
+"PO-Revision-Date: 2019-03-06 15:38\n"
msgid " Status"
msgstr ""
@@ -51,6 +51,15 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -186,12 +195,30 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -216,15 +243,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -312,6 +339,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -342,6 +372,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -480,6 +519,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -495,6 +549,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -579,24 +636,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -765,6 +849,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -780,6 +867,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -849,7 +939,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -861,6 +951,15 @@ 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 previewing the blob"
msgstr ""
@@ -873,6 +972,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -909,6 +1011,9 @@ 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 getting projects"
msgstr ""
@@ -966,12 +1071,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -1062,6 +1173,60 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1104,9 +1269,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1191,6 +1362,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1206,9 +1380,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1767,6 +1938,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1803,6 +1977,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1815,6 +1992,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1881,9 +2061,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -2043,6 +2220,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -2058,9 +2238,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2106,10 +2283,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2148,6 +2325,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2244,7 +2424,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2259,9 +2439,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2307,9 +2484,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2547,15 +2721,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2859,6 +3045,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3351,6 +3540,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3429,6 +3621,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3600,6 +3795,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3636,6 +3834,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3654,9 +3855,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3681,6 +3879,12 @@ 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 ""
@@ -3732,15 +3936,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3753,6 +3975,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3804,6 +4038,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3873,6 +4110,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3951,6 +4215,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -4038,7 +4305,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4104,9 +4371,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4164,9 +4428,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4257,9 +4518,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4374,7 +4632,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4404,9 +4662,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4839,15 +5103,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4905,6 +5178,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5277,9 +5553,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5331,6 +5622,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5388,6 +5685,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5406,6 +5706,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5448,7 +5751,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5637,6 +5940,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5724,6 +6030,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5901,6 +6210,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5946,6 +6264,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5973,36 +6294,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -6057,6 +6348,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6207,9 +6501,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6354,6 +6645,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6435,13 +6729,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6504,9 +6798,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6534,13 +6834,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6636,6 +6939,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6843,6 +7149,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6852,6 +7161,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -7044,6 +7356,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -7059,6 +7377,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7179,9 +7500,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7191,9 +7524,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7218,6 +7560,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7416,9 +7761,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7518,6 +7860,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7560,6 +7905,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7659,6 +8007,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -8022,6 +8373,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8157,6 +8514,27 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Resend invite"
msgstr ""
@@ -8319,6 +8697,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8349,6 +8730,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8382,6 +8766,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8442,6 +8829,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8700,6 +9090,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8724,6 +9117,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8781,9 +9177,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8886,6 +9288,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9156,6 +9576,12 @@ 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 "Stars"
msgstr ""
@@ -9366,6 +9792,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9555,6 +9984,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9678,6 +10110,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9723,6 +10158,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9744,6 +10194,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9828,6 +10281,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10395,6 +10854,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10404,6 +10866,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10632,6 +11097,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10641,6 +11109,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10944,6 +11415,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -11049,6 +11523,9 @@ 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 ""
@@ -11109,6 +11586,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11202,6 +11682,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11301,6 +11784,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11403,9 +11889,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11445,6 +11928,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11553,9 +12039,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11682,6 +12165,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11754,6 +12240,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11823,6 +12312,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index ed642e63cdf..cf0ef977e47 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:12\n"
+"PO-Revision-Date: 2019-03-06 15:39\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d подаване"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Ðабор от графики отноÑно непрекъÑнатата интеграциÑ"
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "ОтмÑна"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Графики"
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "ТърÑене по път"
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr "ВнаÑÑне на хранилище"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr "ПредÑтавÑме Ви анализа на циклите"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Ðаучете повече в"
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Ðов план за Ñхема"
msgid "New Snippet"
msgstr ""
-msgid "New Snippets"
-msgstr ""
-
msgid "New branch"
msgstr "Ðов клон"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr "ÐÑма доÑтатъчно данни"
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr "Променливи"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "ÑобÑтвен"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Схеми"
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr "Връзката към изнеÑените данни на проекÑ
msgid "Project export started. A download link will be sent by email."
msgstr "ИзнаÑÑнето на проекта започна. Ще получите връзка към данните по е-поща."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Планиране на Ñхемите"
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Преминаване към клон/етикет"
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr "Това означава, че нÑма да можете да изпр
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "ОттеглÑне на заÑвката за доÑтъп"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 "Ðе можете да Ñъздавате повече проекти"
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index a6bc33b3974..e70b8c43f9e 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:12\n"
+"PO-Revision-Date: 2019-03-06 15:47\n"
msgid " Status"
msgstr " Estat"
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d comissió"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Afegeix una taula"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Afegeix el comentari"
+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 "Afegeix un comentari a la imatge"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Afegeix una llicència"
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr "Configuració avançada"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr "Tots"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr "ag."
msgid "August"
msgstr "agost"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Diagrames"
msgid "Chat"
msgstr "Xat"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr "Tancades"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Incidències tancades"
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr "Descripció:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr "Introduïu el títol de la petició de fusió"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr "Mostra-ho tot"
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr "Nova"
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr "Desa els canvis"
-
msgid "FeatureFlags|Status"
msgstr "Estat"
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr "Filtra..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "Claus GPG"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "General"
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr "Enrere"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "Enrere"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "Vés a"
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr "Informació del grup:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Petició de fusió"
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr "Sistema"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr "Més informació"
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index c71b768ece2..97c0e8046a1 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:13\n"
+"PO-Revision-Date: 2019-03-06 15:52\n"
msgid " Status"
msgstr ""
@@ -47,6 +47,13 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -156,12 +163,28 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -182,15 +205,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -270,6 +293,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -296,6 +322,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -416,6 +449,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -431,6 +479,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -515,24 +566,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -701,6 +779,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -714,6 +795,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -783,7 +867,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -795,6 +879,15 @@ 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 previewing the blob"
msgstr ""
@@ -807,6 +900,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -843,6 +939,9 @@ 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 getting projects"
msgstr ""
@@ -900,12 +999,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -996,6 +1101,52 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1038,9 +1189,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1125,6 +1282,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1140,9 +1300,6 @@ msgstr "Srp"
msgid "August"
msgstr "Srpen"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1701,6 +1858,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1737,6 +1897,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1749,6 +1912,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1815,9 +1981,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1977,6 +2140,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1992,9 +2158,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2040,10 +2203,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2082,6 +2245,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2178,7 +2344,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2193,9 +2359,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2241,9 +2404,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2481,15 +2641,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2791,6 +2963,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3281,6 +3456,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3359,6 +3537,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3530,6 +3711,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3566,6 +3750,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3584,9 +3771,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3611,6 +3795,12 @@ 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 ""
@@ -3662,15 +3852,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3683,6 +3891,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3734,6 +3954,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3803,6 +4026,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3881,6 +4131,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3968,7 +4221,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4034,9 +4287,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4094,9 +4344,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4185,9 +4432,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4302,7 +4546,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4332,9 +4576,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4767,15 +5017,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4833,6 +5092,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5203,9 +5465,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5257,6 +5534,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5312,6 +5595,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5330,6 +5616,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5372,7 +5661,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5561,6 +5850,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5646,6 +5938,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5821,6 +6116,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5866,6 +6170,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5893,36 +6200,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5977,6 +6254,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6127,9 +6407,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6274,6 +6551,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6353,13 +6633,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6422,9 +6702,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6452,13 +6738,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6554,6 +6843,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6759,6 +7051,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6768,6 +7063,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6960,6 +7258,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6975,6 +7279,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7095,9 +7402,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7107,9 +7426,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7134,6 +7462,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7332,9 +7663,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7434,6 +7762,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7476,6 +7807,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7575,6 +7909,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7936,6 +8273,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8071,6 +8414,23 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Resend invite"
msgstr ""
@@ -8231,6 +8591,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8261,6 +8624,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8294,6 +8660,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8354,6 +8723,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8612,6 +8984,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8636,6 +9011,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8693,9 +9071,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8796,6 +9180,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9066,6 +9468,12 @@ 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 "Stars"
msgstr ""
@@ -9276,6 +9684,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9465,6 +9876,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9588,6 +10002,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9633,6 +10050,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9654,6 +10086,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9738,6 +10173,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10301,6 +10742,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10310,6 +10754,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10538,6 +10985,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10547,6 +10997,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10850,6 +11303,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10955,6 +11411,9 @@ 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 ""
@@ -11015,6 +11474,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11108,6 +11570,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11199,6 +11664,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11297,9 +11765,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11339,6 +11804,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11439,9 +11907,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11564,6 +12029,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11636,6 +12104,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11701,6 +12172,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 174737050e6..1eabb89a94c 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:16\n"
+"PO-Revision-Date: 2019-03-06 15:53\n"
msgid " Status"
msgstr ""
@@ -51,6 +51,15 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -186,12 +195,30 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -216,15 +243,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -312,6 +339,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -342,6 +372,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -480,6 +519,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -495,6 +549,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -579,24 +636,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -765,6 +849,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -780,6 +867,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -849,7 +939,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -861,6 +951,15 @@ 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 previewing the blob"
msgstr ""
@@ -873,6 +972,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -909,6 +1011,9 @@ 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 getting projects"
msgstr ""
@@ -966,12 +1071,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -1062,6 +1173,60 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+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] ""
+msgstr[5] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1104,9 +1269,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1191,6 +1362,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1206,9 +1380,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1767,6 +1938,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1803,6 +1977,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1815,6 +1992,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1881,9 +2061,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -2043,6 +2220,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -2058,9 +2238,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2106,10 +2283,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2148,6 +2325,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2244,7 +2424,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2259,9 +2439,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2307,9 +2484,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2547,15 +2721,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2859,6 +3045,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3351,6 +3540,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3429,6 +3621,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3600,6 +3795,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3636,6 +3834,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3654,9 +3855,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3681,6 +3879,12 @@ 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 ""
@@ -3732,15 +3936,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3753,6 +3975,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3804,6 +4038,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3873,6 +4110,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3951,6 +4215,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -4038,7 +4305,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4104,9 +4371,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4164,9 +4428,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4257,9 +4518,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4374,7 +4632,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4404,9 +4662,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4839,15 +5103,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4905,6 +5178,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5277,9 +5553,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5331,6 +5622,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5388,6 +5685,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5406,6 +5706,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5448,7 +5751,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5637,6 +5940,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5724,6 +6030,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5901,6 +6210,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5946,6 +6264,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5973,36 +6294,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -6057,6 +6348,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6207,9 +6501,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6354,6 +6645,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6435,13 +6729,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6504,9 +6798,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6534,13 +6834,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6636,6 +6939,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6843,6 +7149,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6852,6 +7161,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -7044,6 +7356,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -7059,6 +7377,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7179,9 +7500,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7191,9 +7524,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7218,6 +7560,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7416,9 +7761,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7518,6 +7860,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7560,6 +7905,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7659,6 +8007,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -8022,6 +8373,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8157,6 +8514,27 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Resend invite"
msgstr ""
@@ -8319,6 +8697,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8349,6 +8730,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8382,6 +8766,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8442,6 +8829,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8700,6 +9090,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8724,6 +9117,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8781,9 +9177,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8886,6 +9288,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9156,6 +9576,12 @@ 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 "Stars"
msgstr ""
@@ -9366,6 +9792,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9555,6 +9984,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9678,6 +10110,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9723,6 +10158,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9744,6 +10194,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9828,6 +10281,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10395,6 +10854,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10404,6 +10866,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10632,6 +11097,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10641,6 +11109,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10944,6 +11415,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -11049,6 +11523,9 @@ 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 ""
@@ -11109,6 +11586,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11202,6 +11682,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11301,6 +11784,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11403,9 +11889,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11445,6 +11928,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11553,9 +12039,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11682,6 +12165,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11754,6 +12240,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11823,6 +12312,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index ee02b31f2b0..231c3569bb2 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:13\n"
+"PO-Revision-Date: 2019-03-06 15:52\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index f77e2599726..cc544400449 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:15\n"
+"PO-Revision-Date: 2019-03-06 15:39\n"
msgid " Status"
msgstr " Status"
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" in Projekten"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d Commit"
@@ -126,12 +131,26 @@ msgstr "%{counter_storage} (%{counter_repositories} Repositories, %{counter_buil
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "%{count} weitere Zugewiesene"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} Teilnehmer"
@@ -148,15 +167,15 @@ msgstr "%{filePath} gelöscht"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} mehr"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}Gruppen%{group_docs_link_end} ermöglichen dir die Verwaltung und die Zusammenarbeit über mehrere Projekte hinweg. Mitglieder einer Gruppe haben Zugriff auf alle Projekte darin."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wird entfernt! Bist du sicher?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr "+ %{count} weitere"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} weitere"
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] "1 %{type} Änderung"
msgstr[1] "%{count} %{type} Änderungen"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "1 geschlossenes Ticket"
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "Ein 'Runner' ist ein Prozess, welcher ein Job ausführt. Du kannst so viele Runner erstellen wie du benötigst."
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Eine Sammlung von Graphen bezüglich kontinuierlicher Integration"
@@ -367,6 +409,9 @@ msgstr "Ein Mitglied des GitLab-Missbrauchsteams wird deinen Bericht so schnell
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "Ein neuer Branch wird in deinem Fork erzeugt und ein neuer Merge-Request wird gestartet."
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "In einem Projekt speicherst du deine Dateien (Repository), planst deine Arbeit (Tickets) und veröffentlichst deine Dokumentation (Wiki), %{among_other_things_link}."
@@ -451,24 +496,51 @@ msgstr "Kubernetes-Cluster hinzufügen"
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 "Füge zu deinem Wiki eine Startseite mit Informationen zu deinem GitLab-Project hinzu und GitLab wird sie hier anstatt dieser Meldung anzeigen."
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Tabelle hinzufügen"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "Füge zusätzlichen Text hinzu, der in jeglicher E-Mail-Kommunikation angezeigt wird. Maximal %{character_limit} Zeichen"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Jetzt kommentieren"
+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 "Bildkommentar hinzufügen"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Lizenz hinzufügen"
@@ -637,6 +709,9 @@ msgstr "Erweiterte Berechtigungen, Large File Storage und Einstellungen zur Zwei
msgid "Advanced settings"
msgstr "Erweiterte Einstellungen"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "Alarm"
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr "Alle"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "Alle Änderungen sind committed"
@@ -717,7 +795,7 @@ msgstr "Bei einem leeren GitLab-Benutzerfeld wird der vollständigen Namen des F
msgid "An error has occurred"
msgstr "Es ist ein Fehler aufgetreten"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ msgstr "Beim Hinzufügen eines neuen Entwurfs ist ein Fehler aufgetreten."
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 previewing the blob"
msgstr "Bei der Vorschau des Blobs ist ein Fehler aufgetreten"
@@ -741,6 +828,9 @@ msgstr "Beim Aktualisieren der Ticket-Gewichtung ist ein Fehler aufgetreten"
msgid "An error occurred while adding approver"
msgstr "Beim Hinzufügen eines Genehmigungsberechtigten ist ein Fehler aufgetreten"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Beim Löschen des Kommentars ist ein Fehler aufgetreten"
@@ -777,6 +867,9 @@ msgstr "Beim Abrufen der Jobs ist ein Fehler aufgetreten."
msgid "An error occurred while fetching the pipeline."
msgstr "Beim Abrufen der Pipeline ist ein Fehler aufgetreten."
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Beim Abrufen der Projekte ist ein Fehler aufgetreten"
@@ -834,12 +927,18 @@ msgstr "Beim Speichern des LDAP-Ãœberschreibungsstatus ist ein Fehler aufgetrete
msgid "An error occurred while saving assignees"
msgstr "Beim Speichern der Zuweisungen ist ein Fehler aufgetreten"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Beim Abonnieren von Benachrichtigungen ist ein Fehler aufgetreten."
msgid "An error occurred while unsubscribing to notifications."
msgstr "Beim Abbestellen der Benachrichtigungen ist ein Fehler aufgetreten."
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "Beim Aktualisieren des Kommentars ist ein Fehler aufgetreten"
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr "Möchtest du den öffentlichen Schlüssel wirklich neu generieren? Du mu
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Bist du sicher, dass du %{group_name} wirklich entfernen willst?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr "Zuweisungslisten zeigen alle dem ausgewählten Benutzer zugewiesenen Tic
msgid "Assignee(s)"
msgstr "Zugewiesene Personen"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr "Aug"
msgid "August"
msgstr "August"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Authentifizierungsprotokoll"
@@ -1635,6 +1778,9 @@ msgstr "Kann nicht automatisch zusammengeführt werden"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Kann verwalteten Kubernetes-Cluster nicht ändern"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "Wiederherstellen "
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Dies wird einen neuen Commit erzeugen, um die vorhandenen Änderungen rückgängig zu machen."
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "Änderungen werden angezeigt, als ob die <b>Quell</b>-Revision in die <b>Ziel</b>-Revision gemerged wurde."
@@ -1683,6 +1832,9 @@ msgstr "Diagramme"
msgid "Chat"
msgstr "Chat"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "Lies die %{docs_link_start}Dokumentation%{docs_link_end}."
@@ -1749,9 +1901,6 @@ msgstr "Wähle die Gruppen aus, die du mit diesem sekundären Knoten synchronisi
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Wähle welche Repositories du verbinden und die CI/CD-Pipelines ausführen möchtest."
-msgid "Choose which repositories you want to import."
-msgstr "Wähle aus, welche Repositories du importieren möchtest."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "Wähle die Fragmente aus, die du mit diesem sekundären Knoten synchronisieren möchtest."
@@ -1911,6 +2060,9 @@ msgstr "Repository klonen"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr "Geschlossen"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Geschlossene Tickets"
@@ -1974,12 +2123,12 @@ msgstr "Nachdem Ingress installiert wurde, solltest du deine Wildcard-DNS an die
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "Beim Abrufen der Projektzonen ist ein Fehler aufgetreten: %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Ein Fehler ist bei dem Verbindungsversuch mit der Google Cloud API aufgetreten. Bitte versuche es später erneut."
+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 ""
@@ -2016,6 +2165,9 @@ msgstr "Wähle, welche Anwendungen auf deinem Kubernetes Cluster installiert wer
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Wähle, welche deiner Umgebungen du für dieses Cluster verwenden willst."
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,8 +2264,8 @@ msgstr "Ausblenden"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Wenn du mehrere Cluster einrichtest und Auto-DevOps verwendest, lies zuerst %{help_link_start}dies%{help_link_end}."
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "Um den Zustand des Clusters anzuzeigen, müssen wir dein Cluster mit Prometheus bereitstellen, um die erforderlichen Daten zu sammeln."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -2127,9 +2279,6 @@ msgstr "Ingress bietet die Möglichkeit, Dienste-Anfragen je nach Anfragehost od
msgid "ClusterIntegration|Install"
msgstr "Installieren"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "Prometheus installieren"
-
msgid "ClusterIntegration|Installed"
msgstr "Installiert"
@@ -2175,9 +2324,6 @@ msgstr "Kubernetes-Cluster"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes-Cluster-Details"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Zustand des Kubernetes-Cluster"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "Kubernetes-Cluster wird mit der Google Kubernetes-Engine erstellt..."
@@ -2415,15 +2561,27 @@ msgstr "Registrierung"
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr "Code-Besitzer(innen)"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Kohorten"
msgid "Collapse"
msgstr "Reduzieren"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Seitenleiste einklappen"
@@ -2723,6 +2881,9 @@ msgstr "Kopiere %{protocol} clone-URL"
msgid "Copy ID to clipboard"
msgstr "ID in Zwischenablage kopieren"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "Kopiere SSH clone-URL"
@@ -3211,6 +3372,9 @@ msgstr "Beschreibungsvorlagen ermöglichen dir, kontextspezifische Vorlagen für
msgid "Description:"
msgstr "Beschreibung:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "Löschen"
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "Verwerfen"
@@ -3460,6 +3627,9 @@ msgstr "Für dieses Projekt aktivieren"
msgid "Enable group Runners"
msgstr "Gruppen-Runner aktivieren"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Aktiviere oder deaktiviere die Pseudonymizer-Datensammlung."
@@ -3496,6 +3666,9 @@ msgstr "Endet am (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr "Gib die Beschreibung des Merge-Requests ein"
msgid "Enter the merge request title"
msgstr "Gib den Titel des Merge-Requests ein"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ msgstr "Beim Abrufen der Umgebungen ist ein Fehler aufgetreten."
msgid "Environments|An error occurred while making the request."
msgstr "Während der Anfrage ist ein Fehler aufgetreten."
+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 "Beim Anhalten der Umgebung ist ein Fehler aufgetreten. Bitte versuche es erneut"
@@ -3592,15 +3768,33 @@ msgstr "Öffne Live-Umgebung"
msgid "Environments|Pod logs from"
msgstr "Pod-Protokolle von"
+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 "Erneute Bereitstellung in der Umgebung"
msgid "Environments|Read more about environments"
msgstr "Lies mehr über Umgebungen"
+msgid "Environments|Rollback"
+msgstr ""
+
msgid "Environments|Rollback environment"
msgstr "Umgebung wiederherstellen"
+msgid "Environments|Rollback environment %{environment_name}?"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
msgid "Environments|Show all"
msgstr "Alle anzeigen"
@@ -3613,6 +3807,18 @@ msgstr "Umgebung stoppen"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Aktualisiert"
@@ -3664,6 +3870,9 @@ msgstr "Fehlerberichterstattung und Protokollierung"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr "Fehler beim Erstellen des Epics"
@@ -3733,6 +3942,33 @@ msgstr "Fehler beim Laden des Merge-Requests. Bitte versuche es erneut."
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr "Aufklappen"
msgid "Expand all"
msgstr "Alle erweitern"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Menüleiste ausklappen"
@@ -3898,7 +4137,7 @@ msgstr "Bereitstellung fehlgeschlagen für"
msgid "Failed to load emoji list."
msgstr "Fehler beim Laden der Emoji-Liste."
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "Beschreibung"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "%{feature_flag_name} bearbeiten"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "Feature-Flag bearbeiten"
@@ -4024,9 +4260,6 @@ msgstr "Neu"
msgid "FeatureFlags|New Feature Flag"
msgstr "Neues Feature-Flag"
-msgid "FeatureFlags|Save changes"
-msgstr "Änderungen speichern"
-
msgid "FeatureFlags|Status"
msgstr "Status"
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr "Filter..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Finde über den Pfad"
@@ -4230,8 +4460,8 @@ msgstr "Fehler in deiner .gitlab-ci.yml gefunden:"
msgid "Free Trial of GitLab.com Gold"
msgstr "Kostenlose Testversion von GitLab.com Gold"
-msgid "From %{provider_title}"
-msgstr "Von %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Von Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr "Von Meilensteinen:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "Installiere den Runner aus der Anwendungsliste in der Kubernetes-Cluster Detailansicht"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG-Schlüssel"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "Allgemein"
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr "Zurück"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "Zurück"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "Gehe zu"
msgid "Go to %{link_to_google_takeout}."
msgstr "Gehe zu %{link_to_google_takeout}."
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Google Code-Import"
@@ -4761,6 +5006,9 @@ msgstr "Gruppeninfo:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Gruppenbetreuer können Gruppen-Runner unter %{link} registrieren"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "Gruppenname"
@@ -5129,9 +5377,24 @@ msgstr "Repository importieren"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr "Verbinde Repositories von"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "Verbessere Ticketboards mit der GitLab Enterprise Edition."
@@ -5183,6 +5446,12 @@ msgstr "Gib die Host-Schlüssel manuell ein"
msgid "Input your repository URL"
msgstr "Gib deine Repository-URL ein"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr "Arbeitsablaufsanalysen vorgestellt"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "Ticket"
@@ -5296,8 +5571,8 @@ msgstr "Tickets können Bugs, Tasks oder zu diskutierende Ideen sein. Tickets si
msgid "Issues closed"
msgstr "Geschlossene Tickets"
-msgid "Issues, merge requests, pushes and comments."
-msgstr "Tickets, Merge-Requests, Pushes und Kommentare."
+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 ""
@@ -5485,6 +5760,9 @@ msgstr "Label hochstufen"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr "%{labelTitle} hochzustufen macht es für alle Projekte in %{groupName} verfügbar. Existierende Projektlabels mit dem selben Titel werden zusammengeführt. Diese Aktion kann nicht rückgängig gemacht werden."
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr "Large File Storage"
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr "Erfahre mehr über geschützte Branches"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Erfahre mehr in den"
@@ -5741,6 +6022,15 @@ msgstr "Mit Smartcard einloggen"
msgid "Logs"
msgstr "Protokolle"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 "Mache alle in deinem Team unabhängig von ihrem Standort produktiver. GitLab Geo erstellt schreibgeschützte Mirror deiner GitLab-Instanz, sodass du die Zeit zum Klonen und Abrufen großer Repos reduzieren kannst."
@@ -5786,6 +6076,9 @@ msgstr "Manifest"
msgid "Manifest file import"
msgstr "Manifestdateiimport"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Ordne eine FogBugz-Konto-ID einem/einer GitLab-Benutzer(in) zu"
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr "Markdown aktiviert"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr "Eine Punktliste hinzufügen"
-
-msgid "MarkdownToolbar|Add a link"
-msgstr "Einen Link hinzufügen"
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr "Eine nummerierte Liste hinzufügen"
-
-msgid "MarkdownToolbar|Add a table"
-msgstr "Eine Tabelle hinzufügen"
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr "Eine Aufgabenliste hinzufügen"
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr "Einen fetten Text hinzufügen"
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr "Einen kursiven Text hinzufügen"
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr "Gehe in den Vollbildmodus"
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr "Füge ein Zitat ein"
-
-msgid "MarkdownToolbar|Insert code"
-msgstr "Füge Code ein"
-
msgid "Maven Metadata"
msgstr "Maven-Metadaten"
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Merge-Request"
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus Query-Dokumentation"
-msgid "Metrics|System"
-msgstr "System"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "Beim Abrufen der Umgebungsdaten trat ein Fehler auf, bitte versuche es erneut"
@@ -6194,6 +6457,9 @@ msgstr "Mehr Informationen"
msgid "More information is available|here"
msgstr "hier"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "Die meisten Sterne"
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Neuer Pipeline Zeitplan"
msgid "New Snippet"
msgstr "Neuer Codeausschnitt"
-msgid "New Snippets"
-msgstr "Neue Codeausschnitte"
-
msgid "New branch"
msgstr "Neuer Branch"
@@ -6340,9 +6606,15 @@ msgstr "Neu..."
msgid "No"
msgstr "Nein"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "Kein Label"
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr "Keine Beiträge gefunden"
msgid "No credit card required."
msgstr "Keine Kreditkarte erforderlich."
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "Kein Fälligkeitsdatum"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr "Nicht genügend Daten"
msgid "Not now"
msgstr "Nicht jetzt"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Beachte, dass der master-Branch automatisch geschützt ist. %{link_to_protected_branches}"
@@ -6675,6 +6953,9 @@ msgstr "Vorgänge"
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Ein Projekt zum Dashboard hinzufügen"
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr "Optional kannst du %{link_to_customize}, wie FogBugz E-Mail-Adressen und Benutzernamen in GitLab importiert werden."
@@ -6876,6 +7160,12 @@ msgstr "Variablen"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Benutzerdefiniert"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -6891,6 +7181,9 @@ msgstr "Pipelines der letzten Woche"
msgid "Pipelines for last year"
msgstr "Pipelines des letzten Jahres"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "Baue mit Vertrauen"
@@ -7011,9 +7304,21 @@ msgstr "Bitte wandle sie in %{link_to_git} um und durchlaufe erneut die %{link_t
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr "Bitte wandle sie in Git auf Google Code um und durchlaufe erneut die %{link_to_import_flow}."
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr "Bitte gib einen beschreibenden Namen für deine Gruppe ein."
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr "Bitte beachte, dass diese Anwendung nicht von GitLab bereitgestellt wird. Du solltest daher die Authentizität überprüfen, bevor du den Zugriff erlaubst."
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "Bitte wähle zumindest einen Filter um Ergebnisse zu sehen"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Bitte löse das reCAPTCHA"
@@ -7050,6 +7364,9 @@ msgstr "Einstellungen"
msgid "Preferences|Navigation theme"
msgstr "Navigationsthema"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "Drücke Eingabe oder klicke um zu suchen"
@@ -7248,9 +7565,6 @@ msgstr "Diese E-Mail-Adresse wird für webbasierte Vorgänge wie Bearbeitungen u
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Dieses Emoji und diese Nachricht werden in deinem Profil und auf der gesamten Benutzeroberfläche angezeigt."
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr "Fortschritt"
msgid "Project"
msgstr "Projekt"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "Projekt \"%{project_name}\" wird gerade gelöscht."
@@ -7392,6 +7709,9 @@ msgstr "Der Link für den Export des Projektes ist abgelaufen. Bitte generiere e
msgid "Project export started. A download link will be sent by email."
msgstr "Export des Projektes gestartet. Ein Link zum Herunterladen wir dir per E-Mail zugesandt."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr "Benutzer(innen) können nur Commits in dieses Repository pushen die mit
msgid "Projects"
msgstr "Projekte"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Geteilte Projekte mit %{group_name}"
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "Avatar entfernen"
@@ -7985,6 +8314,19 @@ msgstr "Alle Benutzer(innen) dieser Gruppe müssen die Zwei-Faktor-Authentifizie
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Fordere alle Benutzer(innen) auf, die Nutzungsbedingungen und Datenschutzrichtlinien zu akzeptieren, wenn sie auf GitLab zugreifen."
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr "Du hast alle deine Pipeline-Minuten für geteilte Runner verbraucht."
msgid "Running"
msgstr "Wird ausgeführt"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8173,6 +8518,9 @@ msgstr "Öffentlicher SSH-Schlüssel"
msgid "SSL Verification"
msgstr "SSL-Verifizierung"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "Speichern"
@@ -8206,6 +8554,9 @@ msgstr "Geplant"
msgid "Schedules"
msgstr "Zeitpläne"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Pipelines planen"
@@ -8266,6 +8617,9 @@ msgstr "Projekte suchen"
msgid "Search users"
msgstr "Suche Benutzer(innen)"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "Deine Projekte durchsuchen"
@@ -8524,6 +8878,9 @@ msgstr "Lege ein Instanz-weites Vorlagen-Repository"
msgid "Set max session time for web terminal."
msgstr "Lege die maximale Sitzungszeit für das Web-Terminal fest."
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "Benachrichtigungs-E-Mail für Missbrauchsberichte festlegen."
@@ -8548,6 +8905,9 @@ msgstr "Richte notwendige Angaben (E-Mail, Vorname, Nachname) und NameID gemäß
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 "Richte dein Projekt so ein, dass Änderungen automatisch an ein anderes Repository gesendet bzw. von diesem abgerufen werden. Branches, Tags und Commits werden automatisch synchronisiert."
@@ -8605,9 +8965,15 @@ msgstr "Verwendete Pipeline-Minuten zurücksetzen"
msgid "Sherlock Transactions"
msgstr "Sherlock-Transaktionen"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "Befehl anzeigen"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "Zeige komplettes Rohprotokoll"
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr "Codeausschnitte"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ msgstr "Aktivität markierter Projekte"
msgid "Starred projects"
msgstr "Markierte Projekte"
+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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Zu Branch/Tag wechseln"
msgid "Sync information"
msgstr "Informationen synchronisieren"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "System-Hooks"
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "Die maximal zulässige Dateigröße beträgt 200 KB."
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "Das Kennwort, das zum Entschlüsseln des privaten Schlüssels erforderlich ist. Dies ist optional und der Wert wird im Ruhezustand verschlüsselt."
@@ -9498,6 +9894,9 @@ msgstr "Beim Löschen des To-dos ist ein Fehler aufgetreten."
msgid "There was an error loading users activity calendar."
msgstr "Beim Laden des Benutzeraktivitäts-Kalenders ist ein Fehler aufgetreten."
+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."
@@ -9543,6 +9942,21 @@ msgstr "Der Umfang dieses Boards ist reduziert"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr "Dieser Branch wurde verändert, seit du begonnen hast ihn zu bearbeiten. Möchtest du einen neuen Branch anlegen?"
+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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr "Diese Container-Registry wurde zur Löschung vorgesehen."
@@ -9564,6 +9978,9 @@ msgstr "Dieses Verzeichnis"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "Diese Gruppe"
@@ -9648,6 +10065,12 @@ msgstr "Dies bedeutet, dass du keinen Code pushen kannst, bevor du kein leeres R
msgid "This merge request is locked."
msgstr "Dieser Merge-Request ist gesperrt."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "Diese Option wurde deaktiviert, da du keine Schreibrechte für diesen Branch hast"
@@ -10207,6 +10630,9 @@ msgstr "Demnächst"
msgid "Update"
msgstr "Aktualisieren"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr "Jetzt updaten"
msgid "Update your group name, description, avatar, and visibility."
msgstr "Deine Gruppenbezeichnung, Beschreibung, Avatar und Sichtbarkeit anpassen."
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "Aktualisiere"
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr "Dokumentation anzeigen"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "Epic-Liste anzeigen"
@@ -10453,6 +10885,9 @@ msgstr "Zeige Datei @ "
msgid "View group labels"
msgstr "Gruppenlabels ansehen"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "Ticket anzeigen"
@@ -10756,6 +11191,9 @@ msgstr "Mit der Beitragsanalyse hast du einen Überblick über die Aktivitäten
msgid "Withdraw Access Request"
msgstr "Zugriffsanfrage widerrufen"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ msgstr ""
msgid "You have no permissions"
msgstr "Du hast keine Berechtigungen"
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Du hast die Projektbegrenzung erreicht"
@@ -10921,6 +11362,9 @@ msgstr "Du musst einen deinem Profil einen SSH-Schlüssel hinzufügen, bevor du
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Du musst unterschiedliche Branchnamen verwenden, um einen gültigen Vergleich zu erhalten."
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr "Du erhältst diese E-Mail, weil %{reason}."
@@ -11014,6 +11458,9 @@ msgstr "selber zuweisen"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "Branch-Name"
@@ -11097,6 +11544,9 @@ msgstr "Code-Qualität"
msgid "ciReport|Confidence"
msgstr "Vertrauen"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "Container-Scan"
@@ -11191,9 +11641,6 @@ msgstr "Keine Änderungen an den Leistungsmetriken"
msgid "ciReport|Performance metrics"
msgstr "Leistungsmetriken"
-msgid "ciReport|Revert dismissal"
-msgstr "Ausblenden rückgängig machen"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11233,6 +11680,9 @@ msgstr "Fehler beim Laden des Abhängigkeitsprüfungs-Berichtes"
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "Fehler beim Wiedereinblenden. Bitte versuche es erneut."
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "Upgrade %{name} von %{version} zu %{fixed}."
@@ -11325,9 +11775,6 @@ msgstr "Hilfe"
msgid "here"
msgstr "hier"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://dein-bitbucket-server"
@@ -11446,6 +11893,9 @@ msgstr "Während des Sendens deiner Genehmigung trat ein Fehler auf."
msgid "mrWidget|Approve"
msgstr "Genehmigen"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "Genehmigt von"
@@ -11518,6 +11968,9 @@ msgstr "Lokal mergen"
msgid "mrWidget|Merge request approved"
msgstr "Merge-Request genehmigt"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "Merge-Request genehmigt; du kannst zusätzlich genehmigen"
@@ -11579,6 +12032,9 @@ msgstr "Zurücksetzen"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "Diesen Merge-Request in einem neuen Merge-Request rückgängig machen"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "Festlegt von"
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 68aebe5b9f2..e8c50215d7e 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:15\n"
+"PO-Revision-Date: 2019-03-06 15:50\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index fde168f06af..8704cc351fc 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:13\n"
+"PO-Revision-Date: 2019-03-06 15:51\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d enmetado"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Aro da diagramoj pri la seninterrompa integrado"
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "Malfari"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Diagramoj"
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Trovi per dosierindiko"
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr "Enporti deponejon"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr "Ni prezentas al vi la ciklan analizon"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Lernu pli en la"
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Nova ĉenstabla plano"
msgid "New Snippet"
msgstr ""
-msgid "New Snippets"
-msgstr ""
-
msgid "New branch"
msgstr "Nova branĉo"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr "Ne estas sufiĉe da datenoj"
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr "Variabloj"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Propra"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Ĉenstabloj"
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr "La ligilo por la projekta elporto eksvalidiÄis. Bonvolu krei novan elpo
msgid "Project export started. A download link will be sent by email."
msgstr "La elporto de la projekto komenciÄis. Vi ricevos ligilon per retpoÅto por elÅuti la datenoj."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Planado de la ĉenstabloj"
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Iri al branĉo/etikedo"
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr "Ĉi tiu signifas, ke vi ne povos alpuÅi kodon, antaÅ­ ol vi kreos malpl
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "Nuligi la peton pri atingeblo"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 "Vi ne povas krei pliajn projektojn"
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index ae1db647187..7ac4b7c7eb1 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 10:21\n"
+"PO-Revision-Date: 2019-03-06 15:19\n"
msgid " Status"
msgstr " Estado"
@@ -32,17 +32,22 @@ msgstr[0] " mejorado en %d punto"
msgstr[1] " mejorado en %d puntos"
msgid " or "
-msgstr ""
+msgstr " o "
msgid " or <#epic id>"
-msgstr ""
+msgstr " o <#epic id>"
msgid " or <#issue id>"
-msgstr ""
+msgstr " o <#issue id>"
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" en proyectos"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d cambio"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} participante"
@@ -148,15 +167,15 @@ msgstr "%{filePath} eliminado"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} más"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr "¡Va a eliminar %{issuableType}! ¿Está seguro de que desea realizar esta acción?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,9 +247,12 @@ msgstr "+ %{count} más"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} más"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ", o "
+
msgid "- Runner is active and can process any new jobs"
msgstr "- El ejecutor está activo y puede procesar cualquier trabajo nuevo"
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] "1 %{type} modificación"
msgstr[1] "%{count} %{type} modificaciones"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "1 incidencia cerrada"
@@ -299,7 +326,7 @@ msgid "1st contribution!"
msgstr "¡1ra contribución!"
msgid "2FA"
-msgstr ""
+msgstr "2FA"
msgid "2FA enabled"
msgstr "Verificación en 2 pasos habilitada"
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Una colección de gráficos sobre Integración Continua"
@@ -367,6 +409,9 @@ msgstr "Un miembro del equipo de GitLab revisará tus comentarios tan pronto com
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -434,7 +479,7 @@ msgid "Add"
msgstr "Añadir"
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "Añadir CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr ""
@@ -451,24 +496,51 @@ msgstr "Añadir clúster de Kubernetes"
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Añadir tabla"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Añadir comentario ahora"
+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 "Añadir comentario a la imagen"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Añadir licencia"
@@ -637,17 +709,23 @@ msgstr "Permisos avanzados, almacenamiento de grandes archivos y configuraciones
msgid "Advanced settings"
msgstr "Configuración avanzada"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "Alerta"
msgstr[1] "Alertas"
msgid "Alerts"
-msgstr ""
+msgstr "Alertas"
msgid "All"
msgstr "Todos"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr "Se ha producido un error"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ msgstr "Se ha producido un error al añadir un nuevo borrador."
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 previewing the blob"
msgstr "Ha ocurrido un error visualizando el blob"
@@ -741,6 +828,9 @@ msgstr "Se ha producido un error al actualizar el tamaño de la incidencia"
msgid "An error occurred while adding approver"
msgstr "Se ha producido un error al añadir el aprobador."
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Se ha producido un error al eliminar el comentario"
@@ -777,6 +867,9 @@ msgstr "Se ha producido un error al obtener los trabajos."
msgid "An error occurred while fetching the pipeline."
msgstr "Se ha producido un error mientras se obtenía el pipeline."
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Se ha producido un error al obtener los proyectos"
@@ -834,12 +927,18 @@ msgstr "Se ha producido un error al guardar el estado de LDAP. Por favor, intén
msgid "An error occurred while saving assignees"
msgstr "Se ha producido un error al guardar las asignaciones"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Se ha producido un error al suscribirse a las notificaciones."
msgid "An error occurred while unsubscribing to notifications."
msgstr "Se ha producido un error al cancelar la suscripción a las notificaciones."
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "Se ha producido un error al actualizar el comentario"
@@ -925,14 +1024,52 @@ msgid "Applications"
msgstr "Aplicaciones"
msgid "Applied"
-msgstr ""
+msgstr "Aplicado"
msgid "Apply suggestion"
+msgstr "Aplicar sugerencia"
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
msgstr ""
-msgid "Approvals"
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
msgstr ""
+msgid "Approvals"
+msgstr "Aprobaciones"
+
msgid "Approvals required"
msgstr ""
@@ -952,7 +1089,7 @@ msgid "Archived projects"
msgstr "Proyectos archivados"
msgid "Are you sure"
-msgstr ""
+msgstr "¿Está seguro?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?"
@@ -972,9 +1109,15 @@ msgstr "¿Seguro que quiere regenerar la clave pública? Deberá actualizar la c
msgid "Are you sure you want to remove %{group_name}?"
msgstr "¿Está seguro que desea eliminar %{group_name}?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr "Asignado(s)"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr "Ago"
msgid "August"
msgstr "Agosto"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Registro de Autenticación"
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr "No se puede modificar el clúster de Kubernetes gestionado"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "Revertir"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Gráficos"
msgid "Chat"
msgstr "Chat"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr "Seleccione que repositorios desea importar."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr "Clonar repositorio"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr "Cerrado"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Incidencias cerradas"
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ msgstr "Ocultar"
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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "Instalar"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr "Instalado"
@@ -2175,9 +2324,6 @@ msgstr "cluster de Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Detalles del cluster de Kubernetes"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2413,31 +2559,43 @@ msgid "ClusterIntegration|sign up"
msgstr "regístrese"
msgid "Code"
+msgstr "Código"
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
msgstr ""
msgid "Code owners"
msgstr "Propietarios del código"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr "Contraer"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Contraer la barra lateral"
msgid "Command line instructions"
-msgstr ""
+msgstr "Instrucciones de la línea de comando"
msgid "Comment"
msgstr "Comentar"
msgid "Comment & close %{noteable_name}"
-msgstr ""
+msgstr "Comentar y cerrar %{noteable_name}"
msgid "Comment & reopen %{noteable_name}"
-msgstr ""
+msgstr "Comentar y volver a abrir %{noteable_name}"
msgid "Comment & resolve discussion"
msgstr "Comentar y resolver la discusión"
@@ -2457,7 +2615,7 @@ msgstr[0] "Cambio"
msgstr[1] "Cambios"
msgid "Commit %{commit_id}"
-msgstr ""
+msgstr "Commit %{commit_id}"
msgid "Commit Message"
msgstr "Mensaje del commit"
@@ -2529,7 +2687,7 @@ msgid "Compare Revisions"
msgstr "Comparar revisiones"
msgid "Compare changes"
-msgstr ""
+msgstr "Comparar cambios"
msgid "Compare changes with the last commit"
msgstr "Comparar los cambios con el último commit"
@@ -2723,11 +2881,14 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr "Copiar el ID a portapapeles"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
msgid "Copy SSH public key"
-msgstr ""
+msgstr "Copiar la clave pública SSH"
msgid "Copy SSH public key to clipboard"
msgstr "Copiar la clave pública SSH al portapapeles"
@@ -2775,7 +2936,7 @@ msgid "Create New Directory"
msgstr "Crear Nuevo Directorio"
msgid "Create New Domain"
-msgstr ""
+msgstr "Crear un nuevo dominio"
msgid "Create a new branch"
msgstr "Crear un nuevo 'branch'"
@@ -2787,7 +2948,7 @@ msgid "Create a new issue"
msgstr "Crear una nueva incidencia"
msgid "Create a new repository"
-msgstr ""
+msgstr "Crear un nuevo repositorio"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Crear un token de acceso personal en tu cuenta para actualizar o enviar a través de %{protocol}."
@@ -2961,7 +3122,7 @@ msgid "CycleAnalyticsStage|Test"
msgstr "Pruebas"
msgid "DNS"
-msgstr ""
+msgstr "DNS"
msgid "Dashboard"
msgstr "Panel de control"
@@ -2973,10 +3134,10 @@ msgid "DashboardProjects|Personal"
msgstr "Personales"
msgid "Data is still calculating..."
-msgstr ""
+msgstr "Los datos aún se están calculando..."
msgid "Date picker"
-msgstr ""
+msgstr "Selector de fecha"
msgid "Debug"
msgstr "Depurar"
@@ -2988,16 +3149,16 @@ msgid "December"
msgstr "Diciembre"
msgid "Decline"
-msgstr ""
+msgstr "Declinar"
msgid "Decline and sign out"
msgstr "Rechazar y cerrar sesión"
msgid "Default Branch"
-msgstr ""
+msgstr "Branch por defecto"
msgid "Default classification label"
-msgstr ""
+msgstr "Etiqueta de clasificación por defecto"
msgid "Default first day of the week"
msgstr ""
@@ -3006,7 +3167,7 @@ msgid "Default first day of the week in calendars and date pickers."
msgstr ""
msgid "Default: Directly import the Google Code email address or username"
-msgstr ""
+msgstr "Por defecto: Importar directamente el nombre de usuario o la dirección de correo electrónico de Google Code"
msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
@@ -3200,7 +3361,7 @@ msgid "Deprioritize label"
msgstr ""
msgid "Descending"
-msgstr ""
+msgstr "Descendente"
msgid "Description"
msgstr "Descripción"
@@ -3209,6 +3370,9 @@ msgid "Description templates allow you to define context-specific templates for
msgstr ""
msgid "Description:"
+msgstr "Descripción:"
+
+msgid "Designs"
msgstr ""
msgid "Destroy"
@@ -3266,22 +3430,22 @@ msgid "Discard all unstaged changes?"
msgstr ""
msgid "Discard changes"
-msgstr ""
+msgstr "Descartar los cambios"
msgid "Discard changes to %{path}?"
-msgstr ""
+msgstr "¿Descartar los cambios en %{path}?"
msgid "Discard draft"
-msgstr ""
+msgstr "Descartar borrador"
msgid "Discard review"
-msgstr ""
+msgstr "Descartar la revisión"
msgid "Discover GitLab Geo"
msgstr ""
msgid "Discover projects, groups and snippets. Share your projects with others"
-msgstr ""
+msgstr "Descubra proyectos, grupos y fragmentos. Comparta sus proyectos con otros"
msgid "Discuss a specific suggestion or question"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "Descartar"
@@ -3371,13 +3538,13 @@ msgid "Edit"
msgstr "Editar"
msgid "Edit %{name}"
-msgstr ""
+msgstr "Editar %{name}"
msgid "Edit Label"
msgstr "Editar etiqueta"
msgid "Edit Milestone"
-msgstr ""
+msgstr "Editar hito"
msgid "Edit Pipeline Schedule %{id}"
msgstr "Editar Programación del Pipeline %{id}"
@@ -3389,10 +3556,10 @@ msgid "Edit application"
msgstr "Editar aplicación"
msgid "Edit comment"
-msgstr ""
+msgstr "Editar comentario"
msgid "Edit environment"
-msgstr ""
+msgstr "Editar el entorno"
msgid "Edit files in the editor and commit changes here"
msgstr "Editar los archivos en el editor y confirmar los cambios aquí"
@@ -3458,6 +3625,9 @@ msgid "Enable for this project"
msgstr "Habilitar para este proyecto"
msgid "Enable group Runners"
+msgstr "Habilitar el grupo de ejecutores"
+
+msgid "Enable header and footer in emails"
msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
@@ -3496,6 +3666,9 @@ msgstr "Finaliza a las (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,11 +3687,8 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
-msgstr ""
+msgstr "Variables de entorno"
msgid "Environment variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use environment variables for passwords, secret keys, or whatever you want."
msgstr ""
@@ -3541,6 +3711,12 @@ msgstr "Se ha producido un error al recuperar los entornos."
msgid "Environments|An error occurred while making the request."
msgstr "Se ha producido un error al realizar la solicitud."
+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 ""
@@ -3592,27 +3768,57 @@ msgstr ""
msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy to environment"
+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 "Re-desplegar al entorno"
+
msgid "Environments|Read more about environments"
+msgstr "Obtenga más información sobre los entornos"
+
+msgid "Environments|Rollback"
msgstr ""
msgid "Environments|Rollback environment"
+msgstr "Deshacer entorno"
+
+msgid "Environments|Rollback environment %{environment_name}?"
msgstr ""
-msgid "Environments|Show all"
+msgid "Environments|Rollback environment %{name}?"
msgstr ""
+msgid "Environments|Show all"
+msgstr "Mostrar todo"
+
msgid "Environments|Stop"
-msgstr ""
+msgstr "Detener"
msgid "Environments|Stop environment"
-msgstr ""
+msgstr "Detener entorno"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Actualizado"
@@ -3620,7 +3826,7 @@ msgid "Environments|You don't have any environments right now"
msgstr ""
msgid "Environments|protected"
-msgstr ""
+msgstr "protegido"
msgid "Epic"
msgstr "Épica"
@@ -3638,10 +3844,10 @@ msgid "Epics|An error occurred while saving the %{epicDateType} date"
msgstr ""
msgid "Epics|How can I solve this?"
-msgstr ""
+msgstr "¿Cómo puedo resolver esto?"
msgid "Epics|More information"
-msgstr ""
+msgstr "Más información"
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 ""
@@ -3653,7 +3859,7 @@ msgid "Epics|due"
msgstr ""
msgid "Epics|start"
-msgstr ""
+msgstr "Inicio"
msgid "Error"
msgstr "Error"
@@ -3664,6 +3870,9 @@ msgstr "Informe y registro de errores"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr "Error al crear la tarea épica"
@@ -3731,11 +3940,38 @@ msgid "Error while loading the merge request. Please try again."
msgstr ""
msgid "Error:"
+msgstr "Error:"
+
+msgid "ErrorTracking|Active"
msgstr ""
-msgid "Errors"
+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|Find your hostname in your Sentry account settings page"
+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 "Errores"
+
msgid "Estimated"
msgstr "Estimado"
@@ -3758,7 +3994,7 @@ msgid "EventFilterBy|Filter by team"
msgstr "Filtrar por equipo"
msgid "Events"
-msgstr ""
+msgstr "Eventos"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -3773,7 +4009,7 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "Todas las semanas (domingos a las 4:00 am)"
msgid "Everyone"
-msgstr ""
+msgstr "Todo el mundo"
msgid "Everyone can contribute"
msgstr "Todo el mundo puede colaborar"
@@ -3797,7 +4033,7 @@ msgid "Except policy:"
msgstr ""
msgid "Existing Git repository"
-msgstr ""
+msgstr "Repositorio Git existente"
msgid "Existing folder"
msgstr ""
@@ -3811,6 +4047,9 @@ msgstr "Expandir"
msgid "Expand all"
msgstr "Expandir todo"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Expandir barra lateral"
@@ -3898,7 +4137,7 @@ msgstr "Se ha producido un error al desplegar a"
msgid "Failed to load emoji list."
msgstr "Se ha producido un error al cargar la lista de emojis."
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3962,10 +4201,7 @@ msgid "FeatureFlags|Delete feature flag"
msgstr ""
msgid "FeatureFlags|Description"
-msgstr ""
-
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
+msgstr "Descripción"
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -3995,7 +4231,7 @@ msgid "FeatureFlags|Get started with Feature Flags"
msgstr ""
msgid "FeatureFlags|Inactive"
-msgstr ""
+msgstr "Inactivo"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
@@ -4016,19 +4252,16 @@ msgid "FeatureFlags|More information"
msgstr ""
msgid "FeatureFlags|Name"
-msgstr ""
+msgstr "Nombre"
msgid "FeatureFlags|New"
-msgstr ""
+msgstr "Nuevo"
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
-msgstr ""
+msgstr "Estado"
msgid "FeatureFlags|Target environments"
msgstr ""
@@ -4075,7 +4308,7 @@ msgid "File moved"
msgstr ""
msgid "File templates"
-msgstr ""
+msgstr "Plantillas de archivos"
msgid "File upload error."
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr "Filtrar..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Buscar por ruta"
@@ -4156,13 +4386,13 @@ msgid "Fixed date"
msgstr "Fecha fija"
msgid "Fixed due date"
-msgstr ""
+msgstr "Fecha de finalicación fija"
msgid "Fixed start date"
-msgstr ""
+msgstr "Fecha de inicio fija"
msgid "Fixed:"
-msgstr ""
+msgstr "Arreglado:"
msgid "FogBugz Email"
msgstr "Correo electrónico de FogBugz"
@@ -4177,10 +4407,10 @@ msgid "FogBugz URL"
msgstr "URL de FogBugz"
msgid "FogBugz import"
-msgstr ""
+msgstr "Importar desde FogBugz"
msgid "Follow the steps below to export your Google Code project data."
-msgstr ""
+msgstr "Siga los pasos a continuación para exportar sus datos de proyecto de Google Code."
msgid "Font Color"
msgstr "Color de la fuente"
@@ -4230,8 +4460,8 @@ msgstr "Se han encontrado errores en su fichero .gitlab-ci.yml:"
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
-msgstr "De %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Desde Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr "De los hitos:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "Desde la vista de detalles del clúster de Kubernetes, seleccione instalar 'runner' desde la lista de aplicaciones"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "Llaves GPG"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "General"
@@ -4273,7 +4509,7 @@ msgid "Generate a default set of labels"
msgstr "Generar un conjunto predeterminado de etiquetas"
msgid "Generate key"
-msgstr ""
+msgstr "Generar clave"
msgid "Geo"
msgstr "Geo"
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr "Volver"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "Volver"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "Ir a"
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Importar desde Google Code"
@@ -4761,6 +5006,9 @@ msgstr "Información del grupo:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "Nombre del grupo"
@@ -4768,7 +5016,7 @@ msgid "Group overview content"
msgstr ""
msgid "Group:"
-msgstr ""
+msgstr "Grupo:"
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -5064,7 +5312,7 @@ msgid "Import"
msgstr "Importar"
msgid "Import CSV"
-msgstr ""
+msgstr "Importar CSV"
msgid "Import Projects from Gitea"
msgstr "Importar proyectos desde Gitea"
@@ -5085,13 +5333,13 @@ msgid "Import in progress"
msgstr "Importación en progreso"
msgid "Import issues"
-msgstr ""
+msgstr "Importar incidencias"
msgid "Import members"
-msgstr ""
+msgstr "Importar miembros"
msgid "Import members from another project"
-msgstr ""
+msgstr "Importar miembros desde otro proyecto"
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importar varios repositorios subiendo un archivo manifiesto."
@@ -5100,7 +5348,7 @@ msgid "Import project"
msgstr "Importar proyecto"
msgid "Import project members"
-msgstr ""
+msgstr "Importar miembros del proyecto"
msgid "Import projects from Bitbucket"
msgstr "Importar proyectos desde Bitbucket"
@@ -5129,9 +5377,24 @@ msgstr "Importar repositorio"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr "Conectar repositorios desde"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,9 +5446,15 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
-msgid "Insert suggestion"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
msgstr ""
+msgid "Insert suggestion"
+msgstr "Insertar sugerencia"
+
msgid "Install GitLab Runner"
msgstr "Instalar GitLab Runner"
@@ -5216,7 +5485,7 @@ msgid "Interested parties can even contribute by pushing commits if they want to
msgstr ""
msgid "Internal"
-msgstr ""
+msgstr "Interno"
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr "Interno - cualquier usuario que haya iniciado sesión puede ver el grupo y cualquier proyecto interno."
@@ -5236,6 +5505,9 @@ msgstr "Introducción a Cycle Analytics"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5243,10 +5515,10 @@ msgid "Invite"
msgstr "Invitar"
msgid "Invite group"
-msgstr ""
+msgstr "Invitar al grupo"
msgid "Invite member"
-msgstr ""
+msgstr "Invitar al miembro"
msgid "Invoke Count"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "Incidencia"
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr "Incidencias cerradas"
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Más información en la"
@@ -5703,10 +5984,10 @@ msgid "Loading..."
msgstr "Cargando..."
msgid "Loading…"
-msgstr ""
+msgstr "Cargando…"
msgid "Localization"
-msgstr ""
+msgstr "Localización"
msgid "Lock"
msgstr "Bloquear"
@@ -5741,6 +6022,15 @@ msgstr "Iniciar sesión con una tarjeta inteligente"
msgid "Logs"
msgstr "Logs"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 "Haga que todos en su equipo sean más productivos, independientemente de su ubicación. GitLab Geo crea réplicas de solo lectura de su instancia de GitLab para que pueda reducir el tiempo que lleva clonar y obtener grandes repositorios."
@@ -5775,7 +6065,7 @@ msgid "Manage project labels"
msgstr "Administrar etiquetas de proyectos"
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "Administrar autenticación de dos factores"
msgid "Manage your group’s membership while adding another level of security with SAML."
msgstr ""
@@ -5786,6 +6076,9 @@ msgstr "Manifiesto"
msgid "Manifest file import"
msgstr "Importar fichero de manifiesto"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Asigne una ID de cuenta de FogBugz a un usuario de GitLab"
@@ -5808,41 +6101,11 @@ msgid "Mark todo as done"
msgstr "Marcar tarea pendiente como completada"
msgid "Markdown"
-msgstr ""
+msgstr "Markdown"
msgid "Markdown enabled"
msgstr "Markdown habilitado"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr "Metadatos de Maven"
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Merge request"
@@ -5982,7 +6248,7 @@ msgid "MergeRequest|Search files"
msgstr ""
msgid "Merged"
-msgstr "Mergeado"
+msgstr ""
msgid "Messages"
msgstr "Mensajes"
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentción sobre las consultas de Prometheus"
-msgid "Metrics|System"
-msgstr "Sistema"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "Se ha producido un error al recuperar los datos de los distintos entornos, por favor inténtelo de nuevo"
@@ -6168,7 +6431,7 @@ msgid "Modify merge commit"
msgstr ""
msgid "Monday"
-msgstr ""
+msgstr "Lunes"
msgid "Monitor your errors by integrating with Sentry"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr "Más información"
msgid "More information is available|here"
msgstr "Hay más información disponible | aquí"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "Más estrellas"
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Nueva Programación del Pipeline"
msgid "New Snippet"
msgstr "Nuevo fragmento de código"
-msgid "New Snippets"
-msgstr "Nuevo fragmento de código"
-
msgid "New branch"
msgstr "Nueva rama"
@@ -6340,12 +6606,18 @@ msgstr "Nuevo..."
msgid "No"
msgstr "No"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "Sin etiqueta"
-msgid "No activities found"
+msgid "No Tag"
msgstr ""
+msgid "No activities found"
+msgstr "No se han encontrado actividades"
+
msgid "No assignee"
msgstr "Sin asignar"
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr "No se necesita tarjeta de crédito."
-msgid "No details available"
+msgid "No designs found."
msgstr ""
+msgid "No details available"
+msgstr "No hay detalles disponibles"
+
msgid "No due date"
msgstr "Sin fecha límite"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6386,7 +6661,7 @@ msgid "No file chosen"
msgstr "No se ha seleccionado nignun archivo"
msgid "No file selected"
-msgstr ""
+msgstr "No ha seleccionado ningún archivo"
msgid "No files found."
msgstr "No se han encontrado archivos."
@@ -6401,7 +6676,7 @@ msgid "No license. All rights reserved"
msgstr "Sin licencia. Todos los derechos reservados"
msgid "No matching results"
-msgstr ""
+msgstr "No se han encontrado resultados"
msgid "No merge requests for the selected time period."
msgstr ""
@@ -6413,13 +6688,13 @@ msgid "No messages were logged"
msgstr "No se registraron mensajes"
msgid "No milestones to show"
-msgstr ""
+msgstr "No hay archivos para mostrar"
msgid "No other labels with such name or description"
msgstr ""
msgid "No preview for this file type"
-msgstr ""
+msgstr "No hay vista previa para este tipo de archivo"
msgid "No prioritised labels with such name or description"
msgstr ""
@@ -6440,7 +6715,7 @@ msgid "No schedules"
msgstr "No hay programaciones"
msgid "No start date"
-msgstr ""
+msgstr "Sin fecha de inicio"
msgid "No, directly import the existing email addresses and usernames."
msgstr ""
@@ -6472,6 +6747,9 @@ msgstr "No hay suficientes datos"
msgid "Not now"
msgstr "Ahora no"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Tenga en cuenta que la rama principal está protegida automáticamente. %{link_to_protected_branches}"
@@ -6640,7 +6918,7 @@ msgid "Open comment type dropdown"
msgstr ""
msgid "Open errors"
-msgstr ""
+msgstr "Errores abiertos"
msgid "Open in Xcode"
msgstr "Abrir en Xcode"
@@ -6675,6 +6953,9 @@ msgstr "Operaciones"
msgid "Operations Dashboard"
msgstr "Panel de operaciones"
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Agregar un proyecto al panel"
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6748,7 +7032,7 @@ msgid "Pagination|« First"
msgstr ""
msgid "Parameter"
-msgstr ""
+msgstr "Parámetro"
msgid "Parent epic"
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr "Variables"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Personalizado"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr "Preferencias"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "Presione Enter o haga clic para buscar"
@@ -7078,7 +7395,7 @@ msgid "Prioritized label"
msgstr "Etiquetas priorizada"
msgid "Private"
-msgstr ""
+msgstr "Privado"
msgid "Private - Project access must be granted explicitly to each user."
msgstr "Privado - El acceso al proyecto debe ser concedido explícitamente para cada usuario."
@@ -7248,9 +7565,6 @@ msgstr "Este correo electrónico se utilizará para operaciones basadas en la we
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr "Progreso"
msgid "Project"
msgstr "Proyecto"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "El proyecto '%{project_name}' está en proceso de ser eliminado."
@@ -7392,6 +7709,9 @@ msgstr "El enlace de exportación del proyecto ha caducado. Por favor, genera un
msgid "Project export started. A download link will be sent by email."
msgstr "Se inició la exportación del proyecto. Se enviará un enlace de descarga por correo electrónico."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr "Proyectos"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "Eliminar avatar"
@@ -7881,13 +8210,13 @@ msgid "Reopen epic"
msgstr ""
msgid "Reopen milestone"
-msgstr ""
+msgstr "Reabrir hito"
msgid "Repair authentication"
msgstr "Reparar la autenticación"
msgid "Reply to comment"
-msgstr ""
+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}."
@@ -7950,7 +8279,7 @@ msgid "Repository URL"
msgstr "URL del repositorio"
msgid "Repository cleanup"
-msgstr ""
+msgstr "Limpieza del repositorio"
msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete."
msgstr ""
@@ -7985,20 +8314,33 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
-msgid "Resend invite"
+msgid "Require approval from code owners"
msgstr ""
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Resend invite"
+msgstr "Reenviar invitación"
+
msgid "Reset authorization key"
-msgstr ""
+msgstr "Reiniciar la clave de autorización"
msgid "Reset authorization key?"
-msgstr ""
+msgstr "¿Reiniciar la clave de autorización?"
msgid "Reset health check access token"
msgstr ""
msgid "Reset key"
-msgstr ""
+msgstr "Reiniciar la clave"
msgid "Reset runners registration token"
msgstr "Reinicializar el token de registro del runner"
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr "En ejecución"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8173,6 +8518,9 @@ msgstr "Clave pública SSH"
msgid "SSL Verification"
msgstr "Verificación SSL"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "Guardar"
@@ -8206,6 +8554,9 @@ msgstr "Programado"
msgid "Schedules"
msgstr "Programaciones"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Programación de Pipelines"
@@ -8266,6 +8617,9 @@ msgstr "Buscar proyectos"
msgid "Search users"
msgstr "Buscar usuarios"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "Buscar tus proyectos"
@@ -8438,7 +8792,7 @@ msgid "Send email"
msgstr "Enviar correo electrónico"
msgid "Send report"
-msgstr ""
+msgstr "Enviar informe"
msgid "Send usage data"
msgstr "Enviar estadísticas de uso"
@@ -8456,7 +8810,7 @@ msgid "Server version"
msgstr "Versión del servidor"
msgid "Serverless"
-msgstr ""
+msgstr "Serverless"
msgid "ServerlessDetails|Kubernetes Pods"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr "Configure las afirmaciones/atributos/reclamaciones (correo electrónico,
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr "Transacciones de Sherlock"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "Mostrar comando"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "Mostrar el registro completo sin procesar"
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr "Fragmentos de código"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ msgstr ""
msgid "Starred projects"
msgstr "Proyectos favoritos"
+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 "Stars"
msgstr ""
@@ -9172,10 +9562,10 @@ msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
msgstr ""
msgid "Suggested change"
-msgstr ""
+msgstr "Cambio sugerido"
msgid "Sunday"
-msgstr ""
+msgstr "Domingo"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Cambiar rama/etiqueta"
msgid "Sync information"
msgstr "Sincronizar información"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "Hooks de sistema"
@@ -9205,10 +9598,10 @@ msgid "System metrics (Kubernetes)"
msgstr "Métricas del sistema (Kubernetes)"
msgid "Tag"
-msgstr ""
+msgstr "Etiqueta"
msgid "Tag list:"
-msgstr ""
+msgstr "Listas de etiquetas:"
msgid "Tags"
msgstr "Etiquetas"
@@ -9304,10 +9697,10 @@ msgid "Templates"
msgstr "Plantillas"
msgid "Terminal"
-msgstr ""
+msgstr "Terminal"
msgid "Terminal for environment"
-msgstr ""
+msgstr "Terminal para el entorno"
msgid "Terms of Service Agreement and Privacy Policy"
msgstr "Términos del acuerdo de servicio y de la política de privacidad"
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ 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."
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr "El alcance de este tablero es limitado"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr "Esta rama ha cambiado desde que se comenzó a editar. ¿Le gustaría crear una nueva rama?"
+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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr "Este directorio"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "Este grupo"
@@ -9648,6 +10065,12 @@ msgstr "Esto significa que no puede enviar código hasta que cree un repositorio
msgid "This merge request is locked."
msgstr "Este merge request está bloqueado."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -9902,7 +10325,7 @@ msgid "Title"
msgstr "Título"
msgid "Titles and Filenames"
-msgstr ""
+msgstr "Títulos y nombres de archivos"
msgid "To %{link_to_help} of your domain, add the above key to a TXT record within to your DNS configuration."
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr "Actualizar"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr "Actualizar ahora"
msgid "Update your group name, description, avatar, and visibility."
msgstr "Actualice el nombre de su grupo, su descripción, su avatar y su visibilidad."
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "Actualizando"
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr "Ver documentación"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "Ver lista de tareas épicas"
@@ -10453,6 +10885,9 @@ msgstr "Ver archivo @ "
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "Ver incidencia"
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "Retirar Solicitud de Acceso"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 "Has alcanzado el límite de tu proyecto"
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr "asignar a uno mismo"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "nombre de la rama"
@@ -11097,6 +11544,9 @@ msgstr "Calidad del código"
msgid "ciReport|Confidence"
msgstr "Confianza"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "Análisis de contenedores"
@@ -11191,9 +11641,6 @@ msgstr "No hay cambios en las métricas de rendimiento"
msgid "ciReport|Performance metrics"
msgstr "Métricas de rendimiento"
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr "ayuda"
msgid "here"
msgstr "aquí"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://tu-servidor-bitbucket"
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr "Aprobar"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "Aprobado por"
@@ -11518,6 +11968,9 @@ msgstr "Merge local"
msgid "mrWidget|Merge request approved"
msgstr "Solicitud de merge request aprobada"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "Establecido por"
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index ee015172f6d..16c4951d8a7 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:14\n"
+"PO-Revision-Date: 2019-03-06 15:50\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index c943b2814a3..271ba2587b6 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:14\n"
+"PO-Revision-Date: 2019-03-06 15:50\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 83e62a5f9de..81d25244a74 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:14\n"
+"PO-Revision-Date: 2019-03-06 15:50\n"
msgid " Status"
msgstr " Statut"
@@ -32,17 +32,22 @@ msgstr[0] " amélioré sur %d point"
msgstr[1] " amélioré sur %d points"
msgid " or "
-msgstr ""
+msgstr " ou "
msgid " or <#epic id>"
-msgstr ""
+msgstr " ou <#epic id>"
msgid " or <#issue id>"
-msgstr ""
+msgstr " ou <#issue id>"
msgid "\"%{query}\" in projects"
msgstr "« %{query} » dans les projets"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -54,7 +59,7 @@ msgstr[0] "%d commit de retard"
msgstr[1] "%d commits de retard"
msgid "%d commits"
-msgstr ""
+msgstr "%d commits"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -78,8 +83,8 @@ msgstr[1] "%d tickets"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ticket sélectionné"
+msgstr[1] "%d tickets sélectionnés"
msgid "%d layer"
msgid_plural "%d layers"
@@ -124,12 +129,26 @@ msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build
msgstr "%{counter_storage} (%{counter_repositories} dépôts, %{counter_build_artifacts} artefacts construits, %{counter_lfs_objects} LFS)"
msgid "%{count} %{alerts}"
+msgstr "%{count} %{alerts}"
+
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
+msgstr "%{count} autres personnes assignées"
+
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
msgstr ""
msgid "%{count} participant"
@@ -146,10 +165,7 @@ msgid "%{filePath} deleted"
msgstr "%{filePath} supprimé"
msgid "%{firstLabel} +%{labelCount} more"
-msgstr ""
-
-msgid "%{firstOption} +%{extraOptionCount} more"
-msgstr ""
+msgstr "%{firstLabel} et %{labelCount} de plus"
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 "Les %{group_docs_link_start}groupes%{group_docs_link_end} vous permettent de gérer plusieurs projets et d’y collaborer. Les membres d’un groupe ont accès à tous ses projets."
@@ -157,6 +173,9 @@ msgstr "Les %{group_docs_link_start}groupes%{group_docs_link_end} vous permetten
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sera supprimé ! Êtesâ€vous sûr ?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -217,7 +236,7 @@ msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what infor
msgstr "%{usage_ping_link_start}En savoir plus%{usage_ping_link_end} sur les informations partagées avec GitLab Inc."
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "Profil de %{user_name}"
msgid "(external source)"
msgstr ""
@@ -228,9 +247,12 @@ msgstr "+ %{count} de plus"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} de plus"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ", ou "
+
msgid "- Runner is active and can process any new jobs"
msgstr "- l’exécuteur est actif et peut traiter de nouvelles tâches"
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] "une modification de %{type}"
msgstr[1] "%{count} modifications de %{type}"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "un ticket fermé"
@@ -305,7 +332,7 @@ msgid "2FA enabled"
msgstr "2FA activé"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "Veuillez contacter votre administrateur·rice GitLab afin d’obtenir l’autorisation."
msgid "403|You don't have the permission to access this page."
msgstr "Vous n’avez pas l’autorisation d’accéder à cette page."
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "Un « exécuteur » est un processus qui exécute une tâche. Vous pouvez configurer autant d’exécuteurs que nécessaire."
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Un ensemble de graphiques concernant l’intégration continue (CI)"
@@ -367,6 +409,9 @@ msgstr "Un membre de l’équipe de vérification des abus de GitLab examinera v
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "Une nouvelle branche sera créée dans votre dépôt divergent (fork) et une nouvelle demande de fusion sera lancée."
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "Un projet est l’endroit où vous hébergez vos fichiers (dépôt), planifiez votre travail (tickets) et publiez votre documentation (wiki), %{among_other_things_link}."
@@ -395,7 +440,7 @@ msgid "Abuse reports"
msgstr "Rapports d’abus"
msgid "Accept invitation"
-msgstr ""
+msgstr "Accepter l’invitation"
msgid "Accept terms"
msgstr "Accepter les conditions"
@@ -451,24 +496,51 @@ msgstr "Ajouter une grappe de serveurs Kubernetes"
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 "Ajoutez une page d’accueil à votre wiki contenant des informations sur votre projet. GitLab l’affichera ici à la place de ce message."
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Ajouter un tableau"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "Ajouter un texte apparaissant dans toutes communications par courriel (%{character_limit} caractères maximum)"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Ajouter un commentaire"
+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 "Ajouter un commentaire à l’image"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Ajouter une licence"
@@ -485,7 +557,7 @@ msgid "Add reaction"
msgstr "Ajouter une réaction"
msgid "Add to project"
-msgstr ""
+msgstr "Ajouter au projet"
msgid "Add to review"
msgstr "Ajouter à la revue de code"
@@ -637,6 +709,9 @@ msgstr "Autorisations avancées, stockage de fichiers volumineux et paramètres
msgid "Advanced settings"
msgstr "Paramètres avancés"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "Alerte"
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr "Tous"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "Toutes les modifications sont validées"
@@ -717,7 +795,7 @@ msgstr "Un champ utilisateur Gitlab vide ajoutera le nom complet de l’utilisat
msgid "An error has occurred"
msgstr "Une erreur est survenue"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ msgstr "Une erreur est survenue lors de l’ajout d’un nouveau brouillon."
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 previewing the blob"
msgstr "Une erreur s’est produite lors de la prévisualisation du blob"
@@ -741,6 +828,9 @@ msgstr "Une erreur est survenue lors de la mise à jour du poids du ticket"
msgid "An error occurred while adding approver"
msgstr "Une erreur s’est produite lors de l’ajout de l’approba·teur·trice"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Une erreur est survenue lors de la suppression du commentaire"
@@ -777,6 +867,9 @@ msgstr "Une erreur est survenue pendant la récupération des tâches."
msgid "An error occurred while fetching the pipeline."
msgstr "Une erreur est survenue pendant la récupération du pipeline."
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Une erreur s’est produite lors de la récupération des projets"
@@ -834,12 +927,18 @@ msgstr "Une erreur est survenue lors de l’enregistrement du statut d’outrepa
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 the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Une erreur est survenue lors de l’abonnement aux notifications."
msgid "An error occurred while unsubscribing to notifications."
msgstr "Une erreur est survenue lors du désabonnement aux notifications."
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "Une erreur est survenue lors de la mise à jour du commentaire"
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr "Êtesâ€vous sûr de vouloir générer une nouvelle paire de clefs ? V
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Voulezâ€vous vraiment supprimer %{group_name} ?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr "Les listes d’assignation montrent tous les bogues assignés à l’uti
msgid "Assignee(s)"
msgstr "Assigné·e(s)"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr "août"
msgid "August"
msgstr "août"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Journal d’authentification"
@@ -1635,6 +1778,9 @@ msgstr "Ne peut être fusionnée automatiquement"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Impossible de modifier la grappe de serveurs gérée par Kubernetes"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "Défaire"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Cela va créer un nouveau commit afin de défaire les modifications existantes."
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "Les modifications sont affichées comme si la révision <b>source</b> était fusionnée dans la révision<b>cible</b>."
@@ -1683,6 +1832,9 @@ msgstr "Statistiques"
msgid "Chat"
msgstr "Discussion"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "Veuillez vérifier la %{docs_link_start}documentation%{docs_link_end}."
@@ -1749,9 +1901,6 @@ msgstr "Choisissez les groupes que vous souhaitez synchroniser avec ce nœud sec
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Choisissez quels dépôts vous voulez connecter pour exécuter des pipelines d’intégration et de livraison continues (CI/CD)."
-msgid "Choose which repositories you want to import."
-msgstr "Choisissez les dépôts que vous voulez importer."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "Choisissez les fragments que vous souhaitez synchroniser avec ce nœud secondaire."
@@ -1911,6 +2060,9 @@ msgstr "Cloner le dépôt"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr "Fermé(e)"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Tickets clos"
@@ -1974,12 +2123,12 @@ msgstr "Après avoir installé Ingress, vous devrez faire pointer votre entrée
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "Une erreur est survenue lors de la tentative de récupération des zones du projet : %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Une erreur est survenue lors de la tentative de contact de l’API Google Cloud. Veuillez réessayer plus tard."
+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 ""
@@ -2016,6 +2165,9 @@ msgstr "Choisissez les applications à installer sur votre grappe de serveurs Ku
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Choisissez lequel de vos environnements utilisera cette grappe de serveurs."
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,8 +2264,8 @@ msgstr "Masquer"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Si vous configurez plusieurs grappes de serveurs et que vous utilisez Auto DevOps, %{help_link_start}veillez d’abord lire ceci%{help_link_end}."
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "Afin d’afficher son état de santé, nous devons mettre votre grappe de serveurs à disposition de Prometheus pour récupérer les données nécessaires."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -2127,9 +2279,6 @@ msgstr "Ingress vous permet de router les requêtes vers des services en fonctio
msgid "ClusterIntegration|Install"
msgstr "Installer"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "Installer Prometheus"
-
msgid "ClusterIntegration|Installed"
msgstr "Installé"
@@ -2175,9 +2324,6 @@ msgstr "Grappe de serveurs Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Détails de la grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "État de santé de la grappe de serveurs Kubernetes"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "La grappe de serveurs Kubernetes est en cours de création sur Google Kubernetes Engine…"
@@ -2415,15 +2561,27 @@ msgstr "s’inscrire"
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr "Propriétaires du code"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Cohortes"
msgid "Collapse"
msgstr "Réduire"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Masquer la barre latérale"
@@ -2723,6 +2881,9 @@ msgstr "Copier l’URL %{protocol} de clonage"
msgid "Copy ID to clipboard"
msgstr "Copier l’identifiant dans le presseâ€papiers"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "Copier l’URL SSH de clonage"
@@ -3211,6 +3372,9 @@ msgstr "Les modèles de description permettent de définir des modèles spécifi
msgid "Description:"
msgstr "Description :"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "Détruire"
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "Rejeter"
@@ -3460,6 +3627,9 @@ msgstr "Activer pour ce projet"
msgid "Enable group Runners"
msgstr "Activer les exécuteurs de groupe"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Activer ou désactiver la collecte de données Pseudonymizer."
@@ -3496,6 +3666,9 @@ msgstr "Se termine à (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr "Entrez la description de la demande de fusion"
msgid "Enter the merge request title"
msgstr "Entrez l’intitulé de la demande de fusion"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ msgstr "Une erreur s’est produite lors de la récupération des environnements
msgid "Environments|An error occurred while making the request."
msgstr "Une erreur s’est produite lors de la requête."
+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 "Une erreur s’est produite lors de l’arrêt de l’environnement. Veuillez réessayer"
@@ -3592,15 +3768,33 @@ msgstr "Ouvrir l’environnement en cours"
msgid "Environments|Pod logs from"
msgstr "Journaux du pod depuis"
+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 "Redéployer dans l’environnement"
msgid "Environments|Read more about environments"
msgstr "En savoir plus sur les environnements"
+msgid "Environments|Rollback"
+msgstr ""
+
msgid "Environments|Rollback environment"
msgstr "Restaurer l’environnement"
+msgid "Environments|Rollback environment %{environment_name}?"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
msgid "Environments|Show all"
msgstr "Tout afficher"
@@ -3613,6 +3807,18 @@ msgstr "Arrêter l’environnement"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Mis à jour"
@@ -3664,6 +3870,9 @@ msgstr "Rapport d’erreur et journalisation"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr "Erreur lors de la création de l’épopée"
@@ -3733,6 +3942,33 @@ msgstr "Erreur lors du chargement de la demande de fusion. Veuillez réessayer."
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr "Étendre"
msgid "Expand all"
msgstr "Tout étendre"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Étendre la barre latérale"
@@ -3898,7 +4137,7 @@ msgstr "Échec du déploiement sur"
msgid "Failed to load emoji list."
msgstr "Impossible de charger la liste des émojis."
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "Description"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "Modifier %{feature_flag_name}"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "Modifier l’indicateur de fonctionnalité"
@@ -4024,9 +4260,6 @@ msgstr "Nouveau"
msgid "FeatureFlags|New Feature Flag"
msgstr "Nouvel indicateur de fonctionnalité"
-msgid "FeatureFlags|Save changes"
-msgstr "Enregistrer les modifications"
-
msgid "FeatureFlags|Status"
msgstr "État"
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr "Filtrer…"
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Rechercher par chemin d’accès"
@@ -4230,8 +4460,8 @@ msgstr "Erreurs trouvées dans votre fichier .gitlab-ci.yml :"
msgid "Free Trial of GitLab.com Gold"
msgstr "Essai gratuit de GitLab.com Gold"
-msgid "From %{provider_title}"
-msgstr "De %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Depuis Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr "À partir des jalons :"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "À partir de l’affichage des détails de la grappe de serveurs Kubernetes, installez un exécuteur à partir de la liste des applications"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "Clefs GPG"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "Général"
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr "Retour"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "Retour"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "Aller vers"
msgid "Go to %{link_to_google_takeout}."
msgstr "Consultez le site de %{link_to_google_takeout}."
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Importation depuis Google Code"
@@ -4761,6 +5006,9 @@ msgstr "Informations du groupe :"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Les responsables de groupe peuvent créer des exécuteurs de groupe via %{link}"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "Nom du groupe"
@@ -5129,9 +5377,24 @@ msgstr "Importer un dépôt"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr "Connecter des dépôts provenant de"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "Améliorez le tableau des tickets avec Gitlab Entreprise Edition."
@@ -5183,6 +5446,12 @@ msgstr "Entrer les clefs d’hôte manuellement"
msgid "Input your repository URL"
msgstr "Entrez l’URL de votre dépôt"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr "Introduction à l’analyseur de cycle"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "Ticket"
@@ -5296,8 +5571,8 @@ msgstr "Les tickets peuvent être des bogues, des tâches ou des sujets de discu
msgid "Issues closed"
msgstr "Tickets clos"
-msgid "Issues, merge requests, pushes and comments."
-msgstr "Tickets, demandes de fusion, poussées Git et commentaires."
+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 "Une fois que vous aurez commencé à créer des tickets d’incident en relation avec vos projets, nous pourrons commencer à en effectuer le suivi et afficher des statistiques les concernant"
@@ -5485,6 +5760,9 @@ msgstr "Promouvoir l’étiquette"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr "La promotion de l’étiquette « %{labelTitle} » va la rendre disponible pour tous les projets du groupe %{groupName}. Les étiquettes de projet ayant le même intitulé seront fusionnées. Cette action est irréversible."
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr "Stockage de fichiers volumineux"
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr "En savoir plus sur les branches protégées"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Apprenezâ€en plus dans la"
@@ -5741,6 +6022,15 @@ msgstr "Se connecter avec une carte à puce"
msgid "Logs"
msgstr "Journaux"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 "Rendez chaque membre de votre équipe plus productif, quel que soit l’endroit où il se situe. GitLab Geo crée des miroirs en lecture seule de votre instance GitLab afin que vous puissiez réduire le temps nécessaire pour cloner et récupérer de gros dépôts."
@@ -5786,6 +6076,9 @@ msgstr "Manifeste"
msgid "Manifest file import"
msgstr "Importation de fichier manifeste"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Associer un identifiant de compte FogBugz à un utilisateur GitLab"
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr "Markdown activé"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr "Ajouter une liste à puces"
-
-msgid "MarkdownToolbar|Add a link"
-msgstr "Ajouter un lien"
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr "Ajouter une liste numérotée"
-
-msgid "MarkdownToolbar|Add a table"
-msgstr "Ajouter un tableau"
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr "Ajouter une liste de tâches"
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr "Ajouter du texte en gras"
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr "Ajouter du texte en italique"
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr "Afficher en plein écran"
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr "Insérer une citation"
-
-msgid "MarkdownToolbar|Insert code"
-msgstr "Insérer du code"
-
msgid "Maven Metadata"
msgstr "Métadonnées Maven"
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Demande de fusion"
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentation des requêtes Prometheus"
-msgid "Metrics|System"
-msgstr "Système"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "Une erreur s’est produite lors de la récupération des données d’environnement. Veuillez réessayer."
@@ -6194,6 +6457,9 @@ msgstr "Plus d’informations"
msgid "More information is available|here"
msgstr "ici"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "Les plus étoilés"
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Nouvelle planification de pipeline"
msgid "New Snippet"
msgstr "Nouvel extrait de code"
-msgid "New Snippets"
-msgstr "Nouveaux extraits de code"
-
msgid "New branch"
msgstr "Nouvelle branche"
@@ -6340,9 +6606,15 @@ msgstr "Nouveau…"
msgid "No"
msgstr "Non"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "Aucune étiquette"
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr "Aucune contribution n’a été trouvée"
msgid "No credit card required."
msgstr "Aucune carte de crédit n’est nécessaire."
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "Aucune date d’échéance"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr "Données insuffisantes"
msgid "Not now"
msgstr "Pas maintenant"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Notez que la branche principale « master » est automatiquement protégée. %{link_to_protected_branches}"
@@ -6675,6 +6953,9 @@ msgstr "Opérations"
msgid "Operations Dashboard"
msgstr "Tableau de bord des opérations"
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Ajouter un projet au tableau de bord"
@@ -6684,6 +6965,9 @@ msgstr "Le tableau de bord des opérations fournit un résumé de l’état de s
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr "Vous pouvez éventuellement %{link_to_customize} la manière dont les adresses de courriel et les noms d’utilisateur issus de FogBugz sont importés dans GitLab."
@@ -6876,6 +7160,12 @@ msgstr "Variables"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Personnalisé"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -6891,6 +7181,9 @@ msgstr "Pipelines de la semaine dernière"
msgid "Pipelines for last year"
msgstr "Pipelines de l’année dernière"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "Construire en toute confiance"
@@ -7011,9 +7304,21 @@ msgstr "Veuillez les convertir en %{link_to_git} et repasser par %{link_to_impor
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr "Veuillez les convertir en dépôts Git sur Google Code et repasser par %{link_to_import_flow}."
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr "Veuillez saisir un nom descriptif pour votre groupe."
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr "Veuillez noter que cette application n’est pas fournie par GitLab, vous devriez vérifier son authenticité avant d’autoriser son accès."
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+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 set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Veuillez résoudre le reCAPTCHA"
@@ -7050,6 +7364,9 @@ msgstr "Préférences"
msgid "Preferences|Navigation theme"
msgstr "Thème de navigation"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "Appuyez sur Entrée ou cliquez pour rechercher"
@@ -7248,9 +7565,6 @@ msgstr "Cette adresse de courriel sera utilisée pour les opérations Web, telle
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Cet émoji et ce message apparaîtront sur votre profil et partout dans l’interface."
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr "Progression"
msgid "Project"
msgstr "Projet"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "Le projet « %{project_name} » est en cours de suppression."
@@ -7392,6 +7709,9 @@ msgstr "Le lien de l’exportation du projet a expiré. Merci de générer une n
msgid "Project export started. A download link will be sent by email."
msgstr "L’exportation du projet a débuté. Un lien de téléchargement sera envoyé par courriel."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr "Les utilisateurs et utilisatrices ne peuvent uniquement pousser sur ce d
msgid "Projects"
msgstr "Projets"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projets partagés avec %{group_name}"
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "Supprimer l’avatar"
@@ -7985,6 +8314,19 @@ msgstr "Exiger de tous les utilisateurs de ce groupe la configuration de l’aut
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Exiger que tous les utilisateurs acceptent les conditions générales d’utilisation et la politique de confidentialité quand ils accèdent à GitLab."
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr "Vous avez utilisé tout le temps de pipeline partagé de vos exécuteurs
msgid "Running"
msgstr "En cours d’exécution"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "Authentification unique SAML"
@@ -8173,6 +8518,9 @@ msgstr "Clef SSH publique"
msgid "SSL Verification"
msgstr "Vérification SSL"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "Enregistrer"
@@ -8206,6 +8554,9 @@ msgstr "Planifié"
msgid "Schedules"
msgstr "Planifications"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Planification des pipelines"
@@ -8266,6 +8617,9 @@ msgstr "Rechercher des projets"
msgid "Search users"
msgstr "Rechercher des utilisateurs et utilisatrices"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "Rechercher dans vos projets"
@@ -8524,6 +8878,9 @@ msgstr "Définir un dépôt de modèles au niveau de l’instance"
msgid "Set max session time for web terminal."
msgstr "Définissez le temps maximal de la session pour le terminal Web."
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "Définissez un courriel de notification pour les rapports d’abus."
@@ -8548,6 +8905,9 @@ msgstr "Configure les assertions, attributs et revendications (courriel, prénom
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 "Configurez votre projet afin de pouvoir pousser et/ou récupérer automatiquement les modifications vers ou depuis un autre dépôt. Les branches, les étiquetets et les commits seront automatiquement synchronisés."
@@ -8605,9 +8965,15 @@ msgstr "Réinitialiser les minutes du pipeline utilisées"
msgid "Sherlock Transactions"
msgstr "Transactions Sherlock"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "Afficher la commande"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "Afficher le journal brut complet"
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr "Extraits de code"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ msgstr "Activité des projets favoris"
msgid "Starred projects"
msgstr "Projets favoris"
+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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Changer de branche ou d’étiquette"
msgid "Sync information"
msgstr "Synchroniser les informations"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "« Hooks » système"
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "La taille maximale autorisée pour un fichier est de 200 Kio."
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "La phrase de passe permettant de déchiffrer la clef privée. Ceci est facultatif et la valeur est chiffrée au repos."
@@ -9498,6 +9894,9 @@ msgstr "Une erreur est survenue lors de la suppression de la tâche à accomplir
msgid "There was an error loading users activity calendar."
msgstr "Une erreur s’est produite lors du chargement du calendrier d’activité des utilisateurs."
+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."
@@ -9543,6 +9942,21 @@ msgstr "La portée de ce tableau est réduite"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr "Cette branche a changé depuis que vous y avez apporté des modifications. Souhaitezâ€vous créer une nouvelle branche ?"
+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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr "Ce registre de conteneur a été programmé pour suppression."
@@ -9564,6 +9978,9 @@ msgstr "Ce répertoire"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "Ce groupe"
@@ -9648,6 +10065,12 @@ msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’a
msgid "This merge request is locked."
msgstr "Cette demande de fusion est verrouillée."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "Cette option est désactivée car vous n’avez pas les droits d’écriture sur la branche actuelle"
@@ -10207,6 +10630,9 @@ msgstr "À venir"
msgid "Update"
msgstr "Mettre à jour"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr "Mettre à jour maintenant"
msgid "Update your group name, description, avatar, and visibility."
msgstr "Modifiez le nom du groupe, sa description, son avatar et sa visibilité."
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "Mise à jour en cours"
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr "Voir la documentation"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "Afficher la liste des épopées"
@@ -10453,6 +10885,9 @@ msgstr "Voir le fichier @ "
msgid "View group labels"
msgstr "Afficher les labels de groupe"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "Afficher le ticket"
@@ -10756,6 +11191,9 @@ msgstr "Grâce à l’analyse des contributions, vous pouvez avoir une vue d’e
msgid "Withdraw Access Request"
msgstr "Retirer la demande d’accès"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ msgstr ""
msgid "You have no permissions"
msgstr "Vous n’avez pas les autorisations"
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Vous avez atteint votre limite de projet"
@@ -10921,6 +11362,9 @@ msgstr "Vous ne pourrez pas récupérer ou pousser de code via SSH tant que vous
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Vous devrez utiliser différents noms de branches pour obtenir une comparaison valide."
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr "Vous recevez ce courriel parce que %{reason}."
@@ -11014,6 +11458,9 @@ msgstr "assignez vous"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "nom de la branche"
@@ -11097,6 +11544,9 @@ msgstr "Qualité du code"
msgid "ciReport|Confidence"
msgstr "Niveau de confiance"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "Analyse du conteneur"
@@ -11191,9 +11641,6 @@ msgstr "Aucun changement dans les indicateurs de performance"
msgid "ciReport|Performance metrics"
msgstr "Indicateurs de performance"
-msgid "ciReport|Revert dismissal"
-msgstr "Annuler le rejet"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11233,6 +11680,9 @@ msgstr "Une erreur s’est produite lors du chargement du rapport d’analyse de
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "Une erreur s’est produite lors de l’annulation du rejet. Veuillez réessayer."
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "Mise à niveau de %{name} de %{version} à %{fixed}."
@@ -11325,9 +11775,6 @@ msgstr "aide"
msgid "here"
msgstr "ici"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://votre-serveur-bitbucket"
@@ -11446,6 +11893,9 @@ msgstr "Une erreur est survenue lors de l’envoi de votre approbation."
msgid "mrWidget|Approve"
msgstr "Approuver"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "Approuvée par"
@@ -11518,6 +11968,9 @@ msgstr "Fusionner localement"
msgid "mrWidget|Merge request approved"
msgstr "Demande de fusion approuvée"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "Demande de fusion approuvée ; vous pouvez ajouter votre approbation"
@@ -11579,6 +12032,9 @@ msgstr "Défaire"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "Défaire cette demande de fusion dans une nouvelle demande de fusion"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "Marqué par"
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 188065864c7..a2baf2ad219 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -384,18 +384,39 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -543,6 +564,9 @@ msgstr ""
msgid "AdminUsers|Without projects"
msgstr ""
+msgid "Advanced"
+msgstr ""
+
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -612,10 +636,10 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occurred creating the new branch."
msgstr ""
-msgid "An error occurred creating the new branch."
+msgid "An error occurred fetching the dropdown data."
msgstr ""
msgid "An error occurred previewing the blob"
@@ -654,6 +678,9 @@ 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 getting projects"
msgstr ""
@@ -864,9 +891,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1320,6 +1344,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1365,6 +1392,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1419,6 +1449,12 @@ 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 your merge method, set up a default merge request description template."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1605,10 +1641,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -1662,7 +1698,7 @@ msgstr ""
msgid "ClusterIntegration|Copy Jupyter Hostname to clipboard"
msgstr ""
-msgid "ClusterIntegration|Copy Knative IP Address to clipboard"
+msgid "ClusterIntegration|Copy Knative Endpoint to clipboard"
msgstr ""
msgid "ClusterIntegration|Copy Kubernetes cluster name"
@@ -1785,7 +1821,7 @@ msgstr ""
msgid "ClusterIntegration|Knative Domain Name:"
msgstr ""
-msgid "ClusterIntegration|Knative IP Address:"
+msgid "ClusterIntegration|Knative Endpoint:"
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."
@@ -1905,7 +1941,7 @@ msgstr ""
msgid "ClusterIntegration|Request to begin installing failed"
msgstr ""
-msgid "ClusterIntegration|Retry upgrade"
+msgid "ClusterIntegration|Retry update"
msgstr ""
msgid "ClusterIntegration|Save changes"
@@ -1950,9 +1986,6 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong when upgrading %{title}. Please check the logs and try again."
-msgstr ""
-
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine"
msgstr ""
@@ -1971,12 +2004,21 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr ""
+msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
+msgstr ""
+
msgid "ClusterIntegration|Toggle Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Token"
msgstr ""
+msgid "ClusterIntegration|Update failed. Please check the logs and try again."
+msgstr ""
+
+msgid "ClusterIntegration|Updating"
+msgstr ""
+
msgid "ClusterIntegration|Upgrade"
msgstr ""
@@ -2908,6 +2950,9 @@ msgstr ""
msgid "Edit environment"
msgstr ""
+msgid "Edit file"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
@@ -2932,6 +2977,9 @@ msgstr ""
msgid "Embed"
msgstr ""
+msgid "Emojis|Something went wrong while loading emojis."
+msgstr ""
+
msgid "Empty file"
msgstr ""
@@ -2959,6 +3007,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -3001,9 +3052,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3028,6 +3076,12 @@ 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 ""
@@ -3073,15 +3127,33 @@ msgstr ""
msgid "Environments|Open live environment"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3094,6 +3166,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3112,6 +3196,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error deleting %{issuableType}"
msgstr ""
@@ -3178,6 +3265,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3402,9 +3516,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -3531,6 +3642,9 @@ msgstr ""
msgid "General"
msgstr ""
+msgid "General Settings"
+msgstr ""
+
msgid "General pipelines"
msgstr ""
@@ -3618,6 +3732,9 @@ msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
@@ -3848,6 +3965,9 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "Housekeeping, export, path, transfer, remove, archive."
+msgstr ""
+
msgid "However, you are already a member of this %{member_source}. Sign in using a different account to accept the invitation."
msgstr ""
@@ -4061,6 +4181,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -4464,6 +4590,12 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRDiff|Show changes only"
+msgstr ""
+
+msgid "MRDiff|Show full file"
+msgstr ""
+
msgid "Make sure you're logged into the account that owns the projects you'd like to import."
msgstr ""
@@ -4533,36 +4665,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Max access level"
msgstr ""
@@ -4662,6 +4764,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error loading full diff. Please try again."
+msgstr ""
+
msgid "MergeRequest|Filter files"
msgstr ""
@@ -4824,6 +4929,9 @@ msgstr ""
msgid "Name:"
msgstr ""
+msgid "Naming, tags, avatar"
+msgstr ""
+
msgid "Naming, visibility"
msgstr ""
@@ -4943,6 +5051,9 @@ msgstr ""
msgid "No %{providerTitle} repositories available to import"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -4973,7 +5084,7 @@ msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -5341,9 +5452,6 @@ msgstr ""
msgid "Pipeline"
msgstr ""
-msgid "Pipeline Health"
-msgstr ""
-
msgid "Pipeline Schedule"
msgstr ""
@@ -5401,6 +5509,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -5863,6 +5977,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -5968,6 +6085,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -6118,6 +6238,9 @@ msgstr ""
msgid "Real-time features"
msgstr ""
+msgid "Recent Project Activity"
+msgstr ""
+
msgid "Recent searches"
msgstr ""
@@ -6431,6 +6554,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -7351,6 +7477,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr ""
@@ -7447,6 +7576,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -8093,6 +8225,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Update your project name, tags, description and avatar."
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -8285,6 +8420,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View it on GitLab"
msgstr ""
@@ -8321,6 +8459,9 @@ msgstr ""
msgid "Visibility level:"
msgstr ""
+msgid "Visibility, project features, permissions"
+msgstr ""
+
msgid "Visibility:"
msgstr ""
@@ -8516,6 +8657,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -8832,9 +8976,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index a931df046da..962e96995b6 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:15\n"
+"PO-Revision-Date: 2019-03-06 15:38\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 0c3654b1266..0819ef9afee 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:15\n"
+"PO-Revision-Date: 2019-03-06 15:49\n"
msgid " Status"
msgstr ""
@@ -47,6 +47,13 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -156,12 +163,28 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -182,15 +205,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -270,6 +293,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -296,6 +322,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -416,6 +449,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -431,6 +479,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -515,24 +566,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -701,6 +779,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -714,6 +795,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -783,7 +867,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -795,6 +879,15 @@ 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 previewing the blob"
msgstr ""
@@ -807,6 +900,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -843,6 +939,9 @@ 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 getting projects"
msgstr ""
@@ -900,12 +999,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -996,6 +1101,52 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1038,9 +1189,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1125,6 +1282,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1140,9 +1300,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1701,6 +1858,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1737,6 +1897,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1749,6 +1912,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1815,9 +1981,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1977,6 +2140,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1992,9 +2158,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2040,10 +2203,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2082,6 +2245,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2178,7 +2344,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2193,9 +2359,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2241,9 +2404,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2481,15 +2641,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2791,6 +2963,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3281,6 +3456,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3359,6 +3537,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3530,6 +3711,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3566,6 +3750,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3584,9 +3771,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3611,6 +3795,12 @@ 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 ""
@@ -3662,15 +3852,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3683,6 +3891,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3734,6 +3954,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3803,6 +4026,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3881,6 +4131,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3968,7 +4221,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4034,9 +4287,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4094,9 +4344,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4185,9 +4432,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4302,7 +4546,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4332,9 +4576,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4767,15 +5017,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4833,6 +5092,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5203,9 +5465,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5257,6 +5534,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5312,6 +5595,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5330,6 +5616,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5372,7 +5661,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5561,6 +5850,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5646,6 +5938,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5821,6 +6116,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5866,6 +6170,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5893,36 +6200,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5977,6 +6254,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6127,9 +6407,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6274,6 +6551,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6353,13 +6633,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6422,9 +6702,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6452,13 +6738,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6554,6 +6843,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6759,6 +7051,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6768,6 +7063,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6960,6 +7258,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6975,6 +7279,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7095,9 +7402,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7107,9 +7426,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7134,6 +7462,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7332,9 +7663,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7434,6 +7762,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7476,6 +7807,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7575,6 +7909,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7936,6 +8273,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8071,6 +8414,23 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Resend invite"
msgstr ""
@@ -8231,6 +8591,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8261,6 +8624,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8294,6 +8660,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8354,6 +8723,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8612,6 +8984,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8636,6 +9011,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8693,9 +9071,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8796,6 +9180,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9066,6 +9468,12 @@ 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 "Stars"
msgstr ""
@@ -9276,6 +9684,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9465,6 +9876,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9588,6 +10002,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9633,6 +10050,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9654,6 +10086,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9738,6 +10173,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10301,6 +10742,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10310,6 +10754,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10538,6 +10985,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10547,6 +10997,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10850,6 +11303,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10955,6 +11411,9 @@ 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 ""
@@ -11015,6 +11474,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11108,6 +11570,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11199,6 +11664,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11297,9 +11765,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11339,6 +11804,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11439,9 +11907,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11564,6 +12029,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11636,6 +12104,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11701,6 +12172,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 8a3603ef135..779c2496e2e 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:15\n"
+"PO-Revision-Date: 2019-03-06 15:49\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 5267aa42b8d..912929a31c4 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:13\n"
+"PO-Revision-Date: 2019-03-06 15:52\n"
msgid " Status"
msgstr ""
@@ -45,6 +45,12 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -141,12 +147,27 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -165,15 +186,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -249,6 +270,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -273,6 +297,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -384,6 +414,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -399,6 +444,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -483,24 +531,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -669,6 +744,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -681,6 +759,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -750,7 +831,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -762,6 +843,15 @@ 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 previewing the blob"
msgstr ""
@@ -774,6 +864,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -810,6 +903,9 @@ 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 getting projects"
msgstr ""
@@ -867,12 +963,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -963,6 +1065,48 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1005,9 +1149,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1092,6 +1242,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1107,9 +1260,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1668,6 +1818,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1704,6 +1857,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1716,6 +1872,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1782,9 +1941,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1944,6 +2100,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1959,9 +2118,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2007,10 +2163,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2049,6 +2205,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2145,7 +2304,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2160,9 +2319,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2208,9 +2364,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2448,15 +2601,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2757,6 +2922,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3246,6 +3414,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3324,6 +3495,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3495,6 +3669,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3531,6 +3708,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3549,9 +3729,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3576,6 +3753,12 @@ 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 ""
@@ -3627,15 +3810,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3648,6 +3849,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3699,6 +3912,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3768,6 +3984,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3846,6 +4089,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3933,7 +4179,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3999,9 +4245,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4059,9 +4302,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4149,9 +4389,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4266,7 +4503,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4296,9 +4533,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4731,15 +4974,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4797,6 +5049,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5166,9 +5421,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5220,6 +5490,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5274,6 +5550,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5292,6 +5571,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5334,7 +5616,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5523,6 +5805,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5607,6 +5892,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5781,6 +6069,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5826,6 +6123,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5853,36 +6153,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5937,6 +6207,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6087,9 +6360,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6234,6 +6504,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6312,13 +6585,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6381,9 +6654,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6411,13 +6690,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6513,6 +6795,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6717,6 +7002,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6726,6 +7014,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6918,6 +7209,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6933,6 +7230,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7053,9 +7353,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7065,9 +7377,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7092,6 +7413,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7290,9 +7614,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7392,6 +7713,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7434,6 +7758,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7533,6 +7860,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7893,6 +8223,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8028,6 +8364,21 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Resend invite"
msgstr ""
@@ -8187,6 +8538,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8217,6 +8571,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8250,6 +8607,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8310,6 +8670,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8568,6 +8931,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8592,6 +8958,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8649,9 +9018,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8751,6 +9126,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9021,6 +9414,12 @@ 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 "Stars"
msgstr ""
@@ -9231,6 +9630,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9420,6 +9822,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9543,6 +9948,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9588,6 +9996,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9609,6 +10032,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9693,6 +10119,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10254,6 +10686,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10263,6 +10698,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10491,6 +10929,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10500,6 +10941,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10803,6 +11247,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10908,6 +11355,9 @@ 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 ""
@@ -10968,6 +11418,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11061,6 +11514,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11148,6 +11604,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11244,9 +11703,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11286,6 +11742,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11382,9 +11841,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11505,6 +11961,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11577,6 +12036,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11640,6 +12102,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index bc8e95021c1..5fe58919064 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:14\n"
+"PO-Revision-Date: 2019-03-06 15:49\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 79a8b5aa073..9c9444e6d46 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:11\n"
+"PO-Revision-Date: 2019-03-06 15:48\n"
msgid " Status"
msgstr ""
@@ -41,6 +41,10 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -111,12 +115,25 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -131,15 +148,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -207,6 +224,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -320,6 +344,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -335,6 +374,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -419,24 +461,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -605,6 +674,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -615,6 +687,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -684,7 +759,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -696,6 +771,15 @@ 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 previewing the blob"
msgstr ""
@@ -708,6 +792,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr ""
@@ -801,12 +891,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -897,6 +993,40 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -939,9 +1069,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1026,6 +1162,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1041,9 +1180,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1602,6 +1738,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1638,6 +1777,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1650,6 +1792,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1716,9 +1861,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1878,6 +2020,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1893,9 +2038,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1941,10 +2083,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -1983,6 +2125,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2079,7 +2224,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2094,9 +2239,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2142,9 +2284,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2382,15 +2521,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2689,6 +2840,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3176,6 +3330,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3254,6 +3411,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3425,6 +3585,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3461,6 +3624,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3479,9 +3645,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3506,6 +3669,12 @@ 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 ""
@@ -3557,15 +3726,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3578,6 +3765,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3629,6 +3828,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3698,6 +3900,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3776,6 +4005,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3863,7 +4095,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3929,9 +4161,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -3989,9 +4218,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4077,9 +4303,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4194,7 +4417,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4224,9 +4447,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4659,15 +4888,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4725,6 +4963,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5092,9 +5333,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5146,6 +5402,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5198,6 +5460,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5216,6 +5481,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5258,7 +5526,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5447,6 +5715,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5529,6 +5800,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5701,6 +5975,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5746,6 +6029,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5773,36 +6059,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5857,6 +6113,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6007,9 +6266,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6154,6 +6410,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6230,13 +6489,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6299,9 +6558,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6329,13 +6594,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6431,6 +6699,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6633,6 +6904,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6642,6 +6916,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6834,6 +7111,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6849,6 +7132,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -6969,9 +7255,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -6981,9 +7279,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7008,6 +7315,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7206,9 +7516,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7308,6 +7615,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7350,6 +7660,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7449,6 +7762,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7807,6 +8123,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7942,6 +8264,17 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
msgid "Resend invite"
msgstr ""
@@ -8099,6 +8432,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8129,6 +8465,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8162,6 +8501,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8222,6 +8564,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8480,6 +8825,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8504,6 +8852,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8561,9 +8912,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8661,6 +9018,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8931,6 +9306,12 @@ 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 "Stars"
msgstr ""
@@ -9141,6 +9522,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9330,6 +9714,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9453,6 +9840,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9498,6 +9888,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9519,6 +9924,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9603,6 +10011,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10160,6 +10574,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10169,6 +10586,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10397,6 +10817,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10406,6 +10829,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10709,6 +11135,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10814,6 +11243,9 @@ 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 ""
@@ -10874,6 +11306,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -10967,6 +11402,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11046,6 +11484,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11138,9 +11579,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11180,6 +11618,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11268,9 +11709,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11387,6 +11825,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11459,6 +11900,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11518,6 +11962,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index a7dd46e61dd..b63371c5616 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:09\n"
+"PO-Revision-Date: 2019-03-06 15:18\n"
msgid " Status"
msgstr " Stato"
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" nei progetti"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr "%{count}%{alerts}"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "%{count} altri assegnatari"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} partecipante"
@@ -148,15 +167,15 @@ msgstr "%{filePath} eliminato"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} + %{labelCount} più"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "I %{group_docs_link_start}Gruppi%{group_docs_link_end} consentono di gestire e collaborare in vari progetti. I membri di un gruppo hanno accesso a tutti i suoi progetti."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sarà rimosso! Sei sicuro?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} più"
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Un insieme di grafici riguardo la Continuous Integration"
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr "Impostazioni Avanzate"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr "Tutto"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr "Ago"
msgid "August"
msgstr "Agosto"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Log di autenticazione"
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr "Ripristina"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Grafici"
msgid "Chat"
msgstr "Chat"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr "Clona repository"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "Installa"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr "Installato"
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ msgstr "Errore durante il fetch degli ambienti."
msgid "Environments|An error occurred while making the request."
msgstr "Errore durante l'esecuzione della richiesta."
+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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
msgstr "Leggi di più sugli ambienti"
+msgid "Environments|Rollback"
+msgstr ""
+
msgid "Environments|Rollback environment"
msgstr ""
+msgid "Environments|Rollback environment %{environment_name}?"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
msgid "Environments|Show all"
msgstr "Mostra tutti"
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Aggiornato"
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Trova in percorso"
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "Chiavi GPG"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr "Importa repository"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr "Introduzione delle Analisi Cicliche"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Leggi di più su"
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Richiesta di merge"
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr "Ulteriori informazioni sono disponibili | qui"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,15 +6537,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Nuova pianificazione Pipeline"
msgid "New Snippet"
msgstr ""
-msgid "New Snippets"
-msgstr ""
-
msgid "New branch"
msgstr "Nuova Branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr "Dati insufficienti "
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr "Variabili"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Personalizzato"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipeline"
@@ -6891,6 +7181,9 @@ msgstr "Pipeline per la settimana scorsa"
msgid "Pipelines for last year"
msgstr "Pipeline per l'ultimo anno"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr "Preferenze"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "Il progetto '%{project_name}' è in fase di eliminazione."
@@ -7392,6 +7709,9 @@ msgstr "Il link d'esportazione del progetto è scaduto. Genera una nuova esporta
msgid "Project export started. A download link will be sent by email."
msgstr "Esportazione del progetto iniziata. Un link di download sarà inviato via email."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr "Progetti"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Pianificazione pipelines"
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr "Snippet"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Cambia branch/tag"
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr "Questo significa che non è possibile effettuare push di codice fino a c
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "Ritira richiesta d'accesso"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 "Hai raggiunto il tuo limite di progetto"
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 8998c660e18..f8654721e31 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 12:12\n"
+"PO-Revision-Date: 2019-03-06 17:47\n"
msgid " Status"
msgstr " ステータス"
@@ -30,10 +30,10 @@ msgid_plural " improved on %d points"
msgstr[0] " %dãƒã‚¤ãƒ³ãƒˆã§æ”¹å–„"
msgid " or "
-msgstr ""
+msgstr " ã¾ãŸã¯ "
msgid " or <#epic id>"
-msgstr ""
+msgstr " ã¾ãŸã¯ <#エピックID>"
msgid " or <#issue id>"
msgstr ""
@@ -41,6 +41,10 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "プロジェクト内㮠\"%{query}\""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d個ã®ã‚³ãƒŸãƒƒãƒˆ"
@@ -50,7 +54,7 @@ msgid_plural "%d commits behind"
msgstr[0] "%d個ã®ã‚³ãƒŸãƒƒãƒˆå¾…ã¡"
msgid "%d commits"
-msgstr ""
+msgstr "%d個ã®ã‚³ãƒŸãƒƒãƒˆ"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -70,7 +74,7 @@ msgstr[0] "%d個ã®èª²é¡Œ"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
+msgstr[0] "%d個ã®èª²é¡Œã‚’é¸æŠžæ¸ˆã¿"
msgid "%d layer"
msgid_plural "%d layers"
@@ -111,12 +115,25 @@ msgstr "%{counter_storage} (%{counter_repositories} リãƒã‚¸ãƒˆãƒªã€%{counter_
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
-msgid "%{count} more"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
+msgid "%{count} more"
+msgstr "%{count} 以上"
+
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} 人ã®å‚加者"
@@ -131,18 +148,18 @@ msgstr "%{filePath} ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} ã®è©³ç´°"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}グループ%{group_docs_link_end}を使用ã™ã‚‹ã¨ã€è¤‡æ•°ã®ãƒ—ロジェクトを管ç†ã—ã¦å…±åŒä½œæ¥­ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ‰€å±žã™ã‚‹ãƒ—ロジェクトã®ã™ã¹ã¦ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType}を削除ã—ã¾ã™ï¼ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{link_start}Read more%{link_end} about role permissions"
+msgstr "ロールã®æ¨©é™ã«ã¤ã„ã¦%{link_start}ã‚‚ã£ã¨èª­ã‚€%{link_end}"
+
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} 開始"
@@ -162,22 +179,22 @@ msgid "%{percent}%% complete"
msgstr "%{percent}%% 完了"
msgid "%{state} epics"
-msgstr ""
+msgstr "%{state}エピック"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{branch_count}%{strong_end} ブランãƒ"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{commit_count}%{strong_end} コミット"
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} ファイル"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{tag_count}%{strong_end} ã‚¿ã‚°"
msgid "%{text} %{files}"
msgid_plural "%{text} %{files} files"
@@ -196,20 +213,23 @@ msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what infor
msgstr "GitLab Inc. ã¨ã©ã®ã‚ˆã†ãªæƒ…報を共有ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ %{usage_ping_link_start} ã“ã¡ã‚‰%{usage_ping_link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "%{user_name} プロフィールページ"
msgid "(external source)"
-msgstr ""
+msgstr "(外部ソース)"
msgid "+ %{count} more"
-msgstr ""
+msgstr "%{count} 以上"
msgid "+ %{moreCount} more"
msgstr "+ 他 %{moreCount} 件"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr "ã€ã¾ãŸã¯"
+
msgid "- Runner is active and can process any new jobs"
msgstr "- RunnerãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§æ–°ã—ã„ジョブを処ç†ã§ãã¾ã™"
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] "%{count} 件 %{type} ã®ä¿®æ­£"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "%d件ã®ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚ŒãŸèª²é¡Œ"
@@ -257,7 +281,7 @@ msgstr[0] "%d 個ã®ãƒ‘イプライン"
msgid "1 role"
msgid_plural "%d roles"
-msgstr[0] ""
+msgstr[0] "役割 %d 件"
msgid "1 user"
msgid_plural "%d users"
@@ -267,13 +291,13 @@ msgid "1st contribution!"
msgstr "最åˆã®è²¢çŒ®!"
msgid "2FA"
-msgstr ""
+msgstr "2FA"
msgid "2FA enabled"
msgstr "2段階èªè¨¼ãŒæœ‰åŠ¹"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®é–²è¦§ã«ã¯æ¨©é™ãŒå¿…è¦ã§ã™ã€‚GitLab 管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
msgid "403|You don't have the permission to access this page."
msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -315,11 +339,26 @@ msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong>
msgstr "<strong>%{pushes}</strong>回ã®ãƒ—ッシュã€<strong>%{commits}</strong>回以上ã®ã‚³ãƒŸãƒƒãƒˆãŒè²¢çŒ®è€…<strong>%{people}</strong>ã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã—ãŸã€‚"
msgid "<strong>Deletes</strong> source branch"
-msgstr ""
+msgstr "ソースブランãƒã‚’<strong>削除</strong>"
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "「Runnerã€ã¯ã‚¸ãƒ§ãƒ–を実行ã™ã‚‹ãƒ—ロセスã§ã™ã€‚å¿…è¦ãªæ•°ã® Runner ã‚’ä»»æ„ã«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã§ãã¾ã™ã€‚"
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "CIã«ã¤ã„ã¦ã®ã‚°ãƒ©ãƒ•"
@@ -335,6 +374,9 @@ msgstr "ãŸã ã¡ã«é–‹ç™ºãƒ¡ãƒ³ãƒãƒ¼ã§ã„ãŸã ã„ãŸãƒ¬ãƒãƒ¼ãƒˆã‚’æ‹èª­ã—
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "プロジェクトã¨ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ ¼ç´(リãƒã‚¸ãƒˆãƒª) ã—ã€è¨ˆç”»ã‚’ç«‹ã¦(課題)ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’公開(wiki) ã™ã‚‹å ´æ‰€ã§ã™ã€‚ %{among_other_things_link}"
@@ -363,7 +405,7 @@ msgid "Abuse reports"
msgstr "迷惑行為レãƒãƒ¼ãƒˆ"
msgid "Accept invitation"
-msgstr ""
+msgstr "招待をå—ã‘入れる"
msgid "Accept terms"
msgstr "利用è¦ç´„ã«åŒæ„ã™ã‚‹"
@@ -417,6 +459,9 @@ msgid "Add Kubernetes cluster"
msgstr "Kubernetes クラスターを追加"
msgid "Add README"
+msgstr "README を追加"
+
+msgid "Add a bullet list"
msgstr ""
msgid "Add a general comment to this %{noteable_name}."
@@ -425,18 +470,42 @@ 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 "ã‚ãªãŸã® Wiki ã«ãƒ—ロジェクトã«é–¢ã™ã‚‹æƒ…報をå«ã‚€ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã‚’追加ã™ã‚‹ã¨ã€GitLab ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä»£ã‚ã‚Šã«ãれをã“ã“ã«è¡¨ç¤ºã—ã¾ã™ã€‚"
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "テーブルを追加ã™ã‚‹"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "ã™ã¹ã¦ã®ãƒ¡ãƒ¼ãƒ«ã«è¡¨ç¤ºã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã‚’追加ã—ã¾ã™ã€‚ ãŸã ã—ã€%{character_limit} 文字ã®åˆ¶é™ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr "ç”»åƒã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "ライセンスを追加"
@@ -453,7 +522,7 @@ msgid "Add reaction"
msgstr "リアクションã®è¿½åŠ "
msgid "Add to project"
-msgstr ""
+msgstr "プロジェクトã«è¿½åŠ "
msgid "Add to review"
msgstr "レビュー追加"
@@ -516,40 +585,40 @@ msgid "AdminProjects|Delete project"
msgstr "プロジェクトã®å‰Šé™¤"
msgid "AdminSettings|Auto DevOps domain"
-msgstr ""
+msgstr "Auto DevOps ドメイン"
msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
+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|When creating a new environment variable it will be protected by default."
-msgstr ""
+msgstr "環境変数ã®æ–°è¦ä½œæˆæ™‚ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ä¿è­·ã•ã‚Œã¾ã™"
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "2FA 無効"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "2FA 有効"
msgid "AdminUsers|Active"
-msgstr ""
+msgstr "アクティブ"
msgid "AdminUsers|Admin"
-msgstr ""
+msgstr "管ç†è€…"
msgid "AdminUsers|Admins"
-msgstr ""
+msgstr "管ç†è€…"
msgid "AdminUsers|Block user"
msgstr "ブロックユーザー"
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "ブロック済ã¿"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr ""
+msgstr "LDAP ã§ãƒ–ロックã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ブロック解除ã§ãã¾ã›ã‚“"
msgid "AdminUsers|Delete User %{username} and contributions?"
msgstr "ユーザー %{username} ã¨è²¢çŒ®åº¦ã‚’削除ã—ã¾ã™ã‹?"
@@ -564,28 +633,28 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "ユーザーã¨è²¢çŒ®åº¦ã®å‰Šé™¤"
msgid "AdminUsers|External"
-msgstr ""
+msgstr "外部"
msgid "AdminUsers|It's you!"
-msgstr ""
+msgstr "ã‚ãªãŸã§ã™ï¼"
msgid "AdminUsers|New user"
-msgstr ""
+msgstr "æ–°ã—ã„ユーザー"
msgid "AdminUsers|No users found"
-msgstr ""
+msgstr "ユーザーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "AdminUsers|Search by name, email or username"
-msgstr ""
+msgstr "åå‰ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§æ¤œç´¢"
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "ユーザーを検索"
msgid "AdminUsers|Send email to users"
-msgstr ""
+msgstr "ユーザーã«Eメールをé€ä¿¡ã™ã‚‹"
msgid "AdminUsers|Sort by"
-msgstr ""
+msgstr "並ã³æ›¿ãˆ"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr "確èªã®ãŸã‚ã€%{projectName} を入力ã—ã¦ãã ã•ã„"
@@ -594,10 +663,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "確èªã®ãŸã‚ã€%{username} を入力ã—ã¦ãã ã•ã„"
msgid "AdminUsers|User will be blocked"
-msgstr ""
+msgstr "ユーザーã¯ãƒ–ロックã•ã‚Œã¾ã™"
msgid "AdminUsers|Without projects"
-msgstr ""
+msgstr "プロジェクトãªã—"
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr ""
@@ -605,16 +674,22 @@ msgstr ""
msgid "Advanced settings"
msgstr "高度ãªè¨­å®š"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "アラート"
msgid "Alerts"
-msgstr ""
+msgstr "アラート"
msgid "All"
msgstr "ã™ã¹ã¦"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "ã™ã¹ã¦ã®å¤‰æ›´ãŒã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¦ã„ã¾ã™"
@@ -622,7 +697,7 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr "空ã®ãƒ—ロジェクトã€ãƒ†ãƒ³ãƒ—レートã‹ã‚‰ã€ã¾ãŸã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ã™ã¹ã¦ã®æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ãŒã€å¾Œã§ãƒ—ロジェクト設定ã§ç„¡åŠ¹ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "All issues for this milestone are closed. You may close this milestone now."
-msgstr ""
+msgstr "ã“ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã«é–¢ã™ã‚‹èª²é¡Œã¯ã™ã¹ã¦è§£æ±ºã•ã‚Œã¾ã—ãŸã€‚ã“ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã‚’クローズã§ãã¾ã™ã€‚"
msgid "All users"
msgstr "ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
@@ -649,7 +724,7 @@ msgid "Allow users to request access"
msgstr "ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã§ãるよã†ã«ã™ã‚‹"
msgid "Allow users to request access if visibility is public or internal."
-msgstr ""
+msgstr "å¯è¦–性ãŒå…¬é–‹ã¾ãŸã¯å†…部ã®å ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã§ãるよã†ã«ã—ã¾ã™ã€‚"
msgid "Allowed to fail"
msgstr ""
@@ -684,7 +759,7 @@ msgstr "GitLab ユーザフィールドãŒç©ºã®å ´åˆã€ã™ã¹ã¦ã®å•é¡Œã¨ã‚
msgid "An error has occurred"
msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -694,6 +769,15 @@ 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 previewing the blob"
@@ -708,6 +792,9 @@ msgstr "課題ã®ã‚¦ã‚¨ã‚¤ãƒˆæ›´æ–°æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while adding approver"
msgstr "承èªè€…ã®è¿½åŠ ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "コメントã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr "プロジェクトã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -778,10 +868,10 @@ msgid "An error occurred while removing approver"
msgstr "承èªè€…ã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while removing epics."
-msgstr ""
+msgstr "エピックã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while removing issues."
-msgstr ""
+msgstr "課題ã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while rendering KaTeX"
msgstr "KaTeXã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -801,12 +891,18 @@ msgstr "LDAP ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰çŠ¶æ…‹ã‚’ä¿å­˜ã™ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç
msgid "An error occurred while saving assignees"
msgstr "担当者ã®ç™»éŒ²ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "通知ã®è³¼èª­ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while unsubscribing to notifications."
msgstr "通知ã®è³¼èª­ã‚’解除中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "コメントを更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -814,19 +910,19 @@ msgid "An error occurred while validating username"
msgstr "ユーザåã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred whilst committing your changes."
-msgstr ""
+msgstr "変更ã®ã‚³ãƒŸãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred whilst fetching the job trace."
msgstr ""
msgid "An error occurred whilst fetching the latest pipeline."
-msgstr ""
+msgstr "最新ã®ãƒ‘イプラインã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred whilst loading all the files."
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­è¾¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred whilst loading the file content."
-msgstr ""
+msgstr "ファイルã®å†…容を読込中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred whilst loading the file."
msgstr ""
@@ -853,13 +949,13 @@ msgid "An unexpected error occurred while checking the project runners."
msgstr ""
msgid "An unexpected error occurred while communicating with the Web Terminal."
-msgstr ""
+msgstr "Web ターミナルã¨ã®é€šä¿¡ä¸­ã«äºˆæœŸã—ãªã„エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An unexpected error occurred while starting the Web Terminal."
-msgstr ""
+msgstr "Web ターミナルã®èµ·å‹•ä¸­ã«äºˆæœŸã—ãªã„エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An unexpected error occurred while stopping the Web Terminal."
-msgstr ""
+msgstr "Web ターミナルã®åœæ­¢ä¸­ã«äºˆæœŸã—ãªã„エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Analytics"
msgstr "アクセス解æž"
@@ -892,20 +988,54 @@ msgid "Applications"
msgstr "アプリケーション"
msgid "Applied"
-msgstr ""
+msgstr "é©ç”¨æ¸ˆã¿"
msgid "Apply suggestion"
msgstr ""
-msgid "Approvals"
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
msgstr ""
-msgid "Approvals required"
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
msgstr ""
-msgid "Approvers"
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
msgstr ""
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
+msgid "Approvals"
+msgstr "承èª"
+
+msgid "Approvals required"
+msgstr "承èªãŒå¿…è¦"
+
+msgid "Approvers"
+msgstr "承èªè€…"
+
msgid "Apr"
msgstr "4月"
@@ -919,7 +1049,7 @@ msgid "Archived projects"
msgstr "アーカイブã•ã‚ŒãŸãƒ—ロジェクト"
msgid "Are you sure"
-msgstr ""
+msgstr "よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "ã“ã®ãƒ‘イプラインスケジュールを削除ã—ã¾ã™ã‹ï¼Ÿ"
@@ -934,14 +1064,20 @@ msgid "Are you sure you want to lose your issue information?"
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 ""
+msgstr "公開éµã‚’å†ç”Ÿæˆã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? ミラーリングを行ã†å‰ã«ãƒªãƒ¢ãƒ¼ãƒˆã‚µãƒ¼ãƒãƒ¼ã®å…¬é–‹éµã‚’æ›´æ–°ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "ã“ã® %{group_name} を削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -985,7 +1121,7 @@ msgid "Assertion consumer service URL"
msgstr "アサーション コンシューマー サービス URL"
msgid "Assets"
-msgstr ""
+msgstr "アセット"
msgid "Assign custom color like #FF0000"
msgstr "#FF0000ã®ã‚ˆã†ãªã‚«ã‚¹ã‚¿ãƒ ã‚«ãƒ©ãƒ¼ã‚’割り当ã¦ã‚‹"
@@ -1026,9 +1162,12 @@ msgstr "担当者一覧ã«ã¯ã€é¸æŠžã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦
msgid "Assignee(s)"
msgstr "担当者"
-msgid "Attach a file"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
+msgid "Attach a file"
+msgstr "ファイルを添付"
+
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "ドラッグ&ドロップã¾ãŸã¯ %{upload_link} ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’添付"
@@ -1041,9 +1180,6 @@ msgstr "8月"
msgid "August"
msgstr "8月"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "èªè¨¼ãƒ­ã‚°"
@@ -1060,7 +1196,7 @@ msgid "Authorization code:"
msgstr "èªè¨¼ã‚³ãƒ¼ãƒ‰:"
msgid "Authorization key"
-msgstr ""
+msgstr "èªè¨¼ã‚­ãƒ¼"
msgid "Authorization was granted by entering your username and password in the application."
msgstr "ã“ã®ã‚¢ãƒ—リケーションã«ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードãŒå…¥åŠ›ã•ã‚ŒãŸã®ã§ã€æ‰¿èªãŒè¨±å¯ã•ã‚Œã¾ã—ãŸã€‚"
@@ -1327,10 +1463,10 @@ msgid "Bitbucket import"
msgstr "Bitbucket インãƒãƒ¼ãƒˆ"
msgid "Block"
-msgstr ""
+msgstr "ブロック"
msgid "Blocked"
-msgstr ""
+msgstr "ブロック中"
msgid "Blog"
msgstr "ブログ"
@@ -1495,10 +1631,10 @@ msgid "Browse files"
msgstr "ファイルを表示"
msgid "Built-in"
-msgstr ""
+msgstr "ビルトイン"
msgid "Business"
-msgstr ""
+msgstr "ビジãƒã‚¹"
msgid "Business metrics (Custom)"
msgstr "ビジãƒã‚¹ãƒ¡ãƒˆãƒªã‚¯ã‚¹ï¼ˆã‚«ã‚¹ã‚¿ãƒ ï¼‰"
@@ -1510,19 +1646,19 @@ msgid "ByAuthor|by"
msgstr "作者"
msgid "CHANGELOG"
-msgstr ""
+msgstr "変更履歴"
msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Charts"
-msgstr ""
+msgstr "CI / CD ãƒãƒ£ãƒ¼ãƒˆ"
msgid "CI / CD Settings"
msgstr "CI / CD 設定"
msgid "CI Lint"
-msgstr ""
+msgstr "CI Lint"
msgid "CI will run using the credentials assigned above."
msgstr "CI ã¯ä¸Šè¨˜ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸè³‡æ ¼æƒ…報を元ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
@@ -1552,7 +1688,7 @@ msgid "CICD|Continuous deployment to production"
msgstr "本番環境ã¸ã®ç¶™ç¶šçš„デプロイ"
msgid "CICD|Continuous deployment to production using timed incremental rollout"
-msgstr ""
+msgstr "タイム・インクリメンタル・ロールアウトを用ã„ãŸæœ¬ç•ªç’°å¢ƒã¸ã®ç¶™ç¶šçš„デプロイ"
msgid "CICD|Default to Auto DevOps pipeline"
msgstr "デフォルト㮠Auto DevOps パイプライン"
@@ -1602,11 +1738,14 @@ msgstr "自動的ã«ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "管ç†ä¸‹ã® Kubernetes クラスターを変更ã§ãã¾ã›ã‚“"
-msgid "Certificate"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
msgstr ""
+msgid "Certificate"
+msgstr "証明書"
+
msgid "Certificate (PEM)"
-msgstr ""
+msgstr "証明書 (PEM)"
msgid "Certificate fingerprint"
msgstr "証明書ã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ プリント"
@@ -1615,7 +1754,7 @@ msgid "Change Weight"
msgstr "ウェイトを変更ã™ã‚‹"
msgid "Change permissions"
-msgstr ""
+msgstr "アクセス権é™ã‚’変更"
msgid "Change template"
msgstr "テンプレートを変更"
@@ -1638,6 +1777,9 @@ msgstr "リãƒãƒ¼ãƒˆ"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "コミット済ã®å¤‰æ›´ã‚’ revert ã™ã‚‹ãŸã‚ã«æ–°ã—ã„コミットを作æˆã—ã¾ã™"
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "<b>source</b>リビジョンãŒ<b>target</b>リビジョン内ã«å–ã‚Šè¾¼ã¾ã‚Œã¦ã„るよã†ãªå¤‰æ›´ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã¾ã™"
@@ -1650,11 +1792,14 @@ msgstr "ãƒãƒ£ãƒ¼ãƒˆ"
msgid "Chat"
msgstr "ãƒãƒ£ãƒƒãƒˆ"
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
+msgid "Check again"
msgstr ""
+msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
+msgstr "%{docs_link_start}ドキュメント%{docs_link_end}を確èª"
+
msgid "Check your .gitlab-ci.yml"
-msgstr ""
+msgstr ".gitlab-ci.yml を確èªã—ã¦ãã ã•ã„"
msgid "Checking %{text} availability…"
msgstr "%{text} ãŒåˆ©ç”¨å¯èƒ½ã‹ç¢ºèªã—ã¦ã„ã¾ã™â€¦"
@@ -1684,7 +1829,7 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "変更内容を確èªã—ãŸã‚Šãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’作æˆã™ã‚‹ãŸã‚ã«ã€Branch/tag (例: %{master}) ã‚’é¸æŠžã™ã‚‹ã‹ã€ã‚³ãƒŸãƒƒãƒˆID(例: %{sha})を入力ã—ã¦ãã ã•ã„。"
msgid "Choose a file"
-msgstr ""
+msgstr "ファイルをé¸æŠžã—ã¦ãã ã•ã„"
msgid "Choose a role permission"
msgstr ""
@@ -1693,7 +1838,7 @@ msgid "Choose a template..."
msgstr ""
msgid "Choose a type..."
-msgstr ""
+msgstr "タイプをé¸æŠžã—ã¦ãã ã•ã„..."
msgid "Choose any color."
msgstr "カラーをé¸æŠžã—ã¦ãã ã•ã„。"
@@ -1705,7 +1850,7 @@ msgid "Choose file..."
msgstr "ファイルをé¸æŠž..."
msgid "Choose the top-level group for your repository imports."
-msgstr ""
+msgstr "インãƒãƒ¼ãƒˆãƒªãƒã‚¸ãƒˆãƒªã®ãƒˆãƒƒãƒ—レベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
msgid "Choose what content you want to see on a group’s overview page"
msgstr ""
@@ -1716,9 +1861,6 @@ msgstr "åŒæœŸã•ã›ãŸã„セカンダリノードã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "CI/CD パイプラインを実行ã—ãŸã„リãƒã‚¸ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-msgid "Choose which repositories you want to import."
-msgstr "インãƒãƒ¼ãƒˆã—ãŸã„リãƒã‚¸ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "セカンダリノードã¨åŒæœŸã•ã›ãŸã„シャードをé¸æŠžã—ã¦ãã ã•ã„。"
@@ -1825,10 +1967,10 @@ msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "使用ã§ãã¾ã›ã‚“:%{reason}"
msgid "Clear"
-msgstr ""
+msgstr "クリア"
msgid "Clear input"
-msgstr ""
+msgstr "入力をクリア"
msgid "Clear search"
msgstr "検索をクリア"
@@ -1870,16 +2012,19 @@ msgid "Clients"
msgstr "クライアント"
msgid "Clone"
-msgstr ""
+msgstr "クローン"
msgid "Clone repository"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’クローン"
msgid "Clone with %{http_label}"
+msgstr "%{http_label} ã§ã‚¯ãƒ­ãƒ¼ãƒ³"
+
+msgid "Clone with KRB5"
msgstr ""
msgid "Clone with SSH"
-msgstr ""
+msgstr "SSH ã§ã‚¯ãƒ­ãƒ¼ãƒ³"
msgid "Close"
msgstr "クローズã™ã‚‹"
@@ -1893,9 +2038,6 @@ msgstr ""
msgid "Closed"
msgstr "クローズ"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "クローズã—ãŸèª²é¡Œ"
@@ -1936,17 +2078,17 @@ msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integrat
msgstr "ã“ã® Kubernetes クラスター統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
msgid "ClusterIntegration|After installing Ingress, you will need to point your wildcard DNS at the generated external IP address in order to view your app after it is deployed. %{ingressHelpLink}"
-msgstr ""
+msgstr "Ingress をインストールã—ãŸå¾Œã€ã‚¢ãƒ—リケーションをデプロイã—ãŸå¾Œã«è¡¨ç¤ºã™ã‚‹ãŸã‚ã«ã€ç”Ÿæˆã•ã‚ŒãŸå¤–部 IP アドレス ã«ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã§ DNS を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ %{ingressHelpLink}"
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "プロジェクトゾーンã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Google Cloud API ã¸æŽ¥ç¶šã‚’試ã¿ãŸéš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
+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 ""
@@ -1983,6 +2125,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2014,7 +2159,7 @@ msgid "ClusterIntegration|Did you know?"
msgstr "ã”存知ã§ã™ã‹ï¼Ÿ"
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
-msgstr ""
+msgstr "Kubernetes クラスターã¸ã® GitLab 接続を有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚"
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
@@ -2079,8 +2224,8 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "クラスターã®ç¨¼åƒçŠ¶æ³ã‚’表示ã™ã‚‹ã«ã¯ã€å¿…須事項をåŽé›†ã™ã‚‹ãŸã‚ã® Prometheus を設置ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -2094,9 +2239,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "インストール"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "Prometheus をインストール"
-
msgid "ClusterIntegration|Installed"
msgstr "インストール済ã¿"
@@ -2142,9 +2284,6 @@ msgstr "Kubernetes クラスター"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes クラスターã®è©³ç´°"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Kubernetes クラスターã®ç¨¼åƒçŠ¶æ…‹"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "Kubernetes クラスターを Google Kubernetes Engine 上ã«ä½œæˆã—ã¦ã„ã¾ã™..."
@@ -2215,7 +2354,7 @@ msgid "ClusterIntegration|Please make sure that your Google account meets the fo
msgstr "Google アカウントãŒæ¬¡ã®è¦ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
msgid "ClusterIntegration|Point a wildcard DNS to this generated IP address in order to access your application after it has been deployed."
-msgstr ""
+msgstr "デプロイ完了後ã«ã‚ãªãŸã®ã‚¢ãƒ—リケーションã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ç‚ºã«ã€ç”Ÿæˆã•ã‚ŒãŸ IP アドレスをワイルドカード DNS ã«æŒ‡å®šã—ã¾ã™ã€‚"
msgid "ClusterIntegration|Project cluster"
msgstr "プロジェクトクラスター"
@@ -2311,13 +2450,13 @@ msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review
msgstr ""
msgid "ClusterIntegration|The IP address 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 ""
+msgstr "ã“ã® I Pアドレスã¯å‰²ã‚Šå½“ã¦ãƒ—ロセス実施中ã§ã™ã€‚ã‚‚ã—処ç†æ™‚é–“ãŒé•·ã„å ´åˆã€ã‚ãªãŸã® Kubernetes クラスターã¾ãŸã¯ Google Kubernetes Engine ã®ã‚¯ã‚©ãƒ¼ã‚¿ã‚’確èªã—ã¦ãã ã•ã„。"
msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
msgstr "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ %{link_to_container_project} 㧠Kubernetes クラスターを作æˆã™ã‚‹ã®ã«ä»¥ä¸‹ã®æ¨©é™ãŒå¿…è¦ã§ã™"
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
-msgstr ""
+msgstr "ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨ã€ã‚ãªãŸã¯ã‚¢ãƒ—リケーションを RBAC クラスター上ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|Toggle Kubernetes cluster"
msgstr "Kubernetes クラスターを切り替ãˆ"
@@ -2341,13 +2480,13 @@ msgid "ClusterIntegration|Validating project billing status"
msgstr "プロジェクトã®è«‹æ±‚ステータスを検証ã—ã¦ã„ã¾ã™"
msgid "ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again."
-msgstr ""
+msgstr "GCP 上ã®ãƒ—ロジェクトã®è¦æ±‚ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr "ã“ã®ãƒ—ロジェクト㫠Kubernetes クラスターを関連付ã‘ã‚‹ã“ã¨ã§ã€Review Apps ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’ç°¡å˜ã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|You must first install Helm Tiller before installing the applications below"
-msgstr ""
+msgstr "次ã®ã‚¢ãƒ—リケーションをインストールã™ã‚‹å‰ã«ã€Helm Tiller をインストールã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
msgstr ""
@@ -2380,17 +2519,29 @@ msgid "ClusterIntegration|sign up"
msgstr "æ–°è¦ç™»éŒ²"
msgid "Code"
+msgstr "コード"
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
msgstr ""
msgid "Code owners"
msgstr "コードオーナー"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr "折りãŸãŸã‚€"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "サイドãƒãƒ¼ã‚’éš ã™"
@@ -2423,13 +2574,13 @@ msgid_plural "Commits"
msgstr[0] "コミット"
msgid "Commit %{commit_id}"
-msgstr ""
+msgstr "コミット %{commit_id}"
msgid "Commit Message"
msgstr "コミットメッセージ"
msgid "Commit deleted"
-msgstr ""
+msgstr "コミットを削除ã—ã¾ã—ãŸ"
msgid "Commit duration in minutes for last 30 commits"
msgstr "ç›´è¿‘30コミットã®æ‰€è¦æ™‚é–“(分)"
@@ -2495,7 +2646,7 @@ msgid "Compare Revisions"
msgstr "リビジョンを比較"
msgid "Compare changes"
-msgstr ""
+msgstr "変更を比較"
msgid "Compare changes with the last commit"
msgstr "最後ã®ã‚³ãƒŸãƒƒãƒˆã¨å¤‰æ›´ã‚’比較"
@@ -2546,10 +2697,10 @@ msgid "Configure push mirrors."
msgstr "プッシュミラーを構æˆã—ã¾ã™ã€‚"
msgid "Configure storage path settings."
-msgstr ""
+msgstr "ストレージパス設定を構æˆã—ã¾ã™ã€‚"
msgid "Configure the %{link} integration."
-msgstr ""
+msgstr "%{link} ã®çµ±åˆã‚’設定ã—ã¾ã™ 。"
msgid "Configure the way a user creates a new account."
msgstr "ユーザーãŒæ–°ã—ã„アカウントを作æˆã™ã‚‹æ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
@@ -2642,7 +2793,7 @@ msgid "Contribution Charts"
msgstr ""
msgid "Contributions for <strong>%{calendar_date}</strong>"
-msgstr ""
+msgstr "<strong>%{calendar_date}</strong>ã®è²¢çŒ®"
msgid "Contributions per group member"
msgstr "グループメンãƒãƒ¼ã®è²¢çŒ®åº¦"
@@ -2663,7 +2814,7 @@ msgid "ContributorsPage|Please wait a moment, this page will automatically refre
msgstr "ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯æº–å‚™ãŒæ•´ã†ã¨è‡ªå‹•çš„ã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
msgid "Control the display of third party offers."
-msgstr ""
+msgstr "サードパーティã®ã‚ªãƒ•ã‚¡ãƒ¼ã®è¡¨ç¤ºã‚’管ç†ã—ã¾ã™ã€‚"
msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
msgstr "ã“ã®ã‚»ã‚«ãƒ³ãƒ€ãƒªãƒŽãƒ¼ãƒ‰ã® LFS / attachment ãƒãƒƒã‚¯ãƒ•ã‚£ãƒ«ã®æœ€å¤§ä¸¦è¡Œæ€§ã‚’制御ã™ã‚‹"
@@ -2681,7 +2832,7 @@ msgid "ConvDev Index"
msgstr "ConvDev インデックス"
msgid "Copy %{http_label} clone URL"
-msgstr ""
+msgstr "%{http_label} クローン URL をコピー"
msgid "Copy %{protocol} clone URL"
msgstr "%{protocol} クローン URL をコピー"
@@ -2689,11 +2840,14 @@ msgstr "%{protocol} クローン URL をコピー"
msgid "Copy ID to clipboard"
msgstr "クリップボード㫠ID をコピー"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "SSH 用クローン URL をコピー"
msgid "Copy SSH public key"
-msgstr ""
+msgstr "SSH 公開éµã‚’コピー"
msgid "Copy SSH public key to clipboard"
msgstr "SSH 公開éµã‚’クリップボードã«ã‚³ãƒ”ー"
@@ -2741,7 +2895,7 @@ msgid "Create New Directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆ"
msgid "Create New Domain"
-msgstr ""
+msgstr "æ–°ã—ã„ドメインを作æˆ"
msgid "Create a new branch"
msgstr "æ–°ã—ã„ブランãƒã‚’作æˆ"
@@ -2753,7 +2907,7 @@ msgid "Create a new issue"
msgstr "課題ã®æ–°è¦ä½œæˆ"
msgid "Create a new repository"
-msgstr ""
+msgstr "æ–°ã—ã„リãƒã‚¸ãƒˆãƒªã‚’作æˆ"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "%{protocol} ã§ãƒ—ッシュやプルã™ã‚‹ãŸã‚ã®ã‚ãªãŸå€‹äººç”¨ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’作æˆ"
@@ -2795,7 +2949,7 @@ msgid "Create merge request and branch"
msgstr "マージリクエストã¨ãƒ–ランãƒã‚’作æˆ"
msgid "Create milestone"
-msgstr ""
+msgstr "マイルストーンを作æˆ"
msgid "Create new branch"
msgstr "æ–°ã—ã„ブランãƒã‚’作æˆ"
@@ -2831,7 +2985,7 @@ msgid "Created"
msgstr "作æˆæ¸ˆã¿"
msgid "Created At"
-msgstr ""
+msgstr "作æˆæ—¥"
msgid "Created by me"
msgstr "自分ãŒä½œæˆ"
@@ -2867,7 +3021,7 @@ msgid "Custom CI config path"
msgstr "カスタム CI config パス"
msgid "Custom hostname (for private commit emails)"
-msgstr ""
+msgstr "カスタムホストå (プライベートコミット用メールアドレス)"
msgid "Custom notification events"
msgstr "カスタム通知設定"
@@ -2927,7 +3081,7 @@ msgid "CycleAnalyticsStage|Test"
msgstr "テスト"
msgid "DNS"
-msgstr ""
+msgstr "DNS"
msgid "Dashboard"
msgstr "ダッシュボード"
@@ -2942,7 +3096,7 @@ msgid "Data is still calculating..."
msgstr ""
msgid "Date picker"
-msgstr ""
+msgstr "日付é¸æŠž"
msgid "Debug"
msgstr "デãƒãƒƒã‚°"
@@ -2987,10 +3141,10 @@ msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwis
msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
-msgstr ""
+msgstr "%{job_name} ã‚’ã™ãã«å®Ÿè¡Œã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚¿ã‚¤ãƒžãƒ¼çµ‚了後自動的ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
msgid "DelayedJobs|Start now"
-msgstr ""
+msgstr "今ã™ã始ã‚ã‚‹"
msgid "DelayedJobs|Unschedule"
msgstr ""
@@ -3002,7 +3156,7 @@ msgid "Delete"
msgstr "削除"
msgid "Delete Package"
-msgstr ""
+msgstr "パッケージを削除"
msgid "Delete Snippet"
msgstr "スニペットを削除"
@@ -3014,10 +3168,10 @@ msgid "Delete list"
msgstr "リストを削除ã™ã‚‹"
msgid "Delete source branch"
-msgstr ""
+msgstr "ソースブランãƒã‚’削除"
msgid "Delete this attachment"
-msgstr ""
+msgstr "ã“ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除"
msgid "Deleted"
msgstr "削除完了"
@@ -3156,10 +3310,10 @@ msgid "Deployed"
msgstr ""
msgid "Deployed to"
-msgstr ""
+msgstr "デプロイ先"
msgid "Deploying to"
-msgstr ""
+msgstr "デプロイ先"
msgid "Deprioritize label"
msgstr "éžå„ªå…ˆãƒ©ãƒ™ãƒ«"
@@ -3176,6 +3330,9 @@ msgstr "Description テンプレートを使用ã™ã‚‹ã¨ã€ãƒ—ロジェクトã®
msgid "Description:"
msgstr "説明:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "破棄"
@@ -3183,10 +3340,10 @@ msgid "Details"
msgstr "詳細"
msgid "Details (default)"
-msgstr ""
+msgstr "詳細 (デフォルト)"
msgid "Detect host keys"
-msgstr ""
+msgstr "ホストキーã®æ¤œå‡º"
msgid "Diff content limits"
msgstr ""
@@ -3219,16 +3376,16 @@ msgid "Disable shared Runners"
msgstr ""
msgid "Disabled"
-msgstr ""
+msgstr "無効"
msgid "Discard"
msgstr "破棄"
msgid "Discard all changes"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®å¤‰æ›´ã‚’破棄"
msgid "Discard all unstaged changes?"
-msgstr ""
+msgstr "ステージã•ã‚Œã¦ã„ãªã„ã™ã¹ã¦ã®å¤‰æ›´ã‚’破棄ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Discard changes"
msgstr "変更を破棄ã™ã‚‹"
@@ -3240,7 +3397,7 @@ msgid "Discard draft"
msgstr "下書ãを破棄"
msgid "Discard review"
-msgstr ""
+msgstr "レビューを破棄"
msgid "Discover GitLab Geo"
msgstr ""
@@ -3254,6 +3411,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "解除"
@@ -3264,7 +3424,7 @@ msgid "Dismiss Cycle Analytics introduction box"
msgstr "サイクル分æžã®ç´¹ä»‹ã‚’é–‰ã˜ã‚‹"
msgid "Dismiss Merge Request promotion"
-msgstr ""
+msgstr "マージリクエストã®æ˜‡æ ¼ã‚’å´ä¸‹ã—ã¾ã™"
msgid "Dismiss trial promotion"
msgstr ""
@@ -3291,7 +3451,7 @@ msgid "Download artifacts"
msgstr ""
msgid "Download asset"
-msgstr ""
+msgstr "アセットをダウンロード"
msgid "Download tar"
msgstr "tarå½¢å¼ã§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
@@ -3318,7 +3478,7 @@ msgid "DownloadSource|Download"
msgstr "ダウンロード"
msgid "Downstream"
-msgstr ""
+msgstr "ダウンストリーム"
msgid "Downvotes"
msgstr "イマイãƒ"
@@ -3336,13 +3496,13 @@ msgid "Edit"
msgstr "編集"
msgid "Edit %{name}"
-msgstr ""
+msgstr "%{name} を編集"
msgid "Edit Label"
msgstr "ラベルã®ç·¨é›†"
msgid "Edit Milestone"
-msgstr ""
+msgstr "マイルストーンを編集"
msgid "Edit Pipeline Schedule %{id}"
msgstr "パイプラインスケジュール %{id} を編集"
@@ -3354,10 +3514,10 @@ msgid "Edit application"
msgstr "アプリケーションã®ç·¨é›†"
msgid "Edit comment"
-msgstr ""
+msgstr "コメントを編集"
msgid "Edit environment"
-msgstr ""
+msgstr "環境を編集"
msgid "Edit files in the editor and commit changes here"
msgstr "エディターã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集ã—ã€ã“ã“ã§å¤‰æ›´ã‚’コミットã—ã¾ã™"
@@ -3369,7 +3529,7 @@ msgid "Edit identity for %{user_name}"
msgstr "%{user_name} ã® ID を編集ã™ã‚‹"
msgid "Edit issues"
-msgstr ""
+msgstr "課題を編集"
msgid "Elasticsearch"
msgstr "Elasticsearch"
@@ -3390,7 +3550,7 @@ msgid "Embed"
msgstr "埋ã‚è¾¼ã¿"
msgid "Empty file"
-msgstr ""
+msgstr "空ã®ãƒ•ã‚¡ã‚¤ãƒ«"
msgid "Enable"
msgstr "有効化ã™ã‚‹"
@@ -3417,7 +3577,7 @@ msgid "Enable classification control using an external service"
msgstr "外部サービスを使用ã—ã¦ã€åˆ†é¡žåˆ¶å¾¡ã‚’有効ã«ã™ã‚‹ã€‚"
msgid "Enable error tracking"
-msgstr ""
+msgstr "エラートラッキングを有効ã«ã™ã‚‹"
msgid "Enable for this project"
msgstr "ã“ã®ãƒ—ロジェクトã§ã¯æœ‰åŠ¹ã«ã™ã‚‹"
@@ -3425,6 +3585,9 @@ msgstr "ã“ã®ãƒ—ロジェクトã§ã¯æœ‰åŠ¹ã«ã™ã‚‹"
msgid "Enable group Runners"
msgstr "グループ Runner を有効ã«ã™ã‚‹"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3450,7 +3613,7 @@ msgid "Enable usage ping"
msgstr "利用状æ³ã®é€ä¿¡ã‚’有効ã«ã™ã‚‹"
msgid "Enable usage ping to get an overview of how you are using GitLab from a feature perspective."
-msgstr ""
+msgstr "Ping ã®ä½¿ç”¨ã‚’有効ã«ã™ã‚‹ã¨ã€æ©Ÿèƒ½ãƒ‘ースペクティブã‹ã‚‰ GitLab ã‚’ã©ã®ã‚ˆã†ã«ä½¿ç”¨ã—ã¦ã„ã‚‹ã‹ã‚’知るã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "Enabled"
msgstr "有効"
@@ -3461,6 +3624,9 @@ msgstr "終了時刻 (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3471,19 +3637,16 @@ msgid "Enter the issue description"
msgstr "課題ã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„"
msgid "Enter the issue title"
-msgstr ""
+msgstr "課題ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’入力ã—ã¦ãã ã•ã„"
msgid "Enter the merge request description"
-msgstr ""
+msgstr "マージリクエストã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„"
msgid "Enter the merge request title"
-msgstr ""
-
-msgid "Enter your Sentry API URL"
-msgstr ""
+msgstr "マージリクエストã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’入力ã—ã¦ãã ã•ã„"
msgid "Environment variables"
-msgstr ""
+msgstr "環境変数"
msgid "Environment variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use environment variables for passwords, secret keys, or whatever you want."
msgstr ""
@@ -3492,7 +3655,7 @@ msgid "Environment variables are configured by your administrator to be %{link_s
msgstr ""
msgid "Environment:"
-msgstr ""
+msgstr "環境:"
msgid "Environments"
msgstr "環境"
@@ -3506,17 +3669,23 @@ msgstr "環境をå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Environments|An error occurred while making the request."
msgstr "リクエスト作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "Environments|An error occurred while stopping the environment, please try again"
+msgid "Environments|An error occurred while re-deploying the environment, please try again"
msgstr ""
-msgid "Environments|Are you sure you want to stop this environment?"
+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|Commit"
msgstr "コミット"
msgid "Environments|Deploy to..."
-msgstr ""
+msgstr "デプロイã—ã¾ã™"
msgid "Environments|Deployment"
msgstr "デプロイ"
@@ -3534,7 +3703,7 @@ msgid "Environments|Job"
msgstr "ジョブ"
msgid "Environments|Learn more about stopping environments"
-msgstr ""
+msgstr "環境ã®åœæ­¢ã«ã¤ã„ã¦"
msgid "Environments|New environment"
msgstr "æ–°ã—ã„環境"
@@ -3552,18 +3721,36 @@ msgid "Environments|Note that this action will stop the environment, but it will
msgstr ""
msgid "Environments|Open live environment"
-msgstr ""
+msgstr "ライブ環境を開ã"
msgid "Environments|Pod logs from"
msgstr " 㮠pod ログ"
-msgid "Environments|Re-deploy to environment"
+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|Read more about environments"
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|Show all"
@@ -3576,6 +3763,18 @@ msgid "Environments|Stop environment"
msgstr "環境ã®åœæ­¢"
msgid "Environments|Stopping"
+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 %{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|This action will run the job defined by staging 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|Updated"
@@ -3600,10 +3799,10 @@ msgid "Epics let you manage your portfolio of projects more efficiently and with
msgstr "エピックを使用ã™ã‚‹ã¨ã€ãƒ—ロジェクトã®ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒªã‚ªã‚’より効率的ã‹ã¤å°‘ãªã„労力ã§ç®¡ç†ã§ãã¾ã™"
msgid "Epics|An error occurred while saving the %{epicDateType} date"
-msgstr ""
+msgstr "%{epicDateType} ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Epics|How can I solve this?"
-msgstr ""
+msgstr "ã©ã†ã™ã‚Œã°è§£æ±ºã§ãã¾ã™ã‹ï¼Ÿ"
msgid "Epics|More information"
msgstr "詳ã—ã„情報"
@@ -3615,7 +3814,7 @@ msgid "Epics|To schedule your epic's %{epicDateType} date based on milestones, a
msgstr ""
msgid "Epics|due"
-msgstr ""
+msgstr "期日"
msgid "Epics|start"
msgstr "開始"
@@ -3627,6 +3826,9 @@ msgid "Error Reporting and Logging"
msgstr "エラー報告ã¨ãƒ­ã‚°"
msgid "Error Tracking"
+msgstr "エラートラッキング"
+
+msgid "Error creating a new path"
msgstr ""
msgid "Error creating epic"
@@ -3693,14 +3895,41 @@ msgid "Error updating todo status."
msgstr "TODO ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error while loading the merge request. Please try again."
-msgstr ""
+msgstr "マージリクエストã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Error:"
+msgstr "エラー:"
+
+msgid "ErrorTracking|Active"
msgstr ""
-msgid "Errors"
+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|Find your hostname in your Sentry account settings page"
+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 "Estimated"
msgstr "見ç©"
@@ -3723,7 +3952,7 @@ msgid "EventFilterBy|Filter by team"
msgstr "ãƒãƒ¼ãƒ ã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼"
msgid "Events"
-msgstr ""
+msgstr "イベント"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -3738,7 +3967,7 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "毎週 (日曜日ã®åˆå‰4:00)"
msgid "Everyone"
-msgstr ""
+msgstr "全員"
msgid "Everyone can contribute"
msgstr ""
@@ -3759,16 +3988,16 @@ msgid "Everything you need to create a GitLab Pages site using plain HTML."
msgstr ""
msgid "Except policy:"
-msgstr ""
+msgstr "除外ãƒãƒªã‚·ãƒ¼:"
msgid "Existing Git repository"
-msgstr ""
+msgstr "既存㮠Git リãƒã‚¸ãƒˆãƒª"
msgid "Existing folder"
-msgstr ""
+msgstr "既存ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼"
msgid "Existing members and groups"
-msgstr ""
+msgstr "既存ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã‚°ãƒ«ãƒ¼ãƒ—"
msgid "Expand"
msgstr "展開"
@@ -3776,6 +4005,9 @@ msgstr "展開"
msgid "Expand all"
msgstr "ã™ã¹ã¦å±•é–‹"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "サイドãƒãƒ¼ã‚’é–‹ã"
@@ -3783,10 +4015,10 @@ msgid "Expiration date"
msgstr "有効期é™"
msgid "Expired %{expiredOn}"
-msgstr ""
+msgstr "%{expiredOn} ã«æœŸé™åˆ‡ã‚Œ"
msgid "Expires in %{expires_at}"
-msgstr ""
+msgstr "%{expires_at} ã§æœŸé™åˆ‡ã‚Œ"
msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
msgstr ""
@@ -3810,19 +4042,19 @@ msgid "Explore public groups"
msgstr "公開グループを検索"
msgid "Export as CSV"
-msgstr ""
+msgstr "CSV å½¢å¼ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
msgid "Export issues"
-msgstr ""
+msgstr "課題をエクスãƒãƒ¼ãƒˆ"
msgid "External Classification Policy Authorization"
msgstr "外部分類èªè¨¼ãƒãƒªã‚·ãƒ¼"
msgid "External URL"
-msgstr ""
+msgstr "外部 URL"
msgid "External Wiki"
-msgstr ""
+msgstr "外部 Wiki"
msgid "External authentication"
msgstr "外部èªè¨¼"
@@ -3863,14 +4095,14 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
msgstr "ボードã®èª²é¡Œã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Failed to remove mirror."
-msgstr ""
+msgstr "ミラーã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Failed to remove the pipeline schedule"
msgstr "パイプラインスケジュールを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -3897,7 +4129,7 @@ msgid "Faster as it re-uses the project workspace (falling back to clone if it d
msgstr ""
msgid "Feature Flags"
-msgstr ""
+msgstr "機能フラグ"
msgid "FeatureFlags|* (All Environments)"
msgstr ""
@@ -3909,7 +4141,7 @@ msgid "FeatureFlags|API URL"
msgstr "API URL"
msgid "FeatureFlags|Active"
-msgstr ""
+msgstr "アクティブ"
msgid "FeatureFlags|Configure"
msgstr ""
@@ -3929,9 +4161,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "説明"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "%{feature_flag_name} を編集"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "機能フラグを編集"
@@ -3989,9 +4218,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr "変更をä¿å­˜"
-
msgid "FeatureFlags|Status"
msgstr "ステータス"
@@ -4021,13 +4247,13 @@ msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®é …ç›®ã¯ç·¨é›†ã§ããªã„設定ã§ã™ã€‚次㮠Kuber
msgid "File"
msgid_plural "Files"
-msgstr[0] ""
+msgstr[0] "ファイル"
msgid "File added"
-msgstr ""
+msgstr "ファイルã®è¿½åŠ "
msgid "File browser"
-msgstr ""
+msgstr "ファイルブラウザー"
msgid "File deleted"
msgstr ""
@@ -4042,7 +4268,7 @@ msgid "File templates"
msgstr "ファイルテンプレート"
msgid "File upload error."
-msgstr ""
+msgstr "ファイルアップロードエラー"
msgid "Files"
msgstr "ファイル"
@@ -4077,9 +4303,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "パスã§æ¤œç´¢"
@@ -4090,19 +4313,19 @@ msgid "Find file"
msgstr "ファイルを検索"
msgid "Find the downloaded ZIP file and decompress it."
-msgstr ""
+msgstr "ダウンロードã—㟠ZIP ファイルを展開ã—ã¾ã™ã€‚"
msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
msgstr ""
msgid "Fingerprints"
-msgstr ""
+msgstr "フィンガープリント"
msgid "Finish editing this message first!"
msgstr ""
msgid "Finish review"
-msgstr ""
+msgstr "レビューを完了ã™ã‚‹"
msgid "Finished"
msgstr "完了"
@@ -4126,7 +4349,7 @@ msgid "Fixed start date"
msgstr ""
msgid "Fixed:"
-msgstr ""
+msgstr "修正:"
msgid "FogBugz Email"
msgstr "FogBugz メール"
@@ -4183,7 +4406,7 @@ msgid "Forking in progress"
msgstr "フォーク中ã§ã™"
msgid "Forks"
-msgstr ""
+msgstr "フォーク"
msgid "Format"
msgstr "フォーマット"
@@ -4194,8 +4417,8 @@ msgstr ".gitlab-ci.yml ã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ:"
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
-msgstr "%{provider_title}ã‹ã‚‰"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Bitbucket ã‹ã‚‰"
@@ -4224,9 +4447,15 @@ msgstr "マイルストーンã‹ã‚‰:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "Kubernetes クラスターã®è©³ç´°ç”»é¢ã‚’介ã—ã¦ã€ã‚¢ãƒ—リケーションリストã‹ã‚‰ Runner をインストールã—ã¾ã™ã€‚"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG キー"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "一般"
@@ -4237,7 +4466,7 @@ msgid "Generate a default set of labels"
msgstr "åˆæœŸè¨­å®šãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’生æˆã™ã‚‹"
msgid "Generate key"
-msgstr ""
+msgstr "éµã‚’生æˆ"
msgid "Geo"
msgstr "Geo"
@@ -4414,13 +4643,13 @@ msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection.
msgstr "安全ã§ãªã„ HTTP 接続を使用ã—㦠Geo ノードを設定ã—ã¾ã—ãŸã€‚HTTPS 通信ã®ä½¿ç”¨ã‚’推奨ã—ã¾ã™ã€‚"
msgid "Geo|%{name} is scheduled for forced re-download"
-msgstr ""
+msgstr "%{name} ã¯å¼·åˆ¶çš„ã«å†ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹äºˆå®šã§ã™"
msgid "Geo|%{name} is scheduled for re-check"
-msgstr ""
+msgstr "%{name} ã¯å†ãƒã‚§ãƒƒã‚¯ãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
msgid "Geo|%{name} is scheduled for re-sync"
-msgstr ""
+msgstr "%{name} ã¯å†åŒæœŸãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
msgid "Geo|All"
msgstr "ã™ã¹ã¦"
@@ -4429,16 +4658,16 @@ msgid "Geo|All projects"
msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクト"
msgid "Geo|All projects are being scheduled for re-check"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®å†ãƒã‚§ãƒƒã‚¯ãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
msgid "Geo|All projects are being scheduled for re-sync"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®å†åŒæœŸãŒäºˆå®šã•ã‚Œã¦ã„ã¾ã™"
msgid "Geo|Batch operations"
msgstr "ãƒãƒƒãƒå‡¦ç†"
msgid "Geo|Could not remove tracking entry for an existing project."
-msgstr ""
+msgstr "既存ã®ãƒ—ロジェクトã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Geo|Failed"
msgstr "失敗"
@@ -4447,7 +4676,7 @@ msgid "Geo|File sync capacity"
msgstr "ファイルåŒæœŸå®¹é‡"
msgid "Geo|Geo Status"
-msgstr ""
+msgstr "ジオステータス"
msgid "Geo|Groups to synchronize"
msgstr "åŒæœŸã‚°ãƒ«ãƒ¼ãƒ—"
@@ -4459,13 +4688,13 @@ msgid "Geo|Last repository check run"
msgstr ""
msgid "Geo|Last successful sync"
-msgstr ""
+msgstr "最後ã«æˆåŠŸã—ãŸåŒæœŸ"
msgid "Geo|Last sync attempt"
-msgstr ""
+msgstr "最後ã®åŒæœŸè©¦è¡Œ"
msgid "Geo|Last time verified"
-msgstr ""
+msgstr "å‰å›žã®ç¢ºèªæ—¥æ™‚"
msgid "Geo|Never"
msgstr ""
@@ -4474,7 +4703,7 @@ msgid "Geo|Next sync scheduled at"
msgstr ""
msgid "Geo|Not synced yet"
-msgstr ""
+msgstr "ã¾ã åŒæœŸã—ã¦ã„ã¾ã›ã‚“。"
msgid "Geo|Pending"
msgstr ""
@@ -4498,25 +4727,25 @@ msgid "Geo|Re-verification interval"
msgstr ""
msgid "Geo|Recheck"
-msgstr ""
+msgstr "å†ãƒã‚§ãƒƒã‚¯"
msgid "Geo|Recheck all projects"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトをå†ãƒã‚§ãƒƒã‚¯"
msgid "Geo|Redownload"
-msgstr ""
+msgstr "å†ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
msgid "Geo|Remove"
-msgstr ""
+msgstr "削除"
msgid "Geo|Repository sync capacity"
msgstr "リãƒã‚¸ãƒˆãƒªåŒæœŸå®¹é‡"
msgid "Geo|Resync"
-msgstr ""
+msgstr "å†åŒæœŸ"
msgid "Geo|Resync all projects"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトをå†åŒæœŸ"
msgid "Geo|Retry count"
msgstr "リトライ回数"
@@ -4528,19 +4757,19 @@ msgid "Geo|Shards to synchronize"
msgstr "シャードã®åŒæœŸ"
msgid "Geo|Status"
-msgstr ""
+msgstr "状態"
msgid "Geo|Synced"
-msgstr ""
+msgstr "åŒæœŸæ¸ˆã¿"
msgid "Geo|Synchronization failed - %{error}"
-msgstr ""
+msgstr "åŒæœŸã«å¤±æ•—ã—ã¾ã—㟠- %{error}"
msgid "Geo|Tracking entry for project (%{project_id}) was successfully removed."
-msgstr ""
+msgstr "プロジェクト(%{project_id})ã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªãŒæ­£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Geo|Tracking entry will be removed. Are you sure?"
-msgstr ""
+msgstr "トラッキングエントリã¯å‰Šé™¤ã•ã‚Œã¾ã™ã€‚本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Geo|Unknown state"
msgstr ""
@@ -4561,19 +4790,19 @@ msgid "Geo|You are on a secondary, <b>read-only</b> Geo node. You may be able to
msgstr ""
msgid "Geo|You need a different license to use Geo replication"
-msgstr ""
+msgstr "ジオレプリケーションを使用ã™ã‚‹ã«ã¯åˆ¥ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã§ã™"
msgid "Geo|misconfigured"
msgstr ""
msgid "Geo|primary"
-msgstr ""
+msgstr "プライマリー"
msgid "Geo|secondary"
msgstr ""
msgid "Get a free instance review"
-msgstr ""
+msgstr "ç„¡æ–™ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãƒ¬ãƒ“ューã®å–å¾—"
msgid "Get started with error tracking"
msgstr ""
@@ -4612,7 +4841,7 @@ msgid "GitLab Group Runners can execute code for all the projects in this group.
msgstr "GitLab グループ Runner ã¯ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®å…¨ã¦ã®ãƒ—ロジェクトã®ã‚³ãƒ¼ãƒ‰ã‚’実行ã§ãã¾ã™ã€‚"
msgid "GitLab Import"
-msgstr ""
+msgstr "GitLab インãƒãƒ¼ãƒˆ"
msgid "GitLab Shared Runners execute code of different projects on the same Runner unless you configure GitLab Runner Autoscale with MaxBuilds 1 (which it is on GitLab.com)."
msgstr ""
@@ -4621,7 +4850,7 @@ msgid "GitLab User"
msgstr "GitLab ユーザー"
msgid "GitLab metadata URL"
-msgstr ""
+msgstr "GitLab メタデータ URL"
msgid "GitLab project export"
msgstr "GitLab プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
@@ -4659,20 +4888,29 @@ msgstr ""
msgid "Go Back"
msgstr "戻る"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "å‰ã«æˆ»ã‚‹"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Google コードã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Google Takeout"
-msgstr ""
+msgstr "Google テイクアウト"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google èªè¨¼ã¯ %{link_to_documentation} ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚µãƒ¼ãƒ“スã«ã¤ã„ã¦ã¯ GitLab 管ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
@@ -4702,7 +4940,7 @@ msgid "Group Runners"
msgstr "グループ Runner"
msgid "Group SAML must be enabled to test"
-msgstr ""
+msgstr "グループ SAML を有効ã«ã—ã¦ãƒ†ã‚¹ãƒˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
msgid "Group URL"
msgstr "グループ URL"
@@ -4714,7 +4952,7 @@ msgid "Group description"
msgstr "グループã®èª¬æ˜Ž"
msgid "Group description (optional)"
-msgstr ""
+msgstr "グループã®èª¬æ˜Ž(ä»»æ„)"
msgid "Group details"
msgstr "グループã®è©³ç´°"
@@ -4725,6 +4963,9 @@ msgstr "グループ情報:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "グループ Maintainer 㯠%{link} ã§ã‚°ãƒ«ãƒ¼ãƒ— Runner を登録ã§ãã¾ã™ã€‚"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "グループå"
@@ -4732,7 +4973,7 @@ msgid "Group overview content"
msgstr ""
msgid "Group:"
-msgstr ""
+msgstr "グループ:"
msgid "Group: %{group_name}"
msgstr "グループ:%{group_name}"
@@ -4816,7 +5057,7 @@ msgid "GroupsDropdown|Loading groups"
msgstr "グループã®èª­ã¿è¾¼ã¿ä¸­"
msgid "GroupsDropdown|Search your groups"
-msgstr ""
+msgstr "ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—を検索"
msgid "GroupsDropdown|Something went wrong on our end."
msgstr ""
@@ -4840,7 +5081,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc
msgstr "グループメンãƒãƒ¼ã®æ¨©é™ç®¡ç†ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—内ã®å„プロジェクトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’管ç†ã§ãã¾ã™ã€‚"
msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
-msgstr ""
+msgstr "\"%{fullName}\" グループã‹ã‚‰é›¢è„±ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "GroupsTree|Create a project in this group."
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ—ロジェクトを作æˆã™ã‚‹ã€‚"
@@ -4867,7 +5108,7 @@ msgid "GroupsTree|No groups or projects matched your search"
msgstr ""
msgid "GroupsTree|Search by name"
-msgstr ""
+msgstr "åå‰ã§æ¤œç´¢"
msgid "Have your users email"
msgstr "ユーザーã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡"
@@ -4906,20 +5147,20 @@ msgid "Here is the public SSH key that needs to be added to the remote server. F
msgstr ""
msgid "Hide file browser"
-msgstr ""
+msgstr "ファイルブラウザをéžè¡¨ç¤º"
msgid "Hide host keys manual input"
-msgstr ""
+msgstr "ホストキーã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«å…¥åŠ›ã‚’éš ã™"
msgid "Hide payload"
-msgstr ""
+msgstr "ペイロードを隠ã™"
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "éžè¡¨ç¤º"
msgid "Hide values"
-msgstr ""
+msgstr "éžè¡¨ç¤º"
msgid "History"
msgstr "履歴"
@@ -4943,10 +5184,10 @@ msgid "IDE|Allow live previews of JavaScript projects in the Web IDE using CodeS
msgstr ""
msgid "IDE|Back"
-msgstr ""
+msgstr "戻る"
msgid "IDE|Client side evaluation"
-msgstr ""
+msgstr "クライアントサイド評価"
msgid "IDE|Commit"
msgstr "コミット"
@@ -4955,28 +5196,28 @@ msgid "IDE|Edit"
msgstr "編集"
msgid "IDE|Get started with Live Preview"
-msgstr ""
+msgstr "ライブプレビューã®é–‹å§‹"
msgid "IDE|Go to project"
-msgstr ""
+msgstr "プロジェクトã«ç§»å‹•"
msgid "IDE|Live Preview"
-msgstr ""
+msgstr "ライブプレビュー"
msgid "IDE|Open in file view"
msgstr "ファイルビューã§é–‹ã"
msgid "IDE|Preview your web application using Web IDE client-side evaluation."
-msgstr ""
+msgstr "Web IDE クライアントサイド評価を使用ã—ã¦ã€ã‚ãªãŸã® Web アプリケーションをプレビューã—ã¾ã™ã€‚"
msgid "IDE|Refresh preview"
-msgstr ""
+msgstr "プレビューã®æ›´æ–°"
msgid "IDE|Review"
msgstr "レビュー"
msgid "IP Address"
-msgstr ""
+msgstr "IP アドレス"
msgid "Identifier"
msgstr "識別å­"
@@ -5000,7 +5241,7 @@ msgid "If enabled"
msgstr ""
msgid "If enabled, access to projects will be validated on an external service using their classification label."
-msgstr ""
+msgstr "有効ã«è¨­å®šã—ãŸå ´åˆã€å¤–部サービスã‹ã‚‰ãƒ—ロジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒåˆ†é¡žãƒ©ãƒ™ãƒ«ã‚’使用ã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚"
msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
msgstr "GitHub を使用ã—ã¦ã„ã‚‹å ´åˆã€GitHub 上ã®ã‚³ãƒŸãƒƒãƒˆã‚„プルリクエスã‹ã‚‰ãƒ‘イプラインã®çŠ¶æ…‹ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚%{more_info_link}"
@@ -5027,7 +5268,7 @@ msgid "Import"
msgstr "インãƒãƒ¼ãƒˆ"
msgid "Import CSV"
-msgstr ""
+msgstr "CSV ã®å–ã‚Šè¾¼ã¿"
msgid "Import Projects from Gitea"
msgstr "Gitea ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -5048,13 +5289,13 @@ msgid "Import in progress"
msgstr "インãƒãƒ¼ãƒˆä¸­ã§ã™"
msgid "Import issues"
-msgstr ""
+msgstr "課題ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Import members"
-msgstr ""
+msgstr "メンãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
msgid "Import members from another project"
-msgstr ""
+msgstr "ä»–ã®ãƒ—ロジェクトã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
msgid "Import multiple repositories by uploading a manifest file."
msgstr "manifest ファイルã®ã‚¢ãƒƒãƒ—ロードã«ã‚ˆã‚‹è¤‡æ•°ãƒªãƒã‚¸ãƒˆãƒªã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -5063,10 +5304,10 @@ msgid "Import project"
msgstr "プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Import project members"
-msgstr ""
+msgstr "プロジェクトメンãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
msgid "Import projects from Bitbucket"
-msgstr ""
+msgstr "Bitbucket ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Import projects from Bitbucket Server"
msgstr "Bitbucket Server ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -5092,9 +5333,24 @@ msgstr "リãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆ"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr "リãƒã‚¸ãƒˆãƒªã¸æŽ¥ç¶š"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "GitLab エンタープライズエディションを使用ã™ã‚‹ã¨ã€èª²é¡Œãƒœãƒ¼ãƒ‰ã®æ©Ÿèƒ½ãŒå¼·åŒ–ã•ã‚Œã¾ã™ã€‚"
@@ -5141,16 +5397,22 @@ msgid "Inline"
msgstr "インライン"
msgid "Input host keys manually"
-msgstr ""
+msgstr "ホストキーã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«å…¥åŠ›"
msgid "Input your repository URL"
+msgstr "リãƒã‚¸ãƒˆãƒªã® URL を入力ã—ã¦ãã ã•ã„"
+
+msgid "Insert a quote"
msgstr ""
-msgid "Insert suggestion"
+msgid "Insert code"
msgstr ""
+msgid "Insert suggestion"
+msgstr "候補を挿入ã™ã‚‹"
+
msgid "Install GitLab Runner"
-msgstr ""
+msgstr "GitLab Runner ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
msgid "Install Runner on Kubernetes"
msgstr "Kubernetes 㫠Runner をインストール"
@@ -5163,7 +5425,7 @@ msgid "Instance Statistics"
msgstr "インスタンス統計"
msgid "Instance Statistics visibility"
-msgstr ""
+msgstr "インスタンス統計ã®å¯è¦–性"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "インスタンスã¯ãƒžãƒ«ãƒ Kubernetes クラスターをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
@@ -5178,16 +5440,16 @@ msgid "Interested parties can even contribute by pushing commits if they want to
msgstr "貢献をã—ãŸã„関係者ã¯ã€ã‚³ãƒŸãƒƒãƒˆã‚’プッシュã™ã‚‹ã“ã¨ã§è²¢çŒ®ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
msgid "Internal"
-msgstr ""
+msgstr "内部"
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr "内部 - グループãŠã‚ˆã³å†…部プロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "Internal - The project can be accessed by any logged in user."
-msgstr ""
+msgstr "内部 - プロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚"
msgid "Internal users"
-msgstr ""
+msgstr "内部ユーザー"
msgid "Interval Pattern"
msgstr "é–“éš”ã®ãƒ‘ターン"
@@ -5198,22 +5460,28 @@ msgstr "サイクル分æžã®ã”紹介"
msgid "Introducing Your Conversational Development Index"
msgstr ""
-msgid "Invitation"
+msgid "Invalid input, please avoid emojis"
msgstr ""
+msgid "Invitation"
+msgstr "招待状"
+
msgid "Invite"
-msgstr ""
+msgstr "招待"
msgid "Invite group"
-msgstr ""
+msgstr "グループã«æ‹›å¾…ã™ã‚‹"
msgid "Invite member"
-msgstr ""
+msgstr "メンãƒãƒ¼ã‚’招待ã™ã‚‹"
msgid "Invoke Count"
-msgstr ""
+msgstr "呼ã³å‡ºã—回数"
msgid "Invoke Time"
+msgstr "呼ã³å‡ºã—時間"
+
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
msgstr ""
msgid "Issue"
@@ -5258,17 +5526,17 @@ msgstr "課題ã¨ã¯ãƒã‚°ã€ã‚¿ã‚¹ã‚¯ã€ã¾ãŸã¯è­°è«–ã®å¿…è¦ãªã‚¢ã‚¤ãƒ‡ã‚¢
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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|Issues Created"
-msgstr ""
+msgstr "課題ãŒä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "IssuesAnalytics|Issues created per month"
-msgstr ""
+msgstr "課題ã®ä½œæˆï¼æœˆ"
msgid "IssuesAnalytics|Last 12 months"
msgstr ""
@@ -5310,43 +5578,43 @@ msgid "Job is stuck. Check runners."
msgstr ""
msgid "Job was retried"
-msgstr ""
+msgstr "ジョブãŒå†è©¦è¡Œã•ã‚Œã¾ã—ãŸ"
msgid "Jobs"
msgstr "ジョブ"
msgid "Job|Browse"
-msgstr ""
+msgstr "ブラウズ"
msgid "Job|Complete Raw"
-msgstr ""
+msgstr "完全㪠Raw"
msgid "Job|Download"
-msgstr ""
+msgstr "ダウンロード"
msgid "Job|Erase job log"
-msgstr ""
+msgstr "ジョブログã®æ¶ˆåŽ»"
msgid "Job|Job artifacts"
msgstr ""
msgid "Job|Job has been erased"
-msgstr ""
+msgstr "ジョブãŒæ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ"
msgid "Job|Job has been erased by"
-msgstr ""
+msgstr "ジョブãŒæ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ:"
msgid "Job|Keep"
-msgstr ""
+msgstr "維æŒ"
msgid "Job|Scroll to bottom"
-msgstr ""
+msgstr "最下部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
msgid "Job|Scroll to top"
-msgstr ""
+msgstr "最上部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
msgid "Job|Show complete raw"
-msgstr ""
+msgstr "完全㪠Raw を表示ã™ã‚‹"
msgid "Job|The artifacts were removed"
msgstr ""
@@ -5370,7 +5638,7 @@ msgid "June"
msgstr "6月"
msgid "Key (PEM)"
-msgstr ""
+msgstr "キー (PEM)"
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -5379,7 +5647,7 @@ msgid "Kubernetes Cluster"
msgstr "Kubernetes クラスター"
msgid "Kubernetes Clusters"
-msgstr ""
+msgstr "Kubernetes クラスター"
msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
msgstr "Kubernetes クラスターã®ä½œæˆä¸­ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ:%{timeout}"
@@ -5412,7 +5680,7 @@ msgid "Label"
msgstr "ラベル"
msgid "Label actions dropdown"
-msgstr ""
+msgstr "ラベルアクションドロップダウン"
msgid "Label lists show all issues with the selected label."
msgstr "ラベル一覧ã«ã¯ã€é¸æŠžã—ãŸãƒ©ãƒ™ãƒ«ãŒä»˜ã„ãŸã™ã¹ã¦ã®èª²é¡ŒãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
@@ -5447,6 +5715,9 @@ msgstr "ラベルã®æ˜‡æ ¼"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5509,26 +5780,29 @@ msgid "Learn more about %{issue_boards_url}, to keep track of issues in multiple
msgstr ""
msgid "Learn more about Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps ã®è©³ç´°"
msgid "Learn more about Kubernetes"
msgstr "Kubernetes ã®è©³ç´°"
msgid "Learn more about Web Terminal"
-msgstr ""
+msgstr "Web Terminalã®è©³ç´°"
msgid "Learn more about custom project templates"
-msgstr ""
+msgstr "カスタムプロジェクトテンプレートã®è©³ç´°"
msgid "Learn more about group-level project templates"
-msgstr ""
+msgstr "グループレベルプロジェクトテンプレートã®è©³ç´°"
msgid "Learn more about incoming email addresses"
-msgstr ""
+msgstr "å—信メールアドレスã®è©³ç´°"
msgid "Learn more about protected branches"
msgstr "ä¿è­·ã•ã‚ŒãŸãƒ–ランãƒã«ã¤ã„ã¦ã®è©³ç´°"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "詳ã—ã見る:"
@@ -5551,28 +5825,28 @@ msgid "License"
msgstr "ライセンス"
msgid "LicenseManagement|Add a license"
-msgstr ""
+msgstr "ライセンスを追加"
msgid "LicenseManagement|Add licenses manually to approve or blacklist"
msgstr ""
msgid "LicenseManagement|Approve"
-msgstr ""
+msgstr "承èª"
msgid "LicenseManagement|Approve license"
-msgstr ""
+msgstr "ライセンスã®æ‰¿èª"
msgid "LicenseManagement|Approve license?"
-msgstr ""
+msgstr "ライセンスを承èªã—ã¾ã™ã‹ï¼Ÿ"
msgid "LicenseManagement|Approved"
-msgstr ""
+msgstr "承èªæ¸ˆã¿"
msgid "LicenseManagement|Blacklist"
-msgstr ""
+msgstr "ブラックリスト"
msgid "LicenseManagement|Blacklist license"
-msgstr ""
+msgstr "ブラックリストライセンス"
msgid "LicenseManagement|Blacklist license?"
msgstr ""
@@ -5581,19 +5855,19 @@ msgid "LicenseManagement|Blacklisted"
msgstr ""
msgid "LicenseManagement|Cancel"
-msgstr ""
+msgstr "キャンセル"
msgid "LicenseManagement|License"
msgstr "ライセンス"
msgid "LicenseManagement|License Management"
-msgstr ""
+msgstr "ライセンス管ç†"
msgid "LicenseManagement|License details"
-msgstr ""
+msgstr "ライセンスã®è©³ç´°"
msgid "LicenseManagement|License name"
-msgstr ""
+msgstr "ライセンスå"
msgid "LicenseManagement|Manage approved and blacklisted licenses for this project."
msgstr ""
@@ -5602,25 +5876,25 @@ msgid "LicenseManagement|Packages"
msgstr "パッケージ"
msgid "LicenseManagement|Remove license"
-msgstr ""
+msgstr "ライセンスを削除"
msgid "LicenseManagement|Remove license?"
-msgstr ""
+msgstr "ライセンスを削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "LicenseManagement|Submit"
-msgstr ""
+msgstr "é€ä¿¡"
msgid "LicenseManagement|There are currently no approved or blacklisted licenses in this project."
msgstr ""
msgid "LicenseManagement|This license already exists in this project."
-msgstr ""
+msgstr "ã“ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¯ã™ã§ã«ã“ã®ãƒ—ロジェクトã«å­˜åœ¨ã—ã¾ã™ã€‚"
msgid "LicenseManagement|URL"
msgstr "URL"
msgid "LicenseManagement|You are about to remove the license, %{name}, from this project."
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã‹ã‚‰ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ %{name} を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
msgid "Licenses"
msgstr "ライセンス"
@@ -5639,10 +5913,10 @@ msgid "List Your Gitea Repositories"
msgstr ""
msgid "List available repositories"
-msgstr ""
+msgstr "利用å¯èƒ½ãªãƒªãƒã‚¸ãƒˆãƒªã®ä¸€è¦§"
msgid "List view"
-msgstr ""
+msgstr "一覧表示"
msgid "List your Bitbucket Server repositories"
msgstr ""
@@ -5651,10 +5925,10 @@ msgid "List your GitHub repositories"
msgstr "GitHub リãƒã‚¸ãƒˆãƒªã‚’一覧表示"
msgid "Live preview"
-msgstr ""
+msgstr "ライブプレビュー"
msgid "Loading contribution stats for group members"
-msgstr ""
+msgstr "グループメンãƒãƒ¼ã®è²¢çŒ®åº¦æƒ…報を読ã¿è¾¼ã¿ä¸­"
msgid "Loading the GitLab IDE..."
msgstr "GitLab IDE ã®èª­ã¿è¾¼ã¿ä¸­..."
@@ -5663,7 +5937,7 @@ msgid "Loading..."
msgstr "読ã¿è¾¼ã¿ä¸­..."
msgid "Loading…"
-msgstr ""
+msgstr "読ã¿è¾¼ã¿ä¸­â€¦"
msgid "Localization"
msgstr ""
@@ -5678,7 +5952,7 @@ msgid "Lock not found"
msgstr "ロックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment."
-msgstr ""
+msgstr "%{issuableDisplayName} をロックã—ã¾ã™ã‹ï¼Ÿ<strong>プロジェクトメンãƒãƒ¼</strong> ã®ã¿ã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
msgid "Lock to current projects"
msgstr "ç¾åœ¨ã®ãƒ—ロジェクトをロックã™ã‚‹"
@@ -5693,14 +5967,23 @@ msgid "Locked to current projects"
msgstr "ç¾åœ¨ã®ãƒ—ロジェクトã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
msgid "Locks give the ability to lock specific file or folder."
-msgstr ""
+msgstr "ロックã¯ã€ç‰¹å®šã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„フォルダをロックã™ã‚‹æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚"
msgid "Login with smartcard"
-msgstr ""
+msgstr "スマートカードã§ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹"
msgid "Logs"
msgstr "ログ"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5735,22 +6018,25 @@ msgid "Manage project labels"
msgstr "プロジェクトラベルã®ç®¡ç†"
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "2è¦ç´ èªè¨¼ã®ç®¡ç†"
msgid "Manage your group’s membership while adding another level of security with SAML."
msgstr "グループã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—を管ç†ã—ãªãŒã‚‰ã€SAML ã§åˆ¥ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¬ãƒ™ãƒ«ã‚’追加ã—ã¾ã™ã€‚"
msgid "Manifest"
-msgstr ""
+msgstr "マニフェスト"
msgid "Manifest file import"
+msgstr "マニフェストファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+
+msgid "Manual job"
msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
-msgstr ""
+msgstr "FogBugz アカウントIDã‚’ GitLab ユーザーã«ãƒžãƒƒãƒ—ã™ã‚‹"
msgid "Map a Google Code user to a GitLab user"
-msgstr ""
+msgstr "Google コードユーザーを GitLab ユーザーã«ãƒžãƒƒãƒ—ã™ã‚‹"
msgid "Map a Google Code user to a full email address"
msgstr ""
@@ -5773,41 +6059,11 @@ msgstr ""
msgid "Markdown enabled"
msgstr "マークダウンを使用ã§ãã¾ã™"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
msgid "Max access level"
-msgstr ""
+msgstr "最大アクセスレベル"
msgid "Maximum job timeout"
msgstr ""
@@ -5855,6 +6111,9 @@ msgid "Merge immediately"
msgstr ""
msgid "Merge in progress"
+msgstr "進行中ã®ãƒžãƒ¼ã‚¸"
+
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
msgstr ""
msgid "Merge request"
@@ -5870,13 +6129,13 @@ msgid "Merge requests are a place to propose changes you've made to a project an
msgstr "マージリクエストã¨ã¯ã€ãƒ—ロジェクトã«åŠ ãˆãŸå¤‰æ›´ã‚’æ示ã—ã€ãã®å¤‰æ›´ã«ã¤ã„ã¦ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨è©±ã—åˆã†ãŸã‚ã®å ´æ‰€ã§ã™"
msgid "Merge when pipeline succeeds"
-msgstr ""
+msgstr "パイプラインãŒæˆåŠŸã—ãŸã¨ãã«ãƒžãƒ¼ã‚¸"
msgid "MergeRequests|Add a reply"
-msgstr ""
+msgstr "返信を追加"
msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
+msgstr "下書ãコメントã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "MergeRequests|Discussion stays resolved"
msgstr ""
@@ -5900,7 +6159,7 @@ msgid "MergeRequests|Resolve this discussion in a new issue"
msgstr "æ–°ã—ã„課題ã§ã“ã®æ¤œè¨Žã‚’解決ã™ã‚‹"
msgid "MergeRequests|Saving the comment failed"
-msgstr ""
+msgstr "コメントã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "MergeRequests|Toggle comments for this file"
msgstr ""
@@ -5933,13 +6192,13 @@ msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChang
msgstr ""
msgid "MergeRequest|Filter files"
-msgstr ""
+msgstr "ファイルã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°"
msgid "MergeRequest|No files found"
-msgstr ""
+msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "MergeRequest|Search files"
-msgstr ""
+msgstr "ファイル検索"
msgid "Merged"
msgstr "マージ済ã¿"
@@ -5957,7 +6216,7 @@ msgid "Metrics - Prometheus"
msgstr "メトリクス - Prometheus"
msgid "Metrics and profiling"
-msgstr ""
+msgstr "メトリクスã¨ãƒ—ロファイリング"
msgid "Metrics for environment"
msgstr ""
@@ -6007,14 +6266,11 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus クエリã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ"
-msgid "Metrics|System"
-msgstr "システム"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
msgid "Metrics|There was an error getting deployment information."
-msgstr ""
+msgstr "デプロイ情報ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Metrics|There was an error getting environments information."
msgstr ""
@@ -6053,7 +6309,7 @@ msgid "Milestone"
msgstr "マイルストーン"
msgid "Milestone lists not available with your current license"
-msgstr ""
+msgstr "ç¾åœ¨ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã¯ マイルストーンリストを利用ã§ãã¾ã›ã‚“"
msgid "Milestone lists show all issues from the selected milestone."
msgstr ""
@@ -6143,7 +6399,7 @@ msgid "More"
msgstr ""
msgid "More actions"
-msgstr ""
+msgstr "ãã®ä»–ã®æ“作"
msgid "More info"
msgstr ""
@@ -6154,6 +6410,9 @@ msgstr "詳ã—ã„情報"
msgid "More information is available|here"
msgstr "ã“ã“ã‚’å‚ç…§"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6194,7 +6453,7 @@ msgid "Nav|Sign out and sign in with a different account"
msgstr "別ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã™ã‚‹"
msgid "Need help?"
-msgstr ""
+msgstr "ãŠå›°ã‚Šã§ã™ã‹?"
msgid "Network"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
@@ -6209,7 +6468,7 @@ msgid "New Application"
msgstr "æ–°ã—ã„アプリケーション"
msgid "New Environment"
-msgstr ""
+msgstr "æ–°ã—ã„環境"
msgid "New Group"
msgstr "æ–°ã—ã„グループ"
@@ -6230,15 +6489,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "æ–°è¦ãƒ‘イプラインスケジュール"
msgid "New Snippet"
msgstr "æ–°è¦ã‚¹ãƒ‹ãƒšãƒƒãƒˆ"
-msgid "New Snippets"
-msgstr "æ–°è¦ã‚¹ãƒ‹ãƒšãƒƒãƒˆ"
-
msgid "New branch"
msgstr "æ–°è¦ãƒ–ランãƒ"
@@ -6299,9 +6558,15 @@ msgstr "æ–°è¦...\t"
msgid "No"
msgstr "ã„ã„ãˆ"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "ラベルãŒã‚ã‚Šã¾ã›ã‚“"
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6327,15 +6592,18 @@ msgid "No contributions were found"
msgstr ""
msgid "No credit card required."
+msgstr "クレジット カードã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "No designs found."
msgstr ""
msgid "No details available"
-msgstr ""
+msgstr "詳細ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No due date"
msgstr "期é™ãªã—"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6345,7 +6613,7 @@ msgid "No file chosen"
msgstr "ファイルãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "No file selected"
-msgstr ""
+msgstr "ファイルãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "No files found."
msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
@@ -6405,7 +6673,7 @@ msgid "No, directly import the existing email addresses and usernames."
msgstr ""
msgid "Nodes"
-msgstr ""
+msgstr "ノード"
msgid "None"
msgstr "ãªã—"
@@ -6429,6 +6697,9 @@ msgid "Not enough data"
msgstr "データä¸è¶³"
msgid "Not now"
+msgstr "後ã§"
+
+msgid "Not started"
msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
@@ -6450,7 +6721,7 @@ msgid "Note: Consider asking your GitLab administrator to configure %{github_int
msgstr "注: GitLab ã®ç®¡ç†è€…ã«%{github_integration_link} を設定ã—ã¦ã€GitHub 経由ã®ãƒ­ã‚°ã‚¤ãƒ³ãŒè¨±å¯ã—ã€å€‹äººç”¨ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’生æˆã›ãšã«ãƒªãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆã§ããªã„ã‹å•ã„åˆã‚ã›ãã ã•ã„。"
msgid "Notes|Are you sure you want to cancel creating this comment?"
-msgstr ""
+msgstr "本当ã«ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã®ä½œæˆã‚’キャンセルã—ã¾ã™ã‹ï¼Ÿ"
msgid "Notes|Collapse replies"
msgstr ""
@@ -6459,19 +6730,19 @@ msgid "Notes|Show all activity"
msgstr ""
msgid "Notes|Show comments only"
-msgstr ""
+msgstr "コメントã®ã¿è¡¨ç¤º"
msgid "Notes|Show history only"
-msgstr ""
+msgstr "履歴ã®ã¿è¡¨ç¤º"
msgid "Notification events"
msgstr "イベント通知"
msgid "Notification setting"
-msgstr ""
+msgstr "通知設定"
msgid "Notification setting - %{notification_title}"
-msgstr ""
+msgstr "通知設定 - %{notification_title}"
msgid "NotificationEvent|Close issue"
msgstr "課題をクローズ"
@@ -6568,7 +6839,7 @@ msgid "One or more of your Google Code projects cannot be imported into GitLab d
msgstr ""
msgid "Only admins"
-msgstr ""
+msgstr "管ç†è€…ã®ã¿"
msgid "Only mirror protected branches"
msgstr ""
@@ -6589,10 +6860,10 @@ msgid "Oops, are you sure?"
msgstr ""
msgid "Open"
-msgstr ""
+msgstr "é–‹ã"
msgid "Open Documentation"
-msgstr ""
+msgstr "ドキュメントを開ã"
msgid "Open comment type dropdown"
msgstr ""
@@ -6604,7 +6875,7 @@ msgid "Open in Xcode"
msgstr "Xcode ã§é–‹ã"
msgid "Open projects"
-msgstr ""
+msgstr "プロジェクトを開ã"
msgid "Open sidebar"
msgstr "サイドãƒãƒ¼ã‚’é–‹ã"
@@ -6633,6 +6904,9 @@ msgstr "é‹ç”¨"
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6642,6 +6916,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6676,10 +6953,10 @@ msgid "Owner"
msgstr "オーナー"
msgid "Package information"
-msgstr ""
+msgstr "パッケージ情報"
msgid "Package was removed"
-msgstr ""
+msgstr "パッケージãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "Packages"
msgstr "パッケージ"
@@ -6706,7 +6983,7 @@ msgid "Pagination|« First"
msgstr "« 最åˆ"
msgid "Parameter"
-msgstr ""
+msgstr "パラメーター"
msgid "Parent epic"
msgstr ""
@@ -6757,7 +7034,7 @@ msgid "Permissions"
msgstr "権é™"
msgid "Permissions, LFS, 2FA"
-msgstr ""
+msgstr "パーミッションã€LFSã€2FA"
msgid "Personal Access Token"
msgstr "個人ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³"
@@ -6784,7 +7061,7 @@ msgid "Pipeline quota"
msgstr "パイプラインã®ã‚¯ã‚©ãƒ¼ã‚¿"
msgid "Pipeline triggers"
-msgstr ""
+msgstr "パイプラインã®ãƒˆãƒªã‚¬ãƒ¼"
msgid "PipelineCharts|Failed:"
msgstr "失敗:"
@@ -6834,6 +7111,12 @@ msgstr "変数"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "カスタム"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "パイプライン"
@@ -6849,6 +7132,9 @@ msgstr "先週ã®ãƒ‘イプライン"
msgid "Pipelines for last year"
msgstr "昨年ã®ãƒ‘イプライン"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -6883,13 +7169,13 @@ 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 ""
+msgstr "パイプラインをフェッãƒã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ã„ãŸã ãã‹ã€ã‚µãƒãƒ¼ãƒˆãƒãƒ¼ãƒ ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "ã“ã®ãƒ—ロジェクトã¯ç¾åœ¨ãƒ‘イプラインを実行ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Pipeline|Commit"
-msgstr ""
+msgstr "コミット"
msgid "Pipeline|Create for"
msgstr "実行対象"
@@ -6898,13 +7184,13 @@ msgid "Pipeline|Create pipeline"
msgstr "パイプラインを作æˆ"
msgid "Pipeline|Duration"
-msgstr ""
+msgstr "期間"
msgid "Pipeline|Existing branch name or tag"
msgstr ""
msgid "Pipeline|Pipeline"
-msgstr ""
+msgstr "パイプライン"
msgid "Pipeline|Run Pipeline"
msgstr "パイプラインを実行"
@@ -6916,10 +7202,10 @@ msgid "Pipeline|Specify variable values to be used in this run. The values speci
msgstr "ã“ã®å®Ÿè¡Œã§ä½¿ç”¨ã•ã‚Œã‚‹å¤‰æ•°ã®å€¤ã‚’指定ã—ã¾ã™ã€‚ %{settings_link} ã§æŒ‡å®šã•ã‚ŒãŸå€¤ãŒãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
msgid "Pipeline|Stages"
-msgstr ""
+msgstr "ステージ"
msgid "Pipeline|Status"
-msgstr ""
+msgstr "ステータス"
msgid "Pipeline|Stop pipeline"
msgstr "パイプラインã®åœæ­¢"
@@ -6969,9 +7255,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -6981,9 +7279,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "çµæžœã‚’表示ã™ã‚‹ã«ã¯ã€å°‘ãªãã¨ã‚‚1ã¤ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "reCAPTCHA を解決ã—ã¦ãã ã•ã„"
@@ -7008,6 +7315,9 @@ msgstr "基本設定"
msgid "Preferences|Navigation theme"
msgstr "ナビゲーションテーマ"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7015,13 +7325,13 @@ msgid "Prevent adding new members to project membership within this group"
msgstr ""
msgid "Preview"
-msgstr ""
+msgstr "プレビュー"
msgid "Preview payload"
msgstr ""
msgid "Primary"
-msgstr ""
+msgstr "プライマリ"
msgid "Prioritize"
msgstr "優先順ä½ã‚’付ã‘ã‚‹"
@@ -7036,7 +7346,7 @@ msgid "Prioritized label"
msgstr "優先ラベル"
msgid "Private"
-msgstr ""
+msgstr "プライベート"
msgid "Private - Project access must be granted explicitly to each user."
msgstr "プライベート - å„ユーザーã«ãƒ—ロジェクトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’明示的ã«è¨±å¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -7051,7 +7361,7 @@ msgid "Profile"
msgstr "プロフィール"
msgid "Profile Settings"
-msgstr ""
+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 ""
@@ -7075,13 +7385,13 @@ msgid "Profiles|Add key"
msgstr "キーを追加"
msgid "Profiles|Add status emoji"
-msgstr ""
+msgstr "ステータス絵文字を追加"
msgid "Profiles|Avatar cropper"
msgstr ""
msgid "Profiles|Avatar will be removed. Are you sure?"
-msgstr ""
+msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Profiles|Change username"
msgstr "ユーザーåã®å¤‰æ›´"
@@ -7090,7 +7400,7 @@ msgid "Profiles|Changing your username can have unintended side effects."
msgstr ""
msgid "Profiles|Choose file..."
-msgstr ""
+msgstr "ファイルをé¸æŠž..."
msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
msgstr ""
@@ -7099,7 +7409,7 @@ msgid "Profiles|City, country"
msgstr ""
msgid "Profiles|Clear status"
-msgstr ""
+msgstr "ステータスをクリア"
msgid "Profiles|Click on icon to activate signin with one of the following services"
msgstr ""
@@ -7114,7 +7424,7 @@ msgid "Profiles|Current path: %{path}"
msgstr "ç¾åœ¨ã®ãƒ‘ス: %{path}"
msgid "Profiles|Current status"
-msgstr ""
+msgstr "ç¾åœ¨ã®çŠ¶æ…‹"
msgid "Profiles|Delete Account"
msgstr "アカウント削除"
@@ -7132,13 +7442,13 @@ msgid "Profiles|Disconnect"
msgstr ""
msgid "Profiles|Do not show on profile"
-msgstr ""
+msgstr "プロフィールã«è¡¨ç¤ºã—ãªã„"
msgid "Profiles|Don't display activity-related personal information on your profiles"
msgstr ""
msgid "Profiles|Edit Profile"
-msgstr ""
+msgstr "プロフィールを編集"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
@@ -7180,7 +7490,7 @@ msgid "Profiles|Remove avatar"
msgstr ""
msgid "Profiles|Set new profile picture"
-msgstr ""
+msgstr "æ–°ã—ã„プロフィール画åƒã‚’設定ã™ã‚‹"
msgid "Profiles|Social sign-in"
msgstr ""
@@ -7206,9 +7516,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7285,10 +7592,10 @@ msgid "Profiles|Your status"
msgstr ""
msgid "Profiles|e.g. My MacBook key"
-msgstr ""
+msgstr "例:MacBook ã®ã‚­ãƒ¼"
msgid "Profiles|username"
-msgstr ""
+msgstr "ユーザーå"
msgid "Profiles|website.com"
msgstr ""
@@ -7308,6 +7615,9 @@ msgstr "進行状æ³"
msgid "Project"
msgstr "プロジェクト"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "プロジェクト '%{project_name}' ã¯å‰Šé™¤ä¸­ã§ã™ã€‚"
@@ -7350,9 +7660,12 @@ msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒªãƒ³ã‚¯ã¯æœŸé™åˆ‡ã‚Œã«ãªã‚Š
msgid "Project export started. A download link will be sent by email."
msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’開始ã—ã¾ã—ãŸã€‚ダウンロードã®ãƒªãƒ³ã‚¯ã¯ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã—ã¾ã™"
-msgid "Project members"
+msgid "Project has too many %{label_for_message} to search"
msgstr ""
+msgid "Project members"
+msgstr "プロジェクトメンãƒãƒ¼"
+
msgid "Project name"
msgstr "プロジェクトå"
@@ -7360,7 +7673,7 @@ msgid "Project slug"
msgstr ""
msgid "Project:"
-msgstr ""
+msgstr "プロジェクト:"
msgid "ProjectActivityRSS|Subscribe"
msgstr "講読"
@@ -7449,6 +7762,9 @@ msgstr ""
msgid "Projects"
msgstr "プロジェクト"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7624,31 +7940,31 @@ msgid "ProtectedEnvironment|Environment"
msgstr ""
msgid "ProtectedEnvironment|Protect"
-msgstr ""
+msgstr "ä¿è­·"
msgid "ProtectedEnvironment|Protect Environments in order to restrict who can execute deployments."
msgstr ""
msgid "ProtectedEnvironment|Protect an environment"
-msgstr ""
+msgstr "環境をä¿è­·"
msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_count})"
-msgstr ""
+msgstr "ä¿è­·ã•ã‚ŒãŸç’°å¢ƒ (%{protected_environments_count})"
msgid "ProtectedEnvironment|Select an environment"
-msgstr ""
+msgstr "環境をé¸æŠž"
msgid "ProtectedEnvironment|There are currently no protected environments, protect an environment with the form above."
-msgstr ""
+msgstr "ç¾åœ¨ä¿è­·ã•ã‚ŒãŸç’°å¢ƒã¯ã‚ã‚Šã¾ã›ã‚“。上ã®ãƒ•ã‚©ãƒ¼ãƒ ã§ç’°å¢ƒã‚’ä¿è­·ã—ã¦ãã ã•ã„。"
msgid "ProtectedEnvironment|Unprotect"
-msgstr ""
+msgstr "ä¿è­·ã®è§£é™¤"
msgid "ProtectedEnvironment|Your environment can't be unprotected"
-msgstr ""
+msgstr "ã‚ãªãŸã®ç’°å¢ƒã®ä¿è­·ã‚’解除ã§ãã¾ã›ã‚“。"
msgid "ProtectedEnvironment|Your environment has been protected."
-msgstr ""
+msgstr "ã‚ãªãŸã®ç’°å¢ƒã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
@@ -7657,13 +7973,13 @@ msgid "Protip:"
msgstr ""
msgid "Provider"
-msgstr ""
+msgstr "プロãƒã‚¤ãƒ€ãƒ¼"
msgid "Pseudonymizer data collection"
msgstr ""
msgid "Public"
-msgstr ""
+msgstr "公開"
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "公開- グループãŠã‚ˆã³å…¬é–‹ãƒ—ロジェクトã¯èªè¨¼ç„¡ã—ã§é–²è¦§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"
@@ -7672,10 +7988,10 @@ msgid "Public - The project can be accessed without any authentication."
msgstr "公開 - プロジェクトã¯èªè¨¼ç„¡ã—ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™"
msgid "Public pipelines"
-msgstr ""
+msgstr "公開パイプライン"
msgid "Pull"
-msgstr ""
+msgstr "プル"
msgid "Push"
msgstr ""
@@ -7807,6 +8123,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除"
@@ -7942,6 +8264,17 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "GitLab ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«ã€ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒåˆ©ç”¨è¦ç´„ã«åŒæ„ã™ã‚‹ã“ã¨ã‚’è¦æ±‚ã—ã¾ã™ã€‚"
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
msgid "Resend invite"
msgstr ""
@@ -8085,7 +8418,7 @@ msgid "Runners can be placed on separate users, servers, even on your local mach
msgstr ""
msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
+msgstr "ç¾åœ¨ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã®Runner: %{active_runners_count}"
msgid "Runners page"
msgstr ""
@@ -8099,6 +8432,9 @@ msgstr ""
msgid "Running"
msgstr "稼åƒä¸­"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8129,6 +8465,9 @@ msgstr "SSH 公開éµ"
msgid "SSL Verification"
msgstr "SSL ã®æ¤œè¨¼"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "ä¿å­˜"
@@ -8162,6 +8501,9 @@ msgstr "スケジュール済"
msgid "Schedules"
msgstr "スケジュール"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "パイプラインスケジューリング"
@@ -8217,11 +8559,14 @@ msgid "Search project"
msgstr "プロジェクトを検索"
msgid "Search projects"
-msgstr ""
+msgstr "プロジェクトを検索"
msgid "Search users"
msgstr "ユーザーを検索"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8480,6 +8825,9 @@ msgstr "インスタンス全体レベルã®ãƒ†ãƒ³ãƒ—レートリãƒã‚¸ãƒˆãƒªã‚’
msgid "Set max session time for web terminal."
msgstr "ウェブターミナルã®æœ€å¤§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚¿ã‚¤ãƒ ã‚’設定ã™ã‚‹ã€‚"
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "迷惑行為レãƒãƒ¼ãƒˆã®é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã‚’設定ã™ã‚‹ã€‚"
@@ -8504,6 +8852,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8561,9 +8912,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr "シャーロックトランザクション"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "コマンドを表示"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "完全ãªç”Ÿãƒ­ã‚°ã‚’表示ã™ã‚‹"
@@ -8661,6 +9018,24 @@ msgstr ""
msgid "Snippets"
msgstr "スニペット"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8931,6 +9306,12 @@ 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 "Stars"
msgstr ""
@@ -9130,7 +9511,7 @@ msgid "Suggested change"
msgstr ""
msgid "Sunday"
-msgstr ""
+msgstr "日曜日"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
@@ -9141,6 +9522,9 @@ msgstr "ブランãƒãƒ»ã‚¿ã‚°åˆ‡ã‚Šæ›¿ãˆ"
msgid "Sync information"
msgstr "åŒæœŸæƒ…å ±"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "システムフック"
@@ -9160,10 +9544,10 @@ msgid "System metrics (Kubernetes)"
msgstr ""
msgid "Tag"
-msgstr ""
+msgstr "ã‚¿ã‚°"
msgid "Tag list:"
-msgstr ""
+msgstr "タグ一覧:"
msgid "Tags"
msgstr "ã‚¿ã‚°"
@@ -9330,6 +9714,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "許å¯ã•ã‚Œã‚‹æœ€å¤§ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¯ 200KB ã§ã™ã€‚"
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "秘密éµã®å¾©å·ã«å¿…è¦ã¨ãªã‚‹ãƒ‘スフレーズ。ã“ã‚Œã¯ã‚ªãƒ—ションã§ã€å€¤ã¯æš—å·åŒ–ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
@@ -9453,6 +9840,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr "ユーザーã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティカレンダーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "通知設定をä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -9498,6 +9888,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9508,7 +9913,7 @@ msgid "This date is before the start date, so this epic won't appear in the road
msgstr ""
msgid "This diff is collapsed."
-msgstr "ã“ã®å·®åˆ†ã¯å´©å£Šã—ã¦ã„ã¾ã™ã€‚"
+msgstr "ã“ã®å·®åˆ†ã¯æŠ˜ã‚ŠãŸãŸã¾ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "This diff was suppressed by a .gitattributes entry."
msgstr ""
@@ -9519,6 +9924,9 @@ msgstr "ディレクトリ"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—"
@@ -9603,6 +10011,12 @@ msgstr "空リãƒã‚¸ãƒˆãƒªã‚’作æˆã¾ãŸã¯æ—¢å­˜ãƒªãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼
msgid "This merge request is locked."
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "ã‚ãªãŸã¯ç¾åœ¨ã®ãƒ–ランãƒã«å¯¾ã—ã¦æ›¸ãè¾¼ã¿æ¨©é™ãŒãªã„ã®ã§ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åŠ¹ã§ã™"
@@ -10077,7 +10491,7 @@ msgid "Type"
msgstr "タイプ"
msgid "URL"
-msgstr ""
+msgstr "URL"
msgid "Unable to load the diff. %{button_try_again}"
msgstr "差分を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。%{button_try_again}"
@@ -10160,6 +10574,9 @@ msgstr ""
msgid "Update"
msgstr "アップデート"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10169,6 +10586,9 @@ msgstr "今ã™ãæ›´æ–°"
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "更新中"
@@ -10397,6 +10817,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10406,6 +10829,9 @@ msgstr "ファイルを表示 @ "
msgid "View group labels"
msgstr "グループラベルを表示"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "課題を表示"
@@ -10709,6 +11135,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "アクセスリクエストをå–り消ã™"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10814,6 +11243,9 @@ 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 "プロジェクト数ã®ä¸Šé™ã«é”ã—ã¦ã„ã¾ã™"
@@ -10874,6 +11306,9 @@ msgstr "SSH éµã‚’プロフィールã«è¿½åŠ ã—ãªã„é™ã‚Šã€SSH 経由ã§ãƒ—ã
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "有効ãªæ¯”較を行ã†ãŸã‚ã«ã¯ã€ç•°ãªã‚‹ãƒ–ランãƒåを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -10967,6 +11402,9 @@ msgstr "自分ã«å‰²ã‚Šå½“ã¦"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "ブランãƒå"
@@ -11046,6 +11484,9 @@ msgstr "コードã®å“質"
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11138,9 +11579,6 @@ msgstr "パーフォーマンスメトリクスã«å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "ciReport|Performance metrics"
msgstr "パフォーマンスメトリクス"
-msgid "ciReport|Revert dismissal"
-msgstr "無視ã®å–り消ã—"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11180,6 +11618,9 @@ msgstr "ä¾å­˜é–¢ä¿‚スキャンレãƒãƒ¼ãƒˆã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™º
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "無視ã®å–り消ã—中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "%{name} ã‚’ %{version} ã‹ã‚‰ %{fixed} ã¸ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„。"
@@ -11245,10 +11686,10 @@ msgid "epic"
msgstr ""
msgid "error"
-msgstr ""
+msgstr "エラー"
msgid "error code:"
-msgstr ""
+msgstr "エラー コード:"
msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
msgstr "%{slash_command} コマンドã§è¦‹ç©æ™‚é–“ã‚’æ›´æ–°ã§ãã¾ã™ã€‚"
@@ -11268,9 +11709,6 @@ msgstr "ヘルプ"
msgid "here"
msgstr "ã“ã“"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://your-bitbucket-server"
@@ -11387,6 +11825,9 @@ msgstr "承èªã‚’é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "mrWidget|Approve"
msgstr "承èª"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "承èªè€…"
@@ -11459,6 +11900,9 @@ msgstr "ローカルã§ãƒžãƒ¼ã‚¸"
msgid "mrWidget|Merge request approved"
msgstr "マージリクエストãŒæ‰¿èªã•ã‚Œã¾ã—ãŸ"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11518,6 +11962,9 @@ msgstr "リãƒãƒ¼ãƒˆ"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "æ–°ã—ã„マージリクエストã§ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リãƒãƒ¼ãƒˆã™ã‚‹"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "設定者"
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 369ca42cb2f..36474fb85d1 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 10:21\n"
+"PO-Revision-Date: 2019-03-06 15:16\n"
msgid " Status"
msgstr " ìƒíƒœ"
@@ -30,17 +30,21 @@ msgid_plural " improved on %d points"
msgstr[0] " %d í¬ì¸íŠ¸ í–¥ìƒ"
msgid " or "
-msgstr ""
+msgstr " ë˜ëŠ” "
msgid " or <#epic id>"
-msgstr ""
+msgstr " ë˜ëŠ” <#epic id>"
msgid " or <#issue id>"
-msgstr ""
+msgstr " ë˜ëŠ” <#issue id>"
msgid "\"%{query}\" in projects"
msgstr "프로ì íŠ¸ì—ì„œ \"%{query}\""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%dê°œì˜ ì»¤ë°‹"
@@ -50,7 +54,7 @@ msgid_plural "%d commits behind"
msgstr[0] "%d 커밋 behind"
msgid "%d commits"
-msgstr ""
+msgstr "%dê°œì˜ ì»¤ë°‹"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -70,7 +74,7 @@ msgstr[0] "%d ì´ìŠˆ"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
+msgstr[0] "%d ì´ìŠˆê°€ ì„ íƒë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "%d layer"
msgid_plural "%d layers"
@@ -111,12 +115,25 @@ msgstr "%{counter_storage} (%{counter_repositories} 저장소, %{counter_build_a
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
-msgid "%{count} more"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
+msgid "%{count} more"
+msgstr "%{count} ê°œ ë”보기"
+
msgid "%{count} more assignees"
msgstr "%{count}ëª…ì˜ ë‹´ë‹¹ìž"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} ëª…ì˜ ì°¸ì—¬ìž"
@@ -131,18 +148,18 @@ msgstr "%{filePath} ì‚­ì œë¨"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} ë”보기"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}그룹%{group_docs_link_end}ì„ ì‚¬ìš©í•˜ë©´ 여러 프로ì íŠ¸ë¥¼ 관리하고 ê³µë™ ìž‘ì—…ì„ ìˆ˜í–‰ í•  수 있습니다. 그룹 회ì›ì€ 모든 프로ì íŠ¸ì— 액세스 í•  수 있습니다."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType}ì´ ì‚­ì œë©ë‹ˆë‹¤! 확실합니까?"
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{link_start}Read more%{link_end} about role permissions"
+msgstr "%{link_start}ì—­í•  ê¶Œí•œì— ëŒ€í•´ ìžì„¸ížˆ 알아보기%{link_end}"
+
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} 시작ë¨"
@@ -162,22 +179,22 @@ msgid "%{percent}%% complete"
msgstr "%{percent}%% 완료"
msgid "%{state} epics"
-msgstr ""
+msgstr "%{state} ì—픽"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{branch_count}%{strong_end} 브랜치"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{commit_count}%{strong_end} 커밋"
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} 파ì¼"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{tag_count}%{strong_end} 태그"
msgid "%{text} %{files}"
msgid_plural "%{text} %{files} files"
@@ -196,10 +213,10 @@ msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what infor
msgstr "GitLab Inc와 공유ë˜ëŠ” ì •ë³´ì— ëŒ€í•´ %{usage_ping_link_start}ë” ì•Œì•„ë³´ê¸°%{usage_ping_link_end}"
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "%{user_name} 프로필 페ì´ì§€"
msgid "(external source)"
-msgstr ""
+msgstr "(외부 소스)"
msgid "+ %{count} more"
msgstr "+ %{count} ë”보기"
@@ -207,9 +224,12 @@ msgstr "+ %{count} ë”보기"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} ë”"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ", ë˜ëŠ” "
+
msgid "- Runner is active and can process any new jobs"
msgstr "- Runner ê°€ 활성화ë˜ì—ˆê³ , 새로운 ìž‘ì—…ì„ ì²˜ë¦¬í•  수 있습니다."
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] "%{count} ê°œ %{type} ì˜ ìˆ˜ì •ì‚¬í•­"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "%d ê°œì˜ ì´ìŠˆ closed"
@@ -267,13 +291,13 @@ msgid "1st contribution!"
msgstr "첫번째 기여!"
msgid "2FA"
-msgstr ""
+msgstr "2단계 ì¸ì¦(2FA)"
msgid "2FA enabled"
msgstr "2FA 사용"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "403|ê¶Œí•œì„ ì–»ìœ¼ë ¤ë©´ GitLab 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤."
msgid "403|You don't have the permission to access this page."
msgstr "ì´ íŽ˜ì´ì§€ì— 대한 액세스 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
@@ -315,11 +339,26 @@ msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong>
msgstr "<strong>%{pushes}</strong> íšŒì˜ í‘¸ì‹œ, <strong>%{commits}</strong> 회 ì´ìƒì˜ ì»¤ë°‹ì´ <strong>%{people}</strong> 기여ìžì— ì˜í•´ ì¼ì–´ 났습니다. "
msgid "<strong>Deletes</strong> source branch"
-msgstr ""
+msgstr "소스 브랜치 <strong>삭제</strong>"
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "'러너(Runner)'는 ìž‘ì—…ì„ ì‹¤í–‰í•˜ëŠ” 프로세스입니다. 필요한 ë§Œí¼ ëŸ¬ë„ˆë¥¼ ì…‹ì—…í•  수 있습니다."
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "지ì†ì ì¸ í†µí•©ì— ê´€í•œ 그래프 모ìŒ"
@@ -335,11 +374,14 @@ msgstr "GitLabì˜ ì‚¬ì´ë²„ í­ë ¥ ë°©ì§€íŒ€ì´ ìµœëŒ€í•œ 빨리 ê·€í•˜ì˜ ë¦¬í
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "í¬í¬ì™€ 새 머지 리퀘스트(MR)ê°€ 시작ë˜ë©´ 새로운 브랜치가 만들어질 것입니다."
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "프로ì íŠ¸ëŠ” 파ì¼ì„ 저장하고 (저장소), ìž‘ì—… 계íšì„ 세우며 (ì´ìŠˆ), 문서를 게시하는 ê³³ (위키) 입니다, %{among_other_things_link}."
msgid "A regular expression that will be used to find the test coverage output in the job trace. Leave blank to disable"
-msgstr ""
+msgstr "ìž‘ì—… 트레ì´ìŠ¤ì˜ 테스트 커버리지 결과를 알아 보기 위해 사용ë˜ëŠ” 정규표현ì‹ìž…니다. ë¬´íš¨ì¼ ê²½ìš° 공백입니다."
msgid "A user with write access to the source branch selected this option"
msgstr "소스 ë¸Œëžœì¹˜ì— ëŒ€í•œ 쓰기 ê¶Œí•œì´ ìžˆëŠ” 사용ìžê°€ ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -363,7 +405,7 @@ msgid "Abuse reports"
msgstr "악용 사례 보고서"
msgid "Accept invitation"
-msgstr ""
+msgstr "초대 수ë½"
msgid "Accept terms"
msgstr "약관ë™ì˜"
@@ -402,7 +444,7 @@ msgid "Add"
msgstr "추가"
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "ë³€ê²½ëœ ë¡œê·¸ 추가"
msgid "Add CONTRIBUTING"
msgstr ""
@@ -419,24 +461,51 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 추가"
msgid "Add README"
msgstr ""
-msgid "Add a general comment to this %{noteable_name}."
+msgid "Add a bullet list"
msgstr ""
+msgid "Add a general comment to this %{noteable_name}."
+msgstr "ì´ %{noteable_name} ì— ì¼ë°˜ì ì¸ 코멘트를 추가 합니다."
+
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "프로ì íŠ¸ì— 관한 ì •ë³´ê°€ 담긴 홈페ì´ì§€ë¥¼ wikiì— ì¶”ê°€í•˜ë©´ GitLabì´ ë©”ì‹œì§€ 대신 ì—¬ê¸°ì— í‘œì‹œ 합니다."
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "í…Œì´ë¸” 추가"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "모든 ì´ë©”ì¼ì— í‘œì‹œë  í…스트를 추가합니다. %{character_limit} ìž ì œí•œì´ ìžˆìŠµë‹ˆë‹¤."
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "댓글 추가"
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr "ì´ë¯¸ì§€ 댓글 추가"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "ë¼ì´ì„ ìŠ¤ 추가"
@@ -453,7 +522,7 @@ msgid "Add reaction"
msgstr "ë°˜ì‘ ì¶”ê°€"
msgid "Add to project"
-msgstr ""
+msgstr "프로ì íŠ¸ì— 추가"
msgid "Add to review"
msgstr "리뷰 추가"
@@ -465,7 +534,7 @@ msgid "Add user(s) to the group:"
msgstr "ê·¸ë£¹ì— ì‚¬ìš©ìž ì¶”ê°€:"
msgid "Add users or groups who are allowed to approve every merge request"
-msgstr ""
+msgstr "모든 머지요청(MR) ì„ ìŠ¹ì¸í•  수 있는 ì‚¬ìš©ìž ë˜ëŠ” 그룹 추가"
msgid "Add users to group"
msgstr "ê·¸ë£¹ì— ì‚¬ìš©ìž ì¶”ê°€"
@@ -516,40 +585,40 @@ msgid "AdminProjects|Delete project"
msgstr "프로ì íŠ¸ ì‚­ì œ"
msgid "AdminSettings|Auto DevOps domain"
-msgstr ""
+msgstr "Auto DevOps ë„ë©”ì¸"
msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
+msgstr "환경 변수는 기본ì ìœ¼ë¡œ 보호ë©ë‹ˆë‹¤."
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "모든 프로ì íŠ¸ì˜ ìžë™ 앱 리뷰 ë° ìžë™ ë°°í¬ ë‹¨ê³„ì—ì„œ 기본ì ìœ¼ë¡œ 사용할 ë„ë©”ì¸ì„ 지정하십시오."
msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr ""
+msgstr "새 환경 변수를 작성할 ë•Œ 기본ì ìœ¼ë¡œ 보호ë©ë‹ˆë‹¤."
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "2FA 사용 중지"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "2FA 사용"
msgid "AdminUsers|Active"
-msgstr ""
+msgstr "활성"
msgid "AdminUsers|Admin"
-msgstr ""
+msgstr "관리ìž"
msgid "AdminUsers|Admins"
-msgstr ""
+msgstr "관리ìžë“¤"
msgid "AdminUsers|Block user"
msgstr "ì‚¬ìš©ìž ì°¨ë‹¨"
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "차단ë¨"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr ""
+msgstr "LDAP ì°¨ë‹¨ëœ ì‚¬ìš©ìžì˜ ì°¨ë‹¨ì„ í•´ì œí•  수 없습니다."
msgid "AdminUsers|Delete User %{username} and contributions?"
msgstr " ì‚¬ìš©ìž %{username}와 기여를 삭제하시겠습니까?"
@@ -564,28 +633,28 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "사용ìžì™€ 기여 ì‚­ì œ"
msgid "AdminUsers|External"
-msgstr ""
+msgstr "외부"
msgid "AdminUsers|It's you!"
-msgstr ""
+msgstr "ì´ê²ƒì€ 나!"
msgid "AdminUsers|New user"
-msgstr ""
+msgstr "새로운 유저"
msgid "AdminUsers|No users found"
-msgstr ""
+msgstr "유저를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
msgid "AdminUsers|Search by name, email or username"
-msgstr ""
+msgstr "ì´ë¦„, ì´ë©”ì¼, ì‚¬ìš©ìž ì´ë¦„으로 검색"
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "유저 검색"
msgid "AdminUsers|Send email to users"
-msgstr ""
+msgstr "유저ì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°"
msgid "AdminUsers|Sort by"
-msgstr ""
+msgstr "정렬 기준"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr "확ì¸ì„ 위해 %{projectName} 를 입력해주세요."
@@ -594,10 +663,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "확ì¸ì„ 위해 %{username} ì„ ìž…ë ¥í•˜ì„¸ìš”"
msgid "AdminUsers|User will be blocked"
-msgstr ""
+msgstr "사용ìžê°€ 차단 ë©ë‹ˆë‹¤."
msgid "AdminUsers|Without projects"
-msgstr ""
+msgstr "프로ì íŠ¸ ì—†ì´"
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "고급 사용 권한, 대용량 íŒŒì¼ ì €ìž¥ì†Œì™€ ì´ì¤‘-ì¸ì¦ 설정"
@@ -605,16 +674,22 @@ msgstr "고급 사용 권한, 대용량 íŒŒì¼ ì €ìž¥ì†Œì™€ ì´ì¤‘-ì¸ì¦ 설정
msgid "Advanced settings"
msgstr "고급 설정"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "알림"
msgid "Alerts"
-msgstr ""
+msgstr "알림"
msgid "All"
msgstr "ì „ì²´"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "모든 ë³€ê²½ì‚¬í•­ì´ ì»¤ë°‹ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -622,13 +697,13 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr "모든 ê¸°ëŠ¥ì€ ë¹„ì–´ìžˆëŠ” 프로ì íŠ¸, 템플릿, 가져올 ë•Œ 사용할 수 있지만 ë‚˜ì¤‘ì— í”„ë¡œì íŠ¸ 설정ì—ì„œ 비활성화 í•  수 있습니다."
msgid "All issues for this milestone are closed. You may close this milestone now."
-msgstr ""
+msgstr "현재 마ì¼ìŠ¤í†¤ì— ê´€ë ¨ëœ ëª¨ë“  ì´ìŠˆë“¤ì´ 마ê°ë˜ì—ˆìŠµë‹ˆë‹¤. 현재 마ì¼ìŠ¤í†¤ì„ 마ê°í•  수 있습니다."
msgid "All users"
msgstr "모든 사용ìž"
msgid "Allow \"%{group_name}\" to sign you in"
-msgstr ""
+msgstr "\"%{group_name}\"ì„ ìž…ë ¥í•˜ë©´ ë¡œê·¸ì¸ í•  수 있습니다."
msgid "Allow commits from members who can merge to the target branch."
msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ì— ë¨¸ì§€í•  수 있는 ë©¤ë²„ì˜ ì»¤ë°‹ì„ í—ˆìš©í•©ë‹ˆë‹¤."
@@ -684,7 +759,7 @@ msgstr "비어 있는 GitLab User 필드는 FogBugzì˜ ì‚¬ìš©ìž ì „ì²´ ì´ë¦„ (
msgid "An error has occurred"
msgstr "ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -696,6 +771,15 @@ 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 previewing the blob"
msgstr "BLOB 미리보기 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -708,6 +792,9 @@ msgstr "ì´ìŠˆ ì¤‘ìš”ë„ ì—…ë°ì´íŠ¸ 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while adding approver"
msgstr "승ì¸ìžë¥¼ ì¶”ê°€í•˜ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "ëŒ“ê¸€ì„ ì‚­ì œí•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr "프로ì íŠ¸ë¥¼ 가져오는 ë™ì•ˆ 오류가 ë°œìƒ í–ˆìŠµë‹ˆë‹¤."
@@ -801,12 +891,18 @@ msgstr "LDAP 무시 ìƒíƒœë¥¼ 저장하는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다
msgid "An error occurred while saving assignees"
msgstr "담당ìžë¥¼ 저장하는 중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "ì•Œë¦¼ì„ êµ¬ë…하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while unsubscribing to notifications."
msgstr "알림 구ë…ì„ í•´ì œí•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "ëŒ“ê¸€ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -897,6 +993,40 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -939,9 +1069,15 @@ msgstr "공개키를 재ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ? 미러ë§ì´ 다시 ë™ìž‘하ê
msgid "Are you sure you want to remove %{group_name}?"
msgstr "ì •ë§ë¡œ %{group_name}(ì„)를 ì‚­ì œ 하시겠습니까?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1026,6 +1162,9 @@ msgstr "ë‹´ë‹¹ìž ëª©ë¡ì€ ì„ íƒëœ 사용ìžì—게 할당 ëœ ëª¨ë“  ì´ìŠˆê°
msgid "Assignee(s)"
msgstr "담당ìž"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1041,9 +1180,6 @@ msgstr "8ì›”"
msgid "August"
msgstr "8ì›”"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "ì¸ì¦ 로그"
@@ -1510,19 +1646,19 @@ msgid "ByAuthor|by"
msgstr "작성ìž"
msgid "CHANGELOG"
-msgstr ""
+msgstr "변경 로그"
msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Charts"
-msgstr ""
+msgstr "CI/CD 차트"
msgid "CI / CD Settings"
msgstr "CI/CD 설정"
msgid "CI Lint"
-msgstr ""
+msgstr "CI 린트"
msgid "CI will run using the credentials assigned above."
msgstr "ìœ„ì˜ ìžê²© ì¦ëª…ì„ ì‚¬ìš©í•˜ì—¬ CIê°€ 실행ë©ë‹ˆë‹¤."
@@ -1602,6 +1738,9 @@ msgstr "ìžë™ìœ¼ë¡œ 머지할 수 없습니다."
msgid "Cannot modify managed Kubernetes cluster"
msgstr "ì´ë¯¸ êµ¬ì„±ëœ Kubernetes í´ëŸ¬ìŠ¤í„°ëŠ” 수정할 수 없습니다"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1638,6 +1777,9 @@ msgstr "Revert"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "기존 변경 ì‚¬í•­ì„ ë˜ëŒë¦¬ê¸° 위해 새로운 ì»¤ë°‹ì„ ë§Œë“­ë‹ˆë‹¤."
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "변경 ì‚¬í•­ì€ <b>source</b> ë¦¬ë¹„ì „ì´ <b>target</b> ë¦¬ë¹„ì „ì— ë¨¸ì§€ëœ ê²ƒì²˜ëŸ¼ 표시ë©ë‹ˆë‹¤."
@@ -1650,6 +1792,9 @@ msgstr "차트"
msgid "Chat"
msgstr "채팅"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "%{docs_link_start} 여기부터 %{docs_link_end} 여기까지 확ì¸."
@@ -1716,9 +1861,6 @@ msgstr "ì´ ì„¸ì»¨ë”리 ë…¸ë“œì— ë™ê¸°í™” í•  ê·¸ë£¹ì„ ì„ íƒí•˜ì„¸ìš”."
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Ci/CD 파ì´í”„ë¼ì¸ì´ ì—°ê²°ë˜ê³  실행할 저장소를 ì„ íƒí•´ 주세요."
-msgid "Choose which repositories you want to import."
-msgstr "가져올 저장소를 ì„ íƒí•´ì£¼ì„¸ìš”."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "ì´ ì„¸ì»¨ë”리 ë…¸ë“œì— ì–´ë–¤ 샤드 (shards)를 ë™ê¸°í™” 할지 ì„ íƒí•˜ì„¸ìš”."
@@ -1878,6 +2020,9 @@ msgstr "저장소 í´ë¡ "
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1893,9 +2038,6 @@ msgstr ""
msgid "Closed"
msgstr "닫힘"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "닫힌 ì´ìŠˆ"
@@ -1941,12 +2083,12 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "프로ì íŠ¸ ì˜ì—­ì„ 가져 오는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤: %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Google Cloud APIì— ì—°ê²°ì„ ì‹œë„하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„하십시오."
+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 ""
@@ -1983,6 +2125,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2079,7 +2224,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2094,9 +2239,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "설치"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr "설치ë¨"
@@ -2142,9 +2284,6 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„¸"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒíƒœ"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ê°€ Google Kubernetes Engineì—ì„œ ìƒì„± 중입니다..."
@@ -2382,15 +2521,27 @@ msgstr "ClusterIntegration|가입"
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr "코드 소유ìž"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Cohorts"
msgid "Collapse"
msgstr "ê°ì¶”기"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "사ì´ë“œ ë°” 축소"
@@ -2689,6 +2840,9 @@ msgstr "%{protocol} í´ë¡  URL 복사"
msgid "Copy ID to clipboard"
msgstr "í´ë¦½ ë³´ë“œì— ID 복사"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "SSH í´ë¡  URL 복사"
@@ -3176,6 +3330,9 @@ msgstr ""
msgid "Description:"
msgstr "설명:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "제거"
@@ -3254,6 +3411,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "닫기"
@@ -3425,6 +3585,9 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용"
msgid "Enable group Runners"
msgstr "그룹 Runner 사용"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3461,6 +3624,9 @@ msgstr "(UTC)ì— ì¢…ë£Œë©ë‹ˆë‹¤"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3479,9 +3645,6 @@ msgstr "머지 리퀘스트(MR) ì„¤ëª…ì„ ìž…ë ¥ 해주세요"
msgid "Enter the merge request title"
msgstr "머지 리퀘스트(MR) ì œëª©ì„ ìž…ë ¥ 해주세요"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3506,6 +3669,12 @@ 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 ""
@@ -3557,15 +3726,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr "ëª¨ë‘ ë³´ê¸°"
@@ -3578,6 +3765,18 @@ msgstr "중지 환경"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "갱신ë¨"
@@ -3629,6 +3828,9 @@ msgstr "오류 ë³´ê³  ë° ë¡œê¹…"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr "ì—í”½ì„ ë§Œë“œëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -3698,6 +3900,33 @@ msgstr "머지 리퀘스트(MR) 요청 중 오류 ë°œìƒ. 다시 ì‹œë„하십시
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3776,6 +4005,9 @@ msgstr "펼치기"
msgid "Expand all"
msgstr "ëª¨ë‘ í™•ìž¥"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "사ì´ë“œë°” 확장"
@@ -3863,7 +4095,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr "ì´ëª¨ì§€ 목ë¡ì„ 불러올 수 없습니다"
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3929,9 +4161,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "설명"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "%{feature_flag_name} 수정"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "Feature 플래그 수정"
@@ -3989,9 +4218,6 @@ msgstr "새로운"
msgid "FeatureFlags|New Feature Flag"
msgstr "새로운 Feature 플래그"
-msgid "FeatureFlags|Save changes"
-msgstr "변경사항 저장"
-
msgid "FeatureFlags|Status"
msgstr "ìƒíƒœ"
@@ -4077,9 +4303,6 @@ msgstr ""
msgid "Filter..."
msgstr "í•„í„°..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "경로로 찾기"
@@ -4194,8 +4417,8 @@ msgstr ".gitlab-ci.ymlì—ì„œ 오류를 발견했습니다:"
msgid "Free Trial of GitLab.com Gold"
msgstr "GitLab.com Gold 무료 ì²´í—˜íŒ"
-msgid "From %{provider_title}"
-msgstr "%{provider_title}ì—ì„œ"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Bitbucketì—ì„œ"
@@ -4224,9 +4447,15 @@ msgstr "마ì¼ìŠ¤í†¤ì—ì„œ:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 세부사항 ë³´ê¸°ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ 목ë¡ì—ì„œ Runner를 설치하십시오."
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG 키"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "ì¼ë°˜"
@@ -4659,15 +4888,24 @@ msgstr ""
msgid "Go Back"
msgstr "ì´ì „으로"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "뒤로 가기"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "ì´ë™"
msgid "Go to %{link_to_google_takeout}."
msgstr "%{link_to_google_takeout}ë¡œ ì´ë™í•˜ì‹­ì‹œì˜¤."
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Google Code 가져오기"
@@ -4725,6 +4963,9 @@ msgstr "그룹 정보:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "그룹 관리ìžëŠ” grouo runners를 여기서 ë“±ë¡ í•  수 있습니다: %{link}"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5092,9 +5333,24 @@ msgstr "저장소 가져 오기"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "GitLab Enterprise Editionì„ í†µí•´ ì´ìŠˆ 보드를 í–¥ìƒ ì‹œí‚µë‹ˆë‹¤."
@@ -5146,6 +5402,12 @@ msgstr "호스트 키를 수ë™ìœ¼ë¡œ ìž…ë ¥"
msgid "Input your repository URL"
msgstr "저장소 URLì„ ìž…ë ¥ 하세요"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5198,6 +5460,9 @@ msgstr "Cycle Analytics 소개"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5216,6 +5481,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "ì´ìŠˆ"
@@ -5258,7 +5526,7 @@ msgstr "ì´ìŠˆëŠ” 버그, ìž‘ì—… í˜¹ì€ ë…¼ì˜í•  ì•„ì´ë””ì–´ì¼ ìˆ˜ 있습니ë
msgid "Issues closed"
msgstr "ì´ìŠˆ 닫힘"
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5447,6 +5715,9 @@ msgstr "ë ˆì´ë¸” 승격"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5529,6 +5800,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr "ë³´í˜¸ëœ ë¸Œëžœì¹˜ë“¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ê¸°"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "ë” ìžì„¸ížˆ 알아보기"
@@ -5701,6 +5975,15 @@ msgstr "스마트 카드로 로그ì¸"
msgid "Logs"
msgstr "로그"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5746,6 +6029,9 @@ msgstr "Manifest"
msgid "Manifest file import"
msgstr "Manifest íŒŒì¼ ê°€ì ¸ì˜¤ê¸°"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5773,36 +6059,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr "마í¬ë‹¤ìš´ 활성화ë¨"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr "Maven 메타 ë°ì´í„°"
@@ -5857,6 +6113,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "머지 리퀘스트(MR)"
@@ -6007,9 +6266,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr "시스템"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6154,6 +6410,9 @@ msgstr "ë” ë§Žì€ ì •ë³´"
msgid "More information is available|here"
msgstr "여기"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "ë§Žì€ ë³„"
@@ -6230,15 +6489,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "새로운 파ì´í”„ë¼ì¸ ì¼ì •"
msgid "New Snippet"
msgstr "새 스니펫"
-msgid "New Snippets"
-msgstr "새 스니펫"
-
msgid "New branch"
msgstr "새 브랜치"
@@ -6299,9 +6558,15 @@ msgstr "새로 만들기..."
msgid "No"
msgstr "아니오"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "ë¼ë²¨ ì—†ìŒ"
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6329,13 +6594,16 @@ msgstr "기여를 ì°¾ì„ ìˆ˜ 없습니다."
msgid "No credit card required."
msgstr "신용 카드가 필요하지 않습니다."
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "기한 ì—†ìŒ"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6431,6 +6699,9 @@ msgstr "ë°ì´í„°ê°€ 충분하지 않습니다."
msgid "Not now"
msgstr "나중ì—"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "마스터 브랜치는 ìžë™ìœ¼ë¡œ 보호ë©ë‹ˆë‹¤. %{link_to_protected_branches}"
@@ -6633,6 +6904,9 @@ msgstr "ìš´ì˜ìž"
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6642,6 +6916,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6834,6 +7111,12 @@ msgstr "변수"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "ì‚¬ìš©ìž ì •ì˜"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "파ì´í”„ë¼ì¸"
@@ -6849,6 +7132,9 @@ msgstr "ì§€ë‚œì£¼ì˜ íŒŒì´í”„ë¼ì¸"
msgid "Pipelines for last year"
msgstr "ì§€ë‚œí•´ì˜ íŒŒì´í”„ë¼ì¸"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "ìžì‹ ìžˆê²Œ 빌드하세요"
@@ -6969,9 +7255,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -6981,9 +7279,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "결과를 보려면 최소 í•˜ë‚˜ì˜ í•„í„°ë¥¼ ì„ íƒí•˜ì‹­ì‹œì˜¤"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "ReCAPTCHA를 풀어 주십시오."
@@ -7008,6 +7315,9 @@ msgstr "환경 설정"
msgid "Preferences|Navigation theme"
msgstr "테마 íƒìƒ‰"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7066,7 +7376,7 @@ msgid "Profiles|Account scheduled for removal."
msgstr "ê³„ì •ì´ ì‚­ì œë  ì˜ˆì •ìž…ë‹ˆë‹¤."
msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
+msgstr "ë‹¤ìŒ ì„œë¹„ìŠ¤ 중 하나로 ë¡œê·¸ì¸ í™œì„±í™”"
msgid "Profiles|Active"
msgstr ""
@@ -7087,7 +7397,7 @@ msgid "Profiles|Change username"
msgstr "사용ìžëª… 변경"
msgid "Profiles|Changing your username can have unintended side effects."
-msgstr ""
+msgstr "ì‚¬ìš©ìž ì´ë¦„ì„ ë³€ê²½í•˜ë©´ ì˜ë„하지 ì•Šì€ ë¬¸ì œê°€ ìƒê¸¸ 수 있습니다."
msgid "Profiles|Choose file..."
msgstr "íŒŒì¼ ì„ íƒ.."
@@ -7206,9 +7516,6 @@ msgstr "ì´ ì´ë©”ì¼ì€ 웹 기반 ìž‘ì—…, 수정ì´ë‚˜ mergeì— ì‚¬ìš©ë©ë‹ˆë‹
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "ì´ ê·¸ë¦¼ê³¼ 메시지는 프로필과 ì¸í„°íŽ˜ì´ìŠ¤ ì „ì²´ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤."
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7308,6 +7615,9 @@ msgstr "진행률"
msgid "Project"
msgstr "프로ì íŠ¸"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "프로ì íŠ¸ '%{project_name}' ì‚­ì œ 중입니다."
@@ -7350,6 +7660,9 @@ msgstr "프로ì íŠ¸ 내보내기 ë§í¬ê°€ 만료ë˜ì—ˆìŠµë‹ˆë‹¤. 프로ì íŠ¸
msgid "Project export started. A download link will be sent by email."
msgstr "프로ì íŠ¸ 내보내기가 시작ë˜ì—ˆìŠµë‹ˆë‹¤. 다운로드 ë§í¬ëŠ” ì´ë©”ì¼ë¡œ 전송ë©ë‹ˆë‹¤."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7357,7 +7670,7 @@ msgid "Project name"
msgstr "프로ì íŠ¸ ì´ë¦„"
msgid "Project slug"
-msgstr ""
+msgstr "프로ì íŠ¸ 슬러그"
msgid "Project:"
msgstr ""
@@ -7449,6 +7762,9 @@ msgstr "사용ìžëŠ” ì´ ì €ìž¥ì†Œì— ì¸ì¦ëœ ì´ë©”ì¼ë¡œ ì»¤ë°‹ëœ ì»¤ë°‹ë§Œ
msgid "Projects"
msgstr "프로ì íŠ¸"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name}ê³¼ 공유ë˜ëŠ” 프로ì íŠ¸"
@@ -7807,6 +8123,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "아바타 제거"
@@ -7942,6 +8264,17 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "GitLabì— ì•¡ì„¸ìŠ¤ í•  ë•Œ 모든 사용ìžê°€ 서비스 약관 ë° ê°œì¸ ì •ë³´ 취급 ë°©ì¹¨ì— ë™ì˜í•˜ë„ë¡í•˜ì‹­ì‹œì˜¤."
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
msgid "Resend invite"
msgstr ""
@@ -8099,6 +8432,9 @@ msgstr "모든 공유 Runners 파ì´í”„ë¼ì¸ ì‹œê°„ì„ ì‚¬ìš©í–ˆìŠµë‹ˆë‹¤."
msgid "Running"
msgstr "실행중"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8129,6 +8465,9 @@ msgstr "SSH 공개키"
msgid "SSL Verification"
msgstr "SSL ê²€ì¦"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "저장"
@@ -8162,11 +8501,14 @@ msgstr "예정ë¨"
msgid "Schedules"
msgstr "ì¼ì •"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "파ì´í”„ë¼ì¸ 스케줄ë§"
msgid "Scope"
-msgstr ""
+msgstr "스코프"
msgid "Scoped issue boards"
msgstr ""
@@ -8222,6 +8564,9 @@ msgstr "프로ì íŠ¸ 검색"
msgid "Search users"
msgstr "ì‚¬ìš©ìž ê²€ìƒ‰"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "프로ì íŠ¸ 검색"
@@ -8480,6 +8825,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr "웹 터미ë„ì˜ ìµœëŒ€ 세션 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤."
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "남용 ë³´ê³ ì„œì— ëŒ€í•œ 알림 ì´ë©”ì¼ì„ 설정합니다."
@@ -8504,6 +8852,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8561,9 +8912,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr "ì…œë¡ íŠ¸ëžœì ì…˜"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "명령 보기"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "완료 로그 표시"
@@ -8653,7 +9010,7 @@ msgid "Smartcard"
msgstr "스마트카드"
msgid "Smartcard authentication failed: client certificate header is missing."
-msgstr ""
+msgstr "스마트카드 ì¸ì¦ 실패: í´ë¼ì´ì–¸íŠ¸ ì¸ì¦ì„œ í—¤ë”ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Snippet Contents"
msgstr ""
@@ -8661,6 +9018,24 @@ msgstr ""
msgid "Snippets"
msgstr "스니펫"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8931,6 +9306,12 @@ 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 "Stars"
msgstr ""
@@ -8944,7 +9325,7 @@ msgid "Start a review"
msgstr ""
msgid "Start and due date"
-msgstr ""
+msgstr "시작ì¼ê³¼ 마ê°ì¼"
msgid "Start cleanup"
msgstr ""
@@ -9141,6 +9522,9 @@ msgstr "스위치 브랜치/태그"
msgid "Sync information"
msgstr "ì •ë³´ ë™ê¸°í™”"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "시스템 훅"
@@ -9330,6 +9714,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "허용ë˜ëŠ” 최대 íŒŒì¼ í¬ê¸°ëŠ” 200KB입니다."
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9453,6 +9840,9 @@ msgstr "í•  ì¼ì„ 삭제하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "There was an error loading users activity calendar."
msgstr "ì‚¬ìš©ìž í™œë™ ìº˜ë¦°ë”를 로딩하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "알림 ì„¤ì •ì„ ì €ìž¥í•˜ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -9498,11 +9888,26 @@ msgstr "ì´ ë³´ë“œì˜ ë²”ìœ„ê°€ 축소ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
msgid "This date is after the due date, so this epic won't appear in the roadmap."
-msgstr ""
+msgstr "ì´ ë‚ ì§œëŠ” 마ê°ì¼ ì´í›„ì´ë¯€ë¡œ ì´ ì—í”½ì€ ë¡œë“œë§µì— ë‚˜íƒ€ë‚˜ì§€ 않습니다."
msgid "This date is before the start date, so this epic won't appear in the roadmap."
msgstr ""
@@ -9519,6 +9924,9 @@ msgstr "ì´ ë””ë ‰í† ë¦¬"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "ì´ ê·¸ë£¹"
@@ -9603,6 +10011,12 @@ msgstr "즉, 빈 저장소를 만들거나 기존 저장소를 가져올 때까ì
msgid "This merge request is locked."
msgstr "ì´ ë¨¸ì§€ 리퀘스트(MR)는 잠겨있습니다."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "현재 ë¸Œëžœì¹˜ì— ëŒ€í•œ 쓰기 ê¶Œí•œì´ ì—†ìœ¼ë¯€ë¡œ ì´ ì˜µì…˜ì´ ë¹„í™œì„±í™”ë©ë‹ˆë‹¤."
@@ -10160,6 +10574,9 @@ msgstr ""
msgid "Update"
msgstr "ì—…ë°ì´íŠ¸"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10169,6 +10586,9 @@ msgstr "지금 ì—…ë°ì´íŠ¸"
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "ì—…ë°ì´íŠ¸ì¤‘..."
@@ -10397,6 +10817,9 @@ msgstr ""
msgid "View documentation"
msgstr "문서 보기"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "ì—픽 ëª©ë¡ ë³´ê¸°"
@@ -10406,6 +10829,9 @@ msgstr "파ì¼ë³´ê¸° @ "
msgid "View group labels"
msgstr "그룹 ë¼ë²¨ 보기"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "ì´ìŠˆ 보기"
@@ -10709,6 +11135,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "액세스 요청 철회"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10814,6 +11243,9 @@ 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 "프로ì íŠ¸ ìˆ«ìž í•œë„ì— ë„달했습니다."
@@ -10874,6 +11306,9 @@ msgstr "ë‹¹ì‹ ì˜ í”„ë¡œí•„ì— SSH 키를 등ë¡í•˜ê¸° 전까지 SSH를 통해 í
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "올바른 ë³€ê²½ì‚¬í•­ì„ ê°€ì ¸ì˜¤ë ¤ë©´ 다른 ì´ë¦„ì˜ ë¸Œëžœì¹˜ë¥¼ 사용해야합니다."
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -10967,6 +11402,9 @@ msgstr "ìžì‹ ì„ 담당ìžë¡œ 지정"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "브랜치 ì´ë¦„"
@@ -11046,6 +11484,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11138,9 +11579,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11180,6 +11618,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11268,9 +11709,6 @@ msgstr ""
msgid "here"
msgstr "여기"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://나ì˜-bitbucket-server"
@@ -11387,6 +11825,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "ë‹¤ìŒ ì‚¬ìš©ìžì— ì˜í•´ 승ì¸ë¨: "
@@ -11459,6 +11900,9 @@ msgstr "로컬ì—ì„œ 머지"
msgid "mrWidget|Merge request approved"
msgstr "머지 리퀘스트(MR) 승ì¸ë¨"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "머지 리퀘스트(MR)승ì¸ë¨; 추가ì ìœ¼ë¡œ 승ì¸í•  수 있습니다."
@@ -11518,6 +11962,9 @@ msgstr "ë˜ëŒë¦¬ê¸°"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "새로운 머지 리퀘스트(MR)ì—ì„œ ì´ ë¨¸ì§€ 리퀘스트(MR)ë¡œ ë˜ëŒë¦¬ê¸°"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "설정:"
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 01bbcaaa9c6..3942a250799 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:07\n"
+"PO-Revision-Date: 2019-03-06 15:16\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index ef5040725b3..fca801a32a5 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:07\n"
+"PO-Revision-Date: 2019-03-06 15:17\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 17bc141ae0c..44399927a09 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:11\n"
+"PO-Revision-Date: 2019-03-06 15:51\n"
msgid " Status"
msgstr " Status"
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" in projecten"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -126,12 +131,26 @@ msgstr "%{counter_storage} (%{counter_repositories} repositories, %{counter_buil
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "%{count} andere toebedeelden"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} deelnemer"
@@ -148,15 +167,15 @@ msgstr "%{filePath} verwijderd"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} meer"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}Groepen%{group_docs_link_end} stellen u in staat over meerdere projecten samen te werken en te beheren. Leden van een groep hebben toegang tot alle projecten."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wordt verwijderd! Weet je het zeker?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr "+ %{count} meer"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} meer"
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] "1 %{type} aanpassing"
msgstr[1] "%{count} %{type} aanpassingen"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "1 gesloten issue"
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr "Alles"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr "Grafieken"
msgid "Chat"
msgstr "Chat"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 1f1f71a35e9..2291dc0e557 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:08\n"
+"PO-Revision-Date: 2019-03-06 15:18\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index 39d0494790f..f3266c9c227 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:08\n"
+"PO-Revision-Date: 2019-03-06 15:17\n"
msgid " Status"
msgstr ""
@@ -47,6 +47,13 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -156,12 +163,28 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "%{count} więcej beneficjentów"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -182,15 +205,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -270,6 +293,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -296,6 +322,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -416,6 +449,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -431,6 +479,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -515,24 +566,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -701,6 +779,9 @@ msgstr "Zaawansowane pozwolenia, Magazyn Dużych Plików i Dwuczynnikowe ustawie
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -714,6 +795,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -783,7 +867,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -795,6 +879,15 @@ msgstr "Wystąpił błąd podczas dodawania nowej wersji roboczej."
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 previewing the blob"
msgstr ""
@@ -807,6 +900,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Wystąpił błąd podczas usuwania komentarza"
@@ -843,6 +939,9 @@ 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 getting projects"
msgstr ""
@@ -900,12 +999,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "Wystąpił błąd podczas aktualizacji komentarza"
@@ -996,6 +1101,52 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1038,9 +1189,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1125,6 +1282,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1140,9 +1300,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1701,6 +1858,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1737,6 +1897,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1749,6 +1912,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1815,9 +1981,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1977,6 +2140,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1992,9 +2158,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2040,12 +2203,12 @@ msgstr "Po zainstalowaniu Ingress będziesz musiał wskazać swoje symbole wielo
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "Wystąpił błąd podczas próby pobrania stref projektu: %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Wystąpił błąd podczas próby skontaktowania się z Google Cloud API. Spróbuj ponownie później."
+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 ""
@@ -2082,6 +2245,9 @@ msgstr "Wybierz aplikacje do zainstalowania w Twoim klastrze Kubernetes. Do zain
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Wybierz, które z Twoich środowisk będą używać tego klastra."
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2178,8 +2344,8 @@ msgstr ""
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Jeśli konfigurujesz wiele klastrów i używasz Auto DevOps, %{help_link_start}zapoznaj się najpierw z tym%{help_link_end}."
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "Aby pokazać stan zdrowia klastra, musimy zaopatrzyć Twój klaster w Prometheus, aby zebrać wymagane dane."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -2193,9 +2359,6 @@ msgstr "Wprowadzanie umożliwia kierowanie żądań do usług na podstawie hosta
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "Zainstaluj Prometheus"
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2241,9 +2404,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Kondycja klastra Kubernetes"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2481,15 +2641,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2791,6 +2963,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3281,6 +3456,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3359,6 +3537,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3530,6 +3711,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3566,6 +3750,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3584,9 +3771,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3611,6 +3795,12 @@ 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 ""
@@ -3662,15 +3852,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3683,6 +3891,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3734,6 +3954,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3803,6 +4026,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3881,6 +4131,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3968,7 +4221,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4034,9 +4287,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4094,9 +4344,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4185,9 +4432,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4302,7 +4546,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4332,9 +4576,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4767,15 +5017,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4833,6 +5092,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5203,9 +5465,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5257,6 +5534,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5312,6 +5595,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5330,6 +5616,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5372,7 +5661,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5561,6 +5850,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5646,6 +5938,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5821,6 +6116,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5866,6 +6170,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5893,36 +6200,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5977,6 +6254,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6127,9 +6407,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6274,6 +6551,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6353,13 +6633,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6422,9 +6702,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6452,13 +6738,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6554,6 +6843,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6759,6 +7051,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6768,6 +7063,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6960,6 +7258,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6975,6 +7279,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7095,9 +7402,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7107,9 +7426,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7134,6 +7462,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7332,9 +7663,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7434,6 +7762,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7476,6 +7807,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7575,6 +7909,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7936,6 +8273,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8071,6 +8414,23 @@ msgstr "Wymagaj od wszystkich użytkowników w tej grupie do ustawienia uwierzyt
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Wymagaj od wszystkich użytkowników akceptacji Warunków Usługi i Polityki Prywatności, gdy będą chcieli korzystać z GitLab."
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Resend invite"
msgstr ""
@@ -8231,6 +8591,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8261,6 +8624,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8294,6 +8660,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8354,6 +8723,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8612,6 +8984,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8636,6 +9011,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8693,9 +9071,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8796,6 +9180,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9066,6 +9468,12 @@ msgstr "Aktywność Projektów oznaczonych gwiazdką"
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 "Stars"
msgstr ""
@@ -9276,6 +9684,9 @@ msgstr ""
msgid "Sync information"
msgstr "Synchronizuj informacje"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9465,6 +9876,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9588,6 +10002,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9633,6 +10050,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9654,6 +10086,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9738,6 +10173,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10301,6 +10742,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10310,6 +10754,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10538,6 +10985,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10547,6 +10997,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10850,6 +11303,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10955,6 +11411,9 @@ 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 ""
@@ -11015,6 +11474,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11108,6 +11570,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11199,6 +11664,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11297,9 +11765,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11339,6 +11804,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11439,9 +11907,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11564,6 +12029,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11636,6 +12104,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11701,6 +12172,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index c331c2e5cc6..f5b206ba288 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:08\n"
+"PO-Revision-Date: 2019-03-06 15:17\n"
msgid " Status"
msgstr " Status"
@@ -32,10 +32,10 @@ msgstr[0] " melhorado em %d ponto"
msgstr[1] " melhorado em %d pontos"
msgid " or "
-msgstr ""
+msgstr " ou "
msgid " or <#epic id>"
-msgstr ""
+msgstr " ou <#epic id>"
msgid " or <#issue id>"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" em projetos"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -54,7 +59,7 @@ msgstr[0] "%d commit atrás"
msgstr[1] "%d commits atrás"
msgid "%d commits"
-msgstr ""
+msgstr "%d commits"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -78,8 +83,8 @@ msgstr[1] "%d issues"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d issue selecionada"
+msgstr[1] "%d issues selecionadas"
msgid "%d layer"
msgid_plural "%d layers"
@@ -126,12 +131,26 @@ msgstr "%{counter_storage} (%{counter_repositories} repositórios, %{counter_bui
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
-msgid "%{count} more"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
+msgid "%{count} more"
+msgstr "mais %{count}"
+
msgid "%{count} more assignees"
msgstr "mais %{count} responsáveis"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} participante"
@@ -148,15 +167,15 @@ msgstr "%{filePath} excluído"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} mais"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}Grupos%{group_docs_link_end} permitem que você gerencie e colabore em vários projetos. Os membros de um grupo têm acesso a todos os seus projetos."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} será removido! Você tem certeza?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -183,16 +202,16 @@ msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{branch_count}%{strong_end} Branch"
+msgstr[1] "%{strong_start}%{branch_count}%{strong_end} Branches"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{commit_count}%{strong_end} Commit"
+msgstr[1] "%{strong_start}%{commit_count}%{strong_end} Commits"
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} Arquivos"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
@@ -217,10 +236,10 @@ msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what infor
msgstr "%{usage_ping_link_start}Saiba mais%{usage_ping_link_end} sobre quais informações são compartilhadas com o GitLab Inc."
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "Página de perfil de %{user_name}"
msgid "(external source)"
-msgstr ""
+msgstr "(fonte externa)"
msgid "+ %{count} more"
msgstr "+ %{count} mais"
@@ -228,9 +247,12 @@ msgstr "+ %{count} mais"
msgid "+ %{moreCount} more"
msgstr "%{moreCount} mais"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ", ou "
+
msgid "- Runner is active and can process any new jobs"
msgstr "- O runner está ativo e pode processar novas tarefas"
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] "1 mudança de %{type}"
msgstr[1] "%{count} mudanças de %{type}"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "1 issue fechada"
@@ -299,13 +326,13 @@ msgid "1st contribution!"
msgstr "1ª contribuição!"
msgid "2FA"
-msgstr ""
+msgstr "A2F"
msgid "2FA enabled"
msgstr "Autenticação de 2 passos ativada"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "Por favor entre em contato com o seu administrador do GitLab para obter permissão."
msgid "403|You don't have the permission to access this page."
msgstr "Você não tem permissão para acessar essa página."
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "'Runner' é um processo que executa uma tarefa. Você pode configurar quantos Runners você precisar."
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Uma coleção de gráficos sobre Integração Contínua"
@@ -367,6 +409,9 @@ msgstr "Um membro da equipe de abusos GitLab irá rever a sua avaliação assim
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "Um novo \"branch\" será criado no seu \"fork\" e um novo merge request será iniciado."
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "Um projeto é onde você armazena seus arquivos (repositório), planeja seu trabalho (issues), e publica sua documentação (wiki), %{among_other_things_link}."
@@ -395,7 +440,7 @@ msgid "Abuse reports"
msgstr "Relatórios de abuso"
msgid "Accept invitation"
-msgstr ""
+msgstr "Aceitar convite"
msgid "Accept terms"
msgstr "Aceitar os temos"
@@ -434,10 +479,10 @@ msgid "Add"
msgstr "Adicionar"
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "Adicionar CHANGELOG"
msgid "Add CONTRIBUTING"
-msgstr ""
+msgstr "Adicionar CONTRIBUTING"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
msgstr "Adicione Webhooks de grupo e GitLab Enterprise Edition."
@@ -449,26 +494,53 @@ msgid "Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
msgid "Add README"
+msgstr "Adicionar README"
+
+msgid "Add a bullet list"
msgstr ""
msgid "Add a general comment to this %{noteable_name}."
-msgstr ""
+msgstr "Adicionar um comentário geral para este %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Adicione uma homepage ao seu wiki que contenha informações sobre o seu projeto e o GitLab irá exibi-lo aqui ao invés desta mensagem."
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Adicionar uma tabela"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "Coloque um texto adicional para aparecer em todas as comunicações por email. Limite de %{character_limit} caracteres"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Adicionar comentário"
+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 "Adicionar comentário de imagem"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Adicionar licença"
@@ -485,7 +557,7 @@ msgid "Add reaction"
msgstr "Adicionar reação"
msgid "Add to project"
-msgstr ""
+msgstr "Adicionar ao projeto"
msgid "Add to review"
msgstr "Adicionar à revisão"
@@ -497,7 +569,7 @@ msgid "Add user(s) to the group:"
msgstr "Adicionar usuário(s) ao grupo:"
msgid "Add users or groups who are allowed to approve every merge request"
-msgstr ""
+msgstr "Adicionar usuários ou grupos com permissão para aprovar todos os merge request"
msgid "Add users to group"
msgstr "Adicionar usuários ao grupo"
@@ -560,13 +632,13 @@ msgid "AdminSettings|When creating a new environment variable it will be protect
msgstr ""
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "A2F desativada"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "A2F ativada"
msgid "AdminUsers|Active"
-msgstr ""
+msgstr "Ativo"
msgid "AdminUsers|Admin"
msgstr ""
@@ -578,10 +650,10 @@ msgid "AdminUsers|Block user"
msgstr "Bloquear usuário"
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "Bloqueado"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr ""
+msgstr "Não é possível desbloquear usuários bloqueados pelo LDAP"
msgid "AdminUsers|Delete User %{username} and contributions?"
msgstr "Excluir o usuário %{username} e suas contribuições?"
@@ -596,28 +668,28 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "Excluir o usuário e suas contribuições"
msgid "AdminUsers|External"
-msgstr ""
+msgstr "Externo"
msgid "AdminUsers|It's you!"
-msgstr ""
+msgstr "É você!"
msgid "AdminUsers|New user"
-msgstr ""
+msgstr "Novo usuário"
msgid "AdminUsers|No users found"
-msgstr ""
+msgstr "Nenhum usuário encontrado"
msgid "AdminUsers|Search by name, email or username"
-msgstr ""
+msgstr "Procure por nome, e-mail ou nome de usuário"
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "Procurar usuários"
msgid "AdminUsers|Send email to users"
-msgstr ""
+msgstr "Enviar e-mail para usuários"
msgid "AdminUsers|Sort by"
-msgstr ""
+msgstr "Ordenar por"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr "Para confirmar, digite %{projectName}"
@@ -626,10 +698,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "Para confirmar, digite %{username}"
msgid "AdminUsers|User will be blocked"
-msgstr ""
+msgstr "Usuário será bloqueado"
msgid "AdminUsers|Without projects"
-msgstr ""
+msgstr "Sem projetos"
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."
@@ -637,17 +709,23 @@ msgstr "Permissões avançadas, armazenamento de arquivos grandes e configuraçÃ
msgid "Advanced settings"
msgstr "Configurações avançadas"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "Alerta"
msgstr[1] "Alertas"
msgid "Alerts"
-msgstr ""
+msgstr "Alertas"
msgid "All"
msgstr "Todos"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "Houve commit com todas as mudanças"
@@ -655,13 +733,13 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr "Todas as funcionalidades estão habilitadas para projetos em branco, a partir de templates ou ao importar, mas você pode desativá-los posteriormente nas configurações do projeto."
msgid "All issues for this milestone are closed. You may close this milestone now."
-msgstr ""
+msgstr "Todas as issues para este marco estão fechadas. Você pode fechar este marco agora."
msgid "All users"
msgstr "Todos os usuários"
msgid "Allow \"%{group_name}\" to sign you in"
-msgstr ""
+msgstr "Permitir que \"%{group_name}\" adicione você"
msgid "Allow commits from members who can merge to the target branch."
msgstr "Permitir commits de membros que podem fazer merge ao branch de destino."
@@ -685,7 +763,7 @@ msgid "Allow users to request access if visibility is public or internal."
msgstr "Permitir que os usuários solicitem acesso se a visibilidade for pública ou interna."
msgid "Allowed to fail"
-msgstr ""
+msgstr "Permitido falhar"
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Permite adicionar e gerenciar clusters do Kubernetes."
@@ -717,7 +795,7 @@ msgstr "Um campo vazio do usuário do GitLab adicionará o nome completo do usuÃ
msgid "An error has occurred"
msgstr "Ocorreu um erro"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -727,6 +805,15 @@ msgid "An error occurred adding a new draft."
msgstr "Ocorreu um erro ao adicionar um novo rascunho."
msgid "An error occurred creating the new branch."
+msgstr "Um erro ocorreu ao criar o novo branch."
+
+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 previewing the blob"
@@ -741,6 +828,9 @@ msgstr "Ocorreu um erro ao atualizar o peso do issue"
msgid "An error occurred while adding approver"
msgstr "Ocorreu um erro ao adicionar o aprovador"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Ocorreu um erro ao remover o comentário"
@@ -777,6 +867,9 @@ msgstr "Ocorreu um erro ao recuperar as tarefas."
msgid "An error occurred while fetching the pipeline."
msgstr "Erro ao recuperar informações da pipeline."
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Erro ao recuperar projetos"
@@ -802,7 +895,7 @@ msgid "An error occurred while loading the file"
msgstr "Erro ao carregar o arquivo"
msgid "An error occurred while loading the subscription details."
-msgstr ""
+msgstr "Um erro ocorreu ao carregar os detalhes da inscrição."
msgid "An error occurred while making the request."
msgstr "Erro ao fazer a requisição."
@@ -811,10 +904,10 @@ msgid "An error occurred while removing approver"
msgstr "Ocorreu um erro ao remover o aprovador"
msgid "An error occurred while removing epics."
-msgstr ""
+msgstr "Ocorreu um erro ao remover épicos."
msgid "An error occurred while removing issues."
-msgstr ""
+msgstr "Um erro ocorreu ao remover issues."
msgid "An error occurred while rendering KaTeX"
msgstr "Erro ao renderizar o KaTeX"
@@ -834,12 +927,18 @@ msgstr "Ocorreu um erro ao salvar o status de substituição do LDAP. Por favor,
msgid "An error occurred while saving assignees"
msgstr "Erro ao salvar assignees"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "Ocorreu um erro ao inscrever às notificações."
msgid "An error occurred while unsubscribing to notifications."
msgstr "Ocorreu um erro ao desinscrever às notificações."
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "Ocorreu um erro durante a atualização do comentário"
@@ -850,10 +949,10 @@ msgid "An error occurred whilst committing your changes."
msgstr ""
msgid "An error occurred whilst fetching the job trace."
-msgstr ""
+msgstr "Ocorreu um erro ao buscar o rastreamento do trabalho."
msgid "An error occurred whilst fetching the latest pipeline."
-msgstr ""
+msgstr "Ocorreu um erro ao recuperar o último pipeline."
msgid "An error occurred whilst loading all the files."
msgstr ""
@@ -871,16 +970,16 @@ msgid "An error occurred whilst loading the merge request version data."
msgstr ""
msgid "An error occurred whilst loading the merge request."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar o merge request."
msgid "An error occurred whilst loading the pipelines jobs."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar os trabalhos de pipelines."
msgid "An error occurred. Please try again."
msgstr "Ocorreu um erro. Tente novamente."
msgid "An unexpected error occurred while checking the project environment."
-msgstr ""
+msgstr "Um erro inesperado ocorreu enquanto verificava o ambiente de projeto."
msgid "An unexpected error occurred while checking the project runners."
msgstr ""
@@ -925,20 +1024,58 @@ msgid "Applications"
msgstr "Aplicações"
msgid "Applied"
-msgstr ""
+msgstr "Aplicado"
msgid "Apply suggestion"
+msgstr "Aplicar sugestão"
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
msgstr ""
-msgid "Approvals"
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
msgstr ""
-msgid "Approvals required"
+msgid "ApprovalRule|Members"
msgstr ""
-msgid "Approvers"
+msgid "ApprovalRule|Name"
msgstr ""
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
+msgid "Approvals"
+msgstr "Aprovações"
+
+msgid "Approvals required"
+msgstr "Aprovações necessárias"
+
+msgid "Approvers"
+msgstr "Aprovadores"
+
msgid "Apr"
msgstr "Abr"
@@ -952,7 +1089,7 @@ msgid "Archived projects"
msgstr "Projetos arquivados"
msgid "Are you sure"
-msgstr ""
+msgstr "Você tem certeza"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza que deseja excluir este agendamento de pipeline?"
@@ -972,9 +1109,15 @@ msgstr "Tem certeza de que deseja regenerar a chave pública? Você precisará a
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Você tem certeza que quer remover %{group_name}?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1030,7 +1173,7 @@ msgid "Assign milestone"
msgstr "Atribuir marco"
msgid "Assign some issues to this milestone."
-msgstr ""
+msgstr "Atribua alguns issues a este marco."
msgid "Assign to"
msgstr "Atribuir à"
@@ -1059,9 +1202,12 @@ msgstr "Listas de responsáveis mostram todas as issues atribuídas ao usuário
msgid "Assignee(s)"
msgstr "Responsável(is)"
-msgid "Attach a file"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
+msgid "Attach a file"
+msgstr "Anexar um arquivo"
+
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}"
@@ -1074,9 +1220,6 @@ msgstr "Ago"
msgid "August"
msgstr "Agosto"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Log de autenticação"
@@ -1093,7 +1236,7 @@ msgid "Authorization code:"
msgstr "Código de autorização:"
msgid "Authorization key"
-msgstr ""
+msgstr "Chave de autorização"
msgid "Authorization was granted by entering your username and password in the application."
msgstr "A autorização foi concedida digitando seu nome de usuário e senha no aplicativo."
@@ -1156,25 +1299,25 @@ msgid "Automatically marked as default internal user"
msgstr "Marcado automaticamente como interno de usuário padrão"
msgid "Automatically resolved"
-msgstr ""
+msgstr "Resolvido automaticamente"
msgid "Available"
msgstr "Disponível"
msgid "Available group Runners: %{runners}"
-msgstr ""
+msgstr "Runners de grupo disponíveis: %{runners}"
msgid "Available shared Runners:"
-msgstr ""
+msgstr "Runners compartilhados disponíveis:"
msgid "Available specific runners"
-msgstr ""
+msgstr "Runners específicos disponíveis"
msgid "Avatar for %{assigneeName}"
-msgstr ""
+msgstr "Imagem de perfil para %{assigneeName}"
msgid "Avatar for %{name}"
-msgstr ""
+msgstr "Imagem de perfil para %{name}"
msgid "Avatar will be removed. Are you sure?"
msgstr "Foto de perfil será removida. Tem certeza?"
@@ -1360,10 +1503,10 @@ msgid "Bitbucket import"
msgstr "Importar do Bitbucket"
msgid "Block"
-msgstr ""
+msgstr "Bloquear"
msgid "Blocked"
-msgstr ""
+msgstr "Bloqueado"
msgid "Blog"
msgstr "Blog"
@@ -1528,34 +1671,34 @@ msgid "Browse files"
msgstr "Navegar pelos arquivos"
msgid "Built-in"
-msgstr ""
+msgstr "Embutido"
msgid "Business"
-msgstr ""
+msgstr "Negócios"
msgid "Business metrics (Custom)"
msgstr "Métricas de negócios (personalizadas)"
msgid "By %{user_name}"
-msgstr ""
+msgstr "Por %{user_name}"
msgid "ByAuthor|by"
msgstr "por"
msgid "CHANGELOG"
-msgstr ""
+msgstr "CHANGELOG"
msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Charts"
-msgstr ""
+msgstr "Gráficos CI / CD"
msgid "CI / CD Settings"
msgstr "Configurações de CI / CD"
msgid "CI Lint"
-msgstr ""
+msgstr "Checar syntaxe de CI"
msgid "CI will run using the credentials assigned above."
msgstr "O CI será executado usando as credenciais atribuídas acima."
@@ -1609,13 +1752,13 @@ msgid "CICD|instance enabled"
msgstr "Instância habilitada"
msgid "CONTRIBUTING"
-msgstr ""
+msgstr "CONTRIBUINDO"
msgid "Callback URL"
msgstr "URL de Retorno"
msgid "Can override approvers and approvals required per merge request"
-msgstr ""
+msgstr "Pode substituir aprovadores e aprovações necessárias por merge request"
msgid "Can't find HEAD commit for this branch"
msgstr "Não é possível encontrar o commit HEAD para este branch"
@@ -1635,11 +1778,14 @@ msgstr "Não pode ser feito o merge automaticamente"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Não se pode modificar um cluster Kubernetes gerenciado"
-msgid "Certificate"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
msgstr ""
+msgid "Certificate"
+msgstr "Certificado"
+
msgid "Certificate (PEM)"
-msgstr ""
+msgstr "Certificado (PEM)"
msgid "Certificate fingerprint"
msgstr "Impressão digital do certificado"
@@ -1648,7 +1794,7 @@ msgid "Change Weight"
msgstr "Alterar Peso"
msgid "Change permissions"
-msgstr ""
+msgstr "Alterar permissões"
msgid "Change template"
msgstr "Mudar modelo"
@@ -1671,11 +1817,14 @@ msgstr "Reverter"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Isso criará um novo commit para reverter as mudanças existentes."
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "Mudanças serão mostradas se revisão de <b>origem</b> tiver sofrido merge na revisão <b>alvo</b>."
msgid "Changes suppressed. Click to show."
-msgstr ""
+msgstr "Alterações suprimidas. Clique para mostrar."
msgid "Charts"
msgstr "Gráficos"
@@ -1683,17 +1832,20 @@ msgstr "Gráficos"
msgid "Chat"
msgstr "Bate-papo"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "Verifique a %{docs_link_start}documentação%{docs_link_end}."
msgid "Check your .gitlab-ci.yml"
-msgstr ""
+msgstr "Verifique o seu .gitlab-ci.yml"
msgid "Checking %{text} availability…"
msgstr "Verificando disponibilidade de %{text}…"
msgid "Checking approval status"
-msgstr ""
+msgstr "Verificando status de aprovação"
msgid "Checking branch availability..."
msgstr "Verificando disponibilidade de branch..."
@@ -1717,10 +1869,10 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "Escolha a branch/tag (ex: %{master}) ou número do commit (ex: %{sha}) para ver o que mudou ou para criar um merge request."
msgid "Choose a file"
-msgstr ""
+msgstr "Escolha um arquivo"
msgid "Choose a role permission"
-msgstr ""
+msgstr "Escolha uma permissão de cargo"
msgid "Choose a template..."
msgstr "Escolha um modelo..."
@@ -1741,7 +1893,7 @@ msgid "Choose the top-level group for your repository imports."
msgstr "Escolha o grupo principal para importar seus repositórios."
msgid "Choose what content you want to see on a group’s overview page"
-msgstr ""
+msgstr "Escolha o conteúdo que você deseja ver na página de visão geral de um grupo"
msgid "Choose which groups you wish to synchronize to this secondary node."
msgstr "Escolha quais grupos você deseja sincronizar nesse nó secundário."
@@ -1749,9 +1901,6 @@ msgstr "Escolha quais grupos você deseja sincronizar nesse nó secundário."
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "Escolha quais repositórios você deseja se conectar e executar pipelines de CI/CD."
-msgid "Choose which repositories you want to import."
-msgstr "Escolha quais repositórios você deseja importar."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "Escolha quais shards você deseja sincronizar nesse nó secundário."
@@ -1858,10 +2007,10 @@ msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "está indisponível: %{reason}"
msgid "Clear"
-msgstr ""
+msgstr "Limpar"
msgid "Clear input"
-msgstr ""
+msgstr "Limpar entrada"
msgid "Clear search"
msgstr "Limpar Pesquisa"
@@ -1903,16 +2052,19 @@ msgid "Clients"
msgstr "Clientes"
msgid "Clone"
-msgstr ""
+msgstr "Clonar"
msgid "Clone repository"
msgstr "Clonar repositório"
msgid "Clone with %{http_label}"
+msgstr "Clonar com %{http_label}"
+
+msgid "Clone with KRB5"
msgstr ""
msgid "Clone with SSH"
-msgstr ""
+msgstr "Clonar com SSH"
msgid "Close"
msgstr "Fechar"
@@ -1921,22 +2073,19 @@ msgid "Close epic"
msgstr "Fechar épico"
msgid "Close milestone"
-msgstr ""
+msgstr "Fechar marco"
msgid "Closed"
msgstr "Fechado"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Issues Fechadas"
msgid "ClusterIntegration| %{custom_domain_start}More information%{custom_domain_end}."
-msgstr ""
+msgstr " %{custom_domain_start}Mais informações%{custom_domain_end}."
msgid "ClusterIntegration| can be used instead of a custom domain."
-msgstr ""
+msgstr " pode ser usado em vez de um domínio personalizado."
msgid "ClusterIntegration| is the default environment scope for this cluster. This means that all jobs, regardless of their environment, will use this cluster. %{environment_scope_start}More information%{environment_scope_end}"
msgstr ""
@@ -1974,12 +2123,12 @@ msgstr "Depois de instalar o Ingress, você precisará apontar seu DNS curinga p
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "Erro ao recuperar zonas de projeto: %{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "Ocorreu um erro ao entrar em contato com a Google Cloud API. Por favor, tente novamente mais tarde."
+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 ""
@@ -1990,13 +2139,13 @@ msgid "ClusterIntegration|Applications"
msgstr "Aplicações"
msgid "ClusterIntegration|Apply for credit"
-msgstr ""
+msgstr "Inscreva-se para receber créditos"
msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster."
msgstr "Tem certeza de que deseja remover a integração deste cluster do Kubernetes? Isso não excluirá o seu cluster atual do Kubernetes."
msgid "ClusterIntegration|Base domain"
-msgstr ""
+msgstr "Domínio base"
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificado CA"
@@ -2016,6 +2165,9 @@ msgstr "Escolha quais aplicativos instalar em seu cluster do Kubernetes. O Helm
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Escolha quais dos seus ambientes usarão esse cluster."
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,8 +2264,8 @@ msgstr "Ocultar"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Se você está configurando múltiplos clusters e você está usando auto DevOps, %{help_link_start}leia isso primeiro%{help_link_end}."
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "Para mostrar a saúde do cluster, nós precisamos provisionar seu cluster com Prometheus para coletar os dados necessários."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "Ingressar"
@@ -2127,9 +2279,6 @@ msgstr "Ingress oferece uma maneira de rotear solicitações para serviços com
msgid "ClusterIntegration|Install"
msgstr "Instalar"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "Instalar Prometheus"
-
msgid "ClusterIntegration|Installed"
msgstr "Instalado"
@@ -2175,9 +2324,6 @@ msgstr "Cluter Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Detalhes do cluster Kubernetes"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Saúde do cluster Kubernetes"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "O cluster Kubernetes está sendo criado no Google Kubernetes Engine..."
@@ -2413,31 +2559,43 @@ msgid "ClusterIntegration|sign up"
msgstr "cadastrar"
msgid "Code"
+msgstr "Código"
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
msgstr ""
msgid "Code owners"
msgstr "Proprietários de código"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Cohorts"
msgid "Collapse"
msgstr "Recolher"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Minimizar barra lateral"
msgid "Command line instructions"
-msgstr ""
+msgstr "Instruções de linha de comando"
msgid "Comment"
msgstr "Comentário"
msgid "Comment & close %{noteable_name}"
-msgstr ""
+msgstr "Comentar e fechar %{noteable_name}"
msgid "Comment & reopen %{noteable_name}"
-msgstr ""
+msgstr "Comentar e reabrir %{noteable_name}"
msgid "Comment & resolve discussion"
msgstr "Comentar e marcar a discussão como resolvida"
@@ -2457,13 +2615,13 @@ msgstr[0] "Commit"
msgstr[1] "Commits"
msgid "Commit %{commit_id}"
-msgstr ""
+msgstr "Commit %{commit_id}"
msgid "Commit Message"
msgstr "Mensagem de Commit"
msgid "Commit deleted"
-msgstr ""
+msgstr "Commit excluído"
msgid "Commit duration in minutes for last 30 commits"
msgstr "Duração do commit em minutos para os últimos 30 commits"
@@ -2529,7 +2687,7 @@ msgid "Compare Revisions"
msgstr "Comparar revisões"
msgid "Compare changes"
-msgstr ""
+msgstr "Comparar alterações"
msgid "Compare changes with the last commit"
msgstr "Compare as mudanças do último commit"
@@ -2673,7 +2831,7 @@ msgid "Contribution"
msgstr "Contribuições"
msgid "Contribution Charts"
-msgstr ""
+msgstr "Gráficos de contribuição"
msgid "Contributions for <strong>%{calendar_date}</strong>"
msgstr "Contribuições para <strong>%{calendar_date}</strong>"
@@ -2715,7 +2873,7 @@ msgid "ConvDev Index"
msgstr "Ãndice ConvDev"
msgid "Copy %{http_label} clone URL"
-msgstr ""
+msgstr "Copiar URL de clone do %{http_label}"
msgid "Copy %{protocol} clone URL"
msgstr "Copiar URL de Clone do %{protocol}"
@@ -2723,11 +2881,14 @@ msgstr "Copiar URL de Clone do %{protocol}"
msgid "Copy ID to clipboard"
msgstr "Copiar ID para área de transferência"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "Copiar URL de Clone do SSH"
msgid "Copy SSH public key"
-msgstr ""
+msgstr "Copiar chave pública SSH"
msgid "Copy SSH public key to clipboard"
msgstr "Copiar chave pública SSH para área de transferência"
@@ -2775,7 +2936,7 @@ msgid "Create New Directory"
msgstr "Criar Novo Diretório"
msgid "Create New Domain"
-msgstr ""
+msgstr "Criar novo domínio"
msgid "Create a new branch"
msgstr "Criar uma nova branch"
@@ -2787,7 +2948,7 @@ msgid "Create a new issue"
msgstr "Criar uma nova issue"
msgid "Create a new repository"
-msgstr ""
+msgstr "Criar um novo repositório"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Crie um token de acesso pessoal na sua conta para dar pull ou push via %{protocol}."
@@ -2829,7 +2990,7 @@ msgid "Create merge request and branch"
msgstr "Abrir merge request e criar branch"
msgid "Create milestone"
-msgstr ""
+msgstr "Criar marco"
msgid "Create new branch"
msgstr "Criar novo branch"
@@ -2925,7 +3086,7 @@ msgid "Customize how Google Code email addresses and usernames are imported into
msgstr "Personalize como os endereços de e-mail e nomes de usuário do Google Code são importados para o GitLab. Na próxima etapa, você poderá selecionar os projetos que deseja importar."
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "Personalize as configurações relacionadas a idioma e região."
msgid "Customize your merge request approval settings."
msgstr ""
@@ -2961,7 +3122,7 @@ msgid "CycleAnalyticsStage|Test"
msgstr "Teste"
msgid "DNS"
-msgstr ""
+msgstr "DNS"
msgid "Dashboard"
msgstr "Dashboard"
@@ -2973,7 +3134,7 @@ msgid "DashboardProjects|Personal"
msgstr "Pessoal"
msgid "Data is still calculating..."
-msgstr ""
+msgstr "Os dados ainda estão a ser calculados..."
msgid "Date picker"
msgstr "Seletor de data"
@@ -2988,7 +3149,7 @@ msgid "December"
msgstr "Dezembro"
msgid "Decline"
-msgstr ""
+msgstr "Recusar"
msgid "Decline and sign out"
msgstr "Recusar e sair"
@@ -3000,10 +3161,10 @@ msgid "Default classification label"
msgstr "Etiqueta de classificação padrão"
msgid "Default first day of the week"
-msgstr ""
+msgstr "Primeiro dia da semana padrão"
msgid "Default first day of the week in calendars and date pickers."
-msgstr ""
+msgstr "Primeiro dia da semana padrão em calendários e selecionadores de data."
msgid "Default: Directly import the Google Code email address or username"
msgstr "Padrão: Importar diretamente o endereço de e-mail ou nome de usuário do Google Code"
@@ -3048,10 +3209,10 @@ msgid "Delete list"
msgstr "Excluir lista"
msgid "Delete source branch"
-msgstr ""
+msgstr "Excluir branch de origem"
msgid "Delete this attachment"
-msgstr ""
+msgstr "Excluir este anexo"
msgid "Deleted"
msgstr "Excluído"
@@ -3211,6 +3372,9 @@ msgstr "Os modelos de descrição permitem que você defina modelos específicos
msgid "Description:"
msgstr "Descrição:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "Destruir"
@@ -3218,7 +3382,7 @@ msgid "Details"
msgstr "Detalhes"
msgid "Details (default)"
-msgstr ""
+msgstr "Detalhes (padrão)"
msgid "Detect host keys"
msgstr "Detectar chaves de host"
@@ -3254,7 +3418,7 @@ msgid "Disable shared Runners"
msgstr ""
msgid "Disabled"
-msgstr ""
+msgstr "Desativado"
msgid "Discard"
msgstr "Descartar"
@@ -3284,9 +3448,12 @@ msgid "Discover projects, groups and snippets. Share your projects with others"
msgstr "Descubra projetos, grupos e snippets. Compartilhe seus projetos com outras pessoas"
msgid "Discuss a specific suggestion or question"
-msgstr ""
+msgstr "Discuta uma sugestão ou pergunta específica"
msgid "Discuss a specific suggestion or question that needs to be resolved"
+msgstr "Discuta uma sugestão ou pergunta específica que precisa ser resolvida"
+
+msgid "Discussion"
msgstr ""
msgid "Dismiss"
@@ -3371,13 +3538,13 @@ msgid "Edit"
msgstr "Alterar"
msgid "Edit %{name}"
-msgstr ""
+msgstr "Editar %{name}"
msgid "Edit Label"
msgstr "Editar etiqueta"
msgid "Edit Milestone"
-msgstr ""
+msgstr "Editar marco"
msgid "Edit Pipeline Schedule %{id}"
msgstr "Alterar Agendamento do Pipeline %{id}"
@@ -3389,10 +3556,10 @@ msgid "Edit application"
msgstr "Editar aplicativo"
msgid "Edit comment"
-msgstr ""
+msgstr "Editar comentário"
msgid "Edit environment"
-msgstr ""
+msgstr "Editar ambiente"
msgid "Edit files in the editor and commit changes here"
msgstr "Alterar arquivos no editor e fazer commit das alterações aqui"
@@ -3404,7 +3571,7 @@ msgid "Edit identity for %{user_name}"
msgstr "Editar identidade para %{user_name}"
msgid "Edit issues"
-msgstr ""
+msgstr "Editar issues"
msgid "Elasticsearch"
msgstr "Elasticsearch"
@@ -3425,7 +3592,7 @@ msgid "Embed"
msgstr "Embutido"
msgid "Empty file"
-msgstr ""
+msgstr "Arquivo vazio"
msgid "Enable"
msgstr "Ativar"
@@ -3452,7 +3619,7 @@ msgid "Enable classification control using an external service"
msgstr "Ativar controle de classificação usando um serviço externo"
msgid "Enable error tracking"
-msgstr ""
+msgstr "Ativar rastreamento de erros"
msgid "Enable for this project"
msgstr "Ativar para este projeto"
@@ -3460,6 +3627,9 @@ msgstr "Ativar para este projeto"
msgid "Enable group Runners"
msgstr "Ativar grupo de runners"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Ative ou desative a coleção de dados Pseudonymizer"
@@ -3470,7 +3640,7 @@ msgid "Enable reCAPTCHA or Akismet and set IP limits."
msgstr "Ativar reCAPTCHA ou Akismet e definir seus limites de IP."
msgid "Enable self approval of merge requests"
-msgstr ""
+msgstr "Ativar auto-aprovação de merge request"
msgid "Enable shared Runners"
msgstr ""
@@ -3479,7 +3649,7 @@ msgid "Enable the Performance Bar for a given group."
msgstr "Ative a barra de desempenho para um determinado grupo."
msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "Ativar autenticação de dois fatores"
msgid "Enable usage ping"
msgstr "Ativar dados de uso"
@@ -3496,6 +3666,9 @@ msgstr "Termina em (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr "Digite a descrição do merge request"
msgid "Enter the merge request title"
msgstr "Digite o título do merge request"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ msgstr "Um erro ocorreu ao recuperar ambientes."
msgid "Environments|An error occurred while making the request."
msgstr "Um erro ocorreu ao fazer a requisição."
+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 "Ocorreu um erro ao parar o ambiente, por favor, tente novamente"
@@ -3592,15 +3768,33 @@ msgstr "Abrir ambiente ao vivo"
msgid "Environments|Pod logs from"
msgstr "Logs de pod de"
+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 "Reimplantar no ambiente"
msgid "Environments|Read more about environments"
msgstr "Ler mais sobre ambiente"
+msgid "Environments|Rollback"
+msgstr ""
+
msgid "Environments|Rollback environment"
msgstr "Reverter ambiente"
+msgid "Environments|Rollback environment %{environment_name}?"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
msgid "Environments|Show all"
msgstr "Mostrar tudo"
@@ -3613,6 +3807,18 @@ msgstr "Parar ambiente"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Atualizado"
@@ -3662,6 +3868,9 @@ msgid "Error Reporting and Logging"
msgstr "Relatório e registro de erros"
msgid "Error Tracking"
+msgstr "Acompanhamento de erros"
+
+msgid "Error creating a new path"
msgstr ""
msgid "Error creating epic"
@@ -3731,11 +3940,38 @@ msgid "Error while loading the merge request. Please try again."
msgstr "Erro ao carregar o merge request. Por favor, tente novamente."
msgid "Error:"
+msgstr "Erro:"
+
+msgid "ErrorTracking|Active"
msgstr ""
-msgid "Errors"
+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|Find your hostname in your Sentry account settings page"
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 "Erros"
+
msgid "Estimated"
msgstr "Estimativa"
@@ -3758,10 +3994,10 @@ msgid "EventFilterBy|Filter by team"
msgstr "EventFilterBy|Filtrar por equipe"
msgid "Events"
-msgstr ""
+msgstr "Eventos"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
-msgstr ""
+msgstr "Cada tentativa de %{action} falhou: %{job_error_message}. Por favor, tente novamente."
msgid "Every day (at 4:00am)"
msgstr "Todos os dias (às 4:00)"
@@ -3773,25 +4009,25 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "Toda semana (domingos às 4:00)"
msgid "Everyone"
-msgstr ""
+msgstr "Todos"
msgid "Everyone can contribute"
msgstr "Todos podem contribuir"
msgid "Everything you need to create a GitLab Pages site using GitBook."
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o GitBook."
msgid "Everything you need to create a GitLab Pages site using Hexo."
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Hexo."
msgid "Everything you need to create a GitLab Pages site using Hugo."
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Hugo."
msgid "Everything you need to create a GitLab Pages site using Jekyll."
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Jekyll."
msgid "Everything you need to create a GitLab Pages site using plain HTML."
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando HTML simples."
msgid "Except policy:"
msgstr ""
@@ -3800,10 +4036,10 @@ msgid "Existing Git repository"
msgstr ""
msgid "Existing folder"
-msgstr ""
+msgstr "Pasta existente"
msgid "Existing members and groups"
-msgstr ""
+msgstr "Membros e grupos existentes"
msgid "Expand"
msgstr "Expandir"
@@ -3811,6 +4047,9 @@ msgstr "Expandir"
msgid "Expand all"
msgstr "Expandir tudo"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Expandir barra lateral"
@@ -3818,10 +4057,10 @@ msgid "Expiration date"
msgstr "Data de validade"
msgid "Expired %{expiredOn}"
-msgstr ""
+msgstr "Expirou %{expiredOn}"
msgid "Expires in %{expires_at}"
-msgstr ""
+msgstr "Expira em %{expires_at}"
msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
msgstr "Explique o problema. Se necessário, forneça um link para a issue ou comentário relevante."
@@ -3845,19 +4084,19 @@ msgid "Explore public groups"
msgstr "Explorar grupos públicos"
msgid "Export as CSV"
-msgstr ""
+msgstr "Exportar como CSV"
msgid "Export issues"
-msgstr ""
+msgstr "Exportar issues"
msgid "External Classification Policy Authorization"
msgstr "Autorização de Política de Classificação Externa"
msgid "External URL"
-msgstr ""
+msgstr "URL externo"
msgid "External Wiki"
-msgstr ""
+msgstr "Wiki externo"
msgid "External authentication"
msgstr "Autenticação externa"
@@ -3898,7 +4137,7 @@ msgstr "Falha ao fazer deploy para"
msgid "Failed to load emoji list."
msgstr "Falha ao carregar a lista de emojis."
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3935,10 +4174,10 @@ msgid "Feature Flags"
msgstr "Sinalizadores de recurso"
msgid "FeatureFlags|* (All Environments)"
-msgstr ""
+msgstr "* (Todos os Ambientes)"
msgid "FeatureFlags|* (All environments)"
-msgstr ""
+msgstr "* (Todos os ambientes)"
msgid "FeatureFlags|API URL"
msgstr "URL da API"
@@ -3956,17 +4195,14 @@ msgid "FeatureFlags|Create feature flag"
msgstr "Criar sinalizador de recurso"
msgid "FeatureFlags|Delete %{name}?"
-msgstr ""
+msgstr "Excluir %{name}?"
msgid "FeatureFlags|Delete feature flag"
-msgstr ""
+msgstr "Excluir sinalizador de recurso"
msgid "FeatureFlags|Description"
msgstr "Descrição"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "Editar %{feature_flag_name}"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "Editar sinalizador de recurso"
@@ -3983,22 +4219,22 @@ msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules
msgstr ""
msgid "FeatureFlags|Feature Flags"
-msgstr ""
+msgstr "Sinalizadores de recursos"
msgid "FeatureFlags|Feature Flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
-msgstr ""
+msgstr "Os sinalizadores de recursos permitem que você configure o seu código em diferentes versões alterando dinamicamente determinadas funcionalidades."
msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
-msgstr ""
+msgstr "O sinalizador de recurso %{name} será removido. Você tem certeza?"
msgid "FeatureFlags|Get started with Feature Flags"
-msgstr ""
+msgstr "Comece a usar os sinalizadores de recursos"
msgid "FeatureFlags|Inactive"
msgstr "Inativo"
msgid "FeatureFlags|Inactive flag for %{scope}"
-msgstr ""
+msgstr "Sinalizador inativo para %{scope}"
msgid "FeatureFlags|Install a %{docs_link_start}compatible client library%{docs_link_end} and specify the API URL, application name, and instance ID during the configuration setup."
msgstr "Instale uma %{docs_link_start}biblioteca de cliente compatível%{docs_link_end} e especifique o URL da API, o nome do aplicativo e o ID da instância durante a configuração."
@@ -4007,10 +4243,10 @@ msgid "FeatureFlags|Instance ID"
msgstr "ID da instância"
msgid "FeatureFlags|Loading Feature Flags"
-msgstr ""
+msgstr "Carregando sinalizadores de recursos"
msgid "FeatureFlags|More Information"
-msgstr ""
+msgstr "Mais informações"
msgid "FeatureFlags|More information"
msgstr "Mais informações"
@@ -4024,26 +4260,23 @@ msgstr "Novo"
msgid "FeatureFlags|New Feature Flag"
msgstr "Novo sinalizador de recurso"
-msgid "FeatureFlags|Save changes"
-msgstr "Salvar alterações"
-
msgid "FeatureFlags|Status"
msgstr "Status"
msgid "FeatureFlags|Target environments"
-msgstr ""
+msgstr "Ambientes alvo"
msgid "FeatureFlags|There are no active Feature Flags"
-msgstr ""
+msgstr "Não há sinalizadores de recursos ativos"
msgid "FeatureFlags|There are no inactive Feature Flags"
-msgstr ""
+msgstr "Não há sinalizadores de recursos inativos"
msgid "FeatureFlags|There was an error fetching the feature flags."
-msgstr ""
+msgstr "Ocorreu um erro ao buscar os sinalizadores de recursos."
msgid "FeatureFlags|Try again in a few moments or contact your support team."
-msgstr ""
+msgstr "Tente novamente daqui a pouco ou entre em contato com a sua equipe de suporte."
msgid "Feb"
msgstr "Fev"
@@ -4056,29 +4289,29 @@ msgstr "Campos nessa página não são mais editáveis, você pode configurar"
msgid "File"
msgid_plural "Files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Arquivo"
+msgstr[1] "Arquivos"
msgid "File added"
-msgstr ""
+msgstr "Arquivo adicionado"
msgid "File browser"
-msgstr ""
+msgstr "Navegador de arquivos"
msgid "File deleted"
-msgstr ""
+msgstr "Arquivo excluído"
msgid "File mode changed from %{a_mode} to %{b_mode}"
-msgstr ""
+msgstr "Modo de arquivo alterado de %{a_mode} para %{b_mode}"
msgid "File moved"
-msgstr ""
+msgstr "Arquivo movido"
msgid "File templates"
msgstr "Modelos de arquivos"
msgid "File upload error."
-msgstr ""
+msgstr "Erro ao enviar arquivo."
msgid "Files"
msgstr "Arquivos"
@@ -4099,28 +4332,25 @@ msgid "Filter by commit message"
msgstr "Filtrar por mensagem de commit"
msgid "Filter by milestone name"
-msgstr ""
+msgstr "Filtrar por nome de marco"
msgid "Filter by two-factor authentication"
-msgstr ""
+msgstr "Filtrar por autenticação de dois fatores"
msgid "Filter results by group"
-msgstr ""
+msgstr "Filtrar resultados por grupo"
msgid "Filter results by project"
-msgstr ""
+msgstr "Filtrar resultados por projeto"
msgid "Filter..."
msgstr "Filtro..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "Localizar por caminho"
msgid "Find existing members by name"
-msgstr ""
+msgstr "Encontre membros existentes por nome"
msgid "Find file"
msgstr "Localizar arquivo"
@@ -4135,7 +4365,7 @@ msgid "Fingerprints"
msgstr "Impressões digitais"
msgid "Finish editing this message first!"
-msgstr ""
+msgstr "Conclua a edição desta mensagem primeiro!"
msgid "Finish review"
msgstr "Concluir a revisão"
@@ -4144,7 +4374,7 @@ msgid "Finished"
msgstr "Finalizado"
msgid "First day of the week"
-msgstr ""
+msgstr "Primeiro dia da semana"
msgid "FirstPushedBy|First"
msgstr "Primeiro"
@@ -4192,7 +4422,7 @@ msgid "For internal projects, any logged in user can view pipelines and access j
msgstr "Para projetos internos, qualquer usuário conectado pode visualizar pipelines e acessar detalhes da tarefa (logs de saída e artefatos)"
msgid "For more info, read the documentation."
-msgstr ""
+msgstr "Para mais informações, leia a documentação."
msgid "For more information, go to the "
msgstr "Para mais informações, vá para o "
@@ -4219,7 +4449,7 @@ msgid "Forking in progress"
msgstr "Fork em andamento"
msgid "Forks"
-msgstr ""
+msgstr "Forks"
msgid "Format"
msgstr "Formato"
@@ -4230,8 +4460,8 @@ msgstr "Erros encontrados em seu .gitlab-ci.yml:"
msgid "Free Trial of GitLab.com Gold"
msgstr "Avaliação gratuita do GitLab.com Gold"
-msgid "From %{provider_title}"
-msgstr "De %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "Do Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr "A partir de marcos:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "Na visualização de detalhes do cluster do Kubernetes, instale o Runner pela lista de aplicativos"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "Chaves GPG"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "Geral"
@@ -4273,7 +4509,7 @@ msgid "Generate a default set of labels"
msgstr "Gerar etiquetas padrão"
msgid "Generate key"
-msgstr ""
+msgstr "Gerar chave"
msgid "Geo"
msgstr "Geo"
@@ -4615,7 +4851,7 @@ msgid "Get started with error tracking"
msgstr ""
msgid "Getting started with releases"
-msgstr ""
+msgstr "Introdução às versões"
msgid "Git"
msgstr "Git"
@@ -4657,7 +4893,7 @@ msgid "GitLab User"
msgstr "Usuário GitLab"
msgid "GitLab metadata URL"
-msgstr ""
+msgstr "URL de metadados do GitLab"
msgid "GitLab project export"
msgstr "Exportação do projeto GitLab"
@@ -4690,20 +4926,29 @@ msgid "Gitea Import"
msgstr "Importação do Gitea"
msgid "Given access %{time_ago}"
-msgstr ""
+msgstr "Acesso concedido %{time_ago}"
msgid "Go Back"
msgstr "Voltar"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "Voltar"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "Ir para"
msgid "Go to %{link_to_google_takeout}."
msgstr "Ir para %{link_to_google_takeout}."
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "Importação do Google Code"
@@ -4717,7 +4962,7 @@ msgid "Got it!"
msgstr "Entendi!"
msgid "Grant access"
-msgstr ""
+msgstr "Conceder acesso"
msgid "Graph"
msgstr "Gráfico"
@@ -4761,14 +5006,17 @@ msgstr "Info. do grupo:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Os mantenedores podem registrar grupos de runners em %{link}"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "Nome do grupo"
msgid "Group overview content"
-msgstr ""
+msgstr "Conteúdo da visão geral do grupo"
msgid "Group:"
-msgstr ""
+msgstr "Grupo:"
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -4840,7 +5088,7 @@ msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroup
msgstr "Grupos também podem ser aninhados criando %{subgroup_docs_link_start}subgrupos%{subgroup_docs_link_end}."
msgid "Groups with access to <strong>%{project_name}</strong>"
-msgstr ""
+msgstr "Grupos com acesso a <strong>%{project_name}</strong>"
msgid "GroupsDropdown|Frequently visited"
msgstr "Visitados frequentemente"
@@ -4956,7 +5204,7 @@ msgstr[0] "Ocultar valor"
msgstr[1] "Ocultar valores"
msgid "Hide values"
-msgstr ""
+msgstr "Ocultar valores"
msgid "History"
msgstr "Histórico"
@@ -5091,7 +5339,7 @@ msgid "Import members"
msgstr ""
msgid "Import members from another project"
-msgstr ""
+msgstr "Importar membros de outro projeto"
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importar vários repositórios fazendo o upload de um arquivo manifest."
@@ -5100,7 +5348,7 @@ msgid "Import project"
msgstr "Importar projeto"
msgid "Import project members"
-msgstr ""
+msgstr "Importar membros do projeto"
msgid "Import projects from Bitbucket"
msgstr "Importar projetos do Bitbucket"
@@ -5127,11 +5375,26 @@ msgid "Import repository"
msgstr "Importar repositório"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
+msgstr "Importação expirou. A importação demorou mais de %{import_jobs_expiration} segundos"
+
+msgid "Import/Export illustration"
msgstr ""
msgid "ImportButtons|Connect repositories from"
msgstr "Conectar repositórios de"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "Melhore os painéis com GitLab Enterprise Edition."
@@ -5183,9 +5446,15 @@ msgstr "Insira as chaves do host manualmente"
msgid "Input your repository URL"
msgstr "Insira seu URL do repositório"
-msgid "Insert suggestion"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
msgstr ""
+msgid "Insert suggestion"
+msgstr "Inserir sugestão"
+
msgid "Install GitLab Runner"
msgstr "Instalar o GitLab Runner"
@@ -5216,7 +5485,7 @@ msgid "Interested parties can even contribute by pushing commits if they want to
msgstr "As partes interessadas podem até contribuir enviando commits, caso queiram."
msgid "Internal"
-msgstr ""
+msgstr "Interno"
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr "Interno - O grupo e projetos internos podem ser visualizados por qualquer usuário autenticado."
@@ -5236,17 +5505,20 @@ msgstr "Apresentando a Análise de Ciclo"
msgid "Introducing Your Conversational Development Index"
msgstr ""
-msgid "Invitation"
+msgid "Invalid input, please avoid emojis"
msgstr ""
+msgid "Invitation"
+msgstr "Convite"
+
msgid "Invite"
msgstr "Convidar"
msgid "Invite group"
-msgstr ""
+msgstr "Convidar grupo"
msgid "Invite member"
-msgstr ""
+msgstr "Convidar membro"
msgid "Invoke Count"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "Issue"
@@ -5273,10 +5548,10 @@ msgid "IssueBoards|Boards"
msgstr "Painéis"
msgid "IssueBoards|Create new board"
-msgstr ""
+msgstr "Criar novo painel"
msgid "IssueBoards|Delete board"
-msgstr ""
+msgstr "Excluir painel"
msgid "IssueBoards|No matching boards found"
msgstr ""
@@ -5285,7 +5560,7 @@ msgid "IssueBoards|Some of your boards are hidden, activate a license to see the
msgstr ""
msgid "IssueBoards|Switch board"
-msgstr ""
+msgstr "Alternar painel"
msgid "Issues"
msgstr "Issues"
@@ -5296,8 +5571,8 @@ msgstr "Issues podem ser bugs, tarefas ou ideias a serem discutidas. Além disso
msgid "Issues closed"
msgstr "Issues fechadas"
-msgid "Issues, merge requests, pushes and comments."
-msgstr "Issues, merge requests, pushes e comentários."
+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 "Depois que você começa a criar issues para seus projetos, podemos começar a acompanhar e exibir métricas para elas"
@@ -5324,7 +5599,7 @@ msgid "It must have a header row and at least two columns: the first column is t
msgstr ""
msgid "It's you"
-msgstr ""
+msgstr "É você"
msgid "Jaeger URL"
msgstr "URL Jaeger"
@@ -5408,7 +5683,7 @@ msgid "June"
msgstr "Junho"
msgid "Key (PEM)"
-msgstr ""
+msgstr "Chave (PEM)"
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -5485,6 +5760,9 @@ msgstr "Promover etiqueta"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr "Promover %{labelTitle} irá disponibilizá-la para todos os projetos dentro de %{groupName}. Etiquetas de projetos existentes com o mesmo título serão mescladas. Esta ação não pode ser revertida."
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr "Armazenamento de arquivos grandes"
@@ -5497,7 +5775,7 @@ msgid "Last Pipeline"
msgstr "Último Pipeline"
msgid "Last activity"
-msgstr ""
+msgstr "Última atividade"
msgid "Last commit"
msgstr "Último commit"
@@ -5515,7 +5793,7 @@ msgid "Last reply by"
msgstr "Última resposta de"
msgid "Last seen"
-msgstr ""
+msgstr "Visto pela última vez"
msgid "Last update"
msgstr "Última atualização"
@@ -5539,7 +5817,7 @@ msgid "Lead"
msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
-msgstr ""
+msgstr "Saiba como %{no_packages_link_start}publicar e compartilhar seus pacotes%{no_packages_link_end} com o GitLab."
msgid "Learn more"
msgstr "Saiba mais"
@@ -5548,26 +5826,29 @@ msgid "Learn more about %{issue_boards_url}, to keep track of issues in multiple
msgstr "Saiba mais sobre %{issue_boards_url}, para acompanhar issues em diversas listas, usando etiquetas, atribuições e marcos. Se você notar algo faltando nos painéis, por favor, crie uma issue em %{gitlab_issues_url}."
msgid "Learn more about Auto DevOps"
-msgstr ""
+msgstr "Saiba mais sobre o Auto DevOps"
msgid "Learn more about Kubernetes"
msgstr "Saiba mais sobre o Kubernetes"
msgid "Learn more about Web Terminal"
-msgstr ""
+msgstr "Saiba mais sobre o Terminal Web"
msgid "Learn more about custom project templates"
-msgstr ""
+msgstr "Saiba mais sobre os modelos de projetos personalizados"
msgid "Learn more about group-level project templates"
-msgstr ""
+msgstr "Saiba mais sobre os modelos de projeto de nível de grupo"
msgid "Learn more about incoming email addresses"
-msgstr ""
+msgstr "Saiba mais sobre endereços de e-mail recebidos"
msgid "Learn more about protected branches"
msgstr "Saiba mais sobre branches protegidos"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Saiba mais em"
@@ -5703,10 +5984,10 @@ msgid "Loading..."
msgstr "Carregando..."
msgid "Loading…"
-msgstr ""
+msgstr "Carregando…"
msgid "Localization"
-msgstr ""
+msgstr "Localização"
msgid "Lock"
msgstr "Bloquear"
@@ -5741,6 +6022,15 @@ msgstr "Entrar com cartão inteligente"
msgid "Logs"
msgstr "Logs"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 "Faça com que todos em sua equipe sejam mais produtivos, independentemente da localização deles. O GitLab Geo cria espelhos somente leitura de sua instância do GitLab para que você possa reduzir o tempo necessário para clonar e buscar grandes repositórios."
@@ -5775,7 +6065,7 @@ msgid "Manage project labels"
msgstr "Gerenciar etiquetas de projetos"
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "Gerenciar a autenticação de dois fatores"
msgid "Manage your group’s membership while adding another level of security with SAML."
msgstr "Gerencie a qualidade de membros do seu grupo ao adicionar outro nível de segurança com o SAML."
@@ -5786,6 +6076,9 @@ msgstr "Manifesto"
msgid "Manifest file import"
msgstr "Importação de arquivo de manifesto"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Associar um ID de conta do FogBugz para um usuário do GitLab"
@@ -5808,41 +6101,11 @@ msgid "Mark todo as done"
msgstr "Marcar como concluído"
msgid "Markdown"
-msgstr ""
+msgstr "Markdown"
msgid "Markdown enabled"
msgstr "Markdown habilitado"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr "Adicionar uma lista de marcadores"
-
-msgid "MarkdownToolbar|Add a link"
-msgstr "Adicionar um link"
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr "Adicionar uma lista numerada"
-
-msgid "MarkdownToolbar|Add a table"
-msgstr "Adicionar uma tabela"
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr "Adicionar uma lista de tarefas"
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr "Adicionar texto em negrito"
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr "Adicionar texto em itálico"
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr "Ir para tela cheia"
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr "Inserir uma citação"
-
-msgid "MarkdownToolbar|Insert code"
-msgstr "Inserir código"
-
msgid "Maven Metadata"
msgstr "Metadado do Maven"
@@ -5868,10 +6131,10 @@ msgid "Members"
msgstr "Membros"
msgid "Members can be added by project <i>Maintainers</i> or <i>Owners</i>"
-msgstr ""
+msgstr "Os membros podem ser adicionados pelos <i>mantenedores</i> ou <i>proprietários</i> do projeto"
msgid "Members of <strong>%{project_name}</strong>"
-msgstr ""
+msgstr "Membros de <strong>%{project_name}</strong>"
msgid "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 "Membros serão encaminhados quando fizerem login no seu grupo. Obtenha isso pelo seu provedor de identidade, também chamado de \"SSO Service Location\", \"SAM Token Issuance Endpoint\", ou \"SAML 2.0/W-Federation URL\"."
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Merge requests"
@@ -5913,7 +6179,7 @@ msgid "Merge when pipeline succeeds"
msgstr ""
msgid "MergeRequests|Add a reply"
-msgstr ""
+msgstr "Adicionar uma resposta"
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Ocorreu um erro ao salvar o rascunho do comentário."
@@ -5934,7 +6200,7 @@ msgid "MergeRequests|Jump to next unresolved discussion"
msgstr ""
msgid "MergeRequests|Reply..."
-msgstr ""
+msgstr "Responder..."
msgid "MergeRequests|Resolve this discussion in a new issue"
msgstr "Resolver essa discussão em um novo issue"
@@ -5955,7 +6221,7 @@ msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
msgid "MergeRequests|started a discussion"
-msgstr ""
+msgstr "iniciou uma discussão"
msgid "MergeRequests|started a discussion on %{linkStart}an old version of the diff%{linkEnd}"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentação de consulta do Prometheus"
-msgid "Metrics|System"
-msgstr "Sistema"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "Houve um erro ao obter os dados do ambiente; por favor, tente novamente"
@@ -6168,7 +6431,7 @@ msgid "Modify merge commit"
msgstr ""
msgid "Monday"
-msgstr ""
+msgstr "Segunda-feira"
msgid "Monitor your errors by integrating with Sentry"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr "Mais informações"
msgid "More information is available|here"
msgstr "Mais informações estão disponíveis|aqui"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "Mais estrelas"
@@ -6234,7 +6500,7 @@ msgid "Nav|Sign out and sign in with a different account"
msgstr "Saia e faça login com uma conta diferente"
msgid "Need help?"
-msgstr ""
+msgstr "Precisa de ajuda?"
msgid "Network"
msgstr "Rede"
@@ -6266,20 +6532,20 @@ msgid "New Label"
msgstr "Nova etiqueta"
msgid "New Milestone"
-msgstr ""
+msgstr "Novo Marco"
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Novo Agendamento de Pipeline"
msgid "New Snippet"
msgstr "Novo Snippet"
-msgid "New Snippets"
-msgstr "Novos Snippets"
-
msgid "New branch"
msgstr "Novo branch"
@@ -6314,7 +6580,7 @@ msgid "New merge request"
msgstr "Novo merge request"
msgid "New milestone"
-msgstr ""
+msgstr "Novo marco"
msgid "New pipelines will cancel older, pending pipelines on the same branch"
msgstr "Novos pipelines cancelarão pipelines pendentes mais antigos no mesmo branch"
@@ -6340,12 +6606,18 @@ msgstr "Novo..."
msgid "No"
msgstr "Não"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "Sem etiqueta"
-msgid "No activities found"
+msgid "No Tag"
msgstr ""
+msgid "No activities found"
+msgstr "Nenhuma atividade encontrada"
+
msgid "No assignee"
msgstr "Sem responsável"
@@ -6370,13 +6642,16 @@ msgstr "Nenhuma contribuição foi encontrada"
msgid "No credit card required."
msgstr "Não é necessário cartão de crédito."
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "Sem validade"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6413,7 +6688,7 @@ msgid "No messages were logged"
msgstr "Nenhuma mensagem foi registrada"
msgid "No milestones to show"
-msgstr ""
+msgstr "Sem marcos para mostrar"
msgid "No other labels with such name or description"
msgstr "Sem outras etiquetas com esse nome ou descrição"
@@ -6472,6 +6747,9 @@ msgstr "Dados insuficientes"
msgid "Not now"
msgstr "Agora não"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Observe que o branch master é automaticamente protegido. %{link_to_protected_branches}"
@@ -6509,10 +6787,10 @@ msgid "Notification events"
msgstr "Eventos de notificação"
msgid "Notification setting"
-msgstr ""
+msgstr "Configuração de notificação"
msgid "Notification setting - %{notification_title}"
-msgstr ""
+msgstr "Configuração de notificação - %{notification_title}"
msgid "NotificationEvent|Close issue"
msgstr "Fechar issue"
@@ -6634,13 +6912,13 @@ msgid "Open"
msgstr "Abrir"
msgid "Open Documentation"
-msgstr ""
+msgstr "Abrir documentação"
msgid "Open comment type dropdown"
msgstr ""
msgid "Open errors"
-msgstr ""
+msgstr "Abrir erros"
msgid "Open in Xcode"
msgstr "Abrir no Xcode"
@@ -6675,6 +6953,9 @@ msgstr "Operações"
msgid "Operations Dashboard"
msgstr "Painel de Operações"
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Adicione um projeto ao painel"
@@ -6684,6 +6965,9 @@ msgstr "O painel de operações fornece um resumo da integridade operacional de
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr "Opcionalmente, você pode %{link_to_customize} como os endereços de e-mail e nomes de usuários do FogBugz são importados para o GitLab."
@@ -6730,10 +7014,10 @@ msgid "Pages"
msgstr "Páginas"
msgid "Pages Domain"
-msgstr ""
+msgstr "Domínio de páginas"
msgid "Pages Domains"
-msgstr ""
+msgstr "Domínios de páginas"
msgid "Pagination|Last »"
msgstr "Último >>"
@@ -6748,7 +7032,7 @@ msgid "Pagination|« First"
msgstr "<< Primeiro"
msgid "Parameter"
-msgstr ""
+msgstr "Parâmetro"
msgid "Parent epic"
msgstr ""
@@ -6808,7 +7092,7 @@ msgid "Personal project creation is not allowed. Please contact your administrat
msgstr ""
msgid "Pick a name"
-msgstr ""
+msgstr "Escolha um nome"
msgid "Pipeline"
msgstr "Pipeline"
@@ -6876,6 +7160,12 @@ msgstr "Variáveis"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Personalizado"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -6891,6 +7181,9 @@ msgstr "Pipelines para a última semana"
msgid "Pipelines for last year"
msgstr "Pipelines para o último ano"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "Construa com confiança"
@@ -6997,7 +7290,7 @@ msgid "Play"
msgstr "Iniciar"
msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
-msgstr ""
+msgstr "Por favor, %{link_to_register} ou %{link_to_sign_in} para comentar"
msgid "Please accept the Terms of Service before continuing."
msgstr "Por favor, aceite os Termos de Serviço antes de continuar."
@@ -7011,9 +7304,21 @@ msgstr "Por favor, converta-os para %{link_to_git} e passe pelo %{link_to_import
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr "Por favor, converta-os em Git no Google Code e passe pelo %{link_to_import_flow} novamente."
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr "Por favor, preencha um nome descritivo para o seu grupo."
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr "Por favor, note que esse aplicativo não é fornecido pelo GitLab e você deve verificar a sua autenticidade antes de permitir o acesso."
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "Por favor selecione pelo menos um filtro para ver os resultados"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "Por favor, resolva o reCAPTCHA"
@@ -7033,7 +7347,7 @@ msgid "Please try again"
msgstr "Por favor, tente novamente"
msgid "Please upgrade PostgreSQL to version 9.6 or greater. The status of the replication cannot be determined reliably with the current version."
-msgstr ""
+msgstr "Por favor, atualize o PostgreSQL para a versão 9.6 ou superior. O status da replicação não pode ser determinado de maneira confiável com a versão atual."
msgid "Please use this form to report users to GitLab who create spam issues, comments or behave inappropriately."
msgstr "Use este formulário para denunciar usuários ao GitLab que criam spam de issues, comentários ou se comportam de maneira inapropriada."
@@ -7050,6 +7364,9 @@ msgstr "Preferências"
msgid "Preferences|Navigation theme"
msgstr "Tema de navegação"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "Pressione Enter ou clique para pesquisar"
@@ -7078,7 +7395,7 @@ msgid "Prioritized label"
msgstr "Etiqueta priorizada"
msgid "Private"
-msgstr ""
+msgstr "Privado"
msgid "Private - Project access must be granted explicitly to each user."
msgstr "Privado - O acesso ao projeto deve ser concedido explicitamente para cada usuário."
@@ -7102,16 +7419,16 @@ msgid "Profiles| You are going to change the username %{currentUsernameBold} to
msgstr "Você vai alterar o nome de usuário %{currentUsernameBold} para %{newUsernameBold}. O perfil e os projetos serão redirecionados para %{newUsername} mas esse redirecionamento expirará quando %{currentUsername} for registrado por outro usuário ou grupo. Por favor, atualize seus repositórios remotos Git o mais rápido possível."
msgid "Profiles|@username"
-msgstr ""
+msgstr "@nomedeusuário"
msgid "Profiles|Account scheduled for removal."
msgstr "Conta agendada para remoção."
msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
+msgstr "Ative o login com um dos seguintes serviços"
msgid "Profiles|Active"
-msgstr ""
+msgstr "Ativo"
msgid "Profiles|Add key"
msgstr "Adicionar chave"
@@ -7129,28 +7446,28 @@ msgid "Profiles|Change username"
msgstr "Alterar nome de usuário"
msgid "Profiles|Changing your username can have unintended side effects."
-msgstr ""
+msgstr "Alterar o seu nome de usuário pode ter efeitos colaterais indesejados."
msgid "Profiles|Choose file..."
msgstr "Escolher arquivo..."
msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr ""
+msgstr "Opte por mostrar contribuições de projetos privados em seu perfil público sem quaisquer informações do projeto, repositório ou da organização"
msgid "Profiles|City, country"
-msgstr ""
+msgstr "Cidade, país"
msgid "Profiles|Clear status"
msgstr "Limpar status"
msgid "Profiles|Click on icon to activate signin with one of the following services"
-msgstr ""
+msgstr "Clique no ícone para ativar o login com um dos seguintes serviços"
msgid "Profiles|Connect"
-msgstr ""
+msgstr "Conectar"
msgid "Profiles|Connected Accounts"
-msgstr ""
+msgstr "Contas conectadas"
msgid "Profiles|Current path: %{path}"
msgstr "Caminho atual: %{path}"
@@ -7171,7 +7488,7 @@ msgid "Profiles|Deleting an account has the following effects:"
msgstr "A exclusão de uma conta tem os seguintes efeitos:"
msgid "Profiles|Disconnect"
-msgstr ""
+msgstr "Desconectar"
msgid "Profiles|Do not show on profile"
msgstr "Não mostrar no perfil"
@@ -7183,10 +7500,10 @@ msgid "Profiles|Edit Profile"
msgstr "Editar perfil"
msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr ""
+msgstr "Digite seu nome, então as pessoas que você conhece podem reconhecê-lo"
msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr ""
+msgstr "Aumente a segurança da sua conta ativando a autenticação de dois fatores (A2F)"
msgid "Profiles|Invalid password"
msgstr "Senha inválida"
@@ -7225,13 +7542,13 @@ msgid "Profiles|Set new profile picture"
msgstr "Definir nova foto de perfil"
msgid "Profiles|Social sign-in"
-msgstr ""
+msgstr "Login social"
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "Algumas opções estão indisponíveis para contas LDAP"
msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr ""
+msgstr "Conte-nos sobre você em menos de 250 caracteres"
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "O tamanho máximo de arquivo permitido é de 200KB."
@@ -7240,7 +7557,7 @@ msgid "Profiles|This doesn't look like a public SSH key, are you sure you want t
msgstr "Isso não se parece com uma chave pública SSH, você tem certeza que gostaria de adicioná-la?"
msgid "Profiles|This email will be displayed on your public profile"
-msgstr ""
+msgstr "Este e-mail será exibido no seu perfil público"
msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{learn_more}"
msgstr "Este e-mail será usado para operações baseadas na web, como edições e merges. %{learn_more}"
@@ -7248,14 +7565,11 @@ msgstr "Este e-mail será usado para operações baseadas na web, como edições
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "Este emoji e mensagem aparecerão no seu perfil e em toda a interface."
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
-msgstr ""
+msgstr "Esta informação aparecerá no seu perfil"
msgid "Profiles|Two-Factor Authentication"
-msgstr ""
+msgstr "Autenticação de dois fatores"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Escreva sua %{confirmationValue} para confirmar:"
@@ -7282,13 +7596,13 @@ msgid "Profiles|Username successfully changed"
msgstr "Alteração de nome de usuário realizada com sucesso"
msgid "Profiles|Using emojis in names seems fun, but please try to set a status message instead"
-msgstr ""
+msgstr "Usar emojis em nomes parece divertido, mas tente definir uma mensagem de status"
msgid "Profiles|What's your status?"
msgstr "Qual é o seu status?"
msgid "Profiles|Who you represent or work for"
-msgstr ""
+msgstr "Por quem você representa ou trabalha"
msgid "Profiles|You can change your avatar here"
msgstr "Você pode alterar o seu avatar aqui"
@@ -7309,7 +7623,7 @@ msgid "Profiles|You must transfer ownership or delete these groups before you ca
msgstr "Você precisa delegar outro usuário para ser dono ou apagar esses grupos antes de excluir sua conta."
msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
-msgstr ""
+msgstr "Seu nome de perfil no LinkedIn em linkedin.com/in/nomedeperfil"
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Sua conta é atualmente proprietária dos seguintes grupos:"
@@ -7330,10 +7644,10 @@ msgid "Profiles|e.g. My MacBook key"
msgstr "por exemplo, Chave do meu MacBook"
msgid "Profiles|username"
-msgstr ""
+msgstr "nome de usuário"
msgid "Profiles|website.com"
-msgstr ""
+msgstr "sitedaweb.com"
msgid "Profiles|your account"
msgstr "sua conta"
@@ -7350,6 +7664,9 @@ msgstr "Progresso"
msgid "Project"
msgstr "Projeto"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "O projeto '%{project_name}' está sendo excluído."
@@ -7392,9 +7709,12 @@ msgstr "O link para a exportação do projeto expirou. Favor gerar uma nova expo
msgid "Project export started. A download link will be sent by email."
msgstr "Exportação do projeto iniciada. Um link para baixá-la será enviado por email."
-msgid "Project members"
+msgid "Project has too many %{label_for_message} to search"
msgstr ""
+msgid "Project members"
+msgstr "Membros do projeto"
+
msgid "Project name"
msgstr "Nome do projeto"
@@ -7402,7 +7722,7 @@ msgid "Project slug"
msgstr "Slug do projeto"
msgid "Project:"
-msgstr ""
+msgstr "Projeto:"
msgid "ProjectActivityRSS|Subscribe"
msgstr "Inscreva-se"
@@ -7491,6 +7811,9 @@ msgstr "Usuários só podem fazer push para este repositório com commits que co
msgid "Projects"
msgstr "Projetos"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projetos compartilhados com %{group_name}"
@@ -7705,7 +8028,7 @@ msgid "Pseudonymizer data collection"
msgstr "Coleção de dados Pseudonymizer"
msgid "Public"
-msgstr ""
+msgstr "Público"
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "Público - O grupo e seus projetos podem ser visualizados por todos sem autenticação."
@@ -7747,13 +8070,13 @@ msgid "Quarters"
msgstr "Trimestres"
msgid "Query"
-msgstr ""
+msgstr "Consulta"
msgid "Quick actions can be used in the issues description and comment boxes."
msgstr "Ações rápidas podem ser usadas nas descrições das issues e nas caixas de comentário."
msgid "README"
-msgstr ""
+msgstr "README"
msgid "Read more"
msgstr "Leia mais"
@@ -7797,7 +8120,7 @@ msgid "Register / Sign In"
msgstr "Registrar/Login"
msgid "Register U2F device"
-msgstr ""
+msgstr "Registrar dispositivo U2F"
msgid "Register and see your runners for this group."
msgstr "Registre-se e veja seus runners para este grupo."
@@ -7830,10 +8153,10 @@ msgid "Related merge requests"
msgstr "Merge requests relacionados"
msgid "Releases"
-msgstr ""
+msgstr "Versões"
msgid "Releases mark specific points in a project's development history, communicate information about the type of change, and deliver on prepared, often compiled, versions of the software to be reused elsewhere. Currently, releases can only be created through the API."
-msgstr ""
+msgstr "As versões marcam pontos específicos no histórico de desenvolvimento de um projeto, comunicam informações sobre o tipo de mudança e fornecem versões preparadas, muitas vezes compiladas do software para serem reutilizadas em outro lugar. Atualmente, as versões só podem ser criadas por meio da API."
msgid "Remind later"
msgstr "Lembrar mais tarde"
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "Remover imagem"
@@ -7881,13 +8210,13 @@ msgid "Reopen epic"
msgstr "Reabrir epic"
msgid "Reopen milestone"
-msgstr ""
+msgstr "Reabrir marco"
msgid "Repair authentication"
msgstr "Corrigir autenticação"
msgid "Reply to comment"
-msgstr ""
+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}."
@@ -7974,7 +8303,7 @@ msgid "Request Access"
msgstr "Solicitar acesso"
msgid "Requested %{time_ago}"
-msgstr ""
+msgstr "Solicitado %{time_ago}"
msgid "Requests Profiles"
msgstr "Solicita Perfis"
@@ -7985,26 +8314,39 @@ msgstr "Exigir que todos os usuários deste grupo configurem a autenticação de
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Exija que todos os usuários aceitem Termos de Serviço e Política de Privacidade quando acessarem o GitLab."
-msgid "Resend invite"
+msgid "Require approval from code owners"
msgstr ""
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Resend invite"
+msgstr "Reenviar convite"
+
msgid "Reset authorization key"
-msgstr ""
+msgstr "Redefinir chave de autorização"
msgid "Reset authorization key?"
-msgstr ""
+msgstr "Redefinir chave de autorização?"
msgid "Reset health check access token"
msgstr "Recriar o token de status de saúde"
msgid "Reset key"
-msgstr ""
+msgstr "Redefinir chave"
msgid "Reset runners registration token"
msgstr "Recriar o token de registro de runners"
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
-msgstr ""
+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."
msgid "Resolve all discussions in new issue"
msgstr "Resolver todas discussões em novo issue"
@@ -8016,10 +8358,10 @@ msgid "Resolve discussion"
msgstr "Resolver discussão"
msgid "Resolved"
-msgstr ""
+msgstr "Resolvido"
msgid "Response"
-msgstr ""
+msgstr "Resposta"
msgid "Response metrics (AWS ELB)"
msgstr "Métricas de resposta (AWS ELB)"
@@ -8031,7 +8373,7 @@ msgid "Response metrics (HA Proxy)"
msgstr "Métricas de resposta (HA Proxy)"
msgid "Response metrics (NGINX Ingress VTS)"
-msgstr ""
+msgstr "Métricas de resposta (NGINX Ingress VTS)"
msgid "Response metrics (NGINX Ingress)"
msgstr "Métricas de resposta (NGINX Ingress)"
@@ -8143,6 +8485,9 @@ msgstr "Você usou todos os seus minutos compartilhados para executores."
msgid "Running"
msgstr "Executando"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8173,11 +8518,14 @@ msgstr "Chave SSH pública"
msgid "SSL Verification"
msgstr "Verificação SSL"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "Salvar"
msgid "Save Changes"
-msgstr ""
+msgstr "Salvar alterações"
msgid "Save application"
msgstr "Salvar aplicativo"
@@ -8189,7 +8537,7 @@ msgid "Save changes before testing"
msgstr "Salvar alterações antes de testar"
msgid "Save comment"
-msgstr ""
+msgstr "Salvar comentário"
msgid "Save pipeline schedule"
msgstr "Salvar agendamento da pipeline"
@@ -8206,6 +8554,9 @@ msgstr "Agendado"
msgid "Schedules"
msgstr "Agendamentos"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Agendando pipelines"
@@ -8266,6 +8617,9 @@ msgstr "Pesquisar projetos"
msgid "Search users"
msgstr "Procurar usuários"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "Pesquisar nos seus projetos"
@@ -8372,7 +8726,7 @@ msgid "See metrics"
msgstr ""
msgid "See the affected projects in the GitLab admin panel"
-msgstr ""
+msgstr "Veja os projetos afetados no painel de administração do GitLab"
msgid "Select"
msgstr "Selecionar"
@@ -8402,7 +8756,7 @@ msgid "Select branch/tag"
msgstr "Selecionar o branch/tag"
msgid "Select members to invite"
-msgstr ""
+msgstr "Selecione membros para convidar"
msgid "Select project"
msgstr "Selecionar projeto"
@@ -8438,7 +8792,7 @@ msgid "Send email"
msgstr "Enviar e-mail"
msgid "Send report"
-msgstr ""
+msgstr "Enviar relatório"
msgid "Send usage data"
msgstr "Enviar dados de uso"
@@ -8524,6 +8878,9 @@ msgstr "Definir repositório de modelos para toda a instância"
msgid "Set max session time for web terminal."
msgstr "Defina o tempo máximo da sessão para o terminal da web."
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "Definir notificação por e-mail para relatórios de abuso."
@@ -8548,6 +8905,9 @@ msgstr "Configurar asserções/atributos/alegações (email, first_name, last_na
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 "Configure seu projeto para fazer push e/ou pull de um repositório para outro automaticamente. Branches, tags e commits serão sincronizados automaticamente."
@@ -8605,9 +8965,15 @@ msgstr "Redefinir minutos usados de pipeline"
msgid "Sherlock Transactions"
msgstr "Transações de Sherlock"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "Exibir comando"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "Visualizar raw log completo"
@@ -8653,19 +9019,19 @@ msgid "Sign in / Register"
msgstr "Entrar / Criar conta"
msgid "Sign in to \"%{group_name}\""
-msgstr ""
+msgstr "Entrar em \"%{group_name}\""
msgid "Sign in using smart card"
-msgstr ""
+msgstr "Entrar usando o cartão inteligente"
msgid "Sign in via 2FA code"
-msgstr ""
+msgstr "Entrar via código da A2F"
msgid "Sign in with Single Sign-On"
msgstr "Entre com logon único"
msgid "Sign in with smart card"
-msgstr ""
+msgstr "Entrar com cartão inteligente"
msgid "Sign out"
msgstr "Sair"
@@ -8677,7 +9043,7 @@ msgid "Sign-up restrictions"
msgstr "Restrições de cadastro"
msgid "Similar issues"
-msgstr ""
+msgstr "Issues semelhantes"
msgid "Size"
msgstr "Tamanho"
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr "Snippets"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ msgstr "Atividade dos projetos favoritos"
msgid "Starred projects"
msgstr "Projetos favoritos"
+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 "Stars"
msgstr ""
@@ -9016,13 +9406,13 @@ msgid "Started"
msgstr "Iniciado"
msgid "Started %{startsIn}"
-msgstr ""
+msgstr "Iniciado %{startsIn}"
msgid "Starting..."
-msgstr ""
+msgstr "Iniciando..."
msgid "Starts %{startsIn}"
-msgstr ""
+msgstr "Inicia %{startsIn}"
msgid "Starts at (UTC)"
msgstr "Começa em (UTC)"
@@ -9034,10 +9424,10 @@ msgid "Status"
msgstr "Status"
msgid "Status:"
-msgstr ""
+msgstr "Status:"
msgid "Stop Terminal"
-msgstr ""
+msgstr "Parar terminal"
msgid "Stop environment"
msgstr "Parar o ambiente"
@@ -9055,7 +9445,7 @@ msgid "Stopping this environment is currently not possible as a deployment is in
msgstr "Não é possível parar esse ambiente no momento pois um deploy está em andamento"
msgid "Stopping..."
-msgstr ""
+msgstr "Parando..."
msgid "Storage"
msgstr "Armazenamento"
@@ -9073,7 +9463,7 @@ msgid "Submit as spam"
msgstr "Enviar como spam"
msgid "Submit feedback"
-msgstr ""
+msgstr "Enviar feedback"
msgid "Submit review"
msgstr "Enviar análise"
@@ -9091,7 +9481,7 @@ msgid "Subscribe at project level"
msgstr "Inscrever-se no nível do projeto"
msgid "Subscribe to RSS feed"
-msgstr ""
+msgstr "Inscrever-se no feed RSS"
msgid "Subscribe to calendar"
msgstr ""
@@ -9100,16 +9490,16 @@ msgid "Subscribed"
msgstr "Inscrito"
msgid "SubscriptionTable|Billing"
-msgstr ""
+msgstr "Cobrança"
msgid "SubscriptionTable|Free"
-msgstr ""
+msgstr "Grátis"
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|GitLab.com %{planName} %{suffix}"
-msgstr ""
+msgstr "GitLab.com %{planName} %{suffix}"
msgid "SubscriptionTable|Last invoice"
msgstr ""
@@ -9154,7 +9544,7 @@ msgid "SubscriptionTable|This is the number of seats you will be required to pur
msgstr ""
msgid "SubscriptionTable|Trial"
-msgstr ""
+msgstr "Avaliação"
msgid "SubscriptionTable|Trial end date"
msgstr ""
@@ -9175,7 +9565,7 @@ msgid "Suggested change"
msgstr ""
msgid "Sunday"
-msgstr ""
+msgstr "Domingo"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr "Trocar branch/tag"
msgid "Sync information"
msgstr "Informação de sincronização"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "Hooks do sistema"
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "O tamanho máximo do arquivo é de 200KB."
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "A senha necessária para descriptografar a chave privada. Isso é opcional e o seu valor é criptografado."
@@ -9498,6 +9894,9 @@ msgstr "Houve um erro ao excluir a tarefa."
msgid "There was an error loading users activity calendar."
msgstr "Erro ao carregar calendário de atividades."
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "Erro ao salvar suas configurações de notificação."
@@ -9543,6 +9942,21 @@ msgstr "O escopo deste painel está reduzido"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr "Esse branch mudou desde quando você começou sua edição. Você quer criar um novo branch?"
+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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr "Esse container registry foi agendado para exclusão."
@@ -9564,6 +9978,9 @@ msgstr "Esse diretório"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "Esse grupo"
@@ -9648,6 +10065,12 @@ msgstr "Isto significa que você não pode entregar código até que crie um rep
msgid "This merge request is locked."
msgstr "Esse merge request está bloqueado."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "Esta opção está desativada porque você não tem permissões de escrita para o branch atual"
@@ -10103,7 +10526,7 @@ msgid "Try again"
msgstr "Tente novamente"
msgid "Try again?"
-msgstr ""
+msgstr "Tentar novamente?"
msgid "Try all GitLab has to offer for 30 days."
msgstr "Use tudo que o GitLab tem para oferecer por 30 dias."
@@ -10207,6 +10630,9 @@ msgstr "Em breve"
msgid "Update"
msgstr "Atualizar"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr "Atualizar agora"
msgid "Update your group name, description, avatar, and visibility."
msgstr "Atualize o nome do seu grupo, descrição, avatar e visibilidade."
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "Atualizando"
@@ -10343,7 +10772,7 @@ msgid "UserProfile|Most Recent Activity"
msgstr "Atividade mais recente"
msgid "UserProfile|No snippets found."
-msgstr ""
+msgstr "Nenhum snippet encontrado."
msgid "UserProfile|Overview"
msgstr "Visão geral"
@@ -10358,19 +10787,19 @@ msgid "UserProfile|Snippets"
msgstr "Snippets"
msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
-msgstr ""
+msgstr "Snippets no GitLab podem ser privados, internos ou públicos."
msgid "UserProfile|Subscribe"
msgstr "Inscrever-se"
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "Este usuário não tem nenhum projeto pessoal"
msgid "UserProfile|This user has a private profile"
msgstr "Este usuário tem um perfil privado"
msgid "UserProfile|This user hasn't contributed to any projects"
-msgstr ""
+msgstr "Este usuário não contribuiu para nenhum projeto"
msgid "UserProfile|View all"
msgstr "Ver tudo"
@@ -10385,10 +10814,10 @@ msgid "UserProfile|You haven't created any personal projects."
msgstr ""
msgid "UserProfile|You haven't created any snippets."
-msgstr ""
+msgstr "Você não criou nenhum snippet."
msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
-msgstr ""
+msgstr "Seus projetos podem estar disponíveis publicamente, internamente ou privadamente, à sua escolha."
msgid "Users"
msgstr "Usuários"
@@ -10412,7 +10841,7 @@ msgid "Various email settings."
msgstr "Várias configurações de email."
msgid "Various localization settings."
-msgstr ""
+msgstr "Várias configurações de localização."
msgid "Various settings that affect GitLab performance."
msgstr "Várias configurações que afetam o desempenho do GitLab."
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr "Ver documentação"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "Ve lista de épicos"
@@ -10453,6 +10885,9 @@ msgstr "Ver arquivo @ "
msgid "View group labels"
msgstr "Visualizar etiquetas de grupo"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "Ver issue"
@@ -10756,6 +11191,9 @@ msgstr "Com a análise de contribuições, você pode ter uma visão geral da at
msgid "Withdraw Access Request"
msgstr "Remover Requisição de Acesso"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10775,7 +11213,7 @@ msgid "Yesterday"
msgstr "Ontem"
msgid "You"
-msgstr ""
+msgstr "Você"
msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr "Você é um administrador, o que significa que conceder acesso a <strong>%{client_name}</strong> permitirá que eles também interajam com o GitLab como administrador. Prossiga com cuidado."
@@ -10861,6 +11299,9 @@ msgstr ""
msgid "You have no permissions"
msgstr "Você não tem permissão"
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Você atingiu o limite de seu projeto"
@@ -10921,6 +11362,9 @@ msgstr "Você não poderá fazer push ou pull do código via SSH enquanto não a
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Você precisará usar nomes de branch diferentes para obter uma comparação válida."
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr "Você está recebendo este e-mail porque %{reason}."
@@ -11014,6 +11458,9 @@ msgstr "atribuir a si mesmo"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "nome da branch"
@@ -11097,6 +11544,9 @@ msgstr "Qualidade do código"
msgid "ciReport|Confidence"
msgstr "Confiança"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "Fazer scan no container"
@@ -11191,9 +11641,6 @@ msgstr "Sem mudanças nas métricas de desempenho"
msgid "ciReport|Performance metrics"
msgstr "Métricas de desempenho"
-msgid "ciReport|Revert dismissal"
-msgstr "Reverter ignorar"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11233,6 +11680,9 @@ msgstr "Ocorreu um erro ao carregar o relatório de verificação de dependênci
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "Houve um erro ao reverter o descarte. Por favor, tente novamente."
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "Atualizar %{name} de %{version} para %{fixed}."
@@ -11325,9 +11775,6 @@ msgstr "ajuda"
msgid "here"
msgstr "aqui"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://seu-servidor-do-bitbucket"
@@ -11446,6 +11893,9 @@ msgstr "Ocorreu um erro ao enviar sua aprovação."
msgid "mrWidget|Approve"
msgstr "Aprovar"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "Aprovado por"
@@ -11518,6 +11968,9 @@ msgstr "Fazer merge localmente"
msgid "mrWidget|Merge request approved"
msgstr "Merge request aprovado"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "Merge request aprovado; você pode adicionalmente"
@@ -11579,6 +12032,9 @@ msgstr "Reverter"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "Reverter esse merge request com um novo merge request"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "Definir por"
@@ -11658,7 +12114,7 @@ msgid "new merge request"
msgstr "novo merge request"
msgid "none"
-msgstr ""
+msgstr "nenhum"
msgid "notification emails"
msgstr "e-mails de notificação"
@@ -11692,7 +12148,7 @@ msgid "personal access token"
msgstr "token de acesso pessoal"
msgid "private"
-msgstr ""
+msgstr "privado"
msgid "private key does not match certificate."
msgstr "chave privada não corresponde ao certificado."
@@ -11703,10 +12159,10 @@ msgstr[0] "projeto"
msgstr[1] "projetos"
msgid "quick actions"
-msgstr ""
+msgstr "ações rápidas"
msgid "register"
-msgstr ""
+msgstr "registrar"
msgid "remaining"
msgstr "restante"
@@ -11738,7 +12194,7 @@ msgid "show less"
msgstr ""
msgid "sign in"
-msgstr ""
+msgstr "entrar"
msgid "source"
msgstr "origem"
@@ -11771,7 +12227,7 @@ msgid "triggered"
msgstr ""
msgid "updated"
-msgstr ""
+msgstr "atualizado"
msgid "username"
msgstr "nome do usuário"
@@ -11780,7 +12236,7 @@ msgid "uses Kubernetes clusters to deploy your code!"
msgstr "use clusters Kubernetes para deploy do seu código!"
msgid "verify ownership"
-msgstr ""
+msgstr "verificar propriedade"
msgid "view it on GitLab"
msgstr "ver no GitLab"
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 1584a4159cc..2d43d0ebe4d 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:08\n"
+"PO-Revision-Date: 2019-03-06 15:17\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index 17805691aff..e4b0be5e2a8 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:07\n"
+"PO-Revision-Date: 2019-03-06 15:16\n"
msgid " Status"
msgstr ""
@@ -45,6 +45,12 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -141,12 +147,27 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -165,15 +186,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -249,6 +270,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -273,6 +297,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -384,6 +414,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -399,6 +444,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -483,24 +531,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -669,6 +744,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -681,6 +759,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -750,7 +831,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -762,6 +843,15 @@ 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 previewing the blob"
msgstr ""
@@ -774,6 +864,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -810,6 +903,9 @@ 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 getting projects"
msgstr ""
@@ -867,12 +963,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -963,6 +1065,48 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1005,9 +1149,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1092,6 +1242,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1107,9 +1260,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1668,6 +1818,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1704,6 +1857,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1716,6 +1872,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1782,9 +1941,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1944,6 +2100,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1959,9 +2118,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2007,10 +2163,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2049,6 +2205,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2145,7 +2304,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2160,9 +2319,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2208,9 +2364,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2448,15 +2601,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2757,6 +2922,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3246,6 +3414,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3324,6 +3495,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3495,6 +3669,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3531,6 +3708,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3549,9 +3729,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3576,6 +3753,12 @@ 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 ""
@@ -3627,15 +3810,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3648,6 +3849,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3699,6 +3912,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3768,6 +3984,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3846,6 +4089,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3933,7 +4179,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3999,9 +4245,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4059,9 +4302,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4149,9 +4389,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4266,7 +4503,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4296,9 +4533,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4731,15 +4974,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4797,6 +5049,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5166,9 +5421,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5220,6 +5490,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5274,6 +5550,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5292,6 +5571,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5334,7 +5616,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5523,6 +5805,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5607,6 +5892,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5781,6 +6069,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5826,6 +6123,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5853,36 +6153,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5937,6 +6207,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6087,9 +6360,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6234,6 +6504,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6312,13 +6585,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6381,9 +6654,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6411,13 +6690,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6513,6 +6795,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6717,6 +7002,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6726,6 +7014,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6918,6 +7209,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6933,6 +7230,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7053,9 +7353,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7065,9 +7377,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7092,6 +7413,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7290,9 +7614,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7392,6 +7713,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7434,6 +7758,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7533,6 +7860,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7893,6 +8223,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8028,6 +8364,21 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Resend invite"
msgstr ""
@@ -8187,6 +8538,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8217,6 +8571,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8250,6 +8607,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8310,6 +8670,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8568,6 +8931,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8592,6 +8958,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8649,9 +9018,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8751,6 +9126,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9021,6 +9414,12 @@ 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 "Stars"
msgstr ""
@@ -9231,6 +9630,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9420,6 +9822,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9543,6 +9948,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9588,6 +9996,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9609,6 +10032,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9693,6 +10119,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10254,6 +10686,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10263,6 +10698,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10491,6 +10929,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10500,6 +10941,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10803,6 +11247,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10908,6 +11355,9 @@ 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 ""
@@ -10968,6 +11418,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11061,6 +11514,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11148,6 +11604,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11244,9 +11703,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11286,6 +11742,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11382,9 +11841,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11505,6 +11961,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11577,6 +12036,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11640,6 +12102,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index b5db3291862..ee94200a9f7 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:09\n"
+"PO-Revision-Date: 2019-03-06 15:18\n"
msgid " Status"
msgstr " СтатуÑ"
@@ -47,6 +47,13 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "\"%{query}\" в проектах"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d коммит"
@@ -156,12 +163,28 @@ msgstr "%{counter_storage} (%{counter_repositories} репозиториев, %{
msgid "%{count} %{alerts}"
msgstr "%{count} %{alerts}"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "Ещё %{count} иÑполнителей"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} учаÑтник"
@@ -182,15 +205,15 @@ msgstr "%{filePath} удален"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} + ещё %{labelCount}"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} будет удален! Вы уверены?"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -270,6 +293,9 @@ msgstr "+ ещё %{count}"
msgid "+ %{moreCount} more"
msgstr "+ ещё %{moreCount}"
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -296,6 +322,13 @@ msgstr[1] "%{count} модификаций типа %{type}"
msgstr[2] "%{count} модификаций типа %{type}"
msgstr[3] "%{count} модификаций типа %{type}"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "1 закрытое обÑуждение"
@@ -416,6 +449,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "Графики непрерывной интеграции (CI)"
@@ -431,6 +479,9 @@ msgstr "Сотрудник группы по борьбе Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸ÑÐ
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "Ð’ проекте вы размещаете Ñвои файлы (репозиторий), планируете Ñвою работу (обÑуждениÑ), и публикуете документацию (wiki), %{among_other_things_link}."
@@ -515,24 +566,51 @@ msgstr "Добавить Kubernetes клаÑтер"
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "Добавить таблицу"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "Добавить комментарий"
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr "Добавить комментарий к изображению"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "Добавить лицензию"
@@ -701,6 +779,9 @@ msgstr ""
msgid "Advanced settings"
msgstr "РаÑширенные наÑтройки"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "Предупреждение"
@@ -714,6 +795,9 @@ msgstr ""
msgid "All"
msgstr "Ð’Ñе"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "Ð’Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ñ„Ð¸ÐºÑированы"
@@ -783,7 +867,7 @@ msgstr ""
msgid "An error has occurred"
msgstr "Произошла ошибка"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -795,6 +879,15 @@ 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 previewing the blob"
msgstr "Произошла ошибка при предварительном проÑмотре объекта"
@@ -807,6 +900,9 @@ msgstr "Произошла ошибка при обновлении веÑа оÐ
msgid "An error occurred while adding approver"
msgstr "Произошла ошибка при добавлении одобрÑющего"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка"
@@ -843,6 +939,9 @@ 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 getting projects"
msgstr "Произошла ошибка при получении ÑпиÑка проектов"
@@ -900,12 +999,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr "Произошла ошибка при Ñохранении ответÑтвенных"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -996,6 +1101,52 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1038,9 +1189,15 @@ msgstr "Ð’Ñ‹ уверены, что вы хотите заново ÑгенерÐ
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Вы уверены, что вы хотите удалить %{group_name}?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1125,6 +1282,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr "ОтветÑтвенный(ные)"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1140,9 +1300,6 @@ msgstr "Ðвг."
msgid "August"
msgstr "ÐвгуÑÑ‚"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Журнал аутентификации"
@@ -1701,6 +1858,9 @@ msgstr "Ðет возможноÑти объединить автоматичеÑ
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Ðевозможно изменить управлÑемый клаÑтер Kubernetes"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1737,6 +1897,9 @@ msgstr "Отменить"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Это ÑоздаÑÑ‚ новый коммит Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы откатить ÑущеÑтвующие изменениÑ."
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1749,6 +1912,9 @@ msgstr "Диаграммы"
msgid "Chat"
msgstr "Чат"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1815,9 +1981,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr "Выберите, какие репозитории вы хотите импортировать."
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1977,6 +2140,9 @@ msgstr "Клонировать репозиторий"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1992,9 +2158,6 @@ msgstr ""
msgid "Closed"
msgstr "Закрыто"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "Закрытые обÑуждениÑ"
@@ -2040,12 +2203,12 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "Произошла ошибка при попытке Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð·Ð¾Ð½ проекта: %{error}"
-
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 ""
@@ -2082,6 +2245,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2178,7 +2344,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2193,9 +2359,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "УÑтановить"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr "УÑтановлен"
@@ -2241,9 +2404,6 @@ msgstr "КлаÑтер Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ клаÑтере Kubernetes"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "КлаÑтер Kubernetes ÑоздаётÑÑ Ð² Google Kubernetes Engine..."
@@ -2481,15 +2641,27 @@ msgstr "зарегиÑтрироватьÑÑ"
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr "Владельцы кода"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Когорты"
msgid "Collapse"
msgstr "Свернуть"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Свернуть боковую панель"
@@ -2791,6 +2963,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3281,6 +3456,9 @@ msgstr ""
msgid "Description:"
msgstr "ОпиÑание:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3359,6 +3537,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3530,6 +3711,9 @@ msgstr "Включить Ð´Ð»Ñ Ñтого проекта"
msgid "Enable group Runners"
msgstr "Включить групповые обработчики заданий"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3566,6 +3750,9 @@ msgstr "ЗаканчиваетÑÑ Ð² (UTC)"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3584,9 +3771,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr "Введите заголовок запроÑа на ÑлиÑние"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3611,6 +3795,12 @@ 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 ""
@@ -3662,15 +3852,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr "Показать вÑе"
@@ -3683,6 +3891,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "Обновлено"
@@ -3734,6 +3954,9 @@ msgstr "Отчеты об ошибках и журналирование"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3803,6 +4026,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3881,6 +4131,9 @@ msgstr "Развернуть"
msgid "Expand all"
msgstr "Развернуть вÑе"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Развернуть боковую панель"
@@ -3968,7 +4221,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4034,9 +4287,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "ОпиÑание"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4094,9 +4344,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr "СтатуÑ"
@@ -4185,9 +4432,6 @@ msgstr ""
msgid "Filter..."
msgstr "Фильтр..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "ПоиÑк по пути"
@@ -4302,8 +4546,8 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
-msgstr "Из %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr ""
@@ -4332,9 +4576,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG Ключи"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "ОÑновныe"
@@ -4767,15 +5017,24 @@ msgstr ""
msgid "Go Back"
msgstr "ВернутьÑÑ Ð½Ð°Ð·Ð°Ð´"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "ВернутьÑÑ"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4833,6 +5092,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "Ðазвание группы"
@@ -5203,9 +5465,24 @@ msgstr "Импорт репозиториÑ"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5257,6 +5534,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5312,6 +5595,9 @@ msgstr "Внедрение Цикла Ðналитик"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5330,6 +5616,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "ОбÑуждение"
@@ -5372,8 +5661,8 @@ msgstr "ОбÑуждениÑми могут быть ошибки, задачи
msgid "Issues closed"
msgstr "ОбÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹"
-msgid "Issues, merge requests, pushes and comments."
-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 ""
@@ -5561,6 +5850,9 @@ msgstr "ПеренеÑти Метку"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5646,6 +5938,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "Узнайте больше в"
@@ -5821,6 +6116,15 @@ msgstr ""
msgid "Logs"
msgstr "Журналы"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5866,6 +6170,9 @@ msgstr "МанифеÑÑ‚"
msgid "Manifest file import"
msgstr "Импорт файла манифеÑта"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5893,36 +6200,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr "Включен режим Markdown"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5977,6 +6254,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -6127,9 +6407,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6274,6 +6551,9 @@ msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
msgid "More information is available|here"
msgstr "Больше информации доÑтупно|тут"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6353,15 +6633,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "Ðовое РаÑпиÑание Сборочной Линии"
msgid "New Snippet"
msgstr "Ðовый пример кода"
-msgid "New Snippets"
-msgstr "Ðовые примеры кода"
-
msgid "New branch"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
@@ -6422,9 +6702,15 @@ msgstr ""
msgid "No"
msgstr "Ðет"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6452,13 +6738,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "Плановый Ñрок не указан"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6554,6 +6843,9 @@ msgstr "ÐедоÑтаточно данных"
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Обратите внимание, что маÑтер ветка автоматичеÑки защищена. %{link_to_protected_branches}"
@@ -6759,6 +7051,9 @@ msgstr "Операции"
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6768,6 +7063,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6960,6 +7258,12 @@ msgstr "Переменные"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "ÐаÑтраиваемый"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "Сборочные линии"
@@ -6975,6 +7279,9 @@ msgstr "Сборочные линии за поÑледнюю неделю"
msgid "Pipelines for last year"
msgstr "Сборочные линии за поÑледний год"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7095,9 +7402,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7107,9 +7426,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "ПожалуйÑта, выберите по крайней мере один фильтр, чтобы увидеть результаты"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "ПожалуйÑта, решите reCAPTCHA"
@@ -7134,6 +7462,9 @@ msgstr "ПредпочтениÑ"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7332,9 +7663,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7434,6 +7762,9 @@ msgstr ""
msgid "Project"
msgstr "Проект"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "Проект '%{project_name}' находитÑÑ Ð² процеÑÑе удалениÑ."
@@ -7476,6 +7807,9 @@ msgstr "ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ ÑÑылки на проект. СÐ
msgid "Project export started. A download link will be sent by email."
msgstr "Ðачат ÑкÑпорт проекта. СÑылка Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отправлена по Ñлектронной почте."
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7575,6 +7909,9 @@ msgstr ""
msgid "Projects"
msgstr "Проекты"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7936,6 +8273,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "Удалить аватар"
@@ -8071,6 +8414,23 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Resend invite"
msgstr ""
@@ -8231,6 +8591,9 @@ msgstr ""
msgid "Running"
msgstr "ВыполнÑетÑÑ"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8261,6 +8624,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "Сохранить"
@@ -8294,6 +8660,9 @@ msgstr "Запланировано"
msgid "Schedules"
msgstr "РаÑпиÑаниÑ"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "Планирование Сборочных Линий"
@@ -8354,6 +8723,9 @@ msgstr ""
msgid "Search users"
msgstr "ПоиÑк пользователей"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8612,6 +8984,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr "УÑтановить макÑимальное Ð²Ñ€ÐµÐ¼Ñ ÑеанÑа Ð´Ð»Ñ Ð²ÐµÐ±-терминала."
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "ÐаÑтроить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте Ð´Ð»Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ злоупотреблениÑÑ…."
@@ -8636,6 +9011,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8693,9 +9071,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "Показать команду"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8796,6 +9180,24 @@ msgstr ""
msgid "Snippets"
msgstr "Примеры кода"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9066,6 +9468,12 @@ 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 "Stars"
msgstr ""
@@ -9276,6 +9684,9 @@ msgstr "Переключить ветка/тег"
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "СиÑтемные Обработчики"
@@ -9465,6 +9876,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "МакÑимально допуÑтимый размер файла ÑоÑтавлÑет 200 Кб."
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9588,6 +10002,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "Произошла ошибка при Ñохранении наÑтроек уведомлений."
@@ -9633,6 +10050,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9654,6 +10086,9 @@ msgstr "Этот каталог"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9738,6 +10173,12 @@ msgstr "Это означает, что вы не можете отправитÑ
msgid "This merge request is locked."
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован."
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10301,6 +10742,9 @@ msgstr ""
msgid "Update"
msgstr "Обновить"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10310,6 +10754,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr "Обновить наименование вашей группы, её опиÑание, аватар и видимоÑÑ‚ÑŒ."
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10538,6 +10985,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "Показать ÑпиÑок целей"
@@ -10547,6 +10997,9 @@ msgstr "ПроÑмотр файла @ "
msgid "View group labels"
msgstr "ПроÑмотр меток группы"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "ПроÑмотр обÑуждениÑ"
@@ -10850,6 +11303,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10955,6 +11411,9 @@ 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 "Ð’Ñ‹ доÑтигли Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² вашем проекте"
@@ -11015,6 +11474,9 @@ msgstr "Ð’Ñ‹ не Ñможете работать Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¾Ð¼ через
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ нужно иÑпользовать разные имена веток."
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11108,6 +11570,9 @@ msgstr "назначить ÑебÑ"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "Ð¸Ð¼Ñ Ð²ÐµÑ‚Ð²Ð¸"
@@ -11199,6 +11664,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11297,9 +11765,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11339,6 +11804,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11439,9 +11907,6 @@ msgstr "помощь"
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11564,6 +12029,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr "Одобрить"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "Одобрено"
@@ -11636,6 +12104,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние одобрен"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние одобрен; вы можете дополнительно одобрить"
@@ -11701,6 +12172,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index a76359352a9..e1d860895f6 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:09\n"
+"PO-Revision-Date: 2019-03-06 15:19\n"
msgid " Status"
msgstr ""
@@ -47,6 +47,13 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -156,12 +163,28 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -182,15 +205,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -270,6 +293,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -296,6 +322,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -416,6 +449,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -431,6 +479,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -515,24 +566,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -701,6 +779,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -714,6 +795,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -783,7 +867,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -795,6 +879,15 @@ 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 previewing the blob"
msgstr ""
@@ -807,6 +900,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -843,6 +939,9 @@ 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 getting projects"
msgstr ""
@@ -900,12 +999,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -996,6 +1101,52 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1038,9 +1189,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1125,6 +1282,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1140,9 +1300,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1701,6 +1858,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1737,6 +1897,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1749,6 +1912,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1815,9 +1981,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1977,6 +2140,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1992,9 +2158,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2040,10 +2203,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2082,6 +2245,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2178,7 +2344,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2193,9 +2359,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2241,9 +2404,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2481,15 +2641,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2791,6 +2963,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3281,6 +3456,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3359,6 +3537,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3530,6 +3711,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3566,6 +3750,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3584,9 +3771,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3611,6 +3795,12 @@ 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 ""
@@ -3662,15 +3852,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3683,6 +3891,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3734,6 +3954,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3803,6 +4026,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3881,6 +4131,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3968,7 +4221,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -4034,9 +4287,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4094,9 +4344,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4185,9 +4432,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4302,7 +4546,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4332,9 +4576,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4767,15 +5017,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4833,6 +5092,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5203,9 +5465,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5257,6 +5534,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5312,6 +5595,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5330,6 +5616,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5372,7 +5661,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5561,6 +5850,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5646,6 +5938,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5821,6 +6116,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5866,6 +6170,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5893,36 +6200,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5977,6 +6254,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6127,9 +6407,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6274,6 +6551,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6353,13 +6633,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6422,9 +6702,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6452,13 +6738,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6554,6 +6843,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6759,6 +7051,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6768,6 +7063,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6960,6 +7258,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6975,6 +7279,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7095,9 +7402,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7107,9 +7426,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7134,6 +7462,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7332,9 +7663,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7434,6 +7762,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7476,6 +7807,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7575,6 +7909,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7936,6 +8273,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8071,6 +8414,23 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Resend invite"
msgstr ""
@@ -8231,6 +8591,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8261,6 +8624,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8294,6 +8660,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8354,6 +8723,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8612,6 +8984,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8636,6 +9011,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8693,9 +9071,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8796,6 +9180,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9066,6 +9468,12 @@ 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 "Stars"
msgstr ""
@@ -9276,6 +9684,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9465,6 +9876,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9588,6 +10002,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9633,6 +10050,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9654,6 +10086,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9738,6 +10173,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10301,6 +10742,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10310,6 +10754,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10538,6 +10985,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10547,6 +10997,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10850,6 +11303,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10955,6 +11411,9 @@ 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 ""
@@ -11015,6 +11474,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11108,6 +11570,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11199,6 +11664,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11297,9 +11765,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11339,6 +11804,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11439,9 +11907,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11564,6 +12029,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11636,6 +12104,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11701,6 +12172,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 3774bd3ad14..cb3bb5e42a1 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:07\n"
+"PO-Revision-Date: 2019-03-06 15:16\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 85059aa0f90..25f70503b18 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:09\n"
+"PO-Revision-Date: 2019-03-06 15:19\n"
msgid " Status"
msgstr ""
@@ -45,6 +45,12 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -141,12 +147,27 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -165,15 +186,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -249,6 +270,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -273,6 +297,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -384,6 +414,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -399,6 +444,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -483,24 +531,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -669,6 +744,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -681,6 +759,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -750,7 +831,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -762,6 +843,15 @@ 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 previewing the blob"
msgstr ""
@@ -774,6 +864,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -810,6 +903,9 @@ 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 getting projects"
msgstr ""
@@ -867,12 +963,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -963,6 +1065,48 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1005,9 +1149,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1092,6 +1242,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1107,9 +1260,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1668,6 +1818,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1704,6 +1857,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1716,6 +1872,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1782,9 +1941,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1944,6 +2100,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1959,9 +2118,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2007,10 +2163,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2049,6 +2205,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2145,7 +2304,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2160,9 +2319,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2208,9 +2364,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2448,15 +2601,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2757,6 +2922,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3246,6 +3414,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3324,6 +3495,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3495,6 +3669,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3531,6 +3708,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3549,9 +3729,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3576,6 +3753,12 @@ 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 ""
@@ -3627,15 +3810,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3648,6 +3849,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3699,6 +3912,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3768,6 +3984,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3846,6 +4089,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3933,7 +4179,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3999,9 +4245,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4059,9 +4302,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4149,9 +4389,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4266,7 +4503,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4296,9 +4533,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4731,15 +4974,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4797,6 +5049,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5166,9 +5421,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5220,6 +5490,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5274,6 +5550,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5292,6 +5571,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5334,7 +5616,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5523,6 +5805,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5607,6 +5892,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5781,6 +6069,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5826,6 +6123,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5853,36 +6153,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5937,6 +6207,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6087,9 +6360,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6234,6 +6504,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6312,13 +6585,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6381,9 +6654,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6411,13 +6690,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6513,6 +6795,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6717,6 +7002,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6726,6 +7014,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6918,6 +7209,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6933,6 +7230,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7053,9 +7353,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7065,9 +7377,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7092,6 +7413,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7290,9 +7614,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7392,6 +7713,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7434,6 +7758,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7533,6 +7860,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7893,6 +8223,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8028,6 +8364,21 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Resend invite"
msgstr ""
@@ -8187,6 +8538,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8217,6 +8571,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8250,6 +8607,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8310,6 +8670,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8568,6 +8931,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8592,6 +8958,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8649,9 +9018,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8751,6 +9126,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9021,6 +9414,12 @@ 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 "Stars"
msgstr ""
@@ -9231,6 +9630,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9420,6 +9822,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9543,6 +9948,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9588,6 +9996,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9609,6 +10032,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9693,6 +10119,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10254,6 +10686,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10263,6 +10698,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10491,6 +10929,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10500,6 +10941,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10803,6 +11247,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10908,6 +11355,9 @@ 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 ""
@@ -10968,6 +11418,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11061,6 +11514,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11148,6 +11604,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11244,9 +11703,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11286,6 +11742,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11382,9 +11841,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11505,6 +11961,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11577,6 +12036,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11640,6 +12102,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 1a877ebde6e..f60a4196aec 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:09\n"
+"PO-Revision-Date: 2019-03-06 15:18\n"
msgid " Status"
msgstr ""
@@ -45,6 +45,12 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -141,12 +147,27 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -165,15 +186,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -249,6 +270,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -273,6 +297,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -384,6 +414,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -399,6 +444,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -483,24 +531,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -669,6 +744,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -681,6 +759,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -750,7 +831,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -762,6 +843,15 @@ 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 previewing the blob"
msgstr ""
@@ -774,6 +864,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -810,6 +903,9 @@ 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 getting projects"
msgstr ""
@@ -867,12 +963,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -963,6 +1065,48 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+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] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -1005,9 +1149,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1092,6 +1242,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1107,9 +1260,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1668,6 +1818,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1704,6 +1857,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1716,6 +1872,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1782,9 +1941,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1944,6 +2100,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1959,9 +2118,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -2007,10 +2163,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2049,6 +2205,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2145,7 +2304,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2160,9 +2319,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2208,9 +2364,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2448,15 +2601,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2757,6 +2922,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3246,6 +3414,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3324,6 +3495,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3495,6 +3669,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3531,6 +3708,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3549,9 +3729,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3576,6 +3753,12 @@ 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 ""
@@ -3627,15 +3810,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3648,6 +3849,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3699,6 +3912,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3768,6 +3984,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3846,6 +4089,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3933,7 +4179,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3999,9 +4245,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4059,9 +4302,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4149,9 +4389,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4266,7 +4503,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4296,9 +4533,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4731,15 +4974,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4797,6 +5049,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5166,9 +5421,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5220,6 +5490,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5274,6 +5550,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5292,6 +5571,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5334,7 +5616,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5523,6 +5805,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5607,6 +5892,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5781,6 +6069,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5826,6 +6123,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5853,36 +6153,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5937,6 +6207,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6087,9 +6360,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6234,6 +6504,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6312,13 +6585,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6381,9 +6654,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6411,13 +6690,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6513,6 +6795,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6717,6 +7002,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6726,6 +7014,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6918,6 +7209,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6933,6 +7230,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7053,9 +7353,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7065,9 +7377,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7092,6 +7413,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7290,9 +7614,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7392,6 +7713,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7434,6 +7758,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7533,6 +7860,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7893,6 +8223,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -8028,6 +8364,21 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Resend invite"
msgstr ""
@@ -8187,6 +8538,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8217,6 +8571,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8250,6 +8607,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8310,6 +8670,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8568,6 +8931,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8592,6 +8958,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8649,9 +9018,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8751,6 +9126,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -9021,6 +9414,12 @@ 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 "Stars"
msgstr ""
@@ -9231,6 +9630,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9420,6 +9822,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9543,6 +9948,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9588,6 +9996,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9609,6 +10032,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9693,6 +10119,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10254,6 +10686,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10263,6 +10698,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10491,6 +10929,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10500,6 +10941,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10803,6 +11247,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10908,6 +11355,9 @@ 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 ""
@@ -10968,6 +11418,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11061,6 +11514,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11148,6 +11604,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11244,9 +11703,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11286,6 +11742,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11382,9 +11841,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11505,6 +11961,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11577,6 +12036,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11640,6 +12102,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 1d66cc3af44..ca342915099 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:10\n"
+"PO-Revision-Date: 2019-03-06 15:20\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index d6f57772b1b..e4c780f147f 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:10\n"
+"PO-Revision-Date: 2019-03-06 15:19\n"
msgid " Status"
msgstr ""
@@ -43,6 +43,11 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
@@ -126,12 +131,26 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -148,15 +167,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -228,6 +247,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -250,6 +272,11 @@ msgid_plural "%{count} %{type} modifications"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -352,6 +379,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr ""
@@ -367,6 +409,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -451,24 +496,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -637,6 +709,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -648,6 +723,9 @@ msgstr ""
msgid "All"
msgstr ""
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -717,7 +795,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -729,6 +807,15 @@ 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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -777,6 +867,9 @@ 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 getting projects"
msgstr ""
@@ -834,12 +927,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -930,6 +1029,44 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1059,6 +1202,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1074,9 +1220,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1635,6 +1778,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1683,6 +1832,9 @@ msgstr ""
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,9 +2078,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3211,6 +3372,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3514,9 +3687,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,6 +3807,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3733,6 +3942,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4230,7 +4460,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,9 +4490,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5296,7 +5571,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5897,6 +6160,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6340,9 +6606,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6675,6 +6953,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7050,6 +7364,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7248,9 +7565,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7392,6 +7709,9 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7491,6 +7811,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8266,6 +8617,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8706,6 +9072,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9498,6 +9894,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10921,6 +11362,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11325,9 +11775,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11446,6 +11893,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index dcdc049d9a6..dd5e8f6db76 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -13,123 +13,142 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:10\n"
+"PO-Revision-Date: 2019-03-06 18:45\n"
msgid " Status"
-msgstr ""
+msgstr " Durum"
msgid " and"
-msgstr ""
+msgstr " ve"
msgid " degraded on %d point"
msgid_plural " degraded on %d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " %d noktasında bozuldu"
+msgstr[1] " %d noktasında bozuldu"
msgid " improved on %d point"
msgid_plural " improved on %d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " %d noktasında geliştirildi"
+msgstr[1] " %d noktalasında geliştirildi"
msgid " or "
-msgstr ""
+msgstr " veya "
msgid " or <#epic id>"
-msgstr ""
+msgstr " veya <#epic id>"
msgid " or <#issue id>"
-msgstr ""
+msgstr " veya <#issue id>"
msgid "\"%{query}\" in projects"
-msgstr ""
+msgstr "\"%{query}\" projelerde"
+
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d yorum"
+msgstr[1] "%d yorum"
msgid "%d commit"
msgid_plural "%d commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d iÅŸlem"
+msgstr[1] "%d iÅŸlem"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d 'e bağlı işlem"
+msgstr[1] "%d 'e bağlı işlem"
msgid "%d commits"
-msgstr ""
+msgstr "%d iÅŸlem"
msgid "%d exporter"
msgid_plural "%d exporters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d dışa aktaran"
+msgstr[1] "%d dışa aktaran"
msgid "%d failed test result"
msgid_plural "%d failed test results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d başarısız test sonucu"
+msgstr[1] "%d başarısız test sonucu"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sabit test sonucu"
+msgstr[1] "%d sabit test sonucu"
msgid "%d issue"
msgid_plural "%d issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sorun"
+msgstr[1] "%d soru"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sorun seçili"
+msgstr[1] "%d sorun seçili"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d katman"
+msgstr[1] "%d katmanlar"
msgid "%d merge request"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d birleÅŸtirme isteÄŸi"
+msgstr[1] "%d birleÅŸtirme isteÄŸi"
msgid "%d metric"
msgid_plural "%d metrics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d metrik"
+msgstr[1] "%d metrik"
msgid "%d staged change"
msgid_plural "%d staged changes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d aşamalı değişiklik"
+msgstr[1] "%d aşamalı değişiklik"
msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d grupsuz deÄŸiÅŸiklik"
+msgstr[1] "%d grupsuz deÄŸiÅŸiklik"
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[0] "%s performans sorunlarını önlemek için ek işlem konulmuştur."
+msgstr[1] "%s performans sorunlarını önlemek için ek işlem konulmuştur."
msgid "%{actionText} & %{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{actionText} ve %{openOrClose} %{noteable}"
msgid "%{authorsName}'s discussion"
-msgstr ""
+msgstr "%{authorsName} kişisinin tartışması"
msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr ""
+msgstr "%{commit_author_link} %{commit_timeago} yazdı"
msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
-msgstr ""
+msgstr "%{counter_storage} (%{counter_repositories} depo, %{counter_build_artifacts} yapı eseri, %{counter_lfs_objects} LFS)"
msgid "%{count} %{alerts}"
+msgstr "%{count} %{alerts}"
+
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
msgid "%{count} more"
-msgstr ""
+msgstr "%{count} daha"
msgid "%{count} more assignees"
+msgstr "%{count} daha fazla atanan"
+
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
msgstr ""
msgid "%{count} participant"
@@ -143,181 +162,189 @@ msgstr[0] ""
msgstr[1] ""
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} silindi"
msgid "%{firstLabel} +%{labelCount} more"
-msgstr ""
-
-msgid "%{firstOption} +%{extraOptionCount} more"
-msgstr ""
+msgstr "%{firstLabel} +%{labelCount} daha"
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 "%{issuableType} will be removed! Are you sure?"
+msgstr "%{issuableType} kaldırılacak! Emin misiniz?"
+
+msgid "%{label_for_message} unavailable"
msgstr ""
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
msgid "%{loadingIcon} Started"
-msgstr ""
+msgstr "%{loadingIcon} Başladı"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
-msgstr ""
+msgstr "%{lock_path} dizini %{lock_user_id} GitLab kullanıcısı tarafından kilitlendi"
msgid "%{name}'s avatar"
-msgstr ""
+msgstr "%{name} kullanıcısının avatarı"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
msgid "%{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{openOrClose} %{noteable}"
msgid "%{percent}%% complete"
-msgstr ""
+msgstr "%{percent}%% tamamlandı"
msgid "%{state} epics"
-msgstr ""
+msgstr "%{state} epik"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{branch_count}%{strong_end} Dal"
+msgstr[1] "%{strong_start}%{branch_count}%{strong_end} Dal"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{commit_count}%{strong_end} Ä°ÅŸlem"
+msgstr[1] "%{strong_start}%{commit_count}%{strong_end} Ä°ÅŸlem"
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} Dosya"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{tag_count}%{strong_end} Etiket"
+msgstr[1] "%{strong_start}%{tag_count}%{strong_end} Etiket"
msgid "%{text} %{files}"
msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{text} %{files}"
+msgstr[1] "%{text} %{files} dosyaları"
msgid "%{text} is available"
-msgstr ""
+msgstr "%{text} kullanılabilir"
msgid "%{title} changes"
-msgstr ""
+msgstr "%{title} deÄŸiÅŸiklik"
msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgstr "%{unstaged} aşamasız ve %{staged} aşamalı değişiklik"
msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "%{user_name} profil sayfası"
msgid "(external source)"
-msgstr ""
+msgstr "(dış kaynak)"
msgid "+ %{count} more"
-msgstr ""
+msgstr "+ %{count} daha"
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} daha fazla"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ", veya "
+
msgid "- Runner is active and can process any new jobs"
-msgstr ""
+msgstr "- Çalıştırıcı aktif ve yeni işler işleyebilir"
msgid "- Runner is paused and will not receive any new jobs"
-msgstr ""
+msgstr "- Çalıştırıcı duraklatıldı ve yeni işler almayacak"
msgid "- show less"
msgstr "- daha az göster"
msgid "1 %{type} addition"
msgid_plural "%{count} %{type} additions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 %{type} ek"
+msgstr[1] "%{count} %{type} ek"
msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 %{type} deÄŸiÅŸiklik"
+msgstr[1] "%{count} %{type} deÄŸiÅŸiklik"
+
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] "1 gün"
+msgstr[1] "%d gün"
msgid "1 closed issue"
msgid_plural "%d closed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 kapatılmış sorun"
+msgstr[1] "%d kapatılmış sorun"
msgid "1 closed merge request"
msgid_plural "%d closed merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 kapatılmış birleştirme talebi"
+msgstr[1] "%d kapatılmış birleştirme talebi"
msgid "1 group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 grup"
+msgstr[1] "%d grup"
msgid "1 merged merge request"
msgid_plural "%d merged merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 birleÅŸtirilmiÅŸ birleÅŸtirme talebi"
+msgstr[1] "%d birleÅŸtirilmiÅŸ birleÅŸtirme talebi"
msgid "1 open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 açık sorun"
+msgstr[1] "%d açık sorun"
msgid "1 open merge request"
msgid_plural "%d open merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 açık birleştirme talebi"
+msgstr[1] "%d açık birleştirme talebi"
msgid "1 pipeline"
msgid_plural "%d pipelines"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 iş hattı"
+msgstr[1] "%d iş hattı"
msgid "1 role"
msgid_plural "%d roles"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 rol"
+msgstr[1] "%d rol"
msgid "1 user"
msgid_plural "%d users"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 kullanıcı"
+msgstr[1] "%d kullanıcı"
msgid "1st contribution!"
msgstr "İlk katkı!"
msgid "2FA"
-msgstr ""
+msgstr "2FA"
msgid "2FA enabled"
-msgstr ""
+msgstr "2FA etkin"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "403|İzin almak için lütfen GitLab yöneticinize başvurun."
msgid "403|You don't have the permission to access this page."
-msgstr ""
+msgstr "403 | Bu sayfaya eriÅŸim izniniz yok."
msgid "404|Make sure the address is correct and the page hasn't moved."
-msgstr ""
+msgstr "404|Adresin doğru olduğundan ve sayfanın taşınmadığından emin olun."
msgid "404|Page Not Found"
-msgstr ""
+msgstr "404|Sayfa Bulunamadı"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
-msgstr ""
+msgstr "404|Lütfen bunun bir hata olduğunu düşünüyorsanız, GitLab yöneticinizle görüşün."
msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
msgstr ""
@@ -335,13 +362,13 @@ msgid "<strong>%{changedFilesLength} unstaged</strong> and <strong>%{stagedFiles
msgstr ""
msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
-msgstr ""
+msgstr "<strong>%{created_count}</strong> oluÅŸturuldu, <strong>%{accepted_count}</strong> kabul edildi."
msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
-msgstr ""
+msgstr "<strong>%{created_count}</strong> oluşturuldu, <strong>%{closed_count}</strong> kapatıldı."
msgid "<strong>%{group_name}</strong> group members"
-msgstr ""
+msgstr "<strong>%{group_name}</strong> grup üyeleri"
msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
msgstr ""
@@ -352,167 +379,212 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
-msgid "A collection of graphs regarding Continuous Integration"
+msgid "A .NET Core console application template, customizable for any .NET Core project"
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 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 collection of graphs regarding Continuous Integration"
+msgstr "Sürekli Entegrasyon için bir grafik derlemesi"
+
msgid "A default branch cannot be chosen for an empty project."
msgstr ""
msgid "A deleted user"
-msgstr ""
+msgstr "Silinmiş kullanıcı"
msgid "A member of GitLab's abuse team will review your report as soon as possible."
msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
+msgstr "Çatalınızdan yeni bir dal oluşturulacak ve yeni bir birleştirme talebi başlatılacak."
+
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
msgid "A regular expression that will be used to find the test coverage output in the job trace. Leave blank to disable"
-msgstr ""
+msgstr "İş izlemede test kapsamı çıktısını bulmak için kullanılacak düzenli bir ifade. Devre dışı bırakmak için boş bırakın"
msgid "A user with write access to the source branch selected this option"
-msgstr ""
+msgstr "Bu dala yazma yetkisi olan kullanıcı bu seçeneği seçti"
msgid "About GitLab"
-msgstr ""
+msgstr "GitLab Hakkında"
msgid "About GitLab CE"
-msgstr ""
+msgstr "GitLab CE hakkında"
msgid "About auto deploy"
-msgstr ""
+msgstr "Otomatik dağıtım hakkında"
msgid "About this feature"
-msgstr ""
+msgstr "Bu özellik hakkında"
msgid "Abuse Reports"
msgstr "Kötüye Kullanım Raporları"
msgid "Abuse reports"
-msgstr ""
+msgstr "Kötüye kullanım raporları"
msgid "Accept invitation"
-msgstr ""
+msgstr "Daveti kabul et"
msgid "Accept terms"
-msgstr ""
+msgstr "Şartları kabul et"
msgid "Accepted MR"
-msgstr ""
+msgstr "Kabul edilen MR"
msgid "Access Tokens"
-msgstr "Erişim anahtarları"
+msgstr "Erişim Anahtarları"
msgid "Access denied! Please verify you can add deploy keys to this repository."
-msgstr ""
+msgstr "Erişim reddedildi! Lütfen bu depoya dağıtım anahtarlarını ekleyebileceğinizi doğrulayın."
msgid "Access expiration date"
-msgstr ""
+msgstr "EriÅŸim bitiÅŸ tarihi"
msgid "Access to '%{classification_label}' not allowed"
-msgstr ""
+msgstr "'%{classification_label}' eriÅŸimine izin verilmedi"
msgid "Account"
msgstr "Hesap"
msgid "Account and limit"
-msgstr ""
+msgstr "Hesap ve sınırı"
msgid "Active"
msgstr "Etkin"
msgid "Active Sessions"
-msgstr ""
+msgstr "Etkin Oturumlar"
msgid "Activity"
msgstr "Etkinlik"
msgid "Add"
-msgstr ""
+msgstr "Ekle"
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "CHANGELOG ekle"
msgid "Add CONTRIBUTING"
-msgstr ""
+msgstr "CONTRIBUTING ekle"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
msgstr ""
msgid "Add Jaeger URL"
-msgstr ""
+msgstr "Jaeger URL ekle"
msgid "Add Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes kümesi ekle"
msgid "Add README"
-msgstr ""
+msgstr "BENÄ°OKU ekle"
+
+msgid "Add a bullet list"
+msgstr "Madde iÅŸareti listesi ekle"
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 ""
+msgstr "Wiki'nize projeniz hakkında bilgi içeren bir ana sayfa ekleyin. GitLab bu mesaj yerine onu burada görüntüleyecektir."
+
+msgid "Add a link"
+msgstr "Bağlantı ekle"
+
+msgid "Add a numbered list"
+msgstr "Numaralı liste ekle"
msgid "Add a table"
-msgstr ""
+msgstr "Tablo ekle"
+
+msgid "Add a task list"
+msgstr "Görev listesi ekle"
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr "Tüm e-posta iletişiminde görünecek ek metin ekleyin. %{character_limit} karakter sınırı"
+
+msgid "Add approver(s)"
msgstr ""
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr "Kalın metin ekle"
+
msgid "Add comment now"
+msgstr "Åžimdi yorum ekle"
+
+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 ""
+msgstr "Resim yorumu ekle"
+
+msgid "Add italic text"
+msgstr "EÄŸik metin ekle"
msgid "Add license"
-msgstr ""
+msgstr "Lisans ekle"
msgid "Add new application"
-msgstr ""
+msgstr "Yeni uygulama ekle"
msgid "Add new directory"
msgstr "Yeni dizin ekle"
msgid "Add projects"
-msgstr ""
+msgstr "Proje ekle"
msgid "Add reaction"
-msgstr ""
+msgstr "Tepki ekle"
msgid "Add to project"
-msgstr ""
+msgstr "Projeye ekle"
msgid "Add to review"
-msgstr ""
+msgstr "Ä°ncelemeye ekle"
msgid "Add todo"
msgstr "Yapılacaklara Ekle"
msgid "Add user(s) to the group:"
-msgstr ""
+msgstr "Gruba kullanıcı(lar) ekleyin:"
msgid "Add users or groups who are allowed to approve every merge request"
msgstr ""
msgid "Add users to group"
-msgstr ""
+msgstr "Kullanıcıları gruba ekle"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
-msgstr ""
+msgstr "GitLab örneğinizde yeni uygulamalar eklemek devre dışı bırakıldı. İzin almak için lütfen GitLab yöneticinize başvurun"
msgid "Additional text"
-msgstr ""
+msgstr "Ek metin"
msgid "Admin Area"
-msgstr ""
+msgstr "Yönetici alanı"
msgid "Admin Overview"
-msgstr ""
+msgstr "Yönetim Genel Bakış"
msgid "AdminArea| 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 %{strong_start}block user%{strong_end} feature instead. Once you %{strong_start}Delete user%{strong_end}, it cannot be undone or recovered."
msgstr ""
@@ -530,22 +602,22 @@ msgid "AdminArea|Stop jobs"
msgstr "Ä°ÅŸleri durdur"
msgid "AdminArea|Stopping jobs failed"
-msgstr ""
+msgstr "AdminArea|Durdurma işleri başarısız oldu"
msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running."
-msgstr ""
+msgstr "AdminArea|Bütün işleri durdurmak üzeresiniz. Bu işlem çalışan tüm mevcut işleri durduracaktır."
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 ""
+msgstr "AdminProjects|Sil"
msgid "AdminProjects|Delete Project %{projectName}?"
-msgstr ""
+msgstr "AdminProjects|%{projectName} projesi silinsin mi?"
msgid "AdminProjects|Delete project"
-msgstr ""
+msgstr "AdminProjects|Projeyi sil"
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
@@ -560,52 +632,52 @@ msgid "AdminSettings|When creating a new environment variable it will be protect
msgstr ""
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "AdminUsers|2FA Devre dışı"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "AdminUsers|2FA Etkin"
msgid "AdminUsers|Active"
-msgstr ""
+msgstr "AdminUsers|Etkin"
msgid "AdminUsers|Admin"
-msgstr ""
+msgstr "AdminUsers|Yönetici"
msgid "AdminUsers|Admins"
-msgstr ""
+msgstr "AdminUsers|Yöneticiler"
msgid "AdminUsers|Block user"
-msgstr ""
+msgstr "AdminUsers | Kullanıcıyı engelle"
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "AdminUsers|Engellendi"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
msgstr ""
msgid "AdminUsers|Delete User %{username} and contributions?"
-msgstr ""
+msgstr "AdminUsers |%{username} kullanıcısını ve katkılarını sil?"
msgid "AdminUsers|Delete User %{username}?"
-msgstr ""
+msgstr "AdminUsers|%{username} kullanısını sil?"
msgid "AdminUsers|Delete user"
-msgstr ""
+msgstr "AdminUsers|Kullanıcıyı sil"
msgid "AdminUsers|Delete user and contributions"
-msgstr ""
+msgstr "AdminUsers|Kullanıcıyı ve katkılarını sil"
msgid "AdminUsers|External"
-msgstr ""
+msgstr "AdminUsers|Harici"
msgid "AdminUsers|It's you!"
-msgstr ""
+msgstr "AdminUsers|Bu sensin!"
msgid "AdminUsers|New user"
-msgstr ""
+msgstr "AdminUsers|Yeni kullanıcı"
msgid "AdminUsers|No users found"
-msgstr ""
+msgstr "AdminUsers|Kullanıcı bulunamadı"
msgid "AdminUsers|Search by name, email or username"
msgstr ""
@@ -617,7 +689,7 @@ msgid "AdminUsers|Send email to users"
msgstr ""
msgid "AdminUsers|Sort by"
-msgstr ""
+msgstr "AdminUsers|Buna göre sırala"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr ""
@@ -637,20 +709,26 @@ msgstr ""
msgid "Advanced settings"
msgstr "GeliÅŸmiÅŸ ayarlar"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Uyarı"
+msgstr[1] "Uyarı"
msgid "Alerts"
-msgstr ""
+msgstr "Uyarılar"
msgid "All"
msgstr "Tümü"
-msgid "All changes are committed"
+msgid "All Members"
msgstr ""
+msgid "All changes are committed"
+msgstr "Tüm değişiklikler işlendi"
+
msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings."
msgstr ""
@@ -658,16 +736,16 @@ msgid "All issues for this milestone are closed. You may close this milestone no
msgstr ""
msgid "All users"
-msgstr ""
+msgstr "Tüm kullanıcılar"
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
msgid "Allow commits from members who can merge to the target branch."
-msgstr ""
+msgstr "Hedef dala bağlanabilecek üyelerin işlemlerine izin verin."
msgid "Allow projects within this group to use Git LFS"
-msgstr ""
+msgstr "Bu gruptaki projelerin Git LFS'yi kullanmasına izin verin"
msgid "Allow public access to pipelines and job details, including output logs and artifacts"
msgstr ""
@@ -679,7 +757,7 @@ msgid "Allow requests to the local network from hooks and services."
msgstr ""
msgid "Allow users to request access"
-msgstr ""
+msgstr "Kullanıcıların erişim isteğinde bulunmasına izin ver"
msgid "Allow users to request access if visibility is public or internal."
msgstr ""
@@ -709,26 +787,35 @@ msgid "An SSH key will be automatically generated when the form is submitted. Fo
msgstr ""
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
-msgstr ""
+msgstr "%{link_to_client} adlı uygulama, GitLab hesabınıza erişim talep ediyor."
msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
msgstr ""
msgid "An error has occurred"
-msgstr ""
+msgstr "Bir hata oluÅŸtu"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
msgstr ""
msgid "An error occurred adding a new draft."
-msgstr ""
+msgstr "Yeni taslak eklenirken bir hata oluÅŸtu."
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 previewing the blob"
msgstr ""
@@ -741,6 +828,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -760,52 +850,55 @@ msgid "An error occurred while fetching pending comments"
msgstr ""
msgid "An error occurred while fetching sidebar data"
-msgstr ""
+msgstr "Kenar çubuğu verileri getirilirken bir hata oluştu"
msgid "An error occurred while fetching stages."
msgstr ""
msgid "An error occurred while fetching the job log."
-msgstr ""
+msgstr "İş kayıtları alınırken bir hata oluştu."
msgid "An error occurred while fetching the job."
-msgstr ""
+msgstr "İş alınırken bir hata oluştu."
msgid "An error occurred while fetching the jobs."
-msgstr ""
+msgstr "İşler alınırken bir hata oluştu."
msgid "An error occurred while fetching the pipeline."
+msgstr "İş hattı alınırken bir hata oluştu."
+
+msgid "An error occurred while fetching the releases. Please try again."
msgstr ""
msgid "An error occurred while getting projects"
msgstr "Projeler yüklenirken bir hata oluştu"
msgid "An error occurred while importing project: %{details}"
-msgstr ""
+msgstr "Projeyi içe aktarırken bir sorun oluştu: %{details}"
msgid "An error occurred while initializing path locks"
msgstr ""
msgid "An error occurred while loading chart data"
-msgstr ""
+msgstr "Tablo verileri alınırken bir hata oluştu"
msgid "An error occurred while loading commit signatures"
-msgstr ""
+msgstr "İşlem imzaları yüklenirken bir hata oluştu"
msgid "An error occurred while loading diff"
-msgstr ""
+msgstr "Değişiklikler uygulanırken bir hata oluştu"
msgid "An error occurred while loading filenames"
msgstr "Dosya isimleri yüklenirken bir hata oluştu"
msgid "An error occurred while loading the file"
-msgstr ""
+msgstr "Dosya yüklenirken bir hata oluştu"
msgid "An error occurred while loading the subscription details."
msgstr ""
msgid "An error occurred while making the request."
-msgstr ""
+msgstr "Talep edilirken bir hata oluÅŸtu."
msgid "An error occurred while removing approver"
msgstr ""
@@ -823,7 +916,7 @@ msgid "An error occurred while rendering preview broadcast message"
msgstr "Önizleme yayını iletisi oluşturulurken bir hata oluştu"
msgid "An error occurred while retrieving calendar activity"
-msgstr ""
+msgstr "Takvim etkinlikleri getirilirken bir hata meydana geldi"
msgid "An error occurred while retrieving diff"
msgstr "Değişiklikler yüklenirken bir hata oluştu"
@@ -832,16 +925,22 @@ msgid "An error occurred while saving LDAP override status. Please try again."
msgstr ""
msgid "An error occurred while saving assignees"
+msgstr "Atanmış kişiler kaydedilirken bir hata oluştu"
+
+msgid "An error occurred while saving the approval settings"
msgstr ""
msgid "An error occurred while subscribing to notifications."
-msgstr ""
+msgstr "Bildirimlere abone olunurken bir hata oluÅŸtu."
msgid "An error occurred while unsubscribing to notifications."
+msgstr "Bildirim aboneliÄŸi iptal edilirken bir hata oluÅŸtu."
+
+msgid "An error occurred while updating approvers"
msgstr ""
msgid "An error occurred while updating the comment"
-msgstr ""
+msgstr "Yorum güncellenirken bir hata oluştu"
msgid "An error occurred while validating username"
msgstr "Kullanıcı adı doğrulanırken bir hata oluştu"
@@ -895,49 +994,87 @@ msgid "An unexpected error occurred while stopping the Web Terminal."
msgstr ""
msgid "Analytics"
-msgstr ""
+msgstr "Analizler"
msgid "Anonymous"
-msgstr ""
+msgstr "Anonim"
msgid "Anti-spam verification"
-msgstr ""
+msgstr "Anti-spam doÄŸrulama"
msgid "Any"
-msgstr ""
+msgstr "Herhangi"
msgid "Any Label"
-msgstr ""
+msgstr "Herhangi bir etiket"
msgid "Appearance"
msgstr "Görünüm"
msgid "Application"
-msgstr ""
+msgstr "Uygulama"
msgid "Application ID"
-msgstr ""
+msgstr "Uygulama KimliÄŸi"
msgid "Application: %{name}"
-msgstr ""
+msgstr "Uygulama: %{name}"
msgid "Applications"
msgstr "Uygulamalar"
msgid "Applied"
-msgstr ""
+msgstr "Uygulandı"
msgid "Apply suggestion"
+msgstr "Öneriyi uygula"
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
msgstr ""
-msgid "Approvals"
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
msgstr ""
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
+msgid "Approvals"
+msgstr "Onaylar"
+
msgid "Approvals required"
msgstr ""
msgid "Approvers"
-msgstr ""
+msgstr "Onaylayanlar"
msgid "Apr"
msgstr "Nis"
@@ -949,13 +1086,13 @@ msgid "Archived project! Repository and other project resources are read-only"
msgstr ""
msgid "Archived projects"
-msgstr ""
+msgstr "ArÅŸivlenmiÅŸ projeler"
msgid "Are you sure"
-msgstr ""
+msgstr "Emin misiniz"
msgid "Are you sure you want to delete this pipeline schedule?"
-msgstr ""
+msgstr "Bu iş hattı planını silmek istediğinizden emin misiniz?"
msgid "Are you sure you want to erase this build?"
msgstr ""
@@ -972,9 +1109,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -982,7 +1125,7 @@ msgid "Are you sure you want to remove the attachment?"
msgstr ""
msgid "Are you sure you want to remove this identity?"
-msgstr ""
+msgstr "Bu kimliği kaldırmak istediğinizden emin misiniz?"
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -994,7 +1137,7 @@ msgid "Are you sure you want to stop this environment?"
msgstr ""
msgid "Are you sure you want to unlock %{path_lock_path}?"
-msgstr ""
+msgstr "%{path_lock_path} silmek istediÄŸinizden emin misiniz?"
msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
msgstr ""
@@ -1003,10 +1146,10 @@ msgid "Are you sure?"
msgstr "Emin misiniz?"
msgid "Artifact ID"
-msgstr ""
+msgstr "Yapı Kimliği"
msgid "Artifacts"
-msgstr ""
+msgstr "Yapılar"
msgid "Ascending"
msgstr ""
@@ -1027,7 +1170,7 @@ msgid "Assign labels"
msgstr "Etiket tanımla"
msgid "Assign milestone"
-msgstr ""
+msgstr "Kilometre taşı ata"
msgid "Assign some issues to this milestone."
msgstr ""
@@ -1036,7 +1179,7 @@ msgid "Assign to"
msgstr "Ata"
msgid "Assigned Issues"
-msgstr ""
+msgstr "Atanan sorunlar"
msgid "Assigned Merge Requests"
msgstr ""
@@ -1045,10 +1188,10 @@ msgid "Assigned to :name"
msgstr ""
msgid "Assigned to me"
-msgstr ""
+msgstr "Bana atanan"
msgid "Assignee"
-msgstr ""
+msgstr "Atanan"
msgid "Assignee lists not available with your current license"
msgstr ""
@@ -1057,6 +1200,9 @@ msgid "Assignee lists show all issues assigned to the selected user."
msgstr ""
msgid "Assignee(s)"
+msgstr "Atanan(lar)"
+
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
msgid "Attach a file"
@@ -1066,7 +1212,7 @@ msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Sürükleyip bırakarak bir dosya ekle veya %{upload_link}"
msgid "Audit Events"
-msgstr ""
+msgstr "Denetim Etkinlikleri"
msgid "Aug"
msgstr "AÄŸustos"
@@ -1074,50 +1220,47 @@ msgstr "AÄŸustos"
msgid "August"
msgstr "AÄŸustos"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "Kimlik Doğrulama Günlüğü"
msgid "Authentication log"
-msgstr ""
+msgstr "Kimlik Doğrulama Günlüğü"
msgid "Authentication method"
-msgstr ""
+msgstr "Kimlik doğrulama yöntemi"
msgid "Author"
msgstr "Yazar"
msgid "Authorization code:"
-msgstr ""
+msgstr "Yetkilendirme kodu:"
msgid "Authorization key"
msgstr ""
msgid "Authorization was granted by entering your username and password in the application."
-msgstr ""
+msgstr "Uygulamaya kullanıcı adınız ve şifreniz girilererek yetki verildi."
msgid "Authorize"
-msgstr ""
+msgstr "Yetki Ver"
msgid "Authorize %{link_to_client} to use your account?"
msgstr ""
msgid "Authorized At"
-msgstr ""
+msgstr "Yetkili"
msgid "Authorized applications (%{size})"
-msgstr ""
+msgstr "Yetkili uygulamalar (%{size})"
msgid "Authors: %{authors}"
msgstr "Yazarlar: %{authors}"
msgid "Auto DevOps"
-msgstr ""
+msgstr "Otomatik DevOps"
msgid "Auto DevOps enabled"
-msgstr ""
+msgstr "Auto DevOps etkinleÅŸtirildi"
msgid "Auto DevOps, runners and job artifacts"
msgstr ""
@@ -1132,7 +1275,7 @@ msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
-msgstr ""
+msgstr "AutoDevOps|Ayarlardan etkinleÅŸtirin"
msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
msgstr ""
@@ -1147,13 +1290,13 @@ msgid "AutoDevOps|You can automatically build and test your application if you %
msgstr ""
msgid "AutoDevOps|add a Kubernetes cluster"
-msgstr ""
+msgstr "AutoDevOps|Kubernetes Cluster Ekle"
msgid "AutoDevOps|enable Auto DevOps"
-msgstr ""
+msgstr "AutoDevOps | Auto DevOps'u etkinleÅŸtir"
msgid "Automatically marked as default internal user"
-msgstr ""
+msgstr "Otomatik olarak varsayılan kullanıcı olarak işaretlendi"
msgid "Automatically resolved"
msgstr ""
@@ -1180,31 +1323,31 @@ msgid "Avatar will be removed. Are you sure?"
msgstr "Avatar kaldırılacak. Emin misiniz?"
msgid "Average per day: %{average}"
-msgstr ""
+msgstr "Günlük ortalama: %{average}"
msgid "Background Color"
-msgstr ""
+msgstr "Arkaplan Rengi"
msgid "Background Jobs"
-msgstr ""
+msgstr "Arka plan iÅŸleri"
msgid "Background color"
-msgstr ""
+msgstr "Arkaplan rengi"
msgid "Badges"
-msgstr ""
+msgstr "Rozetler"
msgid "Badges|A new badge was added."
-msgstr ""
+msgstr "Badges|Yeni bir rozet eklendi."
msgid "Badges|Add badge"
-msgstr ""
+msgstr "Badges|Rozet ekle"
msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
-msgstr ""
+msgstr "Badges|Rozetin eklenmesi başarısız oldu, lütfen girilen bağlantıları kontrol edin ve tekrar deneyin."
msgid "Badges|Badge image URL"
-msgstr ""
+msgstr "Badges|Rozet resim bağlantısı"
msgid "Badges|Badge image preview"
msgstr ""
@@ -1330,7 +1473,7 @@ msgid "BillingPlans|Upgrade"
msgstr ""
msgid "BillingPlans|You are currently on the %{plan_link} plan."
-msgstr ""
+msgstr "BillingPlans|Şu an %{plan_link} plan kullanıyorsunuz."
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
msgstr ""
@@ -1345,7 +1488,7 @@ msgid "BillingPlans|frequently asked questions"
msgstr ""
msgid "BillingPlans|monthly"
-msgstr ""
+msgstr "BillingPlans|aylık"
msgid "BillingPlans|paid annually at %{price_per_year}"
msgstr ""
@@ -1366,10 +1509,10 @@ msgid "Blocked"
msgstr ""
msgid "Blog"
-msgstr ""
+msgstr "Blog"
msgid "Boards"
-msgstr ""
+msgstr "Panolar"
msgid "Branch %{branchName} was not found in this project's repository."
msgstr ""
@@ -1378,13 +1521,13 @@ msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy
msgstr ""
msgid "Branch has changed"
-msgstr ""
+msgstr "Dal deÄŸiÅŸti"
msgid "Branch is already taken"
msgstr ""
msgid "Branch name"
-msgstr ""
+msgstr "Dal adı"
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr ""
@@ -1393,22 +1536,22 @@ msgid "BranchSwitcherTitle|Switch branch"
msgstr ""
msgid "Branches"
-msgstr ""
+msgstr "Dallar"
msgid "Branches|Active"
-msgstr ""
+msgstr "Branches|Etkin"
msgid "Branches|Active branches"
msgstr ""
msgid "Branches|All"
-msgstr ""
+msgstr "Branches|Tümü"
msgid "Branches|Cant find HEAD commit for this branch"
msgstr ""
msgid "Branches|Compare"
-msgstr ""
+msgstr "Branches|Karşılaştırma"
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
msgstr ""
@@ -1417,7 +1560,7 @@ msgid "Branches|Delete branch"
msgstr ""
msgid "Branches|Delete merged branches"
-msgstr ""
+msgstr "Branches|Birleştirilmiş dalları sil"
msgid "Branches|Delete protected branch"
msgstr ""
@@ -1450,7 +1593,7 @@ msgid "Branches|Only a project maintainer or owner can delete a protected branch
msgstr ""
msgid "Branches|Overview"
-msgstr ""
+msgstr "Branches|Genel Bakış"
msgid "Branches|Protected branches can be managed in %{project_settings_link}."
msgstr ""
@@ -1624,17 +1767,20 @@ msgid "Canary Deployments is a popular CI strategy, where a small portion of the
msgstr ""
msgid "Cancel"
-msgstr ""
+msgstr "Ä°ptal"
msgid "Cancel this job"
-msgstr ""
+msgstr "Bu iÅŸi iptal et"
msgid "Cannot be merged automatically"
-msgstr ""
+msgstr "Otomatik olarak birleÅŸtirilemez"
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1671,6 +1817,9 @@ msgstr ""
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1678,9 +1827,12 @@ msgid "Changes suppressed. Click to show."
msgstr ""
msgid "Charts"
-msgstr ""
+msgstr "Grafikler"
msgid "Chat"
+msgstr "Sohbet"
+
+msgid "Check again"
msgstr ""
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
@@ -1749,9 +1901,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1911,6 +2060,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1926,11 +2078,8 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
-msgstr ""
+msgstr "Kapalı sorunlar"
msgid "ClusterIntegration| %{custom_domain_start}More information%{custom_domain_end}."
msgstr ""
@@ -1974,10 +2123,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -2016,6 +2165,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2038,7 +2190,7 @@ msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
msgid "ClusterIntegration|Copy Token"
-msgstr ""
+msgstr "ClusterIntegration|Erişim Anahtarını Kopyala"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
@@ -2112,7 +2264,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2127,9 +2279,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2175,9 +2324,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2415,15 +2561,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2520,7 +2678,7 @@ msgid "Commit…"
msgstr ""
msgid "Compare"
-msgstr ""
+msgstr "Karşılaştır"
msgid "Compare Git revisions"
msgstr ""
@@ -2682,10 +2840,10 @@ msgid "Contributions per group member"
msgstr ""
msgid "Contributors"
-msgstr ""
+msgstr "Katkıda Bulunanlar"
msgid "ContributorsPage|%{startDate} – %{endDate}"
-msgstr ""
+msgstr "ContributorsPage|%{startDate} – %{endDate}"
msgid "ContributorsPage|Building repository graph."
msgstr ""
@@ -2694,7 +2852,7 @@ msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limi
msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
-msgstr ""
+msgstr "ContributorsPage|Lütfen bekleyin, hazır olduğunda bu sayfa otomatik olarak yenilenir."
msgid "Control the display of third party offers."
msgstr ""
@@ -2723,6 +2881,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -2763,7 +2924,7 @@ msgid "Copy to clipboard"
msgstr ""
msgid "Copy token to clipboard"
-msgstr ""
+msgstr "Erişim anahtarını panoya kopyala"
msgid "Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation.%{linkEnd}"
msgstr ""
@@ -2778,13 +2939,13 @@ msgid "Create New Domain"
msgstr ""
msgid "Create a new branch"
-msgstr ""
+msgstr "Yeni bir dal oluÅŸtur"
msgid "Create a new branch and merge request"
-msgstr ""
+msgstr "Yeni bir dal ve birleÅŸtirme isteÄŸi oluÅŸtur"
msgid "Create a new issue"
-msgstr ""
+msgstr "Yeni bir sorun oluÅŸtur"
msgid "Create a new repository"
msgstr ""
@@ -2823,31 +2984,31 @@ msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
msgid "Create merge request"
-msgstr ""
+msgstr "BirleÅŸtirme isteÄŸi oluÅŸtur"
msgid "Create merge request and branch"
-msgstr ""
+msgstr "BirleÅŸtirme isteÄŸi ve dal oluÅŸtur"
msgid "Create milestone"
msgstr ""
msgid "Create new branch"
-msgstr ""
+msgstr "Yeni dal oluÅŸtur"
msgid "Create new directory"
-msgstr ""
+msgstr "Yeni dizin oluÅŸtur"
msgid "Create new file"
-msgstr ""
+msgstr "Yeni dosya oluÅŸtur"
msgid "Create new file or directory"
-msgstr ""
+msgstr "Yeni dosya veya dizin oluÅŸtur"
msgid "Create new label"
-msgstr ""
+msgstr "Yeni etiket oluÅŸtur"
msgid "Create new..."
-msgstr ""
+msgstr "Yeni oluÅŸtur..."
msgid "Create project label"
msgstr ""
@@ -2895,7 +3056,7 @@ msgid "CurrentUser|Profile"
msgstr ""
msgid "CurrentUser|Settings"
-msgstr ""
+msgstr "CurrentUser|Ayarlar"
msgid "Custom CI config path"
msgstr ""
@@ -2904,7 +3065,7 @@ msgid "Custom hostname (for private commit emails)"
msgstr ""
msgid "Custom notification events"
-msgstr ""
+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 ""
@@ -2925,7 +3086,7 @@ msgid "Customize how Google Code email addresses and usernames are imported into
msgstr ""
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "Dil ve bölgeyle ilgili ayarları özelleştirin."
msgid "Customize your merge request approval settings."
msgstr ""
@@ -2934,7 +3095,7 @@ msgid "Customize your pipeline configuration, view your pipeline status and cove
msgstr ""
msgid "Cycle Analytics"
-msgstr ""
+msgstr "AÅŸama Analizi"
msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
@@ -2952,13 +3113,13 @@ msgid "CycleAnalyticsStage|Production"
msgstr ""
msgid "CycleAnalyticsStage|Review"
-msgstr ""
+msgstr "CycleAnalyticsStage|Ä°nceleme"
msgid "CycleAnalyticsStage|Staging"
msgstr ""
msgid "CycleAnalyticsStage|Test"
-msgstr ""
+msgstr "CycleAnalyticsStage|Test"
msgid "DNS"
msgstr ""
@@ -2970,7 +3131,7 @@ msgid "DashboardProjects|All"
msgstr ""
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "DashboardProjects|KiÅŸisel"
msgid "Data is still calculating..."
msgstr ""
@@ -2982,10 +3143,10 @@ msgid "Debug"
msgstr ""
msgid "Dec"
-msgstr ""
+msgstr "Ara"
msgid "December"
-msgstr ""
+msgstr "Aralık"
msgid "Decline"
msgstr ""
@@ -3164,7 +3325,7 @@ msgid "DeployTokens|Scopes"
msgstr ""
msgid "DeployTokens|This action cannot be undone."
-msgstr ""
+msgstr "DeployTokens|Bu işlem geri alınamaz."
msgid "DeployTokens|This project has no active Deploy Tokens."
msgstr ""
@@ -3211,14 +3372,17 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
msgid "Details"
-msgstr ""
+msgstr "Ayrıntılar"
msgid "Details (default)"
-msgstr ""
+msgstr "Ayrıntılar (varsayılan)"
msgid "Detect host keys"
msgstr ""
@@ -3289,6 +3453,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3302,7 +3469,7 @@ msgid "Dismiss Merge Request promotion"
msgstr ""
msgid "Dismiss trial promotion"
-msgstr ""
+msgstr "Deneme promosyonunu reddet"
msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
msgstr ""
@@ -3314,10 +3481,10 @@ msgid "Domain"
msgstr ""
msgid "Don't show again"
-msgstr ""
+msgstr "Bir daha gösterme"
msgid "Done"
-msgstr ""
+msgstr "Tamamlandı"
msgid "Download"
msgstr ""
@@ -3404,7 +3571,7 @@ msgid "Edit identity for %{user_name}"
msgstr ""
msgid "Edit issues"
-msgstr ""
+msgstr "Sorunları düzenle"
msgid "Elasticsearch"
msgstr ""
@@ -3413,13 +3580,13 @@ msgid "Elasticsearch integration. Elasticsearch AWS IAM."
msgstr ""
msgid "Email"
-msgstr ""
+msgstr "E-posta"
msgid "Email patch"
msgstr ""
msgid "Emails"
-msgstr ""
+msgstr "E-postalar"
msgid "Embed"
msgstr ""
@@ -3460,6 +3627,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3479,7 +3649,7 @@ msgid "Enable the Performance Bar for a given group."
msgstr ""
msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "İki aşamalı doğrulamayı etkinleştir"
msgid "Enable usage ping"
msgstr ""
@@ -3496,6 +3666,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3512,10 +3685,7 @@ msgid "Enter the merge request description"
msgstr ""
msgid "Enter the merge request title"
-msgstr ""
-
-msgid "Enter your Sentry API URL"
-msgstr ""
+msgstr "Birleştirme isteğinin başlığını girin"
msgid "Environment variables"
msgstr ""
@@ -3541,6 +3711,12 @@ 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 ""
@@ -3592,15 +3768,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3613,9 +3807,21 @@ msgstr ""
msgid "Environments|Stopping"
msgstr ""
-msgid "Environments|Updated"
+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 %{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|This action will run the job defined by staging 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|Updated"
+msgstr "Environments|Güncellendi:"
+
msgid "Environments|You don't have any environments right now"
msgstr ""
@@ -3664,6 +3870,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3671,7 +3880,7 @@ msgid "Error deleting %{issuableType}"
msgstr ""
msgid "Error fetching contributors data."
-msgstr ""
+msgstr "Katkıda bulunanlar verileri alınırken hata oluştu."
msgid "Error fetching labels."
msgstr ""
@@ -3698,7 +3907,7 @@ msgid "Error loading markdown preview"
msgstr ""
msgid "Error loading merge requests."
-msgstr ""
+msgstr "Birleştirme isteği yüklenirken hata oluştu."
msgid "Error loading project data. Please try again."
msgstr ""
@@ -3722,17 +3931,44 @@ msgid "Error updating %{issuableType}"
msgstr ""
msgid "Error updating status for all todos."
-msgstr ""
+msgstr "Bütün yapılacaklar için durum güncellenirken hata oluştu."
msgid "Error updating todo status."
msgstr ""
msgid "Error while loading the merge request. Please try again."
-msgstr ""
+msgstr "Birleştirme isteğini yüklerken hata oluştu. Lütfen tekrar deneyin."
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3758,7 +3994,7 @@ msgid "EventFilterBy|Filter by team"
msgstr ""
msgid "Events"
-msgstr ""
+msgstr "Etkinlikler"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -3811,6 +4047,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3833,16 +4072,16 @@ msgid "Explore GitLab"
msgstr ""
msgid "Explore Groups"
-msgstr ""
+msgstr "Grupları Keşfet"
msgid "Explore groups"
-msgstr ""
+msgstr "Grupları keşfet"
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
-msgstr ""
+msgstr "Genel grupları keşfet"
msgid "Export as CSV"
msgstr ""
@@ -3898,7 +4137,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3964,9 +4203,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -4024,9 +4260,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4046,10 +4279,10 @@ msgid "FeatureFlags|Try again in a few moments or contact your support team."
msgstr ""
msgid "Feb"
-msgstr ""
+msgstr "Åžub"
msgid "February"
-msgstr ""
+msgstr "Åžubat"
msgid "Fields on this page are now uneditable, you can configure"
msgstr ""
@@ -4081,7 +4314,7 @@ msgid "File upload error."
msgstr ""
msgid "Files"
-msgstr ""
+msgstr "Dosyalar"
msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
msgstr ""
@@ -4113,9 +4346,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr ""
@@ -4228,9 +4458,9 @@ msgid "Found errors in your .gitlab-ci.yml:"
msgstr ""
msgid "Free Trial of GitLab.com Gold"
-msgstr ""
+msgstr "GitLab.com Gold Ãœcretsiz Deneme"
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4260,7 +4490,13 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
+msgstr "GPG Anahtarları"
+
+msgid "GPG signature (loading...)"
msgstr ""
msgid "General"
@@ -4462,7 +4698,7 @@ msgid "Geo|All"
msgstr ""
msgid "Geo|All projects"
-msgstr ""
+msgstr "Geo|Tüm projeler"
msgid "Geo|All projects are being scheduled for re-check"
msgstr ""
@@ -4525,7 +4761,7 @@ msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is sa
msgstr ""
msgid "Geo|Projects in certain groups"
-msgstr ""
+msgstr "Geo|Belli gruplardaki projeler"
msgid "Geo|Projects in certain storage shards"
msgstr ""
@@ -4564,7 +4800,7 @@ msgid "Geo|Shards to synchronize"
msgstr ""
msgid "Geo|Status"
-msgstr ""
+msgstr "Geo|Durum"
msgid "Geo|Synced"
msgstr ""
@@ -4695,15 +4931,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4720,7 +4965,7 @@ msgid "Grant access"
msgstr ""
msgid "Graph"
-msgstr ""
+msgstr "Çizelge"
msgid "Group"
msgstr ""
@@ -4753,7 +4998,7 @@ msgid "Group description (optional)"
msgstr ""
msgid "Group details"
-msgstr ""
+msgstr "Grup ayrıntıları"
msgid "Group info:"
msgstr ""
@@ -4761,6 +5006,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -4834,7 +5082,7 @@ msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name
msgstr ""
msgid "Groups"
-msgstr ""
+msgstr "Gruplar"
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
@@ -4870,7 +5118,7 @@ msgid "GroupsEmptyState|If you organize your projects under a group, it works li
msgstr ""
msgid "GroupsEmptyState|No groups found"
-msgstr ""
+msgstr "GroupsEmptyState|Grup bulunamadı"
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr ""
@@ -4930,13 +5178,13 @@ msgid "HealthCheck|Unhealthy"
msgstr ""
msgid "Help"
-msgstr ""
+msgstr "Yardım"
msgid "Help page"
-msgstr ""
+msgstr "Yardım sayfası"
msgid "Help page text and support page url."
-msgstr ""
+msgstr "Yardım sayfası metni ve destek sayfası bağlantısı."
msgid "Here is the public SSH key that needs to be added to the remote server. For more information, please refer to the documentation."
msgstr ""
@@ -5073,7 +5321,7 @@ msgid "Import all compatible projects"
msgstr ""
msgid "Import all projects"
-msgstr ""
+msgstr "Tüm projeleri içe aktar"
msgid "Import all repositories"
msgstr ""
@@ -5103,19 +5351,19 @@ msgid "Import project members"
msgstr ""
msgid "Import projects from Bitbucket"
-msgstr ""
+msgstr "Bitbucket'ten projeleri içe aktar"
msgid "Import projects from Bitbucket Server"
msgstr ""
msgid "Import projects from FogBugz"
-msgstr ""
+msgstr "FogBugz'dan projeleri içe aktar"
msgid "Import projects from GitLab.com"
-msgstr ""
+msgstr "GitLab.com'dan projeleri içe aktar"
msgid "Import projects from Google Code"
-msgstr ""
+msgstr "Google Code'dan projeler içe aktar"
msgid "Import repositories from Bitbucket Server"
msgstr ""
@@ -5129,9 +5377,24 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5183,6 +5446,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5236,6 +5505,9 @@ msgstr ""
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5254,6 +5526,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5264,7 +5539,7 @@ msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
-msgstr ""
+msgstr "Sorun etkinlikleri"
msgid "IssueBoards|Board"
msgstr ""
@@ -5288,15 +5563,15 @@ msgid "IssueBoards|Switch board"
msgstr ""
msgid "Issues"
-msgstr ""
+msgstr "Sorunlar"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
msgid "Issues closed"
-msgstr ""
+msgstr "Sorunlar kapalı"
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5333,10 +5608,10 @@ msgid "Jaeger tracing"
msgstr ""
msgid "Jan"
-msgstr ""
+msgstr "Oca"
msgid "January"
-msgstr ""
+msgstr "Ocak"
msgid "Job"
msgstr ""
@@ -5396,16 +5671,16 @@ msgid "Job|This job is stuck because the project doesn't have any runners online
msgstr ""
msgid "Jul"
-msgstr ""
+msgstr "Tem"
msgid "July"
-msgstr ""
+msgstr "Temmuz"
msgid "Jun"
-msgstr ""
+msgstr "Haz"
msgid "June"
-msgstr ""
+msgstr "Haziran"
msgid "Key (PEM)"
msgstr ""
@@ -5441,10 +5716,10 @@ msgid "LFS"
msgstr ""
msgid "LFSStatus|Disabled"
-msgstr ""
+msgstr "LFSStatus|Kapalı"
msgid "LFSStatus|Enabled"
-msgstr ""
+msgstr "LFSStatus|Etkin"
msgid "Label"
msgstr ""
@@ -5465,7 +5740,7 @@ msgid "LabelSelect|Labels"
msgstr ""
msgid "Labels"
-msgstr ""
+msgstr "Etiketler"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
msgstr ""
@@ -5485,6 +5760,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5497,7 +5775,7 @@ msgid "Last Pipeline"
msgstr ""
msgid "Last activity"
-msgstr ""
+msgstr "Son etkinlik"
msgid "Last commit"
msgstr ""
@@ -5521,7 +5799,7 @@ msgid "Last update"
msgstr ""
msgid "Last updated"
-msgstr ""
+msgstr "Son güncelleme"
msgid "LastPushEvent|You pushed to"
msgstr ""
@@ -5568,6 +5846,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr ""
@@ -5673,7 +5954,7 @@ msgid "LinkedIn"
msgstr ""
msgid "List"
-msgstr ""
+msgstr "Liste"
msgid "List Your Gitea Repositories"
msgstr ""
@@ -5727,7 +6008,7 @@ msgid "Locked"
msgstr ""
msgid "Locked Files"
-msgstr ""
+msgstr "Kilitli Dosyalar"
msgid "Locked to current projects"
msgstr ""
@@ -5741,6 +6022,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5757,7 +6047,7 @@ msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
-msgstr ""
+msgstr "Tüm bildirimleri yönet"
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -5786,6 +6076,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5799,13 +6092,13 @@ msgid "Map a Google Code user to a full name"
msgstr ""
msgid "Mar"
-msgstr ""
+msgstr "Mar"
msgid "March"
-msgstr ""
+msgstr "Mart"
msgid "Mark todo as done"
-msgstr ""
+msgstr "Yapılacağı tamamlandı olarak işaretle"
msgid "Markdown"
msgstr ""
@@ -5813,36 +6106,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5853,7 +6116,7 @@ msgid "Maximum job timeout"
msgstr ""
msgid "May"
-msgstr ""
+msgstr "May"
msgid "Median"
msgstr ""
@@ -5862,10 +6125,10 @@ msgid "Member lock"
msgstr ""
msgid "Member since %{date}"
-msgstr ""
+msgstr "%{date} tarihinden beri üye"
msgid "Members"
-msgstr ""
+msgstr "Ãœyeler"
msgid "Members can be added by project <i>Maintainers</i> or <i>Owners</i>"
msgstr ""
@@ -5877,10 +6140,10 @@ msgid "Members will be forwarded here when signing in to your group. Get this fr
msgstr ""
msgid "Merge Request"
-msgstr ""
+msgstr "BirleÅŸtirme Ä°steÄŸi"
msgid "Merge Requests"
-msgstr ""
+msgstr "BirleÅŸtirme Ä°stekleri"
msgid "Merge Requests created"
msgstr ""
@@ -5897,14 +6160,17 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
-msgid "Merge request"
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
msgstr ""
+msgid "Merge request"
+msgstr "BirleÅŸtirme isteÄŸi"
+
msgid "Merge request approvals"
-msgstr ""
+msgstr "Birleştirme isteği onayları"
msgid "Merge requests"
-msgstr ""
+msgstr "BirleÅŸtirme istekleri"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
@@ -5982,7 +6248,7 @@ msgid "MergeRequest|Search files"
msgstr ""
msgid "Merged"
-msgstr ""
+msgstr "BirleÅŸtirildi"
msgid "Messages"
msgstr ""
@@ -6047,9 +6313,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6099,7 +6362,7 @@ msgid "Milestone lists show all issues from the selected milestone."
msgstr ""
msgid "Milestones"
-msgstr ""
+msgstr "Dönüm Noktaları"
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 ""
@@ -6156,7 +6419,7 @@ msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
msgid "Modal|Cancel"
-msgstr ""
+msgstr "Modal|Ä°ptal"
msgid "Modal|Close"
msgstr ""
@@ -6194,6 +6457,9 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6234,7 +6500,7 @@ msgid "Nav|Sign out and sign in with a different account"
msgstr ""
msgid "Need help?"
-msgstr ""
+msgstr "Yardım ister misiniz?"
msgid "Network"
msgstr ""
@@ -6243,27 +6509,27 @@ msgid "Never"
msgstr ""
msgid "New"
-msgstr ""
+msgstr "Yeni"
msgid "New Application"
-msgstr ""
+msgstr "Yeni Uygulama"
msgid "New Environment"
-msgstr ""
+msgstr "Yeni Ortam"
msgid "New Group"
-msgstr ""
+msgstr "Yeni Grup"
msgid "New Identity"
-msgstr ""
+msgstr "Yeni Kimlik"
msgid "New Issue"
msgid_plural "New Issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Yeni Sorun"
+msgstr[1] "Yeni Sorunlar"
msgid "New Label"
-msgstr ""
+msgstr "Yeni Etiket"
msgid "New Milestone"
msgstr ""
@@ -6271,13 +6537,13 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Password"
msgstr ""
-msgid "New Snippet"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Snippets"
+msgid "New Snippet"
msgstr ""
msgid "New branch"
@@ -6293,25 +6559,25 @@ msgid "New environment"
msgstr ""
msgid "New epic"
-msgstr ""
+msgstr "Yeni epik"
msgid "New file"
-msgstr ""
+msgstr "Yeni dosya"
msgid "New group"
-msgstr ""
+msgstr "Yeni grup"
msgid "New identity"
-msgstr ""
+msgstr "Yeni kimlik"
msgid "New issue"
-msgstr ""
+msgstr "Yeni sorun"
msgid "New label"
-msgstr ""
+msgstr "Yeni etiket"
msgid "New merge request"
-msgstr ""
+msgstr "Yeni birleÅŸtirme isteÄŸi"
msgid "New milestone"
msgstr ""
@@ -6320,32 +6586,38 @@ msgid "New pipelines will cancel older, pending pipelines on the same branch"
msgstr ""
msgid "New project"
-msgstr ""
+msgstr "Yeni proje"
msgid "New schedule"
msgstr ""
msgid "New snippet"
-msgstr ""
+msgstr "Yeni kod parçası"
msgid "New subgroup"
msgstr ""
msgid "New tag"
-msgstr ""
+msgstr "Yeni etiket"
msgid "New..."
-msgstr ""
+msgstr "Yeni..."
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
-msgid "No activities found"
+msgid "No Tag"
msgstr ""
+msgid "No activities found"
+msgstr "Etkinlik bulunamadı"
+
msgid "No assignee"
msgstr ""
@@ -6370,13 +6642,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
-msgid "No details available"
+msgid "No designs found."
msgstr ""
+msgid "No details available"
+msgstr "Ayrıntı yok"
+
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6389,7 +6664,7 @@ msgid "No file selected"
msgstr ""
msgid "No files found."
-msgstr ""
+msgstr "Dosya bulunamadı."
msgid "No issues for the selected time period."
msgstr ""
@@ -6407,7 +6682,7 @@ msgid "No merge requests for the selected time period."
msgstr ""
msgid "No merge requests found"
-msgstr ""
+msgstr "Birleştirme isteği bulunamadı"
msgid "No messages were logged"
msgstr ""
@@ -6425,7 +6700,7 @@ msgid "No prioritised labels with such name or description"
msgstr ""
msgid "No public groups"
-msgstr ""
+msgstr "Genel grup yok"
msgid "No pushes for the selected time period."
msgstr ""
@@ -6472,6 +6747,9 @@ msgstr ""
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6569,28 +6847,28 @@ msgid "NotificationLevel|Watch"
msgstr ""
msgid "Notifications"
-msgstr ""
+msgstr "Bildirimler"
msgid "Notifications off"
-msgstr ""
+msgstr "Bildirimler kapalı"
msgid "Notifications on"
-msgstr ""
+msgstr "Bildirimler açık"
msgid "Nov"
-msgstr ""
+msgstr "Kas"
msgid "November"
-msgstr ""
+msgstr "Kasım"
msgid "OK"
msgstr ""
msgid "Oct"
-msgstr ""
+msgstr "Eki"
msgid "October"
-msgstr ""
+msgstr "Ekim"
msgid "OfSearchInADropdown|Filter"
msgstr ""
@@ -6646,7 +6924,7 @@ msgid "Open in Xcode"
msgstr ""
msgid "Open projects"
-msgstr ""
+msgstr "Projeleri aç"
msgid "Open sidebar"
msgstr ""
@@ -6655,13 +6933,13 @@ msgid "Open source software to collaborate on code"
msgstr ""
msgid "Opened"
-msgstr ""
+msgstr "Açtı:"
msgid "Opened MR"
msgstr ""
msgid "Opened issues"
-msgstr ""
+msgstr "Açılan sorunlar"
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -6673,6 +6951,9 @@ msgid "Operations"
msgstr ""
msgid "Operations Dashboard"
+msgstr "Ä°ÅŸlemler Panosu"
+
+msgid "Operations Settings"
msgstr ""
msgid "OperationsDashboard|Add a project to the dashboard"
@@ -6684,6 +6965,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6757,7 +7041,7 @@ msgid "Part of merge request changes"
msgstr ""
msgid "Password"
-msgstr ""
+msgstr "Åžifre"
msgid "Past due"
msgstr ""
@@ -6802,7 +7086,7 @@ msgid "Permissions, LFS, 2FA"
msgstr ""
msgid "Personal Access Token"
-msgstr ""
+msgstr "Kişisel Erişim Anahtarı"
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
msgstr ""
@@ -6823,7 +7107,7 @@ msgid "Pipeline Schedules"
msgstr ""
msgid "Pipeline quota"
-msgstr ""
+msgstr "İş Hattı Kotası"
msgid "Pipeline triggers"
msgstr ""
@@ -6876,6 +7160,12 @@ msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -6891,6 +7181,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -7011,9 +7304,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -7023,9 +7328,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7045,13 +7359,16 @@ msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
msgid "Preferences"
-msgstr ""
+msgstr "Tercihler"
msgid "Preferences|Navigation theme"
+msgstr "Preferences|Gezinme teması"
+
+msgid "Preferences|This feature is experimental and translations are not complete yet"
msgstr ""
msgid "Press Enter or click to search"
-msgstr ""
+msgstr "Aramak için Enter tuşuna basın veya tıklayın"
msgid "Prevent adding new members to project membership within this group"
msgstr ""
@@ -7090,10 +7407,10 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr ""
msgid "Profile"
-msgstr ""
+msgstr "Profil"
msgid "Profile Settings"
-msgstr ""
+msgstr "Profil Ayarları"
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 ""
@@ -7117,7 +7434,7 @@ msgid "Profiles|Add key"
msgstr ""
msgid "Profiles|Add status emoji"
-msgstr ""
+msgstr "Profiles|Durum ifadesi ekle"
msgid "Profiles|Avatar cropper"
msgstr ""
@@ -7141,7 +7458,7 @@ msgid "Profiles|City, country"
msgstr ""
msgid "Profiles|Clear status"
-msgstr ""
+msgstr "Profiles|Durumu temizle"
msgid "Profiles|Click on icon to activate signin with one of the following services"
msgstr ""
@@ -7150,22 +7467,22 @@ msgid "Profiles|Connect"
msgstr ""
msgid "Profiles|Connected Accounts"
-msgstr ""
+msgstr "Profiles|Bağlı Hesaplar"
msgid "Profiles|Current path: %{path}"
msgstr ""
msgid "Profiles|Current status"
-msgstr ""
+msgstr "Profiles|Mevcut durum"
msgid "Profiles|Delete Account"
-msgstr ""
+msgstr "Profiles|Hesabı Sil"
msgid "Profiles|Delete account"
-msgstr ""
+msgstr "Profiles|Hesabı sil"
msgid "Profiles|Delete your account?"
-msgstr ""
+msgstr "Profiles|Hesabınız silinsin mi?"
msgid "Profiles|Deleting an account has the following effects:"
msgstr ""
@@ -7180,7 +7497,7 @@ msgid "Profiles|Don't display activity-related personal information on your prof
msgstr ""
msgid "Profiles|Edit Profile"
-msgstr ""
+msgstr "Profiles|Profili Düzenle"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
@@ -7189,7 +7506,7 @@ msgid "Profiles|Increase your account's security by enabling Two-Factor Authenti
msgstr ""
msgid "Profiles|Invalid password"
-msgstr ""
+msgstr "Profiles|Geçersiz şifre"
msgid "Profiles|Invalid username"
msgstr ""
@@ -7198,10 +7515,10 @@ msgid "Profiles|Learn more"
msgstr ""
msgid "Profiles|Made a private contribution"
-msgstr ""
+msgstr "Profiles|Özel bir katkı yaptı"
msgid "Profiles|Main settings"
-msgstr ""
+msgstr "Profiles|Ana ayarlar"
msgid "Profiles|No file chosen"
msgstr ""
@@ -7213,10 +7530,10 @@ msgid "Profiles|Position and size your new avatar"
msgstr ""
msgid "Profiles|Private contributions"
-msgstr ""
+msgstr "Profiles|Özel katkılar"
msgid "Profiles|Public Avatar"
-msgstr ""
+msgstr "Profiles|Genel Avatar"
msgid "Profiles|Remove avatar"
msgstr ""
@@ -7225,7 +7542,7 @@ msgid "Profiles|Set new profile picture"
msgstr ""
msgid "Profiles|Social sign-in"
-msgstr ""
+msgstr "Profiles|Sosyal oturum açma"
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr ""
@@ -7246,13 +7563,10 @@ msgid "Profiles|This email will be used for web based operations, such as edits
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
-msgstr ""
-
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
+msgstr "Profiles|Bu ifade ve mesaj profilinizde ve arayüz boyunca görünecektir."
msgid "Profiles|This information will appear on your profile"
-msgstr ""
+msgstr "Profiles|Bu bilgiler profilinizde görünecek"
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -7264,13 +7578,13 @@ msgid "Profiles|Typically starts with \"ssh-rsa …\""
msgstr ""
msgid "Profiles|Update profile settings"
-msgstr ""
+msgstr "Profiles|Profil ayarlarını güncelle"
msgid "Profiles|Update username"
msgstr ""
msgid "Profiles|Upload new avatar"
-msgstr ""
+msgstr "Profiles|Yeni avatar yükle"
msgid "Profiles|Use a private email - %{email}"
msgstr ""
@@ -7279,13 +7593,13 @@ msgid "Profiles|Username change failed - %{message}"
msgstr ""
msgid "Profiles|Username successfully changed"
-msgstr ""
+msgstr "Profiles|Kullanıcı adı başarıyla değiştirildi"
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 ""
+msgstr "Profiles|Durumunuz nedir?"
msgid "Profiles|Who you represent or work for"
msgstr ""
@@ -7324,7 +7638,7 @@ msgid "Profiles|Your name was automatically set based on your %{provider_label}
msgstr ""
msgid "Profiles|Your status"
-msgstr ""
+msgstr "Profiles|Durumunuz"
msgid "Profiles|e.g. My MacBook key"
msgstr ""
@@ -7342,7 +7656,7 @@ msgid "Profiling - Performance bar"
msgstr ""
msgid "Programming languages used in this repository"
-msgstr ""
+msgstr "Bu depoda kullanılan programlama dilleri"
msgid "Progress"
msgstr ""
@@ -7350,6 +7664,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7357,7 +7674,7 @@ msgid "Project '%{project_name}' queued for deletion."
msgstr ""
msgid "Project '%{project_name}' was successfully created."
-msgstr ""
+msgstr "'%{project_name}' projesi başarıyla oluşturuldu."
msgid "Project '%{project_name}' was successfully updated."
msgstr ""
@@ -7378,7 +7695,7 @@ msgid "Project avatar in repository: %{link}"
msgstr ""
msgid "Project details"
-msgstr ""
+msgstr "Proje ayrıntıları"
msgid "Project export could not be deleted."
msgstr ""
@@ -7392,11 +7709,14 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
msgid "Project name"
-msgstr ""
+msgstr "Proje adı"
msgid "Project slug"
msgstr ""
@@ -7414,10 +7734,10 @@ msgid "ProjectCreationLevel|Default project creation protection"
msgstr ""
msgid "ProjectCreationLevel|Developers + Maintainers"
-msgstr ""
+msgstr "ProjectCreationLevel|GeliÅŸtirici + Sorumlu"
msgid "ProjectCreationLevel|Maintainers"
-msgstr ""
+msgstr "ProjectCreationLevel|Sorumlu"
msgid "ProjectCreationLevel|No one"
msgstr ""
@@ -7489,6 +7809,9 @@ msgid "ProjectSettings|Users can only push commits to this repository that were
msgstr ""
msgid "Projects"
+msgstr "Projeler"
+
+msgid "Projects Successfully Retrieved"
msgstr ""
msgid "Projects shared with %{group_name}"
@@ -7806,7 +8129,7 @@ msgid "Register and see your runners for this project."
msgstr ""
msgid "Registry"
-msgstr ""
+msgstr "Kayıt Defteri"
msgid "Related Commits"
msgstr ""
@@ -7824,13 +8147,13 @@ msgid "Related Merge Requests"
msgstr ""
msgid "Related Merged Requests"
-msgstr ""
+msgstr "Ä°lgili BirleÅŸtirme Talepleri"
msgid "Related merge requests"
msgstr ""
msgid "Releases"
-msgstr ""
+msgstr "Sürümler"
msgid "Releases mark specific points in a project's development history, communicate information about the type of change, and deliver on prepared, often compiled, versions of the software to be reused elsewhere. Currently, releases can only be created through the API."
msgstr ""
@@ -7850,6 +8173,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7941,7 +8270,7 @@ msgid "Reports|no changed test results"
msgstr ""
msgid "Repository"
-msgstr ""
+msgstr "Depo"
msgid "Repository Settings"
msgstr ""
@@ -7985,6 +8314,19 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Resend invite"
msgstr ""
@@ -8143,6 +8485,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8162,10 +8507,10 @@ msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from you
msgstr ""
msgid "SSH Keys"
-msgstr ""
+msgstr "SSH Anahtarları"
msgid "SSH host keys"
-msgstr ""
+msgstr "SSH ana bilgisayar anahtarları"
msgid "SSH public key"
msgstr ""
@@ -8173,6 +8518,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8180,7 +8528,7 @@ msgid "Save Changes"
msgstr ""
msgid "Save application"
-msgstr ""
+msgstr "Uygulamayı kaydet"
msgid "Save changes"
msgstr ""
@@ -8206,6 +8554,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr ""
@@ -8252,23 +8603,26 @@ msgid "Search milestones"
msgstr ""
msgid "Search or filter results..."
-msgstr ""
+msgstr "Ara veya sonuçları filtrele..."
msgid "Search or jump to…"
-msgstr ""
+msgstr "Ara veya atla…"
msgid "Search project"
msgstr ""
msgid "Search projects"
-msgstr ""
+msgstr "Projeleri ara"
msgid "Search users"
msgstr ""
-msgid "Search your projects"
+msgid "Search users or groups"
msgstr ""
+msgid "Search your projects"
+msgstr "Projelerinizi arayın"
+
msgid "SearchAutocomplete|All GitLab"
msgstr ""
@@ -8414,7 +8768,7 @@ msgid "Select project to choose zone"
msgstr ""
msgid "Select projects you want to import."
-msgstr ""
+msgstr "İçe aktarmak istediğiniz projeleri seçin."
msgid "Select source branch"
msgstr ""
@@ -8447,10 +8801,10 @@ msgid "Sentry API URL"
msgstr ""
msgid "Sep"
-msgstr ""
+msgstr "Eyl"
msgid "September"
-msgstr ""
+msgstr "Eylül"
msgid "Server version"
msgstr ""
@@ -8498,7 +8852,7 @@ msgid "Serverless|There is currently no function data available from Knative. Th
msgstr ""
msgid "Service Desk"
-msgstr ""
+msgstr "Servis Masası"
msgid "Service Templates"
msgstr ""
@@ -8507,13 +8861,13 @@ msgid "Service URL"
msgstr ""
msgid "Session expiration, projects limit and attachment size."
-msgstr ""
+msgstr "Oturum zaman aşımı, proje sınırı ve ek boyutu."
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
msgid "Set a template repository for projects in this group"
-msgstr ""
+msgstr "Bu gruptaki projeler için bir şablon deposu ayarlayın"
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -8524,6 +8878,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8548,6 +8905,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8555,28 +8915,28 @@ msgid "SetPasswordToCloneLink|set a password"
msgstr ""
msgid "SetStatusModal|Add status emoji"
-msgstr ""
+msgstr "SetStatusModal|Durum ifadesi ekle"
msgid "SetStatusModal|Clear status"
-msgstr ""
+msgstr "SetStatusModal|Durumu temizle"
msgid "SetStatusModal|Edit status"
-msgstr ""
+msgstr "SetStatusModal|Durumu düzenle"
msgid "SetStatusModal|Remove status"
-msgstr ""
+msgstr "SetStatusModal|Durumu kaldır"
msgid "SetStatusModal|Set a status"
-msgstr ""
+msgstr "SetStatusModal|Bir durum ayarla"
msgid "SetStatusModal|Set status"
-msgstr ""
+msgstr "SetStatusModal|Durum ayarla"
msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
msgstr ""
msgid "SetStatusModal|What's your status?"
-msgstr ""
+msgstr "SetStatusModal|Durumunuz nedir?"
msgid "Settings"
msgstr ""
@@ -8605,9 +8965,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8628,8 +8994,8 @@ msgstr ""
msgid "Showing %d event"
msgid_plural "Showing %d events"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d etkinliği gösteriliyor"
+msgstr[1] "%d etkinlikleri gösteriliyor"
msgid "Side-by-side"
msgstr ""
@@ -8668,7 +9034,7 @@ msgid "Sign in with smart card"
msgstr ""
msgid "Sign out"
-msgstr ""
+msgstr "Oturumu kapat"
msgid "Sign-in restrictions"
msgstr ""
@@ -8677,7 +9043,7 @@ msgid "Sign-up restrictions"
msgstr ""
msgid "Similar issues"
-msgstr ""
+msgstr "Benzer sorunlar"
msgid "Size"
msgstr ""
@@ -8704,6 +9070,24 @@ msgid "Snippet Contents"
msgstr ""
msgid "Snippets"
+msgstr "Parçacıklar"
+
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
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."
@@ -8833,7 +9217,7 @@ msgid "SortOptions|Last joined"
msgstr ""
msgid "SortOptions|Last updated"
-msgstr ""
+msgstr "SortOptions|Son güncelleme"
msgid "SortOptions|Least popular"
msgstr ""
@@ -8881,7 +9265,7 @@ msgid "SortOptions|Oldest sign in"
msgstr ""
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "SortOptions|En eski güncelleme"
msgid "SortOptions|Popularity"
msgstr ""
@@ -8914,7 +9298,7 @@ msgid "Source (branch or tag)"
msgstr ""
msgid "Source code"
-msgstr ""
+msgstr "Kaynak kodu"
msgid "Source is not available"
msgstr ""
@@ -8944,7 +9328,7 @@ msgid "Squash commits"
msgstr ""
msgid "Stage"
-msgstr ""
+msgstr "AÅŸama"
msgid "Stage & Commit"
msgstr ""
@@ -8976,6 +9360,12 @@ 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 "Stars"
msgstr ""
@@ -9010,7 +9400,7 @@ msgid "Start the Runner!"
msgstr ""
msgid "Start your trial"
-msgstr ""
+msgstr "Denemenizi başlatın"
msgid "Started"
msgstr ""
@@ -9064,10 +9454,10 @@ msgid "Storage:"
msgstr ""
msgid "Subgroups"
-msgstr ""
+msgstr "Alt gruplar"
msgid "Subgroups and projects"
-msgstr ""
+msgstr "Alt gruplar ve projeler"
msgid "Submit as spam"
msgstr ""
@@ -9082,7 +9472,7 @@ msgid "Submit search"
msgstr ""
msgid "Subscribe"
-msgstr ""
+msgstr "Abone ol"
msgid "Subscribe at group level"
msgstr ""
@@ -9091,13 +9481,13 @@ msgid "Subscribe at project level"
msgstr ""
msgid "Subscribe to RSS feed"
-msgstr ""
+msgstr "RSS beslemesine abone olun"
msgid "Subscribe to calendar"
-msgstr ""
+msgstr "Takvime abone ol"
msgid "Subscribed"
-msgstr ""
+msgstr "Abone"
msgid "SubscriptionTable|Billing"
msgstr ""
@@ -9186,6 +9576,9 @@ msgstr ""
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9211,13 +9604,13 @@ msgid "Tag list:"
msgstr ""
msgid "Tags"
-msgstr ""
+msgstr "Etiketler"
msgid "Tags feed"
msgstr ""
msgid "Tags:"
-msgstr ""
+msgstr "Etiketler:"
msgid "TagsPage|Browse commits"
msgstr ""
@@ -9229,7 +9622,7 @@ msgid "TagsPage|Can't find HEAD commit for this tag"
msgstr ""
msgid "TagsPage|Cancel"
-msgstr ""
+msgstr "TagsPage|Ä°ptal"
msgid "TagsPage|Create tag"
msgstr ""
@@ -9322,7 +9715,7 @@ msgid "Test coverage parsing"
msgstr ""
msgid "Thanks! Don't show me this again"
-msgstr ""
+msgstr "Teşekkürler! Bu mesajı tekrar gösterme"
msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
msgstr ""
@@ -9375,6 +9768,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9496,6 +9892,9 @@ msgid "There was an error deleting the todo."
msgstr ""
msgid "There was an error loading users activity calendar."
+msgstr "Kullanıcı etkinlik takvimi yüklenirken bir hata oluştu."
+
+msgid "There was an error saving your changes."
msgstr ""
msgid "There was an error saving your notification settings."
@@ -9543,6 +9942,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9564,6 +9978,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9598,7 +10015,7 @@ msgid "This job does not have a trace."
msgstr ""
msgid "This job has been canceled"
-msgstr ""
+msgstr "Bu iÅŸ iptal edildi"
msgid "This job has been skipped"
msgstr ""
@@ -9648,6 +10065,12 @@ msgstr ""
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -9754,130 +10177,130 @@ msgid "TimeTracking|Spent"
msgstr ""
msgid "Timeago|%s days ago"
-msgstr ""
+msgstr "Timeago|%s gün önce"
msgid "Timeago|%s days remaining"
-msgstr ""
+msgstr "Timeago|%s gün kaldı"
msgid "Timeago|%s hours ago"
-msgstr ""
+msgstr "Timeago|%s saat önce"
msgid "Timeago|%s hours remaining"
-msgstr ""
+msgstr "Timeago|%s saat kaldı"
msgid "Timeago|%s minutes ago"
-msgstr ""
+msgstr "Timeago|%s dakika önce"
msgid "Timeago|%s minutes remaining"
-msgstr ""
+msgstr "Timeago|%s dakika kaldı"
msgid "Timeago|%s months ago"
-msgstr ""
+msgstr "Timeago|%s ay önce"
msgid "Timeago|%s months remaining"
-msgstr ""
+msgstr "Timeago|%s ay kaldı"
msgid "Timeago|%s seconds ago"
-msgstr ""
+msgstr "Timeago|%s saniye önce"
msgid "Timeago|%s seconds remaining"
-msgstr ""
+msgstr "Timeago|%s saniye kaldı"
msgid "Timeago|%s weeks ago"
-msgstr ""
+msgstr "Timeago|%s hafta önce"
msgid "Timeago|%s weeks remaining"
-msgstr ""
+msgstr "Timeago|%s hafta kaldı"
msgid "Timeago|%s years ago"
-msgstr ""
+msgstr "Timeago|%s yıl önce"
msgid "Timeago|%s years remaining"
-msgstr ""
+msgstr "Timeago|%s yıl kaldı"
msgid "Timeago|1 day ago"
msgstr ""
msgid "Timeago|1 day remaining"
-msgstr ""
+msgstr "Timeago|1 gün kaldı"
msgid "Timeago|1 hour ago"
-msgstr ""
+msgstr "Timeago|1 saat önce"
msgid "Timeago|1 hour remaining"
-msgstr ""
+msgstr "Timeago|1 saat kaldı"
msgid "Timeago|1 minute ago"
-msgstr ""
+msgstr "Timeago|1 dakika önce"
msgid "Timeago|1 minute remaining"
-msgstr ""
+msgstr "Timeago|1 dakika kaldı"
msgid "Timeago|1 month ago"
-msgstr ""
+msgstr "Timeago|1 ay önce"
msgid "Timeago|1 month remaining"
-msgstr ""
+msgstr "Timeago|1 ay kaldı"
msgid "Timeago|1 week ago"
-msgstr ""
+msgstr "Timeago|1 hafta önce"
msgid "Timeago|1 week remaining"
-msgstr ""
+msgstr "Timeago|1 hafta kaldı"
msgid "Timeago|1 year ago"
-msgstr ""
+msgstr "Timeago|1 yıl önce"
msgid "Timeago|1 year remaining"
-msgstr ""
+msgstr "Timeago|1 yıl kaldı"
msgid "Timeago|Past due"
-msgstr ""
+msgstr "Timeago|Vadesi geçmiş"
msgid "Timeago|in %s days"
-msgstr ""
+msgstr "Timeago|%s gün içinde"
msgid "Timeago|in %s hours"
-msgstr ""
+msgstr "Timeago|%s saat içinde"
msgid "Timeago|in %s minutes"
-msgstr ""
+msgstr "Timeago|%s dakika içinde"
msgid "Timeago|in %s months"
-msgstr ""
+msgstr "Timeago|%s ay içinde"
msgid "Timeago|in %s seconds"
-msgstr ""
+msgstr "Timeago|%s saniye içinde"
msgid "Timeago|in %s weeks"
-msgstr ""
+msgstr "Timeago|%s hafta içinde"
msgid "Timeago|in %s years"
-msgstr ""
+msgstr "Timeago|%s yıl içinde"
msgid "Timeago|in 1 day"
-msgstr ""
+msgstr "Timeago|1 gün içinde"
msgid "Timeago|in 1 hour"
-msgstr ""
+msgstr "Timeago|1 saat içinde"
msgid "Timeago|in 1 minute"
-msgstr ""
+msgstr "Timeago|1 dakika içinde"
msgid "Timeago|in 1 month"
-msgstr ""
+msgstr "Timeago|1 ay içinde"
msgid "Timeago|in 1 week"
-msgstr ""
+msgstr "Timeago|1 hafta içinde"
msgid "Timeago|in 1 year"
-msgstr ""
+msgstr "Timeago|1 yıl içinde"
msgid "Timeago|just now"
-msgstr ""
+msgstr "Timeago|ÅŸimdi"
msgid "Timeago|right now"
-msgstr ""
+msgstr "Timeago|ÅŸimdi"
msgid "Timeout"
msgstr ""
@@ -10010,7 +10433,7 @@ msgid "Todo"
msgstr ""
msgid "Todos"
-msgstr ""
+msgstr "Yapılacaklar"
msgid "Toggle Sidebar"
msgstr ""
@@ -10040,7 +10463,7 @@ msgid "ToggleButton|Toggle Status: ON"
msgstr ""
msgid "Token"
-msgstr ""
+msgstr "Erişim anahtarı"
msgid "Tomorrow"
msgstr ""
@@ -10184,7 +10607,7 @@ msgid "Unstar"
msgstr ""
msgid "Unsubscribe"
-msgstr ""
+msgstr "Abonelikten çık"
msgid "Unsubscribe at group level"
msgstr ""
@@ -10207,6 +10630,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10216,6 +10642,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10307,7 +10736,7 @@ msgid "User Cohorts are only shown when the %{usage_ping_link_start}usage ping%{
msgstr ""
msgid "User Settings"
-msgstr ""
+msgstr "Kullanıcı Ayarları"
msgid "User and IP Rate Limits"
msgstr ""
@@ -10316,22 +10745,22 @@ msgid "User map"
msgstr ""
msgid "UserProfile|Activity"
-msgstr ""
+msgstr "UserProfile|Etkinlik"
msgid "UserProfile|Already reported for abuse"
msgstr ""
msgid "UserProfile|Contributed projects"
-msgstr ""
+msgstr "UserProfile|Katıldığı projeler"
msgid "UserProfile|Edit profile"
-msgstr ""
+msgstr "UserProfile|Profili düzenle"
msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr ""
msgid "UserProfile|Groups"
-msgstr ""
+msgstr "UserProfile|Gruplar"
msgid "UserProfile|Groups are the best way to manage projects and members."
msgstr ""
@@ -10340,43 +10769,43 @@ msgid "UserProfile|Join or create a group to start contributing by commenting on
msgstr ""
msgid "UserProfile|Most Recent Activity"
-msgstr ""
+msgstr "UserProfile|En Son Etkinlik"
msgid "UserProfile|No snippets found."
-msgstr ""
+msgstr "UserProfile|Parçacık bulunamadı."
msgid "UserProfile|Overview"
-msgstr ""
+msgstr "UserProfile|Genel bakış"
msgid "UserProfile|Personal projects"
-msgstr ""
+msgstr "UserProfile|KiÅŸisel projeler"
msgid "UserProfile|Report abuse"
-msgstr ""
+msgstr "UserProfile|Kötüye kullanımı bildir"
msgid "UserProfile|Snippets"
-msgstr ""
+msgstr "UserProfile|Parçacıklar"
msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
msgstr ""
msgid "UserProfile|Subscribe"
-msgstr ""
+msgstr "UserProfile|Abone"
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "UserProfile|Bu kullanıcının herhangi bir kişisel projesi yok"
msgid "UserProfile|This user has a private profile"
-msgstr ""
+msgstr "UserProfile|Bu kullanıcı özel bir profile sahip"
msgid "UserProfile|This user hasn't contributed to any projects"
-msgstr ""
+msgstr "UserProfile|Bu kullanıcı hiçbir projeye katkıda bulunmadı"
msgid "UserProfile|View all"
-msgstr ""
+msgstr "UserProfile|Tümünü görüntüle"
msgid "UserProfile|View user in admin area"
-msgstr ""
+msgstr "UserProfile|Kullanıcıyı yönetici alanında görüntüle"
msgid "UserProfile|You can create a group for several dependent projects."
msgstr ""
@@ -10444,6 +10873,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10453,6 +10885,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10756,6 +11191,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr ""
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10850,10 +11288,10 @@ msgid "You do not have the correct permissions to override the settings from the
msgstr ""
msgid "You don't have any applications"
-msgstr ""
+msgstr "Herhangi bir uygulamanız yok"
msgid "You don't have any authorized applications"
-msgstr ""
+msgstr "Herhangi bir yetkili uygulamanız yok"
msgid "You don't have any deployments right now."
msgstr ""
@@ -10861,6 +11299,9 @@ 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 ""
@@ -10895,16 +11336,16 @@ msgid "You will lose all the unstaged changes you've made in this project. This
msgstr ""
msgid "You will not get any notifications via email"
-msgstr ""
+msgstr "E-posta yoluyla herhangi bir bildirim almazsınız "
msgid "You will only receive notifications for the events you choose"
-msgstr ""
+msgstr "Yalnızca seçtiğiniz etkinlikler için bildirim alacaksınız"
msgid "You will only receive notifications for threads you have participated in"
msgstr ""
msgid "You will receive notifications for any activity"
-msgstr ""
+msgstr "Herhangi bir etkinlik için bildirim alacaksınız"
msgid "You will receive notifications only for comments in which you were @mentioned"
msgstr ""
@@ -10916,11 +11357,14 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss
msgstr ""
msgid "You won't be able to pull or push project code via SSH until you add an SSH key to your profile"
-msgstr ""
+msgstr "Profilinize bir SSH anahtarı ekleyene kadar proje kodunu SSH üzerinden çekemez veya yollayamazsınız"
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -10937,7 +11381,7 @@ msgid "Your Conversational Development Index gives an overview of how you are us
msgstr ""
msgid "Your Groups"
-msgstr ""
+msgstr "Gruplarınız"
msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure"
msgstr ""
@@ -10949,16 +11393,16 @@ msgid "Your Projects' Activity"
msgstr ""
msgid "Your Todos"
-msgstr ""
+msgstr "Yapacaklarınız"
msgid "Your U2F device needs to be set up. Plug it in (if not already) and click the button on the left."
msgstr ""
msgid "Your applications (%{size})"
-msgstr ""
+msgstr "Uygulamalarınız (%{size})"
msgid "Your authorized applications"
-msgstr ""
+msgstr "Yetkili uygulamalarınız"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
msgstr ""
@@ -10979,7 +11423,7 @@ msgid "Your device was successfully set up! Give it a name and register it with
msgstr ""
msgid "Your groups"
-msgstr ""
+msgstr "Gruplarınız"
msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
msgstr ""
@@ -10994,13 +11438,13 @@ msgid "Your project limit is %{limit} projects! Please contact your administrato
msgstr ""
msgid "Your projects"
-msgstr ""
+msgstr "Projeleriniz"
msgid "a deleted user"
msgstr ""
msgid "ago"
-msgstr ""
+msgstr "önce"
msgid "allowed to fail"
msgstr ""
@@ -11014,6 +11458,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11097,6 +11544,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11191,9 +11641,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11233,6 +11680,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11251,7 +11701,7 @@ msgid "command line instructions"
msgstr ""
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "Yorumladı: %{link_to_project}"
msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue."
msgstr ""
@@ -11288,7 +11738,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "done"
-msgstr ""
+msgstr "tamamlandı"
msgid "draft"
msgid_plural "drafts"
@@ -11320,14 +11770,11 @@ msgid "group"
msgstr ""
msgid "help"
-msgstr ""
+msgstr "yardım"
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11401,8 +11848,8 @@ msgstr ""
msgid "merge request"
msgid_plural "merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "birleÅŸtirme isteÄŸi"
+msgstr[1] "birleÅŸtirme isteÄŸi"
msgid "missing"
msgstr ""
@@ -11446,11 +11893,14 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
msgid "mrWidget|Cancel automatic merge"
-msgstr ""
+msgstr "mrWidget|Otomatik birleÅŸtirmeyi iptal et"
msgid "mrWidget|Check out branch"
msgstr ""
@@ -11518,6 +11968,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11579,6 +12032,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
@@ -11655,13 +12111,13 @@ msgid "n/a"
msgstr ""
msgid "new merge request"
-msgstr ""
+msgstr "yeni birleÅŸtirme isteÄŸi"
msgid "none"
msgstr ""
msgid "notification emails"
-msgstr ""
+msgstr "bildirim e-postaları"
msgid "nounSeries|%{firstItem} and %{lastItem}"
msgstr ""
@@ -11686,10 +12142,10 @@ msgstr[0] ""
msgstr[1] ""
msgid "password"
-msgstr ""
+msgstr "ÅŸifre"
msgid "personal access token"
-msgstr ""
+msgstr "kişisel erişim anahtarı"
msgid "private"
msgstr ""
@@ -11765,13 +12221,13 @@ msgid "this document"
msgstr ""
msgid "to help your contributors communicate effectively!"
-msgstr ""
+msgstr "katkıda bulunanlara yardım etmek için etkili şekilde iletişim kurun!"
msgid "triggered"
msgstr ""
msgid "updated"
-msgstr ""
+msgstr "güncellendi"
msgid "username"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index 522946d739f..d89914c9775 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:12\n"
+"PO-Revision-Date: 2019-03-06 17:46\n"
msgid " Status"
msgstr "状æ€"
@@ -30,17 +30,21 @@ msgid_plural " improved on %d points"
msgstr[0] " æ高 %d 点"
msgid " or "
-msgstr ""
+msgstr " 或 "
msgid " or <#epic id>"
-msgstr ""
+msgstr " 或<#epic id>"
msgid " or <#issue id>"
-msgstr ""
+msgstr " 或<#issue id>"
msgid "\"%{query}\" in projects"
msgstr "在项目中\"%{query}\""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d 次æ交"
@@ -50,7 +54,7 @@ msgid_plural "%d commits behind"
msgstr[0] "è½åŽ %d 个æ交"
msgid "%d commits"
-msgstr ""
+msgstr "%d 次æ交"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -70,7 +74,7 @@ msgstr[0] "%d 个议题"
msgid "%d issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
+msgstr[0] "已选择%d个议题"
msgid "%d layer"
msgid_plural "%d layers"
@@ -111,12 +115,25 @@ msgstr "%{counter_storage} (%{counter_repositories} 个存储库, %{counter_bu
msgid "%{count} %{alerts}"
msgstr "%{count}个%{alerts}"
-msgid "%{count} more"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
msgstr ""
+msgid "%{count} more"
+msgstr "其余 %{count} 项"
+
msgid "%{count} more assignees"
msgstr "åŠå…¶ä»–%{count}å指派人"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} ä½å‚与者"
@@ -131,18 +148,18 @@ msgstr "%{filePath} 已删除"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} 更多"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}群组%{group_docs_link_end} å…许您管ç†ã€å作多个项目。群组的æˆå‘˜å¯ä»¥è®¿é—®ç¾¤ç»„下的所有项目。"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 将被删除ï¼æ‚¨ç¡®å®šå—?"
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{link_start}Read more%{link_end} about role permissions"
+msgstr "%{link_start}查看更多%{link_end} 关于角色æƒé™"
+
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} 已开始"
@@ -162,22 +179,22 @@ msgid "%{percent}%% complete"
msgstr "å·²å®Œæˆ %{percent}%%"
msgid "%{state} epics"
-msgstr ""
+msgstr "epic %{state}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{branch_count}%{strong_end} 个分支"
msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{commit_count}%{strong_end} 次æ交"
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} 个文件"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
-msgstr[0] ""
+msgstr[0] "%{strong_start}%{tag_count}%{strong_end} 个标签"
msgid "%{text} %{files}"
msgid_plural "%{text} %{files} files"
@@ -196,10 +213,10 @@ msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what infor
msgstr "%{usage_ping_link_start}了解更多%{usage_ping_link_end}关于GitLab Inc.的共享信æ¯ã€‚"
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "%{user_name}的个人资料"
msgid "(external source)"
-msgstr ""
+msgstr "(外部资æº)"
msgid "+ %{count} more"
msgstr "+ 其余 %{count} 项"
@@ -207,9 +224,12 @@ msgstr "+ 其余 %{count} 项"
msgid "+ %{moreCount} more"
msgstr "+ 其余 %{moreCount} 项"
-msgid ", or "
+msgid "+%{extraOptionCount} more"
msgstr ""
+msgid ", or "
+msgstr ",或"
+
msgid "- Runner is active and can process any new jobs"
msgstr "- Runnerå·²å¯ç”¨ï¼Œéšæ—¶å¯ä»¥å¤„ç†æ–°ä½œä¸š"
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] "%{count} 个 %{type} 的修改"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "%d 个已关闭的议题"
@@ -267,13 +291,13 @@ msgid "1st contribution!"
msgstr "最高贡献"
msgid "2FA"
-msgstr ""
+msgstr "åŒå› å­éªŒè¯"
msgid "2FA enabled"
msgstr "å¯ç”¨åŒé‡è®¤è¯"
msgid "403|Please contact your GitLab administrator to get permission."
-msgstr ""
+msgstr "请è”系您的 GitLab 管ç†å‘˜èŽ·å–访问æƒé™ã€‚"
msgid "403|You don't have the permission to access this page."
msgstr "您没有æƒé™è®¿é—®æ­¤é¡µé¢ã€‚"
@@ -315,11 +339,26 @@ msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong>
msgstr "<strong>%{pushes}</strong>次推é€ï¼Œå«æ¥è‡ª<strong>%{people}</strong> å贡献者的<strong>%{commits}</strong>次以上æ交。"
msgid "<strong>Deletes</strong> source branch"
-msgstr ""
+msgstr "<strong>删除</strong>æºåˆ†æ”¯"
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "Runner是一个执行任务的进程。您å¯ä»¥æ ¹æ®éœ€è¦é…置任æ„æ•°é‡çš„Runner。"
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "æŒç»­é›†æˆæ•°æ®å›¾"
@@ -335,6 +374,9 @@ msgstr "GitLab滥用审查团队将会尽快查看您的报告。"
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "将在派生(fork)项目中中创建一个新的分支, 并开å¯ä¸€ä¸ªæ–°çš„åˆå¹¶è¯·æ±‚。"
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "项目å¯ä»¥ç”¨äºŽå­˜æ”¾æ–‡ä»¶(仓库),安排计划(议题),并å‘布文档(wiki), %{among_other_things_link}。"
@@ -363,7 +405,7 @@ msgid "Abuse reports"
msgstr "滥用报告"
msgid "Accept invitation"
-msgstr ""
+msgstr "接å—邀请"
msgid "Accept terms"
msgstr "接å—æ¡æ¬¾"
@@ -396,16 +438,16 @@ msgid "Active Sessions"
msgstr "活动会è¯"
msgid "Activity"
-msgstr "活动"
+msgstr "动æ€"
msgid "Add"
msgstr "添加"
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "添加更新日志"
msgid "Add CONTRIBUTING"
-msgstr ""
+msgstr "添加贡献信æ¯"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
msgstr "添加组 Webhooks å’Œ GitLab ä¼ä¸šç‰ˆã€‚"
@@ -417,26 +459,53 @@ msgid "Add Kubernetes cluster"
msgstr "添加 Kubernetes 集群"
msgid "Add README"
+msgstr "添加自述文件"
+
+msgid "Add a bullet list"
msgstr ""
msgid "Add a general comment to this %{noteable_name}."
-msgstr ""
+msgstr "添加一般评论 %{noteable_name}。"
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "在wiki中添加一个主页,其中包å«æœ‰å…³é¡¹ç›®çš„ä¿¡æ¯ï¼ŒGitLab将在此处显示该主页,而ä¸æ˜¯æ­¤æ¶ˆæ¯ã€‚"
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "添加表格"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "添加包å«åœ¨æ‰€æœ‰ç”µå­é‚®ä»¶ä¸­çš„附加文本。 长度ä¸è¶…过%{character_limit} 字符"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "ç«‹å³æ·»åŠ è¯„论"
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr "添加图片评论"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "添加许å¯è¯"
@@ -453,7 +522,7 @@ msgid "Add reaction"
msgstr "添加回应"
msgid "Add to project"
-msgstr ""
+msgstr "添加到项目"
msgid "Add to review"
msgstr "添加到评审"
@@ -465,7 +534,7 @@ msgid "Add user(s) to the group:"
msgstr "å‘群组添加用户"
msgid "Add users or groups who are allowed to approve every merge request"
-msgstr ""
+msgstr "添加å…许批准æ¯ä¸ªåˆå¹¶è¯·æ±‚的用户或群组"
msgid "Add users to group"
msgstr "将用户加入群组"
@@ -516,40 +585,40 @@ msgid "AdminProjects|Delete project"
msgstr "删除项目"
msgid "AdminSettings|Auto DevOps domain"
-msgstr ""
+msgstr "Auto DevOps 域"
msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
+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|When creating a new environment variable it will be protected by default."
-msgstr ""
+msgstr "创建一个新的环境å˜é‡æ—¶ï¼Œå®ƒä¼šè¢«é»˜è®¤ä¿æŠ¤ã€‚"
msgid "AdminUsers|2FA Disabled"
-msgstr ""
+msgstr "ç¦ç”¨åŒå› å­éªŒè¯"
msgid "AdminUsers|2FA Enabled"
-msgstr ""
+msgstr "å¯ç”¨åŒå› å­éªŒè¯"
msgid "AdminUsers|Active"
-msgstr ""
+msgstr "活跃"
msgid "AdminUsers|Admin"
-msgstr ""
+msgstr "管ç†å‘˜"
msgid "AdminUsers|Admins"
-msgstr ""
+msgstr "管ç†å‘˜"
msgid "AdminUsers|Block user"
msgstr "ç¦ç”¨ç”¨æˆ·"
msgid "AdminUsers|Blocked"
-msgstr ""
+msgstr "å·²å±è”½"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr ""
+msgstr "无法解除已å±è”½çš„ LDAP 用户"
msgid "AdminUsers|Delete User %{username} and contributions?"
msgstr "删除用户 %{username} 以åŠç›¸å…³è´¡çŒ®å—?"
@@ -564,28 +633,28 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "删除用户åŠç›¸å…³è´¡çŒ®"
msgid "AdminUsers|External"
-msgstr ""
+msgstr "外部"
msgid "AdminUsers|It's you!"
-msgstr ""
+msgstr "自己ï¼"
msgid "AdminUsers|New user"
-msgstr ""
+msgstr "新用户"
msgid "AdminUsers|No users found"
-msgstr ""
+msgstr "未找到用户"
msgid "AdminUsers|Search by name, email or username"
-msgstr ""
+msgstr "按åå­—ã€ç”µå­é‚®ä»¶æˆ–用户åæœç´¢"
msgid "AdminUsers|Search users"
-msgstr ""
+msgstr "æœç´¢ç”¨æˆ·"
msgid "AdminUsers|Send email to users"
-msgstr ""
+msgstr "å‘用户å‘é€ç”µå­é‚®ä»¶"
msgid "AdminUsers|Sort by"
-msgstr ""
+msgstr "排åºæ–¹å¼"
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr "请输入 %{projectName} æ¥ç¡®è®¤"
@@ -594,10 +663,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "请输入 %{username} æ¥ç¡®è®¤"
msgid "AdminUsers|User will be blocked"
-msgstr ""
+msgstr "用户将被å±è”½"
msgid "AdminUsers|Without projects"
-msgstr ""
+msgstr "没有项目"
msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
msgstr "高级æƒé™ï¼Œå¤§æ–‡ä»¶å­˜å‚¨å’ŒåŒé‡è®¤è¯è®¾ç½®ã€‚"
@@ -605,16 +674,22 @@ msgstr "高级æƒé™ï¼Œå¤§æ–‡ä»¶å­˜å‚¨å’ŒåŒé‡è®¤è¯è®¾ç½®ã€‚"
msgid "Advanced settings"
msgstr "高级设置"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "警报"
msgid "Alerts"
-msgstr ""
+msgstr "警报"
msgid "All"
msgstr "全部"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "所有更改å‡å·²æ交"
@@ -622,13 +697,13 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr "从模æ¿æˆ–导入时为空白项目将å¯ç”¨æ‰€æœ‰åŠŸèƒ½ï¼Œä½†å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®ä¸­å°†å…¶ç¦ç”¨ã€‚"
msgid "All issues for this milestone are closed. You may close this milestone now."
-msgstr ""
+msgstr "这个里程碑的所有议题都已关闭。现在您å¯ä»¥å…³é—­è¿™ä¸ªé‡Œç¨‹ç¢‘。"
msgid "All users"
msgstr "所有用户"
msgid "Allow \"%{group_name}\" to sign you in"
-msgstr ""
+msgstr "å…许“%{group_name}â€ä»¥æ‚¨çš„身份登录"
msgid "Allow commits from members who can merge to the target branch."
msgstr "å…许具有åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯æƒé™çš„æˆå‘˜æ交"
@@ -652,7 +727,7 @@ msgid "Allow users to request access if visibility is public or internal."
msgstr "如果是公开或内部å¯è§æ€§ï¼Œåˆ™å…许用户请求访问æƒé™ã€‚"
msgid "Allowed to fail"
-msgstr ""
+msgstr "å…许失败"
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "这里å¯ä»¥æ·»åŠ å’Œç®¡ç† Kubernetes 集群。"
@@ -684,7 +759,7 @@ msgstr "空GitLab用户字段将在所有问题和注释的æ述中添加FogBug
msgid "An error has occurred"
msgstr "å‘生错误"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -694,6 +769,15 @@ 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 previewing the blob"
@@ -708,6 +792,9 @@ msgstr "更新议题æƒé‡æ—¶å‘生错误"
msgid "An error occurred while adding approver"
msgstr "添加审批者时出错"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "删除评论时å‘生错误"
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr "获å–项目时å‘生错误"
@@ -769,7 +859,7 @@ msgid "An error occurred while loading the file"
msgstr "加载文件时å‘生错误"
msgid "An error occurred while loading the subscription details."
-msgstr ""
+msgstr "加载订阅信æ¯æ—¶å‘生错误。"
msgid "An error occurred while making the request."
msgstr "å‘é€è¯·æ±‚æ—¶å‘生错误。"
@@ -778,10 +868,10 @@ msgid "An error occurred while removing approver"
msgstr "删除批准者时å‘生错误"
msgid "An error occurred while removing epics."
-msgstr ""
+msgstr "删除 epic æ—¶å‘生错误。"
msgid "An error occurred while removing issues."
-msgstr ""
+msgstr "删除议题时å‘生错误。"
msgid "An error occurred while rendering KaTeX"
msgstr "渲染KaTeXæ—¶å‘生错误"
@@ -790,7 +880,7 @@ msgid "An error occurred while rendering preview broadcast message"
msgstr "渲染广播消æ¯æ—¶å‘生错误"
msgid "An error occurred while retrieving calendar activity"
-msgstr "获å–日历活动时å‘生错误"
+msgstr "获å–日历动æ€æ—¶å‘生错误"
msgid "An error occurred while retrieving diff"
msgstr "获å–差异时å‘生错误"
@@ -801,12 +891,18 @@ msgstr "ä¿å­˜LDAP覆盖状æ€æ—¶å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "An error occurred while saving assignees"
msgstr "ä¿å­˜è¢«æŒ‡æ´¾äººæ—¶å‡ºçŽ°é”™è¯¯ã€‚"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "订阅通知时å‘生错误。"
msgid "An error occurred while unsubscribing to notifications."
msgstr "å–消订阅通知时å‘生错误。"
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "更新评论时å‘生错误"
@@ -814,52 +910,52 @@ msgid "An error occurred while validating username"
msgstr "验è¯ç”¨æˆ·åæ—¶å‘生错误"
msgid "An error occurred whilst committing your changes."
-msgstr ""
+msgstr "æ交更改时å‘生错误。"
msgid "An error occurred whilst fetching the job trace."
-msgstr ""
+msgstr "获å–作业跟踪时å‘生错误。"
msgid "An error occurred whilst fetching the latest pipeline."
-msgstr ""
+msgstr "获å–最新æµæ°´çº¿æ—¶å‘生错误。"
msgid "An error occurred whilst loading all the files."
-msgstr ""
+msgstr "加载所有文件时å‘生错误。"
msgid "An error occurred whilst loading the file content."
-msgstr ""
+msgstr "加载文件内容时å‘生错误。"
msgid "An error occurred whilst loading the file."
-msgstr ""
+msgstr "加载文件时å‘生错误。"
msgid "An error occurred whilst loading the merge request changes."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚çš„å˜æ›´å†…容时å‘生错误。"
msgid "An error occurred whilst loading the merge request version data."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚的版本数æ®æ—¶å‘生错误。"
msgid "An error occurred whilst loading the merge request."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
msgid "An error occurred whilst loading the pipelines jobs."
-msgstr ""
+msgstr "加载æµæ°´çº¿ä½œä¸šæ—¶å‘生错误。"
msgid "An error occurred. Please try again."
msgstr "å‘生了错误,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "An unexpected error occurred while checking the project environment."
-msgstr ""
+msgstr "检查项目环境时å‘生æ„外错误。"
msgid "An unexpected error occurred while checking the project runners."
-msgstr ""
+msgstr "检查项目è¿è¡Œå™¨æ—¶å‘生æ„外错误。"
msgid "An unexpected error occurred while communicating with the Web Terminal."
-msgstr ""
+msgstr "与Web终端通信时å‘生æ„外错误。"
msgid "An unexpected error occurred while starting the Web Terminal."
-msgstr ""
+msgstr "å¯åŠ¨Web终端时å‘生æ„外错误。"
msgid "An unexpected error occurred while stopping the Web Terminal."
-msgstr ""
+msgstr "åœæ­¢Web终端时å‘生æ„外错误。"
msgid "Analytics"
msgstr "分æž"
@@ -892,20 +988,54 @@ msgid "Applications"
msgstr "应用"
msgid "Applied"
-msgstr ""
+msgstr "已应用"
msgid "Apply suggestion"
+msgstr "应用建议"
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}."
msgstr ""
-msgid "Approvals"
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
msgstr ""
-msgid "Approvals required"
+msgid "ApprovalRule|Members"
msgstr ""
-msgid "Approvers"
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
msgstr ""
+msgid "Approvals"
+msgstr "核准"
+
+msgid "Approvals required"
+msgstr "需è¦æ ¸å‡†"
+
+msgid "Approvers"
+msgstr "核准人"
+
msgid "Apr"
msgstr "4月"
@@ -919,7 +1049,7 @@ msgid "Archived projects"
msgstr "归档项目"
msgid "Are you sure"
-msgstr ""
+msgstr "您确定å—"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "确定è¦åˆ é™¤æ­¤æµæ°´çº¿è®¡åˆ’å—?"
@@ -931,7 +1061,7 @@ msgid "Are you sure you want to lose unsaved changes?"
msgstr "确定è¦æ”¾å¼ƒæœªä¿å­˜çš„更改å—?"
msgid "Are you sure you want to lose your issue information?"
-msgstr ""
+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 "您确定è¦é‡æ–°ç”Ÿæˆå…¬é’¥å—?在镜åƒå†æ¬¡è¿è¡Œä¹‹å‰ï¼Œæ‚¨å¿…须更新远程æœåŠ¡å™¨ä¸Šçš„公钥。"
@@ -939,17 +1069,23 @@ msgstr "您确定è¦é‡æ–°ç”Ÿæˆå…¬é’¥å—?在镜åƒå†æ¬¡è¿è¡Œä¹‹å‰ï¼Œæ‚¨å¿…
msgid "Are you sure you want to remove %{group_name}?"
msgstr "确定移除群组 %{group_name} å—?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
+msgstr "您确定è¦åˆ é™¤æ ¸å‡†è€… %{name} å—?"
+
+msgid "Are you sure you want to remove group %{name}"
msgstr ""
msgid "Are you sure you want to remove group %{name}?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤ %{name} 群组å—?"
msgid "Are you sure you want to remove the attachment?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤æ­¤é™„件?"
msgid "Are you sure you want to remove this identity?"
-msgstr "你确定è¦åˆ é™¤è¿™ä¸ªèº«ä»½æ ‡è¯†å—?"
+msgstr "您确定è¦åˆ é™¤è¿™ä¸ªèº«ä»½æ ‡è¯†å—?"
msgid "Are you sure you want to reset registration token?"
msgstr "确定è¦é‡ç½®æ³¨å†Œä»¤ç‰Œå—?"
@@ -961,10 +1097,10 @@ msgid "Are you sure you want to stop this environment?"
msgstr "是å¦ç¡®å®šç»ˆæ­¢å½“å‰çŽ¯å¢ƒï¼Ÿ"
msgid "Are you sure you want to unlock %{path_lock_path}?"
-msgstr "你确定è¦è§£é” %{path_lock_path} å—?"
+msgstr "您确定è¦è§£é” %{path_lock_path} å—?"
msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
-msgstr ""
+msgstr "您确定è¦å–消订阅 %{type}:%{link_to_noteable_text}å—?"
msgid "Are you sure?"
msgstr "确定å—?"
@@ -985,7 +1121,7 @@ msgid "Assertion consumer service URL"
msgstr "断言消费者æœåŠ¡ URL"
msgid "Assets"
-msgstr ""
+msgstr "资æº"
msgid "Assign custom color like #FF0000"
msgstr "分é…自定义颜色,如FF0000"
@@ -997,7 +1133,7 @@ msgid "Assign milestone"
msgstr "分é…里程碑"
msgid "Assign some issues to this milestone."
-msgstr ""
+msgstr "为此里程碑分é…一些议题。"
msgid "Assign to"
msgstr "分é…到"
@@ -1026,9 +1162,12 @@ msgstr "指派列表显示分é…给选定用户的所有议题。"
msgid "Assignee(s)"
msgstr "指派"
-msgid "Attach a file"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
+msgid "Attach a file"
+msgstr "附加文件"
+
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "拖放文件到此处或者 %{upload_link}"
@@ -1041,9 +1180,6 @@ msgstr "8月"
msgid "August"
msgstr "8 月"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "认è¯æ—¥å¿—"
@@ -1060,7 +1196,7 @@ msgid "Authorization code:"
msgstr "授æƒç ï¼š"
msgid "Authorization key"
-msgstr ""
+msgstr "授æƒå¯†é’¥"
msgid "Authorization was granted by entering your username and password in the application."
msgstr "在应用中输入您的用户å和密ç å³å®ŒæˆæŽˆæƒã€‚"
@@ -1123,25 +1259,25 @@ msgid "Automatically marked as default internal user"
msgstr "自动标记为默认内部用户"
msgid "Automatically resolved"
-msgstr ""
+msgstr "自动解决"
msgid "Available"
msgstr "å¯ç”¨çš„"
msgid "Available group Runners: %{runners}"
-msgstr ""
+msgstr "å¯ç”¨çš„群组 Runner: %{runners}"
msgid "Available shared Runners:"
-msgstr ""
+msgstr "å¯ç”¨çš„共享è¿è¡Œå™¨ï¼š"
msgid "Available specific runners"
-msgstr ""
+msgstr "å¯ç”¨çš„特定è¿è¡Œå™¨"
msgid "Avatar for %{assigneeName}"
-msgstr ""
+msgstr "%{assigneeName} 头åƒ"
msgid "Avatar for %{name}"
-msgstr ""
+msgstr "%{name} 头åƒ"
msgid "Avatar will be removed. Are you sure?"
msgstr "å³å°†åˆ é™¤å¤´åƒã€‚确定继续å—?"
@@ -1327,10 +1463,10 @@ msgid "Bitbucket import"
msgstr "从 Bitbucket 导入"
msgid "Block"
-msgstr ""
+msgstr "å±è”½"
msgid "Blocked"
-msgstr ""
+msgstr "å·²å±è”½"
msgid "Blog"
msgstr "åšå®¢"
@@ -1495,34 +1631,34 @@ msgid "Browse files"
msgstr "æµè§ˆæ–‡ä»¶"
msgid "Built-in"
-msgstr ""
+msgstr "内置"
msgid "Business"
-msgstr ""
+msgstr "商业"
msgid "Business metrics (Custom)"
msgstr "业务指标(自定义)"
msgid "By %{user_name}"
-msgstr ""
+msgstr "ç”± %{user_name}"
msgid "ByAuthor|by"
msgstr "作者:"
msgid "CHANGELOG"
-msgstr ""
+msgstr "更新日志"
msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Charts"
-msgstr ""
+msgstr "CI/CD 统计图"
msgid "CI / CD Settings"
msgstr "CI/CD 设置"
msgid "CI Lint"
-msgstr ""
+msgstr "CI Lint"
msgid "CI will run using the credentials assigned above."
msgstr "CI将使用上é¢æŒ‡å®šçš„凭æ®è¿è¡Œã€‚"
@@ -1570,25 +1706,25 @@ msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration
msgstr "在未找到备用CIé…置文件时使用Auto DevOpsæµæ°´çº¿ã€‚"
msgid "CICD|You must add a %{kubernetes_cluster_start}Kubernetes cluster integration%{kubernetes_cluster_end} to this project with a domain in order for your deployment strategy to work correctly."
-msgstr ""
+msgstr "您必须添加一个%{kubernetes_cluster_start}Kubernetes集群集æˆ%{kubernetes_cluster_end}域å到此项目,以便您的部署策略正常工作。"
msgid "CICD|instance enabled"
msgstr "å·²å¯ç”¨çš„实例"
msgid "CONTRIBUTING"
-msgstr ""
+msgstr "贡献信æ¯"
msgid "Callback URL"
msgstr "回调 URL"
msgid "Can override approvers and approvals required per merge request"
-msgstr ""
+msgstr "å¯ä»¥è¦†ç›–æ¯ä¸ªåˆå¹¶è¯·æ±‚所需的核准人和核准信æ¯"
msgid "Can't find HEAD commit for this branch"
msgstr "无法找到此分支的 HEAD æ交"
msgid "Canary Deployments is a popular CI strategy, where a small portion of the fleet is updated to the new version of your application."
-msgstr ""
+msgstr "金ä¸é›€éƒ¨ç½²æ˜¯ä¸€é¡¹æµè¡Œçš„CI策略,其中一å°éƒ¨åˆ†èŠ‚点更新到您的新版本应用。"
msgid "Cancel"
msgstr "å–消"
@@ -1602,11 +1738,14 @@ msgstr "无法自动åˆå¹¶"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "无法修改托管的 Kubernetes 集群"
-msgid "Certificate"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
msgstr ""
+msgid "Certificate"
+msgstr "è¯ä¹¦"
+
msgid "Certificate (PEM)"
-msgstr ""
+msgstr "è¯ä¹¦(PEM)"
msgid "Certificate fingerprint"
msgstr "è¯ä¹¦æŒ‡çº¹"
@@ -1615,7 +1754,7 @@ msgid "Change Weight"
msgstr "更改æƒé‡"
msgid "Change permissions"
-msgstr ""
+msgstr "更改æƒé™"
msgid "Change template"
msgstr "更改模æ¿"
@@ -1638,11 +1777,14 @@ msgstr "还原"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "这将创建一个新的æ交, æ¥è¿˜åŽŸçŽ°æœ‰çš„更改。"
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "差异显示方å¼ä¾<b>æº</b>版本åˆå¹¶åˆ°<b>目标</b>版本的形å¼ã€‚"
msgid "Changes suppressed. Click to show."
-msgstr ""
+msgstr "仅显示部分。点此显示全部。"
msgid "Charts"
msgstr "统计图"
@@ -1650,17 +1792,20 @@ msgstr "统计图"
msgid "Chat"
msgstr "å³æ—¶é€šè®¯"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "查看%{docs_link_start}文档%{docs_link_end}。"
msgid "Check your .gitlab-ci.yml"
-msgstr ""
+msgstr "检查您的.gitlab-ci.yml"
msgid "Checking %{text} availability…"
msgstr "正在检查%{text}çš„å¯ç”¨æ€§..."
msgid "Checking approval status"
-msgstr ""
+msgstr "检查批准状æ€"
msgid "Checking branch availability..."
msgstr "正在检查分支的å¯ç”¨æ€§..."
@@ -1684,10 +1829,10 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "选择分支/标签(例如%{master})或输入æ交(例如%{sha})以查看更改内容或创建åˆå¹¶è¯·æ±‚。"
msgid "Choose a file"
-msgstr ""
+msgstr "选择一个文件"
msgid "Choose a role permission"
-msgstr ""
+msgstr "选择角色æƒé™"
msgid "Choose a template..."
msgstr "选择模æ¿..."
@@ -1708,7 +1853,7 @@ msgid "Choose the top-level group for your repository imports."
msgstr "选择存储库导入的顶级群组。"
msgid "Choose what content you want to see on a group’s overview page"
-msgstr ""
+msgstr "选择è¦åœ¨ç¾¤ç»„概述页é¢ä¸Šçœ‹åˆ°çš„内容"
msgid "Choose which groups you wish to synchronize to this secondary node."
msgstr "选择您希望与此次è¦èŠ‚点åŒæ­¥çš„群组。"
@@ -1716,9 +1861,6 @@ msgstr "选择您希望与此次è¦èŠ‚点åŒæ­¥çš„群组。"
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "请选择è¦è¿žæŽ¥å¹¶è¿è¡Œ CI/CD æµæ°´çº¿çš„代ç ä»“库。"
-msgid "Choose which repositories you want to import."
-msgstr "选择è¦å¯¼å…¥çš„仓库"
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "选择è¦åŒæ­¥åˆ°æ­¤æ¬¡èŠ‚点的切片。"
@@ -1804,7 +1946,7 @@ msgid "CiVariable|Create wildcard"
msgstr "创建通é…符"
msgid "CiVariable|Error occurred while saving variables"
-msgstr ""
+msgstr "ä¿å­˜å˜é‡æ—¶å‡ºé”™"
msgid "CiVariable|New environment"
msgstr "新建环境"
@@ -1825,10 +1967,10 @@ msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "ä¸å¯ç”¨: %{reason}"
msgid "Clear"
-msgstr ""
+msgstr "清除"
msgid "Clear input"
-msgstr ""
+msgstr "清除输入"
msgid "Clear search"
msgstr "清除æœç´¢"
@@ -1870,43 +2012,43 @@ msgid "Clients"
msgstr "客户端"
msgid "Clone"
-msgstr ""
+msgstr "克隆"
msgid "Clone repository"
msgstr "克隆仓库"
msgid "Clone with %{http_label}"
+msgstr "使用 %{http_label} 克隆"
+
+msgid "Clone with KRB5"
msgstr ""
msgid "Clone with SSH"
-msgstr ""
+msgstr "使用 SSH 克隆"
msgid "Close"
msgstr "关闭"
msgid "Close epic"
-msgstr "关闭å²è¯—故事"
+msgstr "关闭epic"
msgid "Close milestone"
-msgstr ""
+msgstr "关闭里程碑"
msgid "Closed"
msgstr "已关闭"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "已关闭议题"
msgid "ClusterIntegration| %{custom_domain_start}More information%{custom_domain_end}."
-msgstr ""
+msgstr "%{custom_domain_start}更多信æ¯%{custom_domain_end}。"
msgid "ClusterIntegration| can be used instead of a custom domain."
-msgstr ""
+msgstr "å¯ä»¥ç”¨æ¥ä»£æ›¿è‡ªå®šä¹‰åŸŸã€‚"
msgid "ClusterIntegration| is the default environment scope for this cluster. This means that all jobs, regardless of their environment, will use this cluster. %{environment_scope_start}More information%{environment_scope_end}"
-msgstr ""
+msgstr "是此群集的默认环境范围。这æ„味ç€æ‰€æœ‰ä½œä¸šéƒ½å°†ä½¿ç”¨æ­¤ç¾¤é›†ã€‚%{environment_scope_start}更多信æ¯%{environment_scope_end}"
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} å·²æˆåŠŸå®‰è£…到Kubernetes集群上"
@@ -1915,7 +2057,7 @@ msgid "ClusterIntegration|%{boldNotice} This will add some extra resources like
msgstr "%{boldNotice} 这将添加一些é¢å¤–的资æºï¼Œå¦‚è´Ÿè½½å‡è¡¡å™¨ï¼Œè¿™å¯èƒ½ä¼šäº§ç”Ÿé¢å¤–çš„æˆæœ¬ï¼Œå…·ä½“å–决于您安装Kubernetes集群的托管æœåŠ¡æ供商。如果您使用的是Google Kubernetes Engine,则å¯ä»¥ %{pricingLink}。"
msgid "ClusterIntegration|%{title} upgraded successfully."
-msgstr ""
+msgstr "%{title} å‡çº§æˆåŠŸã€‚"
msgid "ClusterIntegration|API URL"
msgstr "API地å€"
@@ -1939,40 +2081,40 @@ msgid "ClusterIntegration|After installing Ingress, you will need to point your
msgstr "安装IngressåŽï¼Œæ‚¨éœ€è¦åœ¨ç”Ÿæˆçš„外部IP地å€ä¸ŠæŒ‡å‘DNS,以便在部署åŽæŸ¥çœ‹æ‚¨çš„应用程åºã€‚ %{ingressHelpLink}"
msgid "ClusterIntegration|Alternatively"
-msgstr ""
-
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "å°è¯•èŽ·å–项目地域时å‘生错误:%{error}"
+msgstr "除外"
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "å°è¯•è”ç³»Google Cloud APIæ—¶å‘生错误。请ç¨åŽå†è¯•ã€‚"
-msgid "ClusterIntegration|An error occurred while trying to fetch your projects: %{error}"
+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 "å°è¯•èŽ·å–您的项目时å‘生错误:%{error}"
+
msgid "ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}"
-msgstr ""
+msgstr "å°è¯•èŽ·å–设备类型时å‘生错误:%{error}"
msgid "ClusterIntegration|Applications"
msgstr "应用程åº"
msgid "ClusterIntegration|Apply for credit"
-msgstr ""
+msgstr "申请信用"
msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster."
msgstr "确定è¦åˆ é™¤æ­¤Kubernetes集群的集æˆå—?注æ„这并ä¸ä¼šåˆ é™¤å®žé™…çš„Kubernetes集群本身。"
msgid "ClusterIntegration|Base domain"
-msgstr ""
+msgstr "基础域"
msgid "ClusterIntegration|CA Certificate"
msgstr "CAè¯ä¹¦"
msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
+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 %{letsEncrypt} and ensure that certificates are valid and up-to-date."
-msgstr ""
+msgstr "Cert-Manager 是一个本地的 Kubernetes è¯ä¹¦ç®¡ç†æŽ§åˆ¶å™¨ï¼Œå¯å¸®åŠ©é¢å‘è¯ä¹¦ã€‚在群集上安装 Cert-Manager 将通过 %{letsEncrypt} é¢å‘è¯ä¹¦ï¼Œå¹¶ç¡®ä¿è¯ä¹¦æœ‰æ•ˆä¸”是最新的。"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "è¯ä¹¦æŽˆæƒåŒ…(PEMæ ¼å¼)"
@@ -1983,9 +2125,12 @@ msgstr "选择è¦åœ¨ Kubernetes 群集上安装的应用程åºã€‚安装以下任
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "请选择使用此Kubernetes群集的环境。"
-msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
+msgid "ClusterIntegration|Cluster health"
msgstr ""
+msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
+msgstr "通过选择匹é…的环境范围的最近集群。例如,项目群集将优先于群组群集。"
+
msgid "ClusterIntegration|Copy API URL"
msgstr "å¤åˆ¶API地å€"
@@ -1999,7 +2144,7 @@ msgid "ClusterIntegration|Copy Jupyter Hostname to clipboard"
msgstr "å°†Jupyter主机åå¤åˆ¶åˆ°å‰ªè´´æ¿"
msgid "ClusterIntegration|Copy Knative IP Address to clipboard"
-msgstr ""
+msgstr "å¤åˆ¶ Knative IP 地å€åˆ°å‰ªè´´æ¿"
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "å¤åˆ¶Kubernetes集群å称"
@@ -2029,13 +2174,13 @@ msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives
msgstr "æ¯ä¸ªæ–°çš„ Google äº‘å¹³å° (GCP) å¸æˆ·ä½¿ç”¨æ­¤é“¾æŽ¥ %{sign_up_link} å¯ä»¥æ”¶åˆ° 价值300美元的å…è´¹é¢åº¦ã€‚通过与Google çš„åˆä½œï¼ŒGitLabå¯ä»¥ä¸ºæ–°æ³¨å†Œçš„和现有的 GCP å¸æˆ·æä¾›é¢å¤– 200 美元的é¢åº¦ï¼Œä»¥æ–¹ä¾¿å®žçŽ°GitLabå’Œ Google Kubernetes引擎的集æˆã€‚"
msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
+msgstr "é…置谷歌Kubernetes引擎(GKE)集群失败: %{message}"
msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
+msgstr "请求Google云平å°å¤±è´¥: %{message}"
msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
+msgstr "è¿è¡Œ Kubeclient 失败: %{message}"
msgid "ClusterIntegration|Fetching machine types"
msgstr "正在获å–实例类型"
@@ -2079,8 +2224,8 @@ msgstr "éšè—"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "如果您正在设置多个群集并使用Auto DevOps,请%{help_link_start}先查阅此处%{help_link_end}。"
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "为了显示集群的å¥åº·çŠ¶å†µï¼Œæ‚¨çš„集群需è¦é…ç½®Prometheus以收集所需的数æ®ã€‚"
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -2094,9 +2239,6 @@ msgstr "Ingress为您æ供了一ç§åŸºäºŽè¯·æ±‚主机或路径将请求路由åˆ
msgid "ClusterIntegration|Install"
msgstr "安装"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "安装Prometheus"
-
msgid "ClusterIntegration|Installed"
msgstr "已安装"
@@ -2110,10 +2252,10 @@ msgid "ClusterIntegration|Integration status"
msgstr "集æˆçŠ¶æ€"
msgid "ClusterIntegration|Issuer Email"
-msgstr ""
+msgstr "ç­¾å‘人电å­é‚®ä»¶"
msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer. "
-msgstr ""
+msgstr "ç­¾å‘人代表è¯ä¹¦é¢å‘机构。您必须为您的签å‘人æ供电å­é‚®ä»¶åœ°å€ã€‚ "
msgid "ClusterIntegration|Jupyter Hostname"
msgstr "Jupyter主机å"
@@ -2131,10 +2273,10 @@ msgid "ClusterIntegration|Knative Domain Name:"
msgstr "Knative域å:"
msgid "ClusterIntegration|Knative IP Address:"
-msgstr ""
+msgstr "Knative IP地å€ï¼š"
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 ""
+msgstr "Knative扩展了Kubernetes,æ供了一组中间件组件,这些组件对于构建å¯åœ¨ä»»ä½•åœ°æ–¹è¿è¡ŒçŽ°ä»£çš„ã€ä»¥å¼€æºä¸ºä¸­å¿ƒå’ŒåŸºäºŽå®¹å™¨çš„应用程åºè‡³å…³é‡è¦ï¼šåœ¨æœ¬åœ°ï¼Œåœ¨äº‘中,甚至在第三方数æ®ä¸­å¿ƒã€‚"
msgid "ClusterIntegration|Kubernetes cluster"
msgstr "Kubernetes 集群"
@@ -2142,9 +2284,6 @@ msgstr "Kubernetes 集群"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes集群详细信æ¯"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Kubernetes集群è¿è¡ŒçŠ¶å†µ"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "正在Google Kubernetes Engine上创建Kubernetes集群..."
@@ -2173,7 +2312,7 @@ msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "了解更多的群组级Kubernetes集群信æ¯"
msgid "ClusterIntegration|Let's Encrypt"
-msgstr ""
+msgstr "Let's Encrypt"
msgid "ClusterIntegration|Machine type"
msgstr "机器类型"
@@ -2254,7 +2393,7 @@ msgid "ClusterIntegration|Request to begin installing failed"
msgstr "请求安装失败"
msgid "ClusterIntegration|Retry upgrade"
-msgstr ""
+msgstr "é‡è¯•å‡çº§"
msgid "ClusterIntegration|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
@@ -2299,7 +2438,7 @@ msgid "ClusterIntegration|Something went wrong on our end."
msgstr "å‘生了内部错误"
msgid "ClusterIntegration|Something went wrong when upgrading %{title}. Please check the logs and try again."
-msgstr ""
+msgstr "å‡çº§ %{title} 时出错。请检查日志并é‡è¯•ã€‚"
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine"
msgstr "在 Google Kubernetes Engine 上创建Kubernetes集群时å‘生错误"
@@ -2308,7 +2447,7 @@ msgid "ClusterIntegration|Something went wrong while installing %{title}"
msgstr "安装 %{title} æ—¶å‘生故障"
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{auto_devops_start}Auto DevOps%{auto_devops_end}. The domain should have a wildcard DNS configured matching the domain."
-msgstr ""
+msgstr "指定域将å…许您使用自动评审应用程åºå’Œè‡ªåŠ¨éƒ¨ç½²é˜¶æ®µè¿›è¡Œ %{auto_devops_start}Auto DevOps%{auto_devops_end}。域应é…置与域匹é…的通é…符DNS。"
msgid "ClusterIntegration|The IP address 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 "IP地å€æ­£åœ¨åˆ†é…中。如果花费时间过长,请检查您的Kubernetes集群或谷歌Kubernetes引擎(GKE) 上的é…é¢ã€‚"
@@ -2326,16 +2465,16 @@ msgid "ClusterIntegration|Token"
msgstr "令牌"
msgid "ClusterIntegration|Upgrade"
-msgstr ""
+msgstr "å‡çº§"
msgid "ClusterIntegration|Upgrade failed"
-msgstr ""
+msgstr "å‡çº§å¤±è´¥"
msgid "ClusterIntegration|Upgraded"
-msgstr ""
+msgstr "å·²å‡çº§"
msgid "ClusterIntegration|Upgrading"
-msgstr ""
+msgstr "å‡çº§ä¸­"
msgid "ClusterIntegration|Validating project billing status"
msgstr "验è¯é¡¹ç›®è´¦å•çŠ¶æ€"
@@ -2350,7 +2489,7 @@ msgid "ClusterIntegration|You must first install Helm Tiller before installing t
msgstr "在安装以下应用程åºä¹‹å‰ï¼Œå¿…须先安装Helm Tiller"
msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
+msgstr "您必须具有已å¯ç”¨RBAC的群集æ‰èƒ½å®‰è£…Knative。"
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "您的å¸æˆ·å¿…须有æƒé™%{link_to_kubernetes_engine}"
@@ -2380,31 +2519,43 @@ msgid "ClusterIntegration|sign up"
msgstr "注册"
msgid "Code"
+msgstr "代ç "
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
msgstr ""
msgid "Code owners"
msgstr "代ç æ‰€æœ‰è€…"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "世代表"
msgid "Collapse"
msgstr "收起"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "收起侧边æ "
msgid "Command line instructions"
-msgstr ""
+msgstr "命令行指引"
msgid "Comment"
msgstr "添加评论"
msgid "Comment & close %{noteable_name}"
-msgstr ""
+msgstr "评论并关闭 %{noteable_name}"
msgid "Comment & reopen %{noteable_name}"
-msgstr ""
+msgstr "评论并é‡æ–°å¼€å¯ %{noteable_name}"
msgid "Comment & resolve discussion"
msgstr "添加评论并解决讨论"
@@ -2423,13 +2574,13 @@ msgid_plural "Commits"
msgstr[0] "æ交"
msgid "Commit %{commit_id}"
-msgstr ""
+msgstr "æ交 %{commit_id}"
msgid "Commit Message"
msgstr "æ交消æ¯"
msgid "Commit deleted"
-msgstr ""
+msgstr "æ交已删除"
msgid "Commit duration in minutes for last 30 commits"
msgstr "最近30次æ交相应æŒç»­é›†æˆèŠ±è´¹çš„时间(分钟)"
@@ -2495,7 +2646,7 @@ msgid "Compare Revisions"
msgstr "比较版本"
msgid "Compare changes"
-msgstr ""
+msgstr "比较å˜æ›´"
msgid "Compare changes with the last commit"
msgstr "与上个æ交比较å˜æ›´å†…容"
@@ -2525,7 +2676,7 @@ msgid "Confidentiality"
msgstr "ä¿å¯†æ€§"
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
-msgstr ""
+msgstr "é…ç½® GitLab Runner 以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
msgid "Configure Gitaly timeouts."
msgstr "é…ç½®Gitaly超时时间。"
@@ -2534,7 +2685,7 @@ msgid "Configure Tracing"
msgstr "é…置跟踪"
msgid "Configure a <code>.gitlab-webide.yml</code> file in the <code>.gitlab</code> directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
-msgstr ""
+msgstr "在 <code>.gitlab</code> 目录中é…ç½® <code>.gitlab-webide.yml</code> 文件以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
msgid "Configure automatic git checks and housekeeping on repositories."
msgstr "在仓库上é…置自动git检查和仓库整ç†ã€‚"
@@ -2570,7 +2721,7 @@ msgid "Connecting..."
msgstr "正在连接..."
msgid "Contact sales to upgrade"
-msgstr ""
+msgstr "è”系销售人员进行å‡çº§"
msgid "Container Registry"
msgstr "容器注册表"
@@ -2621,7 +2772,7 @@ msgid "ContainerRegistry|You can also use a %{deploy_token} for read-only access
msgstr "您也å¯ä»¥ä½¿ç”¨ %{deploy_token} 以åªè¯»æ–¹å¼è®¿é—®é•œåƒåº“çš„é•œåƒã€‚"
msgid "Contents of .gitlab-ci.yml"
-msgstr ""
+msgstr ".gitlab-ci.yml的内容"
msgid "Continue"
msgstr "继续"
@@ -2639,7 +2790,7 @@ msgid "Contribution"
msgstr "贡献"
msgid "Contribution Charts"
-msgstr ""
+msgstr "贡献图表"
msgid "Contributions for <strong>%{calendar_date}</strong>"
msgstr "<strong>%{calendar_date}</strong>的贡献"
@@ -2675,13 +2826,13 @@ msgid "Control the maximum concurrency of verification operations for this Geo n
msgstr "控制此Geo节点的校验æ“作的最大并å‘性"
msgid "Control the minimum interval in days that a repository should be reverified for this primary node"
-msgstr ""
+msgstr "控制此主节点é‡æ–°éªŒè¯å­˜å‚¨åº“的最å°æ—¶é—´é—´éš”"
msgid "ConvDev Index"
msgstr "ConvDev指数"
msgid "Copy %{http_label} clone URL"
-msgstr ""
+msgstr "å¤åˆ¶ %{http_label} 克隆地å€"
msgid "Copy %{protocol} clone URL"
msgstr "å¤åˆ¶ %{protocol} 克隆URL"
@@ -2689,11 +2840,14 @@ msgstr "å¤åˆ¶ %{protocol} 克隆URL"
msgid "Copy ID to clipboard"
msgstr "å¤åˆ¶ID到剪贴æ¿"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "å¤åˆ¶SSH克隆URL"
msgid "Copy SSH public key"
-msgstr ""
+msgstr "å¤åˆ¶SSH公钥"
msgid "Copy SSH public key to clipboard"
msgstr "å°† SSH 公钥å¤åˆ¶åˆ°å‰ªè´´æ¿"
@@ -2741,7 +2895,7 @@ msgid "Create New Directory"
msgstr "创建新目录"
msgid "Create New Domain"
-msgstr ""
+msgstr "创建新域"
msgid "Create a new branch"
msgstr "创建一个新分支"
@@ -2753,7 +2907,7 @@ msgid "Create a new issue"
msgstr "创建新议题"
msgid "Create a new repository"
-msgstr ""
+msgstr "创建一个新存储库"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "在å¸æˆ·ä¸Šåˆ›å»ºä¸ªäººè®¿é—®ä»¤ç‰Œï¼Œä»¥é€šè¿‡ %{protocol} æ¥æ‹‰å–或推é€ã€‚"
@@ -2771,7 +2925,7 @@ msgid "Create empty repository"
msgstr "创建空的仓库"
msgid "Create epic"
-msgstr "创建å²è¯—故事"
+msgstr "创建epic"
msgid "Create file"
msgstr "创建文件"
@@ -2795,7 +2949,7 @@ msgid "Create merge request and branch"
msgstr "创建åˆå¹¶è¯·æ±‚åŠåˆ†æ”¯"
msgid "Create milestone"
-msgstr ""
+msgstr "创建里程碑"
msgid "Create new branch"
msgstr "创建新分支"
@@ -2843,7 +2997,7 @@ msgid "Created on:"
msgstr "创建于:"
msgid "Creating epic"
-msgstr "创建å²è¯—故事中"
+msgstr "创建epic中"
msgid "Cron Timezone"
msgstr "Cron 时区"
@@ -2879,7 +3033,7 @@ 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 ""
+msgstr "尚未为您所属的群组设置自定义项目模æ¿ã€‚请在群组的设置页é¢å¯ç”¨å®ƒã€‚è¦è®¾ç½®è‡ªå®šä¹‰é¡¹ç›®æ¨¡æ¿ï¼Œè¯·è”系群组的所有者或维护者。"
msgid "Customize colors"
msgstr "自定义颜色"
@@ -2891,10 +3045,10 @@ msgid "Customize how Google Code email addresses and usernames are imported into
msgstr "自定义如何将Google Code电å­é‚®ä»¶åœ°å€å’Œç”¨æˆ·å导入GitLab。下一步将选择è¦å¯¼å…¥çš„项目。"
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "自定义语言和区域相关设置。"
msgid "Customize your merge request approval settings."
-msgstr ""
+msgstr "自定义您的åˆå¹¶è¯·æ±‚核准设置。"
msgid "Customize your pipeline configuration, view your pipeline status and coverage report."
msgstr "自定义æµæ°´çº¿é…置,查看æµæ°´çº¿çŠ¶æ€å’Œè¦†ç›–率报告。"
@@ -2927,7 +3081,7 @@ msgid "CycleAnalyticsStage|Test"
msgstr "测试"
msgid "DNS"
-msgstr ""
+msgstr "DNS"
msgid "Dashboard"
msgstr "仪表æ¿"
@@ -2939,7 +3093,7 @@ msgid "DashboardProjects|Personal"
msgstr "个人"
msgid "Data is still calculating..."
-msgstr ""
+msgstr "æ•°æ®ä»åœ¨è®¡ç®—中……"
msgid "Date picker"
msgstr "日期选择器"
@@ -2954,7 +3108,7 @@ msgid "December"
msgstr "12月"
msgid "Decline"
-msgstr ""
+msgstr "æ‹’ç»"
msgid "Decline and sign out"
msgstr "æ‹’ç»å¹¶é€€å‡º"
@@ -2966,10 +3120,10 @@ msgid "Default classification label"
msgstr "默认分类标记"
msgid "Default first day of the week"
-msgstr ""
+msgstr "æ¯å‘¨çš„默认起始日"
msgid "Default first day of the week in calendars and date pickers."
-msgstr ""
+msgstr "在日期选择器中显示æ¯å‘¨é»˜è®¤çš„起始日。"
msgid "Default: Directly import the Google Code email address or username"
msgstr "默认:直接导入Google Code电å­é‚®ä»¶åœ°å€æˆ–用户å"
@@ -2981,7 +3135,7 @@ msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 语法定义自定义模å¼"
msgid "Define environments in the deploy stage(s) in <code>.gitlab-ci.yml</code> to track deployments here."
-msgstr ""
+msgstr "在<code>.githab-ci.yml</code>çš„ deploy 阶段中定义 environment æ¥è·Ÿè¸ªéƒ¨ç½²ã€‚"
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after it's timer finishes."
msgstr "您确定è¦ç«‹å³è¿è¡Œ %{jobName} å—?å¦åˆ™çš„è¯ï¼Œè¯¥ä½œä¸šå°†åœ¨è®¡æ—¶ç»“æŸåŽè‡ªåŠ¨è¿è¡Œã€‚"
@@ -3014,10 +3168,10 @@ msgid "Delete list"
msgstr "删除列表"
msgid "Delete source branch"
-msgstr ""
+msgstr "删除æºåˆ†æ”¯"
msgid "Delete this attachment"
-msgstr ""
+msgstr "删除此附件"
msgid "Deleted"
msgstr "已删除"
@@ -3153,7 +3307,7 @@ msgid "DeployTokens|Your new project deploy token has been created."
msgstr "新项目部署令牌已创建。"
msgid "Deployed"
-msgstr ""
+msgstr "已部署"
msgid "Deployed to"
msgstr "已部署到"
@@ -3176,6 +3330,9 @@ msgstr "æ述模æ¿å…许您为项目的问题和åˆå¹¶è¯·æ±‚定义æ述字段
msgid "Description:"
msgstr "æè¿°:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "删除"
@@ -3183,7 +3340,7 @@ msgid "Details"
msgstr "详情"
msgid "Details (default)"
-msgstr ""
+msgstr "详细信æ¯(默认)"
msgid "Detect host keys"
msgstr "检测主机密钥"
@@ -3216,10 +3373,10 @@ msgid "Disable group Runners"
msgstr "ç¦ç”¨ç¾¤ç»„Runner"
msgid "Disable shared Runners"
-msgstr ""
+msgstr "ç¦ç”¨å…±äº«è¿è¡Œå™¨"
msgid "Disabled"
-msgstr ""
+msgstr "å·²ç¦ç”¨"
msgid "Discard"
msgstr "放弃"
@@ -3243,22 +3400,25 @@ msgid "Discard review"
msgstr "放弃评审"
msgid "Discover GitLab Geo"
-msgstr ""
+msgstr "å‘现GitLab Geo"
msgid "Discover projects, groups and snippets. Share your projects with others"
msgstr "æµè§ˆé¡¹ç›®ï¼Œç¾¤ç»„和代ç ç‰‡æ®µã€‚与他人分享您的项目"
msgid "Discuss a specific suggestion or question"
-msgstr ""
+msgstr "讨论具体的建议或议题"
msgid "Discuss a specific suggestion or question that needs to be resolved"
+msgstr "讨论需è¦è§£å†³çš„具体建议或议题"
+
+msgid "Discussion"
msgstr ""
msgid "Dismiss"
msgstr "忽略"
msgid "Dismiss ConvDev introduction"
-msgstr ""
+msgstr "å–消 ConvDev 导入"
msgid "Dismiss Cycle Analytics introduction box"
msgstr "关闭循环分æžä»‹ç»æ¡†"
@@ -3288,10 +3448,10 @@ msgid "Download"
msgstr "下载"
msgid "Download artifacts"
-msgstr ""
+msgstr "下载工件"
msgid "Download asset"
-msgstr ""
+msgstr "下载资æº"
msgid "Download tar"
msgstr "下载 tar"
@@ -3318,7 +3478,7 @@ msgid "DownloadSource|Download"
msgstr "下载"
msgid "Downstream"
-msgstr ""
+msgstr "下游"
msgid "Downvotes"
msgstr "踩"
@@ -3336,13 +3496,13 @@ msgid "Edit"
msgstr "编辑"
msgid "Edit %{name}"
-msgstr ""
+msgstr "编辑%{name}"
msgid "Edit Label"
msgstr "编辑标签"
msgid "Edit Milestone"
-msgstr ""
+msgstr "编辑里程碑"
msgid "Edit Pipeline Schedule %{id}"
msgstr "编辑 %{id} æµæ°´çº¿è®¡åˆ’"
@@ -3354,10 +3514,10 @@ msgid "Edit application"
msgstr "编辑应用"
msgid "Edit comment"
-msgstr ""
+msgstr "编辑评论"
msgid "Edit environment"
-msgstr ""
+msgstr "编辑环境"
msgid "Edit files in the editor and commit changes here"
msgstr "在编辑器中编辑文件并在这里​​æ交å˜æ›´å†…容"
@@ -3369,7 +3529,7 @@ msgid "Edit identity for %{user_name}"
msgstr "编辑 %{user_name} 的身份信æ¯"
msgid "Edit issues"
-msgstr ""
+msgstr "编辑议题"
msgid "Elasticsearch"
msgstr "Elasticsearch"
@@ -3390,7 +3550,7 @@ msgid "Embed"
msgstr "嵌入"
msgid "Empty file"
-msgstr ""
+msgstr "空文件"
msgid "Enable"
msgstr "å¯ç”¨"
@@ -3417,7 +3577,7 @@ msgid "Enable classification control using an external service"
msgstr "使用外部æœåŠ¡å¯ç”¨åˆ†ç±»æŽ§åˆ¶"
msgid "Enable error tracking"
-msgstr ""
+msgstr "å¯ç”¨é”™è¯¯è·Ÿè¸ª"
msgid "Enable for this project"
msgstr "在此项目中å¯ç”¨"
@@ -3425,6 +3585,9 @@ msgstr "在此项目中å¯ç”¨"
msgid "Enable group Runners"
msgstr "å¯ç”¨ç¾¤ç»„Runner"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "å¯ç”¨æˆ–ç¦ç”¨åŒ¿å化数æ®æ”¶é›†."
@@ -3435,16 +3598,16 @@ msgid "Enable reCAPTCHA or Akismet and set IP limits."
msgstr "å¯ç”¨reCAPTCHA或Akismet并设置IPé™åˆ¶ã€‚"
msgid "Enable self approval of merge requests"
-msgstr ""
+msgstr "å¯ç”¨è‡ªæˆ‘核准åˆå¹¶è¯·æ±‚"
msgid "Enable shared Runners"
-msgstr ""
+msgstr "å¯ç”¨å…±äº«çš„è¿è¡Œå™¨"
msgid "Enable the Performance Bar for a given group."
msgstr "对指定群组å¯ç”¨æ€§èƒ½æ ã€‚"
msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "å¯ç”¨åŒå› ç´ èº«ä»½éªŒè¯"
msgid "Enable usage ping"
msgstr "å¯ç”¨ä½¿ç”¨æƒ…况检测(usage ping)"
@@ -3459,10 +3622,13 @@ msgid "Ends at (UTC)"
msgstr "结æŸäºŽ(UTC)"
msgid "Enforce SSO-only authentication for this group"
+msgstr "对该群组强制执行仅SSO身份验è¯"
+
+msgid "Enforce users to have dedicated group managed accounts for this group"
msgstr ""
msgid "Enforced SSO"
-msgstr ""
+msgstr "已强制执行SSO"
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "输入您的BitbucketæœåŠ¡å™¨URL和个人访问令牌"
@@ -3479,26 +3645,23 @@ msgstr "输入åˆå¹¶è¯·æ±‚说明"
msgid "Enter the merge request title"
msgstr "输入åˆå¹¶è¯·æ±‚标题"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
-msgstr ""
+msgstr "环境å˜é‡"
msgid "Environment variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use environment variables for passwords, secret keys, or whatever you want."
-msgstr ""
+msgstr "环境å˜é‡ä½œç”¨äºŽè¿è¡Œå™¨çš„环境中。å¯å°†å˜é‡é™åˆ¶ä¸ºä»…å—ä¿æŠ¤çš„分支或标签å¯ä»¥è®¿é—®ã€‚您å¯ä»¥ä¿å­˜å¯†ç ã€å¯†é’¥æˆ–任何你想è¦çš„å˜é‡ã€‚"
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default"
-msgstr ""
+msgstr "环境å˜é‡å·²è¢«ç®¡ç†å‘˜é…置为%{link_start}å—ä¿æŠ¤çš„(默认)%{link_end}"
msgid "Environment:"
-msgstr ""
+msgstr "环境:"
msgid "Environments"
msgstr "环境"
msgid "Environments allow you to track deployments of your application %{link_to_read_more}."
-msgstr ""
+msgstr "环境å…许您跟踪应用程åºçš„部署 %{link_to_read_more}。"
msgid "Environments|An error occurred while fetching the environments."
msgstr "获å–环境时å‘生错误。"
@@ -3506,6 +3669,12 @@ 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 "终止环境时å‘生错误,请ç¨åŽé‡è¯•"
@@ -3557,15 +3726,33 @@ msgstr "打开è¿è¡Œä¸­çš„环境"
msgid "Environments|Pod logs from"
msgstr "Pod日志æ¥è‡ªäºŽ"
+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|Read more about environments"
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|Show all"
msgstr "显示全部"
@@ -3576,6 +3763,18 @@ msgid "Environments|Stop environment"
msgstr "终止环境"
msgid "Environments|Stopping"
+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 %{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|This action will run the job defined by staging 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|Updated"
@@ -3588,19 +3787,19 @@ msgid "Environments|protected"
msgstr "å—ä¿æŠ¤çš„"
msgid "Epic"
-msgstr "å²è¯—故事"
+msgstr "Epic"
msgid "Epics"
-msgstr "å²è¯—故事"
+msgstr "Epic"
msgid "Epics Roadmap"
-msgstr "å²è¯—故事路线图"
+msgstr "Epic路线图"
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
-msgstr "利用å²è¯—故事(Epics),产å“线管ç†ä¼šå˜å¾—æ›´è½»æ¾ä¸”更高效"
+msgstr "利用 Epic,产å“线管ç†ä¼šå˜å¾—æ›´è½»æ¾ä¸”更高效"
msgid "Epics|An error occurred while saving the %{epicDateType} date"
-msgstr ""
+msgstr "ä¿å­˜ %{epicDateType} 日期时å‘生错误"
msgid "Epics|How can I solve this?"
msgstr "我该如何解决该问题?"
@@ -3609,10 +3808,10 @@ msgid "Epics|More information"
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 "这些日期会影å“å²è¯—故事在路线图中的显示方å¼ã€‚里程碑日期æ¥è‡ªäºŽå²è¯—故事中的议题所属的里程碑。您还å¯ä»¥è®¾ç½®å›ºå®šæ—¥æœŸæˆ–完全删除它们。"
+msgstr "è¿™äº›æ—¥æœŸä¼šå½±å“ epic 在路线图中的显示方å¼ã€‚里程碑日期æ¥è‡ªäºŽå²è¯—故事中的议题所属的里程碑。您还å¯ä»¥è®¾ç½®å›ºå®šæ—¥æœŸæˆ–完全删除它们。"
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} 日期的里程碑。"
+msgstr "如需根æ®é‡Œç¨‹ç¢‘æ¥å®‰æŽ’ epic çš„ %{epicDateType} 日期,请为 epic 中的任一议题指定带有 %{epicDateType} 日期的里程碑。"
msgid "Epics|due"
msgstr "到期"
@@ -3627,13 +3826,16 @@ msgid "Error Reporting and Logging"
msgstr "错误报告和日志记录"
msgid "Error Tracking"
+msgstr "错误跟踪"
+
+msgid "Error creating a new path"
msgstr ""
msgid "Error creating epic"
-msgstr "创建å²è¯—故事时出错"
+msgstr "创建 epic 时出错"
msgid "Error deleting %{issuableType}"
-msgstr ""
+msgstr "删除 %{issuableType} 时出错"
msgid "Error fetching contributors data."
msgstr "获å–贡献者数æ®æ—¶å‡ºé”™ã€‚"
@@ -3678,13 +3880,13 @@ msgid "Error occurred when toggling the notification subscription"
msgstr "切æ¢é€šçŸ¥è®¢é˜…æ—¶å‘生错误"
msgid "Error rendering markdown preview"
-msgstr ""
+msgstr "渲染Markdown预览时出错"
msgid "Error saving label update."
msgstr "ä¿å­˜æ ‡è®°æ›´æ–°æ—¶å‡ºé”™ã€‚"
msgid "Error updating %{issuableType}"
-msgstr ""
+msgstr "更新 %{issuableType} 时出错"
msgid "Error updating status for all todos."
msgstr "更新所有待办事项的状æ€æ—¶å‡ºé”™ã€‚"
@@ -3696,11 +3898,38 @@ msgid "Error while loading the merge request. Please try again."
msgstr "加载åˆå¹¶è¯·æ±‚时出错。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Error:"
+msgstr "错误:"
+
+msgid "ErrorTracking|Active"
msgstr ""
-msgid "Errors"
+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|Find your hostname in your Sentry account settings page"
+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 "Estimated"
msgstr "预计"
@@ -3723,10 +3952,10 @@ msgid "EventFilterBy|Filter by team"
msgstr "åªæ˜¾ç¤ºå›¢é˜Ÿäº‹ä»¶"
msgid "Events"
-msgstr ""
+msgstr "事件"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
-msgstr ""
+msgstr "所有 %{action} å°è¯•éƒ½å·²å¤±è´¥ï¼š %{job_error_message}。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Every day (at 4:00am)"
msgstr "æ¯æ—¥æ‰§è¡Œï¼ˆå‡Œæ™¨ 4 点)"
@@ -3738,37 +3967,37 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "æ¯å‘¨æ‰§è¡Œï¼ˆå‘¨æ—¥å‡Œæ™¨ 4 点)"
msgid "Everyone"
-msgstr ""
+msgstr "所有人"
msgid "Everyone can contribute"
msgstr "人人皆å¯è´¡çŒ®"
msgid "Everything you need to create a GitLab Pages site using GitBook."
-msgstr ""
+msgstr "使用GitBook创建GitLab Pages站点所需的一切。"
msgid "Everything you need to create a GitLab Pages site using Hexo."
-msgstr ""
+msgstr "使用Hexo创建GitLab Pages站点所需的一切。"
msgid "Everything you need to create a GitLab Pages site using Hugo."
-msgstr ""
+msgstr "使用Hugo创建GitLab Pages站点所需的一切。"
msgid "Everything you need to create a GitLab Pages site using Jekyll."
-msgstr ""
+msgstr "使用Jekyll创建GitLab Pages站点所需的一切。"
msgid "Everything you need to create a GitLab Pages site using plain HTML."
-msgstr ""
+msgstr "使用纯HTML创建GitLab Pages网站所需的一切。"
msgid "Except policy:"
-msgstr ""
+msgstr "策略以外:"
msgid "Existing Git repository"
-msgstr ""
+msgstr "现有的Git存储库"
msgid "Existing folder"
-msgstr ""
+msgstr "现有的文件夹"
msgid "Existing members and groups"
-msgstr ""
+msgstr "现有的æˆå‘˜å’Œç¾¤ç»„"
msgid "Expand"
msgstr "展开"
@@ -3776,6 +4005,9 @@ msgstr "展开"
msgid "Expand all"
msgstr "展开全部"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "展开侧边æ "
@@ -3783,10 +4015,10 @@ msgid "Expiration date"
msgstr "到期时间"
msgid "Expired %{expiredOn}"
-msgstr ""
+msgstr "已在 %{expiredOn} 过期"
msgid "Expires in %{expires_at}"
-msgstr ""
+msgstr "在 %{expires_at} 过期"
msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
msgstr "请解释此问题。如适用,å¯æ供相关议题或评论的链接。"
@@ -3810,19 +4042,19 @@ msgid "Explore public groups"
msgstr "æœç´¢å…¬å¼€ç¾¤ç»„"
msgid "Export as CSV"
-msgstr ""
+msgstr "导出为 CSV"
msgid "Export issues"
-msgstr ""
+msgstr "导出议题"
msgid "External Classification Policy Authorization"
msgstr "外部分类政策授æƒ"
msgid "External URL"
-msgstr ""
+msgstr "外部URL"
msgid "External Wiki"
-msgstr ""
+msgstr "外部Wiki"
msgid "External authentication"
msgstr "外部身份验è¯"
@@ -3863,7 +4095,7 @@ msgstr "无法部署到"
msgid "Failed to load emoji list."
msgstr "无法加载表情列表。"
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3876,7 +4108,7 @@ msgid "Failed to remove the pipeline schedule"
msgstr "无法删除æµæ°´çº¿è®¡åˆ’"
msgid "Failed to reset key. Please try again."
-msgstr ""
+msgstr "é‡ç½®å¯†é’¥å¤±è´¥ã€‚请é‡è¯•ã€‚"
msgid "Failed to signing using smartcard authentication"
msgstr "无法使用智能å¡èº«ä»½éªŒè¯è¿›è¡Œç™»å½•"
@@ -3885,13 +4117,13 @@ msgid "Failed to update issues, please try again."
msgstr "更新议题失败, 请é‡è¯•"
msgid "Failed to upload object map file"
-msgstr ""
+msgstr "上传对象映射文件失败"
msgid "Failure"
msgstr "失败"
msgid "Fast-forward merge without a merge commit"
-msgstr ""
+msgstr "没有åˆå¹¶æ交的快进åˆå¹¶"
msgid "Faster as it re-uses the project workspace (falling back to clone if it doesn't exist)"
msgstr "速度更快,因其é‡ç”¨äº†é¡¹ç›®çš„工作空间(如果它ä¸å­˜åœ¨ï¼Œå°†å›žé€€åˆ°å…‹éš†ï¼‰"
@@ -3900,10 +4132,10 @@ msgid "Feature Flags"
msgstr "功能标志"
msgid "FeatureFlags|* (All Environments)"
-msgstr ""
+msgstr "*(所有环境)"
msgid "FeatureFlags|* (All environments)"
-msgstr ""
+msgstr "*(所有环境)"
msgid "FeatureFlags|API URL"
msgstr "API URL"
@@ -3921,49 +4153,46 @@ msgid "FeatureFlags|Create feature flag"
msgstr "创建功能标志"
msgid "FeatureFlags|Delete %{name}?"
-msgstr ""
+msgstr "删除 %{name}?"
msgid "FeatureFlags|Delete feature flag"
-msgstr ""
+msgstr "删除功能标志"
msgid "FeatureFlags|Description"
msgstr "æè¿°"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "编辑 %{feature_flag_name}"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "编辑功能标志"
msgid "FeatureFlags|Environment Spec"
-msgstr ""
+msgstr "环境规格"
msgid "FeatureFlags|Environment Specs"
-msgstr ""
+msgstr "环境规格"
msgid "FeatureFlags|Feature Flag"
msgstr "功能标志"
msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcare rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
-msgstr ""
+msgstr "功能标记是通过创建一组规则æ¥å®šä¹‰ç›®æ ‡çŽ¯å¢ƒçš„状æ€æ¥æž„建的行为。默认的规则%{codeStart} *%{codeEnd}用于%{boldStart}所有环境%{boldEnd},您å¯ä»¥é€šè¿‡ä¸‹é¢çš„环境规范添加任æ„æ•°é‡çš„规则。您å¯ä»¥åˆ‡æ¢æ¯ä¸ªè§„则的行为以设置它们%{boldStart}活动%{boldEnd}或%{boldStart}éžæ´»åŠ¨%{boldEnd}。"
msgid "FeatureFlags|Feature Flags"
-msgstr ""
+msgstr "功能标志"
msgid "FeatureFlags|Feature Flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
-msgstr ""
+msgstr "功能标志å…许您通过动æ€åˆ‡æ¢æŸäº›åŠŸèƒ½å°†ä»£ç é…置为ä¸åŒçš„风格。"
msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
-msgstr ""
+msgstr "功能标志 %{name} 将被删除。您确定å—?"
msgid "FeatureFlags|Get started with Feature Flags"
-msgstr ""
+msgstr "功能标志入门"
msgid "FeatureFlags|Inactive"
msgstr "未å¯ç”¨"
msgid "FeatureFlags|Inactive flag for %{scope}"
-msgstr ""
+msgstr "%{scope} çš„éžæ´»åŠ¨æ ‡å¿—"
msgid "FeatureFlags|Install a %{docs_link_start}compatible client library%{docs_link_end} and specify the API URL, application name, and instance ID during the configuration setup."
msgstr "安装 %{docs_link_start}兼容的客户端库%{docs_link_end} ,并在é…置指定API URLã€åº”用å称和实例ID。"
@@ -3972,10 +4201,10 @@ msgid "FeatureFlags|Instance ID"
msgstr "实例ID"
msgid "FeatureFlags|Loading Feature Flags"
-msgstr ""
+msgstr "加载功能标志"
msgid "FeatureFlags|More Information"
-msgstr ""
+msgstr "更多信æ¯"
msgid "FeatureFlags|More information"
msgstr "更多信æ¯"
@@ -3989,26 +4218,23 @@ msgstr "新建"
msgid "FeatureFlags|New Feature Flag"
msgstr "新建功能标志"
-msgid "FeatureFlags|Save changes"
-msgstr "ä¿å­˜æ›´æ”¹"
-
msgid "FeatureFlags|Status"
msgstr "状æ€"
msgid "FeatureFlags|Target environments"
-msgstr ""
+msgstr "目标环境"
msgid "FeatureFlags|There are no active Feature Flags"
-msgstr ""
+msgstr "没有活动的功能标志"
msgid "FeatureFlags|There are no inactive Feature Flags"
-msgstr ""
+msgstr "没有éžæ´»åŠ¨çš„功能标志"
msgid "FeatureFlags|There was an error fetching the feature flags."
-msgstr ""
+msgstr "获å–功能标志时出错。"
msgid "FeatureFlags|Try again in a few moments or contact your support team."
-msgstr ""
+msgstr "请ç¨åŽé‡è¯•æˆ–è”系您的支æŒå›¢é˜Ÿã€‚"
msgid "Feb"
msgstr "2月"
@@ -4021,28 +4247,28 @@ msgstr "当å‰é¡µé¢ä¸Šçš„字段ä¸å¯ç¼–辑,å¯ä»¥é…ç½®"
msgid "File"
msgid_plural "Files"
-msgstr[0] ""
+msgstr[0] "文件"
msgid "File added"
-msgstr ""
+msgstr "文件已添加"
msgid "File browser"
-msgstr ""
+msgstr "文件æµè§ˆ"
msgid "File deleted"
-msgstr ""
+msgstr "文件已删除"
msgid "File mode changed from %{a_mode} to %{b_mode}"
-msgstr ""
+msgstr "文件模å¼ä»Ž %{a_mode} 更改为 %{b_mode}"
msgid "File moved"
-msgstr ""
+msgstr "文件已移动"
msgid "File templates"
msgstr "文件模æ¿"
msgid "File upload error."
-msgstr ""
+msgstr "文件上传错误。"
msgid "Files"
msgstr "文件"
@@ -4063,28 +4289,25 @@ msgid "Filter by commit message"
msgstr "按æ交消æ¯è¿‡æ»¤"
msgid "Filter by milestone name"
-msgstr ""
+msgstr "按里程碑å称过滤"
msgid "Filter by two-factor authentication"
-msgstr ""
+msgstr "按åŒé‡èº«ä»½éªŒè¯è¿‡æ»¤"
msgid "Filter results by group"
-msgstr ""
+msgstr "按群组过滤结果"
msgid "Filter results by project"
-msgstr ""
+msgstr "按项目过滤结果"
msgid "Filter..."
msgstr "过滤..."
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "按路径查找"
msgid "Find existing members by name"
-msgstr ""
+msgstr "按å称查找现有æˆå‘˜"
msgid "Find file"
msgstr "查找文件"
@@ -4099,7 +4322,7 @@ msgid "Fingerprints"
msgstr "指纹"
msgid "Finish editing this message first!"
-msgstr ""
+msgstr "先完æˆæ­¤æ¶ˆæ¯çš„编辑ï¼"
msgid "Finish review"
msgstr "完æˆè¯„审"
@@ -4108,7 +4331,7 @@ msgid "Finished"
msgstr "已完æˆ"
msgid "First day of the week"
-msgstr ""
+msgstr "æ¯å‘¨çš„起始日"
msgid "FirstPushedBy|First"
msgstr "首次推é€"
@@ -4156,7 +4379,7 @@ msgid "For internal projects, any logged in user can view pipelines and access j
msgstr "对于内部项目,任何已登录的用户都å¯ä»¥æŸ¥çœ‹æµæ°´çº¿å¹¶è®¿é—®ä½œä¸šè¯¦æƒ…(输出日志和工件)"
msgid "For more info, read the documentation."
-msgstr ""
+msgstr "有关详细信æ¯ï¼Œè¯·é˜…读文档。"
msgid "For more information, go to the "
msgstr "如需了解详细信æ¯ï¼Œè¯·å‚阅"
@@ -4183,7 +4406,7 @@ msgid "Forking in progress"
msgstr "派生(Fork)中"
msgid "Forks"
-msgstr ""
+msgstr "派生"
msgid "Format"
msgstr "æ ¼å¼"
@@ -4194,8 +4417,8 @@ msgstr "在.gitlab-ci.yml中å‘现错误:"
msgid "Free Trial of GitLab.com Gold"
msgstr "å…费试用gitlab.comçš„Gold计划"
-msgid "From %{provider_title}"
-msgstr "æ¥è‡ª %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "æ¥è‡ªBitbucket"
@@ -4224,20 +4447,26 @@ msgstr "æ¥è‡ªé‡Œç¨‹ç¢‘:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "在Kubernetes集群详细信æ¯è§†å›¾ä¸­ï¼Œä»Žåº”用程åºåˆ—表中安装Runner"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG 密钥"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "通用"
msgid "General pipelines"
-msgstr "一般æµæ°´çº¿"
+msgstr "æµæ°´çº¿é€šç”¨è®¾ç½®"
msgid "Generate a default set of labels"
msgstr "生æˆä¸€ç»„默认的标记"
msgid "Generate key"
-msgstr ""
+msgstr "生æˆå¯†é’¥"
msgid "Geo"
msgstr "Geo"
@@ -4330,10 +4559,10 @@ msgid "GeoNodes|Out of sync"
msgstr "ä¸åŒæ­¥"
msgid "GeoNodes|Removing a primary node stops the sync process for all nodes. Syncing cannot be resumed without losing some data on all secondaries. In this case we would recommend setting up all nodes from scratch. Are you sure?"
-msgstr ""
+msgstr "删除主节点会åœæ­¢æ‰€æœ‰èŠ‚点的åŒæ­¥è¿›ç¨‹ã€‚如果ä¸ä¸¢å¤±æ‰€æœ‰è¾…助节点上的æŸäº›æ•°æ®ï¼Œåˆ™æ— æ³•æ¢å¤åŒæ­¥ã€‚在这ç§æƒ…况下,我们建议é‡æ–°è®¾ç½®æ‰€æœ‰èŠ‚点。你确定å—?"
msgid "GeoNodes|Removing a secondary node stops the sync process. It is not currently possible to add back the same node without losing some data. We only recommend setting up a new secondary node in this case. Are you sure?"
-msgstr ""
+msgstr "删除辅助节点会åœæ­¢åŒæ­¥è¿›ç¨‹ã€‚ç›®å‰æ— æ³•åœ¨ä¸ä¸¢å¤±æŸäº›æ•°æ®çš„情况下添加相åŒçš„节点。我们åªå»ºè®®åœ¨è¿™ç§æƒ…况下设置一个新的辅助节点。你确定å—?"
msgid "GeoNodes|Replication slot WAL"
msgstr "å¤åˆ¶æ§½ WAL"
@@ -4408,7 +4637,7 @@ msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
msgstr "已与主节点上对应项验è¯çš„Wiki"
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 ""
+msgstr "使用 %{geo} ,您å¯ä»¥åœ¨ä»»ä½•åœ°æ–¹å®‰è£…特殊的åªè¯»å’Œå¤åˆ¶å®žä¾‹ã€‚在添加节点之å‰ï¼Œè¯·æŒ‰ç…§ %{instructions} 出现的确切顺åºæ‰§è¡Œ 。"
msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
msgstr "当å‰Geo节点é…置使用ä¸å®‰å…¨çš„HTTP连接, 建议使用HTTPS。"
@@ -4456,7 +4685,7 @@ msgid "Geo|In sync"
msgstr "å·²åŒæ­¥"
msgid "Geo|Last repository check run"
-msgstr ""
+msgstr "上次存储库的è¿è¡Œæ£€æŸ¥"
msgid "Geo|Last successful sync"
msgstr "最近一次æˆåŠŸçš„åŒæ­¥"
@@ -4495,7 +4724,7 @@ msgid "Geo|Projects in certain storage shards"
msgstr "特定存储片中的项目"
msgid "Geo|Re-verification interval"
-msgstr ""
+msgstr "é‡æ–°éªŒè¯é—´éš”"
msgid "Geo|Recheck"
msgstr "é‡æ–°æ£€æŸ¥"
@@ -4576,16 +4805,16 @@ msgid "Get a free instance review"
msgstr "获得å…费的实例评估"
msgid "Get started with error tracking"
-msgstr ""
+msgstr "开始使用错误跟踪"
msgid "Getting started with releases"
-msgstr ""
+msgstr "开始使用版本"
msgid "Git"
msgstr "Git"
msgid "Git global setup"
-msgstr ""
+msgstr "Git 全局设置"
msgid "Git repository URL"
msgstr "Git仓库URL"
@@ -4615,13 +4844,13 @@ msgid "GitLab Import"
msgstr "GitLab导入"
msgid "GitLab Shared Runners execute code of different projects on the same Runner unless you configure GitLab Runner Autoscale with MaxBuilds 1 (which it is on GitLab.com)."
-msgstr ""
+msgstr "GitLab 共享è¿è¡Œå™¨å°†åœ¨åŒä¸€ä¸ªè¿è¡Œå™¨ä¸Šæ‰§è¡Œä¸åŒé¡¹ç›®çš„代ç ï¼Œé™¤éžæ‚¨åœ¨GitLab上设置 MaxBuilds为1å’Œ GitLab è¿è¡Œå™¨è‡ªåŠ¨ç¼©æ”¾ã€‚"
msgid "GitLab User"
msgstr "GitLab用户"
msgid "GitLab metadata URL"
-msgstr ""
+msgstr "GitLab å…ƒæ•°æ® URL"
msgid "GitLab project export"
msgstr "GitLab项目导出"
@@ -4654,20 +4883,29 @@ msgid "Gitea Import"
msgstr "从Gitea导入"
msgid "Given access %{time_ago}"
-msgstr ""
+msgstr "%{time_ago} 之å‰æŽˆæƒè®¿é—®"
msgid "Go Back"
msgstr "返回"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "返回"
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "转到"
msgid "Go to %{link_to_google_takeout}."
msgstr "转至 %{link_to_google_takeout}。"
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "从Google Code导入"
@@ -4681,7 +4919,7 @@ msgid "Got it!"
msgstr "了解ï¼"
msgid "Grant access"
-msgstr ""
+msgstr "å…许访问"
msgid "Graph"
msgstr "分支图"
@@ -4725,14 +4963,17 @@ msgstr "群组信æ¯"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "群组维护者å¯ä»¥åœ¨é€šè¿‡ %{link} 注册群组级 Runner"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "群组å称"
msgid "Group overview content"
-msgstr ""
+msgstr "群组概述内容"
msgid "Group:"
-msgstr ""
+msgstr "群组:"
msgid "Group: %{group_name}"
msgstr "群组:%{group_name}"
@@ -4741,19 +4982,19 @@ msgid "GroupRoadmap|From %{dateWord}"
msgstr "从 %{dateWord} 起"
msgid "GroupRoadmap|Something went wrong while fetching epics"
-msgstr "读å–å²è¯—故事时出错"
+msgstr "è¯»å– epic 时出错"
msgid "GroupRoadmap|Sorry, no epics matched your search"
-msgstr "对ä¸èµ·ï¼Œæœªæœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„å²è¯—故事"
+msgstr "对ä¸èµ·ï¼Œæœªæœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„ epic"
msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
-msgstr "路线图显示了å²è¯—故事沿ç€æ—¶é—´çº¿çš„进展情况"
+msgstr "路线图显示了epic 沿ç€æ—¶é—´çº¿çš„进展情况"
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 ""
+msgstr "è¦æŸ¥çœ‹è·¯çº¿å›¾ï¼Œè¯·åœ¨æ­¤ç¾¤ç»„或其å­ç¾¤ç»„中的一个 epic 中添加开始日期或截止日期;从 %{startDate} 到 %{endDate}。"
msgid "GroupRoadmap|To widen your search, change or remove filters; from %{startDate} to %{endDate}."
-msgstr ""
+msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢ï¼Œè¯·æ›´æ”¹æˆ–移除过滤器,从 %{startDate} 到 %{endDate}。"
msgid "GroupRoadmap|Until %{dateWord}"
msgstr "直到 %{dateWord}"
@@ -4762,7 +5003,7 @@ msgid "GroupSettings|Badges"
msgstr "徽章"
msgid "GroupSettings|Custom project templates"
-msgstr ""
+msgstr "自定义项目模æ¿"
msgid "GroupSettings|Customize your group badges."
msgstr "自定义群组徽章。"
@@ -4771,13 +5012,13 @@ msgid "GroupSettings|Learn more about badges."
msgstr "了解有关徽章的更多信æ¯ã€‚"
msgid "GroupSettings|Learn more about group-level project templates."
-msgstr ""
+msgstr "了解更多关于群组级项目模æ¿"
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "ç¦æ­¢ä¸Žå…¶ä»–群组共享 %{group} 中的项目"
msgid "GroupSettings|Select a sub-group as the custom project template source for this group."
-msgstr ""
+msgstr "选择一个å­ç¾¤ç»„作为此群组的自定义项目模æ¿æºã€‚"
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
msgstr "此设置已ç»åº”用于 %{ancestor_group},并已覆盖此å­ç»„的设置。"
@@ -4804,7 +5045,7 @@ msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroup
msgstr "也å¯ä»¥é€šè¿‡åˆ›å»º %{subgroup_docs_link_start}å­ç¾¤ç»„æ¥åµŒå¥—群组%{subgroup_docs_link_end}。"
msgid "Groups with access to <strong>%{project_name}</strong>"
-msgstr ""
+msgstr "å¯ä»¥è®¿é—® <strong>%{project_name}</strong>"
msgid "GroupsDropdown|Frequently visited"
msgstr "ç»å¸¸è®¿é—®çš„群组"
@@ -4906,7 +5147,7 @@ msgid "Here is the public SSH key that needs to be added to the remote server. F
msgstr "以下是需è¦æ·»åŠ åˆ°è¿œç¨‹æœåŠ¡å™¨çš„SSH公钥。有关更多信æ¯ï¼Œè¯·å‚阅文档。"
msgid "Hide file browser"
-msgstr ""
+msgstr "éšè—文件æµè§ˆå™¨"
msgid "Hide host keys manual input"
msgstr "éšè—主机密钥手动输入"
@@ -4919,7 +5160,7 @@ msgid_plural "Hide values"
msgstr[0] "éšè—值"
msgid "Hide values"
-msgstr ""
+msgstr "éšè—值"
msgid "History"
msgstr "历å²"
@@ -4928,7 +5169,7 @@ msgid "Housekeeping successfully started"
msgstr "已开始维护"
msgid "However, you are already a member of this %{member_source}. Sign in using a different account to accept the invitation."
-msgstr ""
+msgstr "但是,您已ç»æ˜¯ %{member_source} çš„æˆå‘˜ã€‚请使用其他å¸æˆ·ç™»å½•ä»¥æŽ¥å—邀请。"
msgid "I accept the %{terms_link}"
msgstr "æˆ‘æŽ¥å— %{terms_link}"
@@ -4988,7 +5229,7 @@ msgid "Identity provider single sign on URL"
msgstr "身份验è¯æ供商å•ç‚¹ç™»å½•URL"
msgid "If any job surpasses this timeout threshold, it will be marked as failed. Human readable time input language is accepted like \"1 hour\". Values without specification represent seconds."
-msgstr ""
+msgstr "如果任何作业超过这个超时阈值,它将被标记为失败。å¯è¾“入英文语å¥ï¼Œå¦‚ “1 hourâ€ã€‚默认å•ä½ä¸ºç§’。"
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 "如果ç¦ç”¨ï¼Œåˆ™ä¸ä¼šä½¿ç”¨è¿œç¨‹å‰¯æœ¬çš„æ交自动更新分å‰çš„本地分支,以防止本地数æ®ä¸¢å¤±ã€‚如果默认分支 (%{default_branch}) 已分å‰ä¸”无法更新,则镜åƒå°†å¤±è´¥ã€‚其他分å‰çš„分支默默被忽略。"
@@ -5021,13 +5262,13 @@ msgid "ImageDiffViewer|Swipe"
msgstr "滑动"
msgid "Impersonation has been disabled"
-msgstr ""
+msgstr "模拟已被ç¦ç”¨"
msgid "Import"
msgstr "导入"
msgid "Import CSV"
-msgstr ""
+msgstr "导入CSV"
msgid "Import Projects from Gitea"
msgstr "从Gitea导入项目"
@@ -5048,13 +5289,13 @@ msgid "Import in progress"
msgstr "正在导入"
msgid "Import issues"
-msgstr ""
+msgstr "导入议题"
msgid "Import members"
-msgstr ""
+msgstr "导入æˆå‘˜"
msgid "Import members from another project"
-msgstr ""
+msgstr "从å¦ä¸€ä¸ªé¡¹ç›®å¯¼å…¥æˆå‘˜"
msgid "Import multiple repositories by uploading a manifest file."
msgstr "通过上传manifest文件导入多个仓库"
@@ -5063,7 +5304,7 @@ msgid "Import project"
msgstr "导入项目"
msgid "Import project members"
-msgstr ""
+msgstr "导入项目æˆå‘˜"
msgid "Import projects from Bitbucket"
msgstr "从Bitbucket导入项目"
@@ -5090,11 +5331,26 @@ msgid "Import repository"
msgstr "导入仓库"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
+msgstr "导入超时。耗时已超过 %{import_jobs_expiration} 秒"
+
+msgid "Import/Export illustration"
msgstr ""
msgid "ImportButtons|Connect repositories from"
msgstr "用以下方å¼è¿žæŽ¥å‚¨å­˜åº“"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "使用 GitLab ä¼ä¸šç‰ˆçš„增强议题看æ¿ã€‚"
@@ -5108,7 +5364,7 @@ msgid "In order to enable instance-level analytics, please ask an admin to enabl
msgstr "è¦å¯ç”¨å®žä¾‹çº§åˆ†æžï¼Œè¯·è¦æ±‚管ç†å‘˜å¯ç”¨ %{usage_ping_link_start}使用情况检测(usage ping)%{usage_ping_link_end}。"
msgid "In order to gather accurate feature usage data, it can take 1 to 2 weeks to see your index."
-msgstr ""
+msgstr "为了收集准确的功能使用数æ®ï¼Œå¯èƒ½éœ€è¦1到2周æ‰èƒ½çœ‹åˆ°æ‚¨çš„指数。"
msgid "In the next step, you'll be able to select the projects you want to import."
msgstr "继续下一步,选择想è¦å¯¼å…¥çš„项目"
@@ -5117,19 +5373,19 @@ msgid "Include a Terms of Service agreement and Privacy Policy that all users mu
msgstr "包括所有用户必须接å—çš„æœåŠ¡æ¡æ¬¾å议和éšç§æ”¿ç­–。"
msgid "Include merge request description"
-msgstr ""
+msgstr "包å«åˆå¹¶è¯·æ±‚æè¿°"
msgid "Include the username in the URL if required: <code>https://username@gitlab.company.com/group/project.git</code>."
msgstr "如果需è¦ï¼Œè¯·åœ¨URL中包å«ç”¨æˆ·å: <code>https://username@gitlab.company.com/group/project.git</code>。"
msgid "Includes an MVC structure to help you get started."
-msgstr ""
+msgstr "包å«ä¸€ä¸ª MVC 结构æ¥å¸®åŠ©æ‚¨å¼€å§‹ã€‚"
msgid "Includes an MVC structure, Gemfile, Rakefile, along with many others, to help you get started."
-msgstr ""
+msgstr "包括一个 MVC 结构,Gemfile,Rakefile,以åŠå…¶ä»–许多æ¥å¸®åŠ©æ‚¨å¼€å§‹ã€‚"
msgid "Includes an MVC structure, mvnw and pom.xml to help you get started."
-msgstr ""
+msgstr "包括一个MVC 结构,mvw å’Œ pom.xml æ¥å¸®åŠ©æ‚¨å¼€å§‹ã€‚"
msgid "Incompatible Project"
msgstr "ä¸å…¼å®¹çš„项目"
@@ -5146,9 +5402,15 @@ msgstr "手动输入主机密钥"
msgid "Input your repository URL"
msgstr "输入您的存储库URL"
-msgid "Insert suggestion"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
msgstr ""
+msgid "Insert suggestion"
+msgstr "æ’入建议"
+
msgid "Install GitLab Runner"
msgstr "安装GitLab Runner"
@@ -5178,7 +5440,7 @@ msgid "Interested parties can even contribute by pushing commits if they want to
msgstr "相关人员甚至å¯ä»¥é€šè¿‡æŽ¨é€æ交æ¥ä¸ºé¡¹ç›®ä½œå‡ºè´¡çŒ®ã€‚"
msgid "Internal"
-msgstr ""
+msgstr "内部"
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr "内部 - 任何登录的用户都å¯ä»¥æŸ¥çœ‹è¯¥ç¾¤ç»„和任何内部项目。"
@@ -5196,24 +5458,30 @@ msgid "Introducing Cycle Analytics"
msgstr "周期分æžç®€ä»‹"
msgid "Introducing Your Conversational Development Index"
+msgstr "介ç»æ‚¨çš„会è¯å‘展指数"
+
+msgid "Invalid input, please avoid emojis"
msgstr ""
msgid "Invitation"
-msgstr ""
+msgstr "邀请"
msgid "Invite"
msgstr "邀请"
msgid "Invite group"
-msgstr ""
+msgstr "邀请群组"
msgid "Invite member"
-msgstr ""
+msgstr "邀请æˆå‘˜"
msgid "Invoke Count"
-msgstr ""
+msgstr "调用计数"
msgid "Invoke Time"
+msgstr "调用时间"
+
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
msgstr ""
msgid "Issue"
@@ -5235,19 +5503,19 @@ msgid "IssueBoards|Boards"
msgstr "看æ¿"
msgid "IssueBoards|Create new board"
-msgstr ""
+msgstr "创建新看æ¿"
msgid "IssueBoards|Delete board"
-msgstr ""
+msgstr "删除看æ¿"
msgid "IssueBoards|No matching boards found"
-msgstr ""
+msgstr "未找到匹é…的看æ¿"
msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr ""
+msgstr "您的一些看æ¿è¢«éšè—,请激活许å¯è¯åŽå†æ¬¡æŸ¥çœ‹ã€‚"
msgid "IssueBoards|Switch board"
-msgstr ""
+msgstr "切æ¢çœ‹æ¿"
msgid "Issues"
msgstr "议题"
@@ -5258,8 +5526,8 @@ msgstr "议题å¯ä»¥æ˜¯ç¼ºé™·ï¼Œä»»åŠ¡æˆ–è¦è®¨è®ºçš„想法。此外,å¯ä»¥é€š
msgid "Issues closed"
msgstr "关闭议题"
-msgid "Issues, merge requests, pushes and comments."
-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 "在您为项目创建议题åŽï¼Œæˆ‘们就会开始跟踪并显示它们的指标"
@@ -5283,10 +5551,10 @@ msgid "IssuesAnalytics|To widen your search, change or remove filters in the fil
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 ""
+msgstr "它必须有标题行和至少有两列:第一æ æ˜¯è®®é¢˜æ ‡é¢˜ï¼Œç¬¬äºŒæ æ˜¯è®®é¢˜æ述。自动检测分隔符。"
msgid "It's you"
-msgstr ""
+msgstr "这是您"
msgid "Jaeger URL"
msgstr "Jaeger 地å€"
@@ -5307,10 +5575,10 @@ msgid "Job has been erased"
msgstr "作业已被删除"
msgid "Job is stuck. Check runners."
-msgstr ""
+msgstr "作业å¡ä½äº†ã€‚请检查è¿è¡Œå™¨ã€‚"
msgid "Job was retried"
-msgstr ""
+msgstr "作业已é‡è¯•"
msgid "Jobs"
msgstr "作业"
@@ -5352,10 +5620,10 @@ msgid "Job|The artifacts were removed"
msgstr "作业产物已被删除"
msgid "Job|The artifacts will be removed"
-msgstr ""
+msgstr "工件将被删除"
msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
-msgstr ""
+msgstr "此作业å¡ä½äº†ï¼Œå› ä¸ºè¯¥é¡¹ç›®æ²¡æœ‰åœ¨çº¿åˆ†é…任何è¿è¡Œå™¨ã€‚"
msgid "Jul"
msgstr "7月"
@@ -5370,7 +5638,7 @@ msgid "June"
msgstr "6月"
msgid "Key (PEM)"
-msgstr ""
+msgstr "秘钥 (PEM)"
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -5379,7 +5647,7 @@ msgid "Kubernetes Cluster"
msgstr "Kubernetes集群"
msgid "Kubernetes Clusters"
-msgstr ""
+msgstr "Kubernetes集群"
msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
msgstr "Kubernetes集群创建时间超过超时; %{timeout}"
@@ -5447,6 +5715,9 @@ msgstr "å‡çº§æ ‡è®°"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr "æå‡ %{labelTitle} 将使其å¯ç”¨äºŽ %{groupName} 内的所有项目。现有的åŒå项目标记将被åˆå¹¶ã€‚该æ“作ä¸å¯æ’¤é”€ã€‚"
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr "大文件存储"
@@ -5458,7 +5729,7 @@ msgid "Last Pipeline"
msgstr "最新æµæ°´çº¿"
msgid "Last activity"
-msgstr ""
+msgstr "上次活动"
msgid "Last commit"
msgstr "最åŽæ交"
@@ -5476,7 +5747,7 @@ msgid "Last reply by"
msgstr "最åŽå›žå¤æ¥è‡ªäºŽ"
msgid "Last seen"
-msgstr ""
+msgstr "上次查看"
msgid "Last update"
msgstr "最åŽæ›´æ–°"
@@ -5494,13 +5765,13 @@ msgid "Latest changes"
msgstr "最新更改"
msgid "Latest pipeline for this branch"
-msgstr ""
+msgstr "该分支的最新æµæ°´çº¿"
msgid "Lead"
-msgstr ""
+msgstr "超å‰"
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
-msgstr ""
+msgstr "了解GitLab如何 %{no_packages_link_start}å‘布和共享您的包%{no_packages_link_end}。"
msgid "Learn more"
msgstr "进一步了解"
@@ -5509,26 +5780,29 @@ msgid "Learn more about %{issue_boards_url}, to keep track of issues in multiple
msgstr "为了了解更多关于 %{issue_boards_url},在多个列表中ä¿æŒå¯¹è®®é¢˜çš„追踪,您å¯ä»¥ä½¿ç”¨ä½¿ç”¨æ ‡è®°ï¼ŒæŒ‡æ´¾äººï¼Œå’Œé‡Œç¨‹ç¢‘。 如果你å‘现议题看æ¿ä¸Šä¸¢å¤±äº†ä¸€äº›ä¿¡æ¯ï¼Œè¯·åœ¨ %{gitlab_issues_url} 创建一个议题。"
msgid "Learn more about Auto DevOps"
-msgstr ""
+msgstr "了解更多关于Auto DevOps"
msgid "Learn more about Kubernetes"
msgstr "进一步了解关于Kubernetesçš„ä¿¡æ¯"
msgid "Learn more about Web Terminal"
-msgstr ""
+msgstr "了解更多关于 Web 终端"
msgid "Learn more about custom project templates"
-msgstr ""
+msgstr "了解更多关于自定义项目模æ¿"
msgid "Learn more about group-level project templates"
-msgstr ""
+msgstr "了解更多关于群组级项目模æ¿"
msgid "Learn more about incoming email addresses"
-msgstr ""
+msgstr "了解更多关于用于接收的电å­é‚®ä»¶åœ°å€"
msgid "Learn more about protected branches"
msgstr "进一步了解ä¿æŠ¤åˆ†æ”¯"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "了解更多"
@@ -5663,10 +5937,10 @@ msgid "Loading..."
msgstr "正在加载..."
msgid "Loading…"
-msgstr ""
+msgstr "正在加载..."
msgid "Localization"
-msgstr ""
+msgstr "本土化"
msgid "Lock"
msgstr "é”定"
@@ -5701,6 +5975,15 @@ msgstr "使用智能å¡ç™»å½•"
msgid "Logs"
msgstr "日志"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+msgstr ""
+
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "GitLab Geo å¯ä»¥åˆ›å»º GitLab 实例的åªè¯»é•œåƒ, 使得从远端克隆和拉å–大型代ç ä»“库的时间大大缩短,从而æ高团队æˆå‘˜çš„工作效率。"
@@ -5735,7 +6018,7 @@ msgid "Manage project labels"
msgstr "管ç†é¡¹ç›®æ ‡è®°"
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "管ç†åŒå› ç´ èº«ä»½éªŒè¯"
msgid "Manage your group’s membership while adding another level of security with SAML."
msgstr "通过SAML管ç†ç¾¤ç»„æˆå‘˜ï¼Œè¿›ä¸€æ­¥æ高安全性。"
@@ -5746,6 +6029,9 @@ msgstr "Manifest"
msgid "Manifest file import"
msgstr "Manifest文件导入"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "å°†FogBugzå¸æˆ·ID映射为GitLab用户"
@@ -5768,41 +6054,11 @@ msgid "Mark todo as done"
msgstr "标记为已完æˆ"
msgid "Markdown"
-msgstr ""
+msgstr "Markdown"
msgid "Markdown enabled"
msgstr "支æŒMarkdownæ ¼å¼"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr "添加一个符å·åˆ—表"
-
-msgid "MarkdownToolbar|Add a link"
-msgstr "添加一个链接"
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr "添加一个编å·åˆ—表"
-
-msgid "MarkdownToolbar|Add a table"
-msgstr "添加一个表格"
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr "添加一个任务列表"
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr "添加粗体文本"
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr "添加斜体文本"
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr "å…¨å±æ˜¾ç¤º"
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr "æ’入一个引用"
-
-msgid "MarkdownToolbar|Insert code"
-msgstr "æ’入代ç "
-
msgid "Maven Metadata"
msgstr "Maven 元数æ®"
@@ -5828,10 +6084,10 @@ msgid "Members"
msgstr "æˆå‘˜"
msgid "Members can be added by project <i>Maintainers</i> or <i>Owners</i>"
-msgstr ""
+msgstr "项目 <i>维护者</i> 或 <i>所有者</i>å¯ä»¥æ·»åŠ æˆå‘˜"
msgid "Members of <strong>%{project_name}</strong>"
-msgstr ""
+msgstr "<strong>%{project_name}</strong>çš„æˆå‘˜"
msgid "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 "群组在登录您的群组时会跳转到此处。请从您的身份认è¯æ供商处获得该信æ¯ã€‚它å¯èƒ½å«åšâ€œSSOæœåŠ¡ä½ç½®ï¼ˆSSO Service Location)â€ï¼Œâ€œSAML令牌é¢å‘点(SAML Token Issuance Endpoint)â€æˆ–“SAML 2.0/W-Federation URLâ€ã€‚"
@@ -5846,15 +6102,18 @@ msgid "Merge Requests created"
msgstr "创建åˆå¹¶è¯·æ±‚"
msgid "Merge commit message"
-msgstr ""
+msgstr "åˆå¹¶æ交消æ¯"
msgid "Merge events"
msgstr "åˆå¹¶äº‹ä»¶"
msgid "Merge immediately"
-msgstr ""
+msgstr "ç«‹å³åˆå¹¶"
msgid "Merge in progress"
+msgstr "正在åˆå¹¶"
+
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
msgstr ""
msgid "Merge request"
@@ -5870,31 +6129,31 @@ msgid "Merge requests are a place to propose changes you've made to a project an
msgstr "åˆå¹¶è¯·æ±‚用于æ出对项目的更改与他人讨论"
msgid "Merge when pipeline succeeds"
-msgstr ""
+msgstr "当æµæ°´çº¿æˆåŠŸæ—¶åˆå¹¶"
msgid "MergeRequests|Add a reply"
-msgstr ""
+msgstr "添加回å¤"
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "ä¿å­˜è¯„论è‰ç¨¿æ—¶å‘生错误。"
msgid "MergeRequests|Discussion stays resolved"
-msgstr ""
+msgstr "讨论并解决"
msgid "MergeRequests|Discussion stays unresolved"
-msgstr ""
+msgstr "讨论并未解决"
msgid "MergeRequests|Discussion will be resolved"
-msgstr ""
+msgstr "讨论并解决"
msgid "MergeRequests|Discussion will be unresolved"
-msgstr ""
+msgstr "讨论并未解决"
msgid "MergeRequests|Jump to next unresolved discussion"
-msgstr ""
+msgstr "跳转到下一个未解决的讨论"
msgid "MergeRequests|Reply..."
-msgstr ""
+msgstr "回å¤..."
msgid "MergeRequests|Resolve this discussion in a new issue"
msgstr "在新议题中解决此讨论"
@@ -5912,22 +6171,22 @@ msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "查看已替æ¢æ–‡ä»¶ @ %{commitId}"
msgid "MergeRequests|commented on commit %{commitLink}"
-msgstr ""
+msgstr "讨论%{commitLink}æ交"
msgid "MergeRequests|started a discussion"
-msgstr ""
+msgstr "开始讨论"
msgid "MergeRequests|started a discussion on %{linkStart}an old version of the diff%{linkEnd}"
-msgstr ""
+msgstr "开始讨论 %{linkStart}旧版本的差异%{linkEnd}"
msgid "MergeRequests|started a discussion on %{linkStart}the diff%{linkEnd}"
-msgstr ""
+msgstr "开始讨论 %{linkStart}差异%{linkEnd}"
msgid "MergeRequests|started a discussion on an outdated change in commit %{linkStart}%{commitId}%{linkEnd}"
-msgstr ""
+msgstr "开始讨论一个过时的å˜æ›´æ交%{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequests|started a discussion on commit %{linkStart}%{commitId}%{linkEnd}"
-msgstr ""
+msgstr "开始讨论æ交%{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}%{timeDifferenceMinutes}%{descriptionChangedTimes}次更改了æè¿°%{paragraphEnd}"
@@ -5939,7 +6198,7 @@ msgid "MergeRequest|No files found"
msgstr "未找到任何文件"
msgid "MergeRequest|Search files"
-msgstr ""
+msgstr "æœç´¢æ–‡ä»¶"
msgid "Merged"
msgstr "å·²åˆå¹¶"
@@ -5960,7 +6219,7 @@ msgid "Metrics and profiling"
msgstr "指标和分æž"
msgid "Metrics for environment"
-msgstr ""
+msgstr "环境指标"
msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
msgstr "查看有关部署到环境的CI/CD文档"
@@ -5969,10 +6228,10 @@ msgid "Metrics|Create metric"
msgstr "创建指标"
msgid "Metrics|Delete metric"
-msgstr ""
+msgstr "删除指标"
msgid "Metrics|Delete metric?"
-msgstr ""
+msgstr "删除指标?"
msgid "Metrics|Edit metric"
msgstr "编辑指标"
@@ -5984,7 +6243,7 @@ msgid "Metrics|For grouping similar metrics"
msgstr "用于分组类似指标"
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
-msgstr ""
+msgstr "Y轴是标签(通常是å•ä½)。X轴总是代表时间。"
msgid "Metrics|Learn about environments"
msgstr "了解环境"
@@ -6002,14 +6261,11 @@ msgid "Metrics|No deployed environments"
msgstr "应用未部署到任何环境"
msgid "Metrics|PromQL query is valid"
-msgstr ""
+msgstr "PromotQL 查询有效"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus查询文档"
-msgid "Metrics|System"
-msgstr "系统"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "获å–环境数æ®æ—¶å‡ºé”™ï¼Œè¯·é‡è¯•"
@@ -6020,7 +6276,7 @@ msgid "Metrics|There was an error getting environments information."
msgstr "获å–环境信æ¯æ—¶å‡ºé”™ã€‚"
msgid "Metrics|There was an error trying to validate your query"
-msgstr ""
+msgstr "å°è¯•éªŒè¯æ‚¨çš„查询时出错"
msgid "Metrics|There was an error while retrieving metrics"
msgstr "读å–指标时出错"
@@ -6044,7 +6300,7 @@ msgid "Metrics|Y-axis label"
msgstr "Y轴标签"
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
-msgstr ""
+msgstr "您å³å°†æ°¸ä¹…删除此指标且无法撤消。"
msgid "Metrics|e.g. Throughput"
msgstr "例如:åžåé‡"
@@ -6122,16 +6378,16 @@ msgid "Modal|Close"
msgstr "关闭"
msgid "Modify commit messages"
-msgstr ""
+msgstr "修改æ交消æ¯"
msgid "Modify merge commit"
-msgstr ""
+msgstr "修改åˆå¹¶æ交"
msgid "Monday"
-msgstr ""
+msgstr "星期一"
msgid "Monitor your errors by integrating with Sentry"
-msgstr ""
+msgstr "通过与Sentry集æˆæ¥ç›‘控您的错误"
msgid "Monitoring"
msgstr "监控"
@@ -6154,6 +6410,9 @@ msgstr "更多信æ¯"
msgid "More information is available|here"
msgstr "帮助文档"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "最多星标"
@@ -6194,7 +6453,7 @@ msgid "Nav|Sign out and sign in with a different account"
msgstr "退出并登录到其他账å·"
msgid "Need help?"
-msgstr ""
+msgstr "需è¦å¸®åŠ©å—?"
msgid "Network"
msgstr "网络"
@@ -6209,7 +6468,7 @@ msgid "New Application"
msgstr "新建应用"
msgid "New Environment"
-msgstr ""
+msgstr "新环境"
msgid "New Group"
msgstr "新建群组"
@@ -6225,9 +6484,12 @@ msgid "New Label"
msgstr "新标签"
msgid "New Milestone"
-msgstr ""
+msgstr "新里程碑"
msgid "New Pages Domain"
+msgstr "新页é¢åŸŸå"
+
+msgid "New Password"
msgstr ""
msgid "New Pipeline Schedule"
@@ -6236,9 +6498,6 @@ msgstr "创建æµæ°´çº¿è®¡åˆ’"
msgid "New Snippet"
msgstr "新建代ç ç‰‡æ®µ"
-msgid "New Snippets"
-msgstr "新建代ç ç‰‡æ®µ"
-
msgid "New branch"
msgstr "新建分支"
@@ -6249,10 +6508,10 @@ msgid "New directory"
msgstr "新建目录"
msgid "New environment"
-msgstr ""
+msgstr "新环境"
msgid "New epic"
-msgstr "新建å²è¯—故事"
+msgstr "æ–°epic"
msgid "New file"
msgstr "新建文件"
@@ -6273,7 +6532,7 @@ msgid "New merge request"
msgstr "新建åˆå¹¶è¯·æ±‚"
msgid "New milestone"
-msgstr ""
+msgstr "新里程碑"
msgid "New pipelines will cancel older, pending pipelines on the same branch"
msgstr "æ–°æµæ°´çº¿å°†å–消åŒä¸€åˆ†æ”¯ä¸Šè¾ƒæ—§çš„待处ç†æµæ°´çº¿"
@@ -6299,12 +6558,18 @@ msgstr "新建..."
msgid "No"
msgstr "å¦"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "无标记"
-msgid "No activities found"
+msgid "No Tag"
msgstr ""
+msgid "No activities found"
+msgstr "没有å‘现任何活动"
+
msgid "No assignee"
msgstr "未指派"
@@ -6315,7 +6580,7 @@ msgid "No changes"
msgstr "æ— å˜æ›´å†…容"
msgid "No changes between %{ref_start}%{source_branch}%{ref_end} and %{ref_start}%{target_branch}%{ref_end}"
-msgstr ""
+msgstr "%{ref_start}%{source_branch}%{ref_end} å’Œ %{ref_start}%{target_branch}%{ref_end} 之间没有产生å˜åŒ–"
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr "无法连接到GitalyæœåŠ¡å™¨ï¼Œè¯·æ£€æŸ¥ç›¸å…³æ—¥å¿—ï¼"
@@ -6329,13 +6594,16 @@ msgstr "未找到任何贡献者"
msgid "No credit card required."
msgstr "无需信用å¡ã€‚"
-msgid "No details available"
+msgid "No designs found."
msgstr ""
+msgid "No details available"
+msgstr "没有å¯ç”¨çš„详细信æ¯"
+
msgid "No due date"
msgstr "无截止日期"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6345,7 +6613,7 @@ msgid "No file chosen"
msgstr "未选定任何文件"
msgid "No file selected"
-msgstr ""
+msgstr "未选择任何文件"
msgid "No files found."
msgstr "未找到文件。"
@@ -6360,7 +6628,7 @@ msgid "No license. All rights reserved"
msgstr "未设定许å¯è¯ã€‚版æƒæ‰€æœ‰ã€‚"
msgid "No matching results"
-msgstr ""
+msgstr "没有匹é…的结果"
msgid "No merge requests for the selected time period."
msgstr "所选时间段无åˆå¹¶è¯·æ±‚。"
@@ -6372,13 +6640,13 @@ msgid "No messages were logged"
msgstr "未记录任何消æ¯"
msgid "No milestones to show"
-msgstr ""
+msgstr "没有è¦æ˜¾ç¤ºçš„里程碑"
msgid "No other labels with such name or description"
msgstr "没有其他具有此类å称或æ述的标记"
msgid "No preview for this file type"
-msgstr ""
+msgstr "无法预览此类型文件"
msgid "No prioritised labels with such name or description"
msgstr "无具有此类å称或æ述的优先标记"
@@ -6399,7 +6667,7 @@ msgid "No schedules"
msgstr "无计划"
msgid "No start date"
-msgstr ""
+msgstr "没有开始日期"
msgid "No, directly import the existing email addresses and usernames."
msgstr "å¦, 请直接导入现有电å­é‚®ä»¶åœ°å€å’Œç”¨æˆ·å。"
@@ -6431,6 +6699,9 @@ msgstr "æ•°æ®ä¸è¶³"
msgid "Not now"
msgstr "æš‚ä¸"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "请注æ„,master分支自动å—ä¿æŠ¤ã€‚%{link_to_protected_branches}"
@@ -6468,10 +6739,10 @@ msgid "Notification events"
msgstr "通知事件"
msgid "Notification setting"
-msgstr ""
+msgstr "无法预览此类型文件"
msgid "Notification setting - %{notification_title}"
-msgstr ""
+msgstr "通知设置 - %{notification_title}"
msgid "NotificationEvent|Close issue"
msgstr "关闭议题"
@@ -6486,7 +6757,7 @@ msgid "NotificationEvent|Merge merge request"
msgstr "åˆå¹¶è¯·æ±‚被åˆå¹¶"
msgid "NotificationEvent|New epic"
-msgstr "新建å²è¯—"
+msgstr "æ–°epic"
msgid "NotificationEvent|New issue"
msgstr "新建议题"
@@ -6574,16 +6845,16 @@ msgid "Only mirror protected branches"
msgstr "åªé•œåƒå—ä¿æŠ¤çš„分支"
msgid "Only policy:"
-msgstr ""
+msgstr "仅策略:"
msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in."
-msgstr ""
+msgstr "åªæœ‰åœ¨æ‚¨ä¿¡ä»» %{idp_url} æ—¶æ‰èƒ½ç»§ç»­æŽ§åˆ¶GitLabå¸æˆ·ç™»å½•ã€‚"
msgid "Only project members can comment."
msgstr "åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥å‘表评论。"
msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
+msgstr "仅导入项目æˆå‘˜ã€‚群组æˆå‘˜å°†è¢«è·³è¿‡ã€‚"
msgid "Oops, are you sure?"
msgstr "å•Š~~, 确定å—?"
@@ -6592,13 +6863,13 @@ msgid "Open"
msgstr "展开"
msgid "Open Documentation"
-msgstr ""
+msgstr "打开文档"
msgid "Open comment type dropdown"
-msgstr ""
+msgstr "打开评论类型下拉列表"
msgid "Open errors"
-msgstr ""
+msgstr "打开错误"
msgid "Open in Xcode"
msgstr "用Xcode打开"
@@ -6633,6 +6904,9 @@ msgstr "è¿ç»´"
msgid "Operations Dashboard"
msgstr "è¿ç»´ä»ªè¡¨æ¿"
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "将项目添加到仪表æ¿"
@@ -6640,6 +6914,9 @@ msgid "OperationsDashboard|The operations dashboard provides a summary of each p
msgstr "è¿ç»´ä»ªè¡¨æ¿æä¾›æ¯ä¸ªé¡¹ç›®çš„è¿è¡ŒçŠ¶å†µçš„摘è¦ï¼ŒåŒ…括æµæ°´çº¿å’Œè­¦æŠ¥çŠ¶æ€ã€‚"
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
+msgstr "无法添加 %{invalidProjects}。 æ“作仪表æ¿å¯ç”¨äºŽå…¬å…±é¡¹ç›®ä»¥åŠå…·æœ‰Gold方案的群组中的ç§æœ‰é¡¹ç›®ã€‚"
+
+msgid "Optional"
msgstr ""
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
@@ -6688,10 +6965,10 @@ msgid "Pages"
msgstr "Pages"
msgid "Pages Domain"
-msgstr ""
+msgstr "Pages域å"
msgid "Pages Domains"
-msgstr ""
+msgstr "Pages域å"
msgid "Pagination|Last »"
msgstr "尾页 »"
@@ -6706,10 +6983,10 @@ msgid "Pagination|« First"
msgstr "« 首页"
msgid "Parameter"
-msgstr ""
+msgstr "å‚æ•°"
msgid "Parent epic"
-msgstr ""
+msgstr "父级epic"
msgid "Part of merge request changes"
msgstr "包å«äºŽåˆå¹¶è¯·æ±‚å˜æ›´ä¸­"
@@ -6718,13 +6995,13 @@ msgid "Password"
msgstr "密ç "
msgid "Past due"
-msgstr ""
+msgstr "逾期"
msgid "Paste epic link"
-msgstr ""
+msgstr "粘贴epic链接"
msgid "Paste issue link"
-msgstr ""
+msgstr "粘贴议题链接"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr "粘贴您的 SSH 公钥,通常包å«åœ¨ '~/.ssh/id_rsa.pub' 文件中,并以 'ssh-rsa' 开头。ä¸è¦ä½¿ç”¨æ‚¨çš„ SSH ç§é’¥ã€‚"
@@ -6763,10 +7040,10 @@ msgid "Personal Access Token"
msgstr "个人访问凭è¯"
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
-msgstr ""
+msgstr "ä¸å…许创建个人项目。如有疑问,请è”系您的管ç†å‘˜"
msgid "Pick a name"
-msgstr ""
+msgstr "选择一个å称"
msgid "Pipeline"
msgstr "æµæ°´çº¿"
@@ -6834,6 +7111,12 @@ msgstr "å˜é‡"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "自定义"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "æµæ°´çº¿"
@@ -6849,6 +7132,9 @@ msgstr "上周的æµæ°´çº¿"
msgid "Pipelines for last year"
msgstr "去年的æµæ°´çº¿"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "自信地构建"
@@ -6955,7 +7241,7 @@ msgid "Play"
msgstr "è¿è¡Œ"
msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
-msgstr ""
+msgstr "想è¦è¯„论请 %{link_to_register} 或 %{link_to_sign_in}"
msgid "Please accept the Terms of Service before continuing."
msgstr "请接å—æœåŠ¡æ¡æ¬¾ä»¥ç»§ç»­ã€‚"
@@ -6969,21 +7255,42 @@ msgstr "请将它们先%{link_to_git}, 然åŽå†æ¬¡ä½¿ç”¨%{link_to_import_flow}ã
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr "请将它们先在Google Code中转为Git, 然åŽå†æ¬¡ä½¿ç”¨%{link_to_import_flow}。"
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
+msgstr "请å¯ç”¨å¹¶è¿ç§»åˆ°æ•£åˆ—存储以é¿å…安全问题并确ä¿æ•°æ®å®Œæ•´æ€§ã€‚ %{migrate_link}"
+
+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 number"
msgstr ""
msgid "Please fill in a descriptive name for your group."
msgstr "请为您的群组填写æ述性å称。"
msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
-msgstr ""
+msgstr "请将所有现有项目è¿ç§»åˆ°æ•£åˆ—存储,以é¿å…安全问题并确ä¿æ•°æ®å®Œæ•´æ€§ã€‚ %{migrate_link}"
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr "请注æ„,GitLabä¸æ供此应用程åºï¼Œæ‚¨åº”该在å…许访问之å‰éªŒè¯å…¶çœŸå®žæ€§ã€‚"
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "请至少选择一个过滤器æ¥æŸ¥çœ‹ç»“æžœ"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "请填写验è¯ç ã€‚"
@@ -6991,7 +7298,7 @@ msgid "Please try again"
msgstr "请å†è¯•ä¸€æ¬¡"
msgid "Please upgrade PostgreSQL to version 9.6 or greater. The status of the replication cannot be determined reliably with the current version."
-msgstr ""
+msgstr "请将PostgreSQLå‡çº§åˆ°9.6或更高版本。使用当å‰ç‰ˆæœ¬æ— æ³•å¯é åœ°ç¡®å®šå¤åˆ¶çš„状æ€ã€‚"
msgid "Please use this form to report users to GitLab who create spam issues, comments or behave inappropriately."
msgstr "请使用此表å•å‘GitLab报告创建垃圾议题ã€è¯„论或有ä¸å½“行为的用户。"
@@ -7008,6 +7315,9 @@ msgstr "å好设置"
msgid "Preferences|Navigation theme"
msgstr "导航主题"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "按 回车键或å•å‡»ä»¥æœç´¢"
@@ -7036,7 +7346,7 @@ msgid "Prioritized label"
msgstr "优先标记"
msgid "Private"
-msgstr ""
+msgstr "ç§æœ‰"
msgid "Private - Project access must be granted explicitly to each user."
msgstr "ç§äºº - å¿…é¡»å‘æ¯ä¸ªç”¨æˆ·æ˜Žç¡®æŽˆäºˆé¡¹ç›®è®¿é—®æƒé™ã€‚"
@@ -7060,16 +7370,16 @@ msgid "Profiles| You are going to change the username %{currentUsernameBold} to
msgstr "您将更改用户å %{currentUsernameBold} 为 %{newUsernameBold}。é…置文件和项目将é‡å®šå‘到 %{newUsername} 命å空间,但是一旦 %{currentUsername} 命å空间被å¦ä¸€ä¸ªç”¨æˆ·æˆ–组注册,此é‡å®šå‘将过期。请尽快更新您的远端Git仓库。"
msgid "Profiles|@username"
-msgstr ""
+msgstr "@用户å"
msgid "Profiles|Account scheduled for removal."
msgstr "å¸æˆ·å·²å®‰æŽ’被删除。"
msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
+msgstr "使用以下æœåŠ¡ä¹‹ä¸€æ¿€æ´»ç™»å½•"
msgid "Profiles|Active"
-msgstr ""
+msgstr "活动"
msgid "Profiles|Add key"
msgstr "添加密钥"
@@ -7087,28 +7397,28 @@ msgid "Profiles|Change username"
msgstr "更改用户å"
msgid "Profiles|Changing your username can have unintended side effects."
-msgstr ""
+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 ""
+msgstr "选择在公开个人资料中显示ç§æœ‰é¡¹ç›®çš„贡献,但ä¸æ˜¾ç¤ºä»»ä½•é¡¹ç›®ï¼Œå­˜å‚¨åº“或组织信æ¯"
msgid "Profiles|City, country"
-msgstr ""
+msgstr "城市,国家"
msgid "Profiles|Clear status"
msgstr "清除状æ€"
msgid "Profiles|Click on icon to activate signin with one of the following services"
-msgstr ""
+msgstr "å•å‡»å›¾æ ‡ä»¥ä½¿ç”¨ä»¥ä¸‹æœåŠ¡ä¹‹ä¸€æ¿€æ´»ç™»å½•"
msgid "Profiles|Connect"
-msgstr ""
+msgstr "连接"
msgid "Profiles|Connected Accounts"
-msgstr ""
+msgstr "å…³è”账户"
msgid "Profiles|Current path: %{path}"
msgstr "当å‰è·¯å¾„: %{path}"
@@ -7129,7 +7439,7 @@ msgid "Profiles|Deleting an account has the following effects:"
msgstr "删除å¸æˆ·å…·æœ‰ä»¥ä¸‹æ•ˆæžœï¼š"
msgid "Profiles|Disconnect"
-msgstr ""
+msgstr "æ–­å¼€"
msgid "Profiles|Do not show on profile"
msgstr "ä¸åœ¨ä¸ªäººèµ„料中显示"
@@ -7141,10 +7451,10 @@ msgid "Profiles|Edit Profile"
msgstr "编辑个人资料"
msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr ""
+msgstr "输入您的姓å,以便大家认识您"
msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr ""
+msgstr "å¯ç”¨åŒé‡èº«ä»½è®¤è¯ï¼ˆ2FA),æ高账户安全性"
msgid "Profiles|Invalid password"
msgstr "密ç æ— æ•ˆ"
@@ -7183,13 +7493,13 @@ msgid "Profiles|Set new profile picture"
msgstr "设置新个人资料图片"
msgid "Profiles|Social sign-in"
-msgstr ""
+msgstr "社交登录"
msgid "Profiles|Some options are unavailable for LDAP accounts"
msgstr "æŸäº›é€‰é¡¹å¯¹äºŽ LDAP å¸æˆ·ä¸å¯ç”¨"
msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr ""
+msgstr "请用少于250字符æ述您自己"
msgid "Profiles|The maximum file size allowed is 200KB."
msgstr "å…许的最大文件大å°ä¸º200KB。"
@@ -7198,7 +7508,7 @@ msgid "Profiles|This doesn't look like a public SSH key, are you sure you want t
msgstr "这看起æ¥ä¸åƒ SSH 公钥,确定è¦æ·»åŠ å®ƒå—?"
msgid "Profiles|This email will be displayed on your public profile"
-msgstr ""
+msgstr "此电å­é‚®ä»¶å°†æ˜¾ç¤ºåœ¨æ‚¨çš„公开个人资料中。"
msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{learn_more}"
msgstr "此电å­é‚®ä»¶å°†ç”¨äºŽåŸºäºŽWebçš„æ“作,例如编辑和åˆå¹¶ã€‚ %{learn_more}"
@@ -7206,14 +7516,11 @@ msgstr "此电å­é‚®ä»¶å°†ç”¨äºŽåŸºäºŽWebçš„æ“作,例如编辑和åˆå¹¶ã€‚ %{
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "此表情符å·å’Œæ¶ˆæ¯ä¼šæ˜¾ç¤ºåœ¨æ‚¨çš„个人资料和界é¢ä¸­ã€‚"
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
-msgstr ""
+msgstr "此信æ¯å°†æ˜¾ç¤ºåœ¨æ‚¨çš„个人资料中"
msgid "Profiles|Two-Factor Authentication"
-msgstr ""
+msgstr "åŒå› ç´ èº«ä»½éªŒè¯"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "键入您的 %{confirmationValue} 以确认:"
@@ -7240,13 +7547,13 @@ msgid "Profiles|Username successfully changed"
msgstr "用户å更改æˆåŠŸ"
msgid "Profiles|Using emojis in names seems fun, but please try to set a status message instead"
-msgstr ""
+msgstr "姓å中使用表情符å·è™½ç„¶æœ‰è¶£ï¼Œä½†è¯·è½¬åˆ°çŠ¶æ€ä¿¡æ¯é‡Œä½¿ç”¨å®ƒ"
msgid "Profiles|What's your status?"
-msgstr "你当å‰çš„状æ€ï¼Ÿ"
+msgstr "您当å‰çš„状æ€ï¼Ÿ"
msgid "Profiles|Who you represent or work for"
-msgstr ""
+msgstr "您代表è°æˆ–为è°å·¥ä½œ"
msgid "Profiles|You can change your avatar here"
msgstr "å¯ä»¥åœ¨è¿™é‡Œä¿®æ”¹æ‚¨çš„头åƒ"
@@ -7267,31 +7574,31 @@ msgid "Profiles|You must transfer ownership or delete these groups before you ca
msgstr "您必须转移所有æƒæˆ–删除这些群组,然åŽæ‰èƒ½åˆ é™¤æ‚¨çš„å¸æˆ·ã€‚"
msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
-msgstr ""
+msgstr "您的LinkedInå称,å‚è§linkedin.com/in/profilename"
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 ""
+msgstr "您的电å­é‚®ä»¶åœ°å€æ˜¯æ ¹æ®æ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„"
msgid "Profiles|Your location was automatically set based on your %{provider_label} account"
-msgstr ""
+msgstr "您的ä½ç½®æ˜¯åŸºäºŽæ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„。"
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
-msgstr ""
+msgstr "您的姓å是根æ®æ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„,以便大家认识您"
msgid "Profiles|Your status"
-msgstr "你的状æ€"
+msgstr "您当å‰çš„状æ€ï¼Ÿ"
msgid "Profiles|e.g. My MacBook key"
msgstr "例如: My MacBook Key"
msgid "Profiles|username"
-msgstr ""
+msgstr "用户å"
msgid "Profiles|website.com"
-msgstr ""
+msgstr "website.com"
msgid "Profiles|your account"
msgstr "您的å¸æˆ·"
@@ -7308,6 +7615,9 @@ msgstr "进度"
msgid "Project"
msgstr "项目"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "项目 “%{project_name}†正在被删除。"
@@ -7350,9 +7660,12 @@ msgstr "项目导出链接已过期。请从项目设置中é‡æ–°ç”Ÿæˆé¡¹ç›®å¯¼
msgid "Project export started. A download link will be sent by email."
msgstr "项目导出已开始。下载链接将通过电å­é‚®ä»¶å‘é€ã€‚"
-msgid "Project members"
+msgid "Project has too many %{label_for_message} to search"
msgstr ""
+msgid "Project members"
+msgstr "项目æˆå‘˜"
+
msgid "Project name"
msgstr "项目å称"
@@ -7360,7 +7673,7 @@ msgid "Project slug"
msgstr "项目标识串"
msgid "Project:"
-msgstr ""
+msgstr "项目:"
msgid "ProjectActivityRSS|Subscribe"
msgstr "订阅"
@@ -7420,7 +7733,7 @@ msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "è”系管ç†å‘˜æ›´æ”¹æ­¤è®¾ç½®ã€‚"
msgid "ProjectSettings|Customize your project badges."
-msgstr "自定义你的项目徽章。"
+msgstr "自定义您的项目徽章。"
msgid "ProjectSettings|Failed to protect the tag"
msgstr "ä¿æŠ¤æ ‡ç­¾å¤±è´¥"
@@ -7449,6 +7762,9 @@ msgstr "用户åªèƒ½é€šè¿‡è‡ªå·±å·²éªŒè¯çš„电å­é‚®ä»¶åœ°å€å°†æ交到此存
msgid "Projects"
msgstr "项目"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "与 %{group_name} 共享的项目"
@@ -7531,7 +7847,7 @@ msgid "PrometheusService|Custom metrics"
msgstr "自定义指标"
msgid "PrometheusService|Enable Prometheus to define custom metrics, using either option above"
-msgstr ""
+msgstr "使用上é¢ä»»ä¸€é€‰é¡¹ä»¥å¯ç”¨ Prometheus æ¥å®šä¹‰è‡ªå®šä¹‰åº¦é‡æ ‡å‡†ï¼Œ"
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "查找和é…置指标..."
@@ -7597,7 +7913,7 @@ 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 "å²è¯—故事(Epics) 让您å¯ä»¥é€šè¿‡è¿½è¸ªè·¨é¡¹ç›®å’Œé‡Œç¨‹ç¢‘共享主题的问题组,更有效地管ç†é¡¹ç›®ç»„åˆã€‚"
+msgstr "Epic 让您å¯ä»¥é€šè¿‡è¿½è¸ªè·¨é¡¹ç›®å’Œé‡Œç¨‹ç¢‘共享主题的问题组,更有效地管ç†é¡¹ç›®ç»„åˆã€‚"
msgid "Promotions|This feature is locked."
msgstr "此功能已é”定"
@@ -7663,7 +7979,7 @@ msgid "Pseudonymizer data collection"
msgstr "匿å化数æ®æ”¶é›†"
msgid "Public"
-msgstr ""
+msgstr "公有"
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "公开 - 群组和任何公开项目å¯ä»¥å¼€æ”¾æŸ¥çœ‹ï¼Œæ— éœ€èº«ä»½éªŒè¯ã€‚"
@@ -7705,19 +8021,19 @@ msgid "Quarters"
msgstr "季度"
msgid "Query"
-msgstr ""
+msgstr "查询"
msgid "Quick actions can be used in the issues description and comment boxes."
msgstr "快速æ“作å¯ç”¨äºŽè®®é¢˜æ述和评论框。"
msgid "README"
-msgstr ""
+msgstr "自述文件"
msgid "Read more"
msgstr "进一步了解"
msgid "Read more about environments"
-msgstr ""
+msgstr "阅读更多有关环境"
msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
msgstr "了解有关项目æƒé™çš„æ›´å¤šä¿¡æ¯ <strong>%{link_to_help}</strong>"
@@ -7726,7 +8042,7 @@ msgid "Real-time features"
msgstr "实时功能"
msgid "Receive alerts from manually configured Prometheus servers."
-msgstr ""
+msgstr "从手动é…置的 Prometheus æœåŠ¡å™¨æŽ¥æ”¶è­¦æŠ¥ã€‚"
msgid "Recent searches"
msgstr "最近的æœç´¢"
@@ -7754,7 +8070,7 @@ msgid "Register / Sign In"
msgstr "注册/登录"
msgid "Register U2F device"
-msgstr ""
+msgstr "注册U2F设备"
msgid "Register and see your runners for this group."
msgstr "注册并查看当å‰ç¾¤ç»„çš„Runner。"
@@ -7787,10 +8103,10 @@ msgid "Related merge requests"
msgstr "相关åˆå¹¶è¯·æ±‚"
msgid "Releases"
-msgstr ""
+msgstr "版本"
msgid "Releases mark specific points in a project's development history, communicate information about the type of change, and deliver on prepared, often compiled, versions of the software to be reused elsewhere. Currently, releases can only be created through the API."
-msgstr ""
+msgstr "版本标志ç€é¡¹ç›®çš„å‘展历å²ä¸­çš„具体节点,传达相关的å˜æ›´ä¿¡æ¯ï¼Œå¹¶æä¾›ç»è¿‡ç¼–译并且已准备好交付的软件版本ã€ä»¥ä¾¿åœ¨å…¶å®ƒåœ°æ–¹é‡ç”¨ã€‚ç›®å‰ï¼Œåªèƒ½é€šè¿‡ API 创建版本。"
msgid "Remind later"
msgstr "ç¨åŽæ醒"
@@ -7802,9 +8118,15 @@ msgid "Remove Runner"
msgstr "移除Runner"
msgid "Remove all approvals in a merge request when new commits are pushed to its source branch"
-msgstr ""
+msgstr "将新的æ交推é€åˆ°å…¶æºåˆ†æ”¯æ—¶ï¼Œåˆ é™¤åˆå¹¶è¯·æ±‚中的所有核准"
msgid "Remove approver"
+msgstr "删除核准人"
+
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
msgstr ""
msgid "Remove avatar"
@@ -7835,16 +8157,16 @@ msgid "Rename folder"
msgstr "é‡å‘½å文件夹"
msgid "Reopen epic"
-msgstr "é‡æ–°å¼€å¯å²è¯—"
+msgstr "é‡æ–°å¼€å¯epic"
msgid "Reopen milestone"
-msgstr ""
+msgstr "é‡æ–°æ‰“开里程碑"
msgid "Repair authentication"
msgstr "ä¿®å¤è®¤è¯"
msgid "Reply to comment"
-msgstr ""
+msgstr "回å¤è¯„论"
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr "直接回å¤æ­¤é‚®ä»¶æˆ– %{view_it_on_gitlab}。"
@@ -7907,10 +8229,10 @@ msgid "Repository URL"
msgstr "仓库地å€"
msgid "Repository cleanup"
-msgstr ""
+msgstr "存储库清ç†"
msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete."
-msgstr ""
+msgstr "存储库清ç†å·²ç»å¼€å§‹ã€‚一旦清ç†å®Œæˆï¼Œæ‚¨å°†æ”¶åˆ°ä¸€å°ç”µå­é‚®ä»¶ã€‚"
msgid "Repository has no locks."
msgstr "当å‰ä»“库无加é”文件。"
@@ -7931,7 +8253,7 @@ msgid "Request Access"
msgstr "申请æƒé™"
msgid "Requested %{time_ago}"
-msgstr ""
+msgstr "请求的 %{time_ago}"
msgid "Requests Profiles"
msgstr "请求分æž"
@@ -7942,26 +8264,37 @@ msgstr "è¦æ±‚此群组中的所有用户都å¯ç”¨åŒé‡è®¤è¯"
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "è¦æ±‚所有用户在访问GitLab时接å—æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–。"
-msgid "Resend invite"
+msgid "Require approval from code owners"
msgstr ""
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
+msgid "Resend invite"
+msgstr "é‡æ–°å‘é€é‚€è¯·"
+
msgid "Reset authorization key"
-msgstr ""
+msgstr "é‡ç½®æŽˆæƒå¯†é’¥"
msgid "Reset authorization key?"
-msgstr ""
+msgstr "é‡ç½®æŽˆæƒå¯†é’¥ï¼Ÿ"
msgid "Reset health check access token"
msgstr "é‡ç½®è¿è¡ŒçŠ¶å†µæ£€æŸ¥è®¿é—®ä»¤ç‰Œ"
msgid "Reset key"
-msgstr ""
+msgstr "é‡ç½®å¯†é’¥"
msgid "Reset runners registration token"
msgstr "é‡ç½® Runner 注册令牌"
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
-msgstr ""
+msgstr "é‡ç½®æŽˆæƒå¯†é’¥å°†ä¼šä½¿å…ˆå‰çš„密钥无效。现有警报é…置需è¦é€šè¿‡æ–°çš„密钥更新。"
msgid "Resolve all discussions in new issue"
msgstr "在新议题中解决所有讨论"
@@ -7973,10 +8306,10 @@ msgid "Resolve discussion"
msgstr "解决讨论"
msgid "Resolved"
-msgstr ""
+msgstr "已解决"
msgid "Response"
-msgstr ""
+msgstr "å“应"
msgid "Response metrics (AWS ELB)"
msgstr "å“应指标(AWS ELB)"
@@ -7988,7 +8321,7 @@ msgid "Response metrics (HA Proxy)"
msgstr "å“应指标(HA Proxy)"
msgid "Response metrics (NGINX Ingress VTS)"
-msgstr ""
+msgstr "å“应指标(NGINX Ingress VTS)"
msgid "Response metrics (NGINX Ingress)"
msgstr "å“应指标(NGINX Ingress)"
@@ -7997,7 +8330,7 @@ msgid "Response metrics (NGINX)"
msgstr "å“应指标(NGINX)"
msgid "Restart Terminal"
-msgstr ""
+msgstr "é‡å¯ç»ˆç«¯"
msgid "Resume"
msgstr "æ¢å¤"
@@ -8016,7 +8349,7 @@ msgid_plural "Reveal values"
msgstr[0] "显示值"
msgid "Reveal values"
-msgstr ""
+msgstr "显示值"
msgid "Revert this commit"
msgstr "还原此æ交"
@@ -8046,7 +8379,7 @@ msgid "Run CI/CD pipelines for external repositories"
msgstr "使用外部仓库的CI/CDæµæ°´çº¿"
msgid "Run tests against your code live using the Web Terminal"
-msgstr ""
+msgstr "使用Web终端对您的代ç è¿›è¡Œå®žæ—¶æµ‹è¯•"
msgid "Run untagged jobs"
msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
@@ -8076,7 +8409,7 @@ msgid "Runners API"
msgstr "Runners API"
msgid "Runners activated for this project"
-msgstr ""
+msgstr "此项目已激活的è¿è¡Œå™¨"
msgid "Runners can be placed on separate users, servers, and even on your local machine."
msgstr "Runnerå¯ä»¥æ”¾åœ¨ä¸åŒçš„用户ã€æœåŠ¡å™¨ï¼Œç”šè‡³æœ¬åœ°æœºå™¨ä¸Šã€‚"
@@ -8099,6 +8432,9 @@ msgstr "您已ç»ä½¿ç”¨äº†æ‰€æœ‰å…±äº«Runnerçš„æµæ°´çº¿æ—¶é—´ã€‚"
msgid "Running"
msgstr "è¿è¡Œä¸­"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO(å•ç‚¹ç™»å½•)"
@@ -8112,7 +8448,7 @@ msgid "SAML Single Sign On Settings"
msgstr "SAML å•ç‚¹ç™»å½•è®¾ç½®"
msgid "SAML for %{group_name}"
-msgstr ""
+msgstr "%{group_name} çš„ SAML"
msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SAML令牌签åè¯ä¹¦çš„SHA1指纹。请从身份验è¯æ供商处获å–(也å¯ä»¥è¢«ç§°ä¸ºâ€œæŒ‡çº¹â€ï¼‰ã€‚"
@@ -8129,11 +8465,14 @@ msgstr "SSH公钥"
msgid "SSL Verification"
msgstr "SSL验è¯"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "ä¿å­˜"
msgid "Save Changes"
-msgstr ""
+msgstr "ä¿å­˜ä¿®æ”¹"
msgid "Save application"
msgstr "ä¿å­˜åº”用"
@@ -8145,7 +8484,7 @@ msgid "Save changes before testing"
msgstr "测试å‰ä¿å­˜æ›´æ”¹"
msgid "Save comment"
-msgstr ""
+msgstr "ä¿å­˜è¯„论"
msgid "Save pipeline schedule"
msgstr "ä¿å­˜æµæ°´çº¿è®¡åˆ’"
@@ -8162,6 +8501,9 @@ msgstr "已加入日程"
msgid "Schedules"
msgstr "计划"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "æµæ°´çº¿è®¡åˆ’"
@@ -8184,7 +8526,7 @@ msgid "Search"
msgstr "æœç´¢"
msgid "Search an environment spec"
-msgstr ""
+msgstr "æœç´¢çŽ¯å¢ƒè§„范"
msgid "Search branches"
msgstr "æœç´¢åˆ†æ”¯"
@@ -8199,7 +8541,7 @@ msgid "Search for projects, issues, etc."
msgstr "æœç´¢é¡¹ç›®ã€è®®é¢˜ç­‰ç­‰â€¦"
msgid "Search groups"
-msgstr ""
+msgstr "æœç´¢ç¾¤ç»„"
msgid "Search merge requests"
msgstr "æœç´¢åˆå¹¶è¯·æ±‚"
@@ -8222,6 +8564,9 @@ msgstr "æœç´¢é¡¹ç›®"
msgid "Search users"
msgstr "æœç´¢ç”¨æˆ·"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "æœç´¢æ‚¨çš„项目"
@@ -8271,7 +8616,7 @@ msgid "Security Dashboard|Issue Created"
msgstr "已创建议题"
msgid "Security Reports|At this time, the security dashboard only supports SAST and dependency scanning."
-msgstr ""
+msgstr "现在的安全仪表æ¿ä»…支æŒSASTå’Œä¾èµ–扫æ。"
msgid "Security Reports|Create issue"
msgstr "创建议题"
@@ -8280,13 +8625,13 @@ msgid "Security Reports|Dismiss vulnerability"
msgstr "忽略æ¼æ´ž"
msgid "Security Reports|Learn more about setting up your dashboard"
-msgstr ""
+msgstr "了解更多关于您的仪表æ¿è®¾ç½®"
msgid "Security Reports|More info"
msgstr "更多信æ¯"
msgid "Security Reports|No Vulnerabilities"
-msgstr ""
+msgstr "æ— æ¼æ´ž"
msgid "Security Reports|Security dashboard documentation"
msgstr "安全仪表æ¿æ–‡æ¡£"
@@ -8304,16 +8649,16 @@ msgid "Security Reports|There was an error reverting this dismissal."
msgstr "å–消忽略时出错。"
msgid "Security Reports|Undo dismiss"
-msgstr ""
+msgstr "撤消解除"
msgid "Security Reports|We've found no vulnerabilities for your group"
-msgstr ""
+msgstr "我们没有在您的群组中å‘现æ¼æ´ž"
msgid "Security Reports|While it's rare to have no vulnerabilities for your group, 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 ""
+msgstr "虽然您的群组中没有æ¼æ´žï¼Œä½†å®ƒå¯èƒ½ä¼šå‡ºçŽ°ã€‚无论如何,我们都建议您仔细检查您的设置以确ä¿æ‚¨å·²æ­£ç¡®çš„设置了您的仪表æ¿ã€‚"
msgid "Security dashboard"
-msgstr ""
+msgstr "安全仪表盘"
msgid "SecurityDashboard| The security dashboard displays the latest security report. Use it to find and fix vulnerabilities."
msgstr "安全仪表æ¿æ˜¾ç¤ºæœ€æ–°çš„安全报告。用它æ¥æŸ¥æ‰¾å’Œä¿®å¤æ¼æ´žã€‚"
@@ -8325,10 +8670,10 @@ msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
msgstr "æµæ°´çº¿ %{pipelineLink} 已触å‘"
msgid "See metrics"
-msgstr ""
+msgstr "查看指标"
msgid "See the affected projects in the GitLab admin panel"
-msgstr ""
+msgstr "查看 GitLab 管ç†é¢æ¿ä¸­çš„å—å½±å“项目"
msgid "Select"
msgstr "选择"
@@ -8358,7 +8703,7 @@ msgid "Select branch/tag"
msgstr "选择分支/标签"
msgid "Select members to invite"
-msgstr ""
+msgstr "选择è¦é‚€è¯·çš„æˆå‘˜"
msgid "Select project"
msgstr "选择项目"
@@ -8394,13 +8739,13 @@ msgid "Send email"
msgstr "å‘é€ç”µå­é‚®ä»¶"
msgid "Send report"
-msgstr ""
+msgstr "å‘é€æŠ¥å‘Š"
msgid "Send usage data"
msgstr "å‘é€çš„使用情况数æ®"
msgid "Sentry API URL"
-msgstr ""
+msgstr "Sentry API URL"
msgid "Sep"
msgstr "9月"
@@ -8412,46 +8757,46 @@ msgid "Server version"
msgstr "æœåŠ¡å™¨ç‰ˆæœ¬"
msgid "Serverless"
-msgstr ""
+msgstr "Serverless"
msgid "ServerlessDetails|Kubernetes Pods"
-msgstr ""
+msgstr "Kubernestes Pods"
msgid "ServerlessDetails|Number of Kubernetes pods in use over time based on necessity."
-msgstr ""
+msgstr "æ ¹æ®éœ€è¦éšæ—¶é—´æŽ¨ç§»ä½¿ç”¨çš„Kubernetes Podæ•°é‡ã€‚"
msgid "ServerlessDetails|pod in use"
-msgstr ""
+msgstr "Pod正在使用"
msgid "ServerlessDetails|pods in use"
-msgstr ""
+msgstr "Pods正在使用"
msgid "ServerlessURL|Copy URL to clipboard"
-msgstr ""
+msgstr "å¤åˆ¶é“¾æŽ¥åˆ°å‰ªè´´æ¿"
msgid "Serverless| In order to start using functions as a service, you must first install Knative on your Kubernetes cluster."
-msgstr ""
+msgstr "è¦å¼€å§‹å°†åŠŸèƒ½ä½œä¸ºä¸€ç§æœåŠ¡ï¼Œå¿…须先在Kubernetes群集上安装Knative。"
msgid "Serverless|An error occurred while retrieving serverless components"
-msgstr ""
+msgstr "检索Serverless组件时å‘生错误"
msgid "Serverless|Getting started with serverless"
-msgstr ""
+msgstr "开始使用Serverless"
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 ""
+msgstr "如果您认为这些都ä¸é€‚用,请ç¨åŽå†æŸ¥çœ‹ï¼Œå› ä¸ºåŠŸèƒ½æ•°æ®å¯èƒ½æ­£åœ¨å˜ä¸ºå¯ç”¨ã€‚"
msgid "Serverless|Install Knative"
-msgstr ""
+msgstr "安装Knative"
msgid "Serverless|Learn more about Serverless"
-msgstr ""
+msgstr "了解更多关于 Serverless"
msgid "Serverless|No functions available"
-msgstr ""
+msgstr "没有å¯ç”¨çš„功能"
msgid "Serverless|There is currently no function data available from Knative. This could be for a variety of reasons including:"
-msgstr ""
+msgstr " Knativeç›®å‰æ²¡æœ‰å¯ç”¨çš„功能数æ®ã€‚è¿™å¯èƒ½æœ‰å¤šç§åŽŸå› ï¼ŒåŒ…括:"
msgid "Service Desk"
msgstr "æœåŠ¡å°"
@@ -8480,11 +8825,14 @@ msgstr "设置实例范围的模æ¿å­˜å‚¨åº“"
msgid "Set max session time for web terminal."
msgstr "为Web终端设置最长会è¯æ—¶é—´ã€‚"
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "为滥用报告设置通知电å­é‚®ä»¶ã€‚"
msgid "Set number of approvers required before open merge requests can be merged"
-msgstr ""
+msgstr "设置åˆå¹¶æœªå…³é—­çš„åˆå¹¶è¯·æ±‚之å‰æ‰€éœ€çš„核准人数é‡"
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "设定用户登录的æ¡ä»¶ã€‚å¯ç”¨å¼ºåˆ¶åŒé‡è®¤è¯ã€‚"
@@ -8502,6 +8850,9 @@ msgid "Set up assertions/attributes/claims (email, first_name, last_name) and Na
msgstr "æ ¹æ®%{docsLinkStart}文档%{icon}%{docsLinkEnd}设置断言/属性/声明(email,first_name,last_name)和NameID"
msgid "Set up new U2F device"
+msgstr "设置新的U2F设备"
+
+msgid "Set up new password"
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."
@@ -8532,7 +8883,7 @@ msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try agai
msgstr "对ä¸èµ·ï¼Œæˆ‘们无法设置您的状æ€ã€‚请ç¨åŽå†è¯•ã€‚"
msgid "SetStatusModal|What's your status?"
-msgstr "你的状æ€æ˜¯ä»€ä¹ˆï¼Ÿ"
+msgstr "您的状æ€æ˜¯ä»€ä¹ˆï¼Ÿ"
msgid "Settings"
msgstr "设置"
@@ -8561,14 +8912,20 @@ msgstr "é‡ç½®å·²ç”¨æµæ°´çº¿åˆ†é’Ÿæ•°"
msgid "Sherlock Transactions"
msgstr "Sherlock事物"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "显示相关命令"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "显示完整的原始日志"
msgid "Show file browser"
-msgstr ""
+msgstr "显示文件æµè§ˆå™¨"
msgid "Show latest version"
msgstr "显示最新版本"
@@ -8608,19 +8965,19 @@ msgid "Sign in / Register"
msgstr "登录/注册"
msgid "Sign in to \"%{group_name}\""
-msgstr ""
+msgstr "登录到 \"%{group_name}\""
msgid "Sign in using smart card"
-msgstr ""
+msgstr "使用智能å¡ç™»å½•"
msgid "Sign in via 2FA code"
-msgstr ""
+msgstr "通过2FA代ç ç™»å½•"
msgid "Sign in with Single Sign-On"
msgstr "使用å•ç‚¹ç™»å½•(SSO)进行登录"
msgid "Sign in with smart card"
-msgstr ""
+msgstr "使用智能å¡ç™»å½•"
msgid "Sign out"
msgstr "退出"
@@ -8632,7 +8989,7 @@ msgid "Sign-up restrictions"
msgstr "注册é™åˆ¶"
msgid "Similar issues"
-msgstr ""
+msgstr "相似议题"
msgid "Size"
msgstr "大å°"
@@ -8656,17 +9013,35 @@ msgid "Smartcard authentication failed: client certificate header is missing."
msgstr "智能å¡èº«ä»½éªŒè¯å¤±è´¥ï¼šç¼ºå°‘客户端è¯ä¹¦æŠ¥å¤´ã€‚"
msgid "Snippet Contents"
-msgstr ""
+msgstr "代ç æ®µå†…容"
msgid "Snippets"
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."
+msgid "SnippetsEmptyState|Explore public snippets"
msgstr ""
-msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
msgstr ""
+msgid "SnippetsEmptyState|They can be either public or private."
+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 "有人与您åŒæ—¶ç¼–辑了%{issueType} 。æ述已被更新,您需è¦é‡æ–°ä¿®æ”¹ã€‚"
+
+msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
+msgstr "有人您åŒæ—¶ç¼–辑了这一åˆå¹¶è¯·æ±‚。请刷新页é¢æŸ¥çœ‹æ›´æ”¹ã€‚"
+
msgid "Something went wrong on our end"
msgstr "出错了,抱歉。"
@@ -8677,7 +9052,7 @@ msgid "Something went wrong on our end. Please try again!"
msgstr "æœåŠ¡å™¨ç«¯å‡ºçŽ°é—®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
msgid "Something went wrong on our end. Please try again."
-msgstr ""
+msgstr "æœåŠ¡å™¨é”™è¯¯ã€‚ 请ç¨åŽå†è¯•ã€‚"
msgid "Something went wrong trying to change the confidentiality of this issue"
msgstr "试图改å˜è¿™ä¸ªè®®é¢˜çš„ç§å¯†æ€§æ—¶å‡ºçŽ°é”™è¯¯"
@@ -8689,13 +9064,13 @@ msgid "Something went wrong when toggling the button"
msgstr "点击按钮时出错"
msgid "Something went wrong while applying the suggestion. Please try again."
-msgstr ""
+msgstr "应用åŒæ„时出了点问题。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr "关闭 %{issuable} 时出错。请ç¨åŽé‡è¯•"
msgid "Something went wrong while deleting the source branch. Please try again."
-msgstr ""
+msgstr "删除æºåˆ†æ”¯æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
msgid "Something went wrong while fetching %{listType} list"
msgstr "åœ¨èŽ·å– %{listType} 列表时出错了"
@@ -8716,7 +9091,7 @@ msgid "Something went wrong while fetching the registry list."
msgstr "拉å–注册表列表时å‘生错误。"
msgid "Something went wrong while merging this merge request. Please try again."
-msgstr ""
+msgstr "åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚时出错。请é‡è¯•ã€‚"
msgid "Something went wrong while reopening the %{issuable}. Please try again later"
msgstr "é‡æ–°å¼€å¯ %{issuable} 时出错。请ç¨åŽå†è¯•"
@@ -8737,19 +9112,19 @@ msgid "Something went wrong. Please try again."
msgstr "出现错误。请é‡è¯•ã€‚"
msgid "Sorry, no epics matched your search"
-msgstr "对ä¸èµ·ï¼Œæœªæœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„å²è¯—故事"
+msgstr "对ä¸èµ·ï¼Œæœªæœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„epic"
msgid "Sorry, no projects matched your search"
msgstr "对ä¸èµ·ï¼Œæœªæœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„项目"
msgid "Sorry, your filter produced no results"
-msgstr ""
+msgstr "抱歉,您的过滤器没有产生结果"
msgid "Sort by"
msgstr "排åº"
msgid "Sort direction"
-msgstr ""
+msgstr "排åºæ–¹å‘"
msgid "SortOptions|Access level, ascending"
msgstr "访问级别,å‡åºæŽ’列"
@@ -8797,7 +9172,7 @@ msgid "SortOptions|Less weight"
msgstr "é™ä½Žæƒé‡"
msgid "SortOptions|Milestone due date"
-msgstr ""
+msgstr "里程碑截止日期"
msgid "SortOptions|Milestone due later"
msgstr "里程碑截止日期"
@@ -8830,7 +9205,7 @@ msgid "SortOptions|Oldest joined"
msgstr "最早的加入"
msgid "SortOptions|Oldest last activity"
-msgstr ""
+msgstr "最新的活动"
msgid "SortOptions|Oldest sign in"
msgstr "最早的登录"
@@ -8845,7 +9220,7 @@ msgid "SortOptions|Priority"
msgstr "优先"
msgid "SortOptions|Recent last activity"
-msgstr ""
+msgstr "最近一次活动"
msgid "SortOptions|Recent sign in"
msgstr "最近登录"
@@ -8875,7 +9250,7 @@ msgid "Source is not available"
msgstr "æºä¸å¯ç”¨"
msgid "Source project cannot be found."
-msgstr ""
+msgstr "找ä¸åˆ°æºé¡¹ç›®ã€‚"
msgid "Spam Logs"
msgstr "垃圾信æ¯æ—¥å¿—"
@@ -8893,7 +9268,7 @@ msgid "Specify the following URL during the Runner setup:"
msgstr "在 Runner 设置时指定以下 URL:"
msgid "Squash commit message"
-msgstr ""
+msgstr "Squashæ交消æ¯"
msgid "Squash commits"
msgstr "åˆå¹¶æ交"
@@ -8923,20 +9298,26 @@ msgid "StarProject|Star"
msgstr "星标"
msgid "Starred Projects"
-msgstr "已星标项目"
+msgstr "星标项目"
msgid "Starred Projects' Activity"
-msgstr "已星标项目的活动"
+msgstr "星标项目动æ€"
msgid "Starred projects"
-msgstr "已星标项目"
+msgstr "星标项目"
-msgid "Stars"
+msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
msgstr ""
-msgid "Start Web Terminal"
+msgid "StarredProjectsEmptyState|You don't have starred projects yet."
msgstr ""
+msgid "Stars"
+msgstr "星标"
+
+msgid "Start Web Terminal"
+msgstr "å¯åŠ¨Web终端"
+
msgid "Start a %{new_merge_request} with these changes"
msgstr "由此更改 %{new_merge_request}"
@@ -8947,19 +9328,19 @@ msgid "Start and due date"
msgstr "开始和截止日期"
msgid "Start cleanup"
-msgstr ""
+msgstr "开始清ç†"
msgid "Start date"
msgstr "开始日期"
msgid "Start discussion"
-msgstr ""
+msgstr "开始讨论"
msgid "Start discussion & close %{noteable_name}"
-msgstr ""
+msgstr "开始讨论并关闭 %{noteable_name}"
msgid "Start discussion & reopen %{noteable_name}"
-msgstr ""
+msgstr "开始讨论并é‡æ–°æ‰“å¼€ %{noteable_name}"
msgid "Start the Runner!"
msgstr "å¯åŠ¨ Runner!"
@@ -8971,13 +9352,13 @@ msgid "Started"
msgstr "å·²å¯åŠ¨"
msgid "Started %{startsIn}"
-msgstr ""
+msgstr "已开始 %{startsIn}"
msgid "Starting..."
-msgstr ""
+msgstr "正在å¯åŠ¨..."
msgid "Starts %{startsIn}"
-msgstr ""
+msgstr "开始 %{startsIn}"
msgid "Starts at (UTC)"
msgstr "开始于(UTC)"
@@ -8989,10 +9370,10 @@ msgid "Status"
msgstr "状æ€"
msgid "Status:"
-msgstr ""
+msgstr "状æ€:"
msgid "Stop Terminal"
-msgstr ""
+msgstr "åœæ­¢ç»ˆç«¯"
msgid "Stop environment"
msgstr "终止环境"
@@ -9010,7 +9391,7 @@ msgid "Stopping this environment is currently not possible as a deployment is in
msgstr "由于部署正在进行,目å‰æ— æ³•ç»ˆæ­¢æ­¤çŽ¯å¢ƒ"
msgid "Stopping..."
-msgstr ""
+msgstr "正在åœæ­¢â€¦â€¦"
msgid "Storage"
msgstr "存储"
@@ -9028,7 +9409,7 @@ msgid "Submit as spam"
msgstr "垃圾信æ¯ä¸¾æŠ¥"
msgid "Submit feedback"
-msgstr ""
+msgstr "æ交å馈"
msgid "Submit review"
msgstr "æ交评审"
@@ -9046,94 +9427,94 @@ msgid "Subscribe at project level"
msgstr "在项目级别订阅"
msgid "Subscribe to RSS feed"
-msgstr ""
+msgstr "订阅 RSS "
msgid "Subscribe to calendar"
-msgstr ""
+msgstr "订阅日历"
msgid "Subscribed"
msgstr "已订阅"
msgid "SubscriptionTable|Billing"
-msgstr ""
+msgstr "è´¦å•"
msgid "SubscriptionTable|Free"
-msgstr ""
+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 ""
+msgstr "GitLab å…许您继续使用您的订阅,å³ä½¿æ‚¨å·²è¶…过您购买的最大使用人数。您必须在续订时支付这些订阅。"
msgid "SubscriptionTable|GitLab.com %{planName} %{suffix}"
-msgstr ""
+msgstr "GitLab.com %{planName} %{suffix}"
msgid "SubscriptionTable|Last invoice"
-msgstr ""
+msgstr "最åŽä¸€ä¸ªå‘票"
msgid "SubscriptionTable|Loading subscriptions"
-msgstr ""
+msgstr "加载订阅"
msgid "SubscriptionTable|Manage"
-msgstr ""
+msgstr "管ç†"
msgid "SubscriptionTable|Max seats used"
-msgstr ""
+msgstr "最大的使用人数"
msgid "SubscriptionTable|Next invoice"
-msgstr ""
+msgstr "下一张å‘票"
msgid "SubscriptionTable|Seats currently in use"
-msgstr ""
+msgstr "当å‰æ­£åœ¨ä½¿ç”¨çš„人数"
msgid "SubscriptionTable|Seats in subscription"
-msgstr ""
+msgstr "订阅中的人数"
msgid "SubscriptionTable|Seats owed"
-msgstr ""
+msgstr "欠款人数"
msgid "SubscriptionTable|Subscription end date"
-msgstr ""
+msgstr "订阅结æŸæ—¥æœŸ"
msgid "SubscriptionTable|Subscription start date"
-msgstr ""
+msgstr "订阅开始日期"
msgid "SubscriptionTable|This is the last time the GitLab.com team was in contact with you to settle any outstanding balances."
-msgstr ""
+msgstr "这是 GitLab.com 团队最近一次与您è”系的时间,关于您的欠款。"
msgid "SubscriptionTable|This is the maximum number of users that have existed at the same time since this subscription started."
-msgstr ""
+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 ""
+msgstr "这是 GitLab.com 团队下一次与您è”系的时间,关于您的欠款。"
msgid "SubscriptionTable|This is the number of seats you will be required to purchase if you update to a paid plan."
-msgstr ""
+msgstr "这是您更新到付费方案时需è¦è´­ä¹°çš„最大使用人数。"
msgid "SubscriptionTable|Trial"
-msgstr ""
+msgstr "试用"
msgid "SubscriptionTable|Trial end date"
-msgstr ""
+msgstr "试用结æŸæ—¥æœŸ"
msgid "SubscriptionTable|Trial start date"
-msgstr ""
+msgstr "试用开始日期"
msgid "SubscriptionTable|Upgrade"
-msgstr ""
+msgstr "å‡çº§"
msgid "SubscriptionTable|Usage"
-msgstr ""
+msgstr "使用情况"
msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
-msgstr ""
+msgstr "使用次数将在æ¯å¤©ä¸­åˆ12:00进行更新。"
msgid "Suggested change"
-msgstr ""
+msgstr "å˜æ›´å»ºè®®"
msgid "Sunday"
-msgstr ""
+msgstr "星期日"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
-msgstr ""
+msgstr "对自定义è¯ä¹¦çš„支æŒå·²ç¦ç”¨ã€‚请è”系系统管ç†å‘˜æ¥å¯ç”¨å®ƒã€‚"
msgid "Switch branch/tag"
msgstr "切æ¢åˆ†æ”¯/标签"
@@ -9141,6 +9522,9 @@ msgstr "切æ¢åˆ†æ”¯/标签"
msgid "Sync information"
msgstr "åŒæ­¥ä¿¡æ¯"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "系统钩å­"
@@ -9148,10 +9532,10 @@ msgid "System Info"
msgstr "系统信æ¯"
msgid "System default (%{default})"
-msgstr ""
+msgstr "系统默认值(%{default})"
msgid "System header and footer"
-msgstr ""
+msgstr "系统页头和页脚"
msgid "System metrics (Custom)"
msgstr "系统指标(自定义)"
@@ -9160,10 +9544,10 @@ msgid "System metrics (Kubernetes)"
msgstr "系统指标(Kubernetes)"
msgid "Tag"
-msgstr ""
+msgstr "标签"
msgid "Tag list:"
-msgstr ""
+msgstr "标签列表:"
msgid "Tags"
msgstr "标签"
@@ -9259,10 +9643,10 @@ msgid "Templates"
msgstr "模æ¿"
msgid "Terminal"
-msgstr ""
+msgstr "终端"
msgid "Terminal for environment"
-msgstr ""
+msgstr "环境终端"
msgid "Terms of Service Agreement and Privacy Policy"
msgstr "æœåŠ¡æ¡æ¬¾å议和éšç§æ”¿ç­–"
@@ -9280,13 +9664,13 @@ msgid "Thanks! Don't show me this again"
msgstr "ä¸å†æ˜¾ç¤º"
msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
-msgstr ""
+msgstr "群组“%{group_path}â€å…许您使用SSO以登录å¸æˆ·"
msgid "The Advanced Global 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 "GitLab 中的高级全局æœç´¢åŠŸèƒ½æ˜¯ä¸€ä¸ªå¼ºå¤§ä¸”节çœæ‚¨çš„时间的æœç´¢æœåŠ¡ã€‚您å¯ä»¥æœç´¢å…¶ä»–团队的代ç ä»¥å¸®åŠ©æ‚¨å®Œå–„自己项目中的代ç ã€‚从而é¿å…创建é‡å¤çš„代ç æˆ–浪费时间。"
msgid "The CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment."
-msgstr ""
+msgstr "CSV导出将在åŽå°åˆ›å»ºã€‚完æˆåŽï¼Œå®ƒå°†ä»¥é™„件形å¼å‘é€åˆ°<strong>%{email}</strong>。"
msgid "The Git LFS objects will <strong>not</strong> be synced."
msgstr "Git LFS对象将<strong>ä¸ä¼š</strong>被åŒæ­¥ã€‚"
@@ -9325,11 +9709,14 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni
msgstr "议题阶段概述了从创建议题到将议题添加到里程碑或议题看æ¿æ‰€èŠ±è´¹çš„时间。创建第一个议题åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„.。"
msgid "The maximum file size allowed is %{size}."
-msgstr ""
+msgstr "å…许的最大文件大å°ä¸º %{size}。"
msgid "The maximum file size allowed is 200KB."
msgstr "文件大å°é™åˆ¶ä¸º 200KB。"
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "解密ç§é’¥æ‰€éœ€çš„密ç çŸ­è¯­ã€‚该项为å¯é€‰é¡¹, 并且内容被加密存储。"
@@ -9352,7 +9739,7 @@ msgid "The production stage shows the total time it takes between creating an is
msgstr "生产阶段概述了从创建一个议题到将代ç éƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒçš„总时间。当完æˆæƒ³æ³•åˆ°éƒ¨ç½²ç”Ÿäº§çš„循环,数æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
msgid "The project can be accessed by any logged in user."
-msgstr "该项目å…许已登录的用户访问。"
+msgstr "该项目å…许所有已登录到当å‰GitLabæœåŠ¡å™¨çš„用户访问。"
msgid "The project can be accessed without any authentication."
msgstr "该项目å…许任何人访问。"
@@ -9376,7 +9763,7 @@ msgid "The review stage shows the time from creating the merge request to mergin
msgstr "审阅阶段概述了从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶çš„时间。当创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
msgid "The roadmap shows the progress of your epics along a timeline"
-msgstr "路线图显示了å²è¯—故事沿ç€æ—¶é—´çº¿çš„进展情况"
+msgstr "路线图显示了 epic 沿ç€æ—¶é—´çº¿çš„进展情况"
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 "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒçš„总时间。首次部署到生产环境åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
@@ -9406,19 +9793,19 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet
msgstr "中ä½æ•°æ˜¯ä¸€ä¸ªæ•°åˆ—中最中间的值。例如在 3ã€5ã€9 之间,中ä½æ•°æ˜¯ 5。在 3ã€5ã€7ã€8 之间,中ä½æ•°æ˜¯ (5 + 7)/ 2 = 6。"
msgid "There are no approvers"
-msgstr ""
+msgstr "没有核准人"
msgid "There are no archived projects yet"
msgstr "当å‰å°šæ— å·²å½’档的项目"
msgid "There are no closed issues"
-msgstr ""
+msgstr "没有已关闭的议题"
msgid "There are no closed merge requests"
-msgstr ""
+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 ""
+msgstr "没有为此GitLab实例设置自定义项目模æ¿ã€‚它们是从GitLab的管ç†åŒºåŸŸå¯ç”¨çš„。请与您的GitLab实例管ç†å‘˜è”系以设置自定义项目模æ¿ã€‚"
msgid "There are no issues to show"
msgstr "当å‰æ— è®®é¢˜"
@@ -9427,13 +9814,13 @@ msgid "There are no labels yet"
msgstr "ç›®å‰æ— æ ‡è®°"
msgid "There are no open issues"
-msgstr ""
+msgstr "没有未关闭的议题"
msgid "There are no open merge requests"
-msgstr ""
+msgstr "没有未关闭的åˆå¹¶è¯·æ±‚"
msgid "There are no packages yet"
-msgstr ""
+msgstr "还没有包"
msgid "There are no projects shared with this group yet"
msgstr "当å‰å°šæ— åˆ†äº«ç»™è¯¥ç¾¤ç»„的项目"
@@ -9453,6 +9840,9 @@ msgstr "删除待办事项时出现错误。"
msgid "There was an error loading users activity calendar."
msgstr "加载用户活动日历时出错。"
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "ä¿å­˜é€šçŸ¥è®¾ç½®æ—¶å‘生错误。"
@@ -9469,7 +9859,7 @@ msgid "There was an error when unsubscribing from this label."
msgstr "å–消订阅此标记时出错。"
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
-msgstr ""
+msgstr "这些现有的议题具有类似的标题。在那里评论å¯èƒ½æ›´å¥½ï¼Œè€Œä¸æ˜¯åˆ›å»ºå¦ä¸€ä¸ªç±»ä¼¼çš„问题。"
msgid "They can be managed using the %{link}."
msgstr "他们å¯ä»¥é€šè¿‡ %{link} 进行管ç†ã€‚"
@@ -9478,10 +9868,10 @@ msgid "Third party offers"
msgstr "第三方优惠"
msgid "This %{issuable} is locked. Only <strong>project members</strong> can comment."
-msgstr ""
+msgstr "这个 %{issuable} 已被é”定。åªæœ‰ <strong>项目æˆå‘˜</strong> å¯ä»¥å‘表评论。"
msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
-msgstr ""
+msgstr "因为 %{reason}无法显示 %{viewer} 。您å¯ä»¥æ”¹ä¸º %{options}。"
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "æ­¤GitLab实例尚未æ供任何共享Runner。管ç†å‘˜å¯ä»¥åœ¨ç®¡ç†åŒºåŸŸä¸­æ³¨å†Œå…±äº«Runner。"
@@ -9498,25 +9888,43 @@ msgstr "此看æ¿èŒƒå›´ç¼©å°äº†"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr "此容器注册表已安排删除。"
msgid "This date is after the due date, so this epic won't appear in the roadmap."
-msgstr "此日期在截止日期之åŽï¼Œå› æ­¤è¯¥å²è¯—故事ä¸ä¼šå‡ºçŽ°åœ¨è·¯çº¿å›¾ä¸­ã€‚"
+msgstr "此日期在截止日期之åŽï¼Œå› æ­¤è¯¥ epic ä¸ä¼šå‡ºçŽ°åœ¨è·¯çº¿å›¾ä¸­ã€‚"
msgid "This date is before the start date, so this epic won't appear in the roadmap."
-msgstr "此日期在开始日期之å‰ï¼Œå› æ­¤è¯¥å²è¯—故事ä¸ä¼šå‡ºçŽ°åœ¨è·¯çº¿å›¾ä¸­ã€‚"
+msgstr "此日期在开始日期之å‰ï¼Œå› æ­¤è¯¥ epic ä¸ä¼šå‡ºçŽ°åœ¨è·¯çº¿å›¾ä¸­ã€‚"
msgid "This diff is collapsed."
msgstr "此差异已折å ã€‚"
msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
+msgstr "此差异由.gitattributes 抑制。"
msgid "This directory"
msgstr "当å‰ç›®å½•"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
+msgstr "此域å未ç»è¿‡éªŒè¯ã€‚在å¯ç”¨è®¿é—®æƒé™ä¹‹å‰ï¼Œæ‚¨éœ€è¦éªŒè¯æ‰€æœ‰æƒã€‚"
+
+msgid "This field is required."
msgstr ""
msgid "This group"
@@ -9583,10 +9991,10 @@ msgid "This job is in pending state and is waiting to be picked by a runner"
msgstr "作业挂起中,等待进入队列"
msgid "This job is stuck because you don't have any active runners online with any of these tags assigned to them:"
-msgstr ""
+msgstr "此作业被å¡ä½äº†ï¼Œå› ä¸ºæ‚¨æ²¡æœ‰ä»»ä½•åœ¨çº¿æ´»è·ƒçš„在è¿è¡Œå™¨ï¼Œå¹¶åˆ†é…了这些标签:"
msgid "This job is stuck because you don't have any active runners that can run this job."
-msgstr ""
+msgstr "由于您没有任何å¯ä»¥è¿è¡Œæ­¤ä½œä¸šçš„活跃è¿è¡Œå™¨ï¼Œå› æ­¤ä½œä¸šå¡ä½äº†ã€‚"
msgid "This job is the most recent deployment to %{link}."
msgstr "此作业最近部署到 %{link}。"
@@ -9595,7 +10003,7 @@ msgid "This job requires a manual action"
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 ""
+msgstr "该作业将在计时器完æˆåŽè‡ªåŠ¨è¿è¡Œã€‚它们通常用于生产环境的增é‡éƒ¨ç½²ã€‚未计划时,它会转æ¢ä¸ºæ‰‹åŠ¨æ“作。"
msgid "This means you can not push code until you create an empty repository or import existing one."
msgstr "在创建一个空的仓库或导入现有仓库之å‰ï¼Œå°†æ— æ³•æŽ¨é€ä»£ç ã€‚"
@@ -9603,6 +10011,12 @@ msgstr "在创建一个空的仓库或导入现有仓库之å‰ï¼Œå°†æ— æ³•æŽ¨é€
msgid "This merge request is locked."
msgstr "æ­¤åˆå¹¶è¯·æ±‚å·²é”定。"
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "由于您没有当å‰åˆ†æ”¯çš„写入æƒé™ï¼Œå› æ­¤ç¦ç”¨æ­¤é€‰é¡¹"
@@ -9616,13 +10030,13 @@ msgid "This page will be removed in a future release."
msgstr "此页é¢å°†åœ¨å°†æ¥çš„版本中删除。"
msgid "This pipeline is run in a merge request context"
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿åœ¨åˆå¹¶è¯·æ±‚上下文中è¿è¡Œ"
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿ä½¿ç”¨äº† %{strongStart}Auto DevOps 预先定义的并已å¯ç”¨çš„ CI/CD é…置。%{strongEnd}"
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by <b>Auto DevOps.</b>"
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿ä½¿ç”¨äº† <b>Auto DevOps 预先定义的并已å¯ç”¨çš„ CI/CD é…置。</b>"
msgid "This project"
msgstr "当å‰é¡¹ç›®"
@@ -9652,7 +10066,7 @@ msgid "This source diff could not be displayed because it is too large."
msgstr "此代ç å·®å¼‚无法显示,因为它太大了。"
msgid "This timeout will take precedence when lower than project-defined timeout and accepts a human readable time input language like \"1 hour\". Values without specification represent seconds."
-msgstr ""
+msgstr "当低于项目定义的超时时,此超时将优先,并å¯æŽ¥å—英文语å¥ï¼Œå¦‚“1 hourâ€ã€‚默认å•ä½ä¸ºç§’。"
msgid "This user has no identities"
msgstr "该用户无身份标识"
@@ -9664,7 +10078,7 @@ msgid "This user will be the author of all events in the activity feed that are
msgstr "此用户将æˆä¸ºæ´»åŠ¨æµä¸­æ‰€æœ‰äº‹ä»¶çš„作者,例如创建新分支或者推é€æ–°æ交到现有分支。在创建或é‡æ–°æŒ‡å®šæ—¶æ‚¨ä»…å¯å°†è‡ªå·±æŒ‡å®šä¸ºé•œåƒç”¨æˆ·ã€‚"
msgid "This will redirect you to an external sign in page."
-msgstr ""
+msgstr "这会将您é‡å®šå‘到外部登录页é¢ã€‚"
msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
msgstr "这些电å­é‚®ä»¶è‡ªåŠ¨ç”Ÿæˆä¸ºè®®é¢˜(评论生æˆä¸ºç”µå­é‚®ä»¶ä¼šè¯)并在此处列出。"
@@ -9772,7 +10186,7 @@ msgid "Timeago|1 month ago"
msgstr "1个月å‰"
msgid "Timeago|1 month remaining"
-msgstr "剩余 1 个月"
+msgstr "剩余1个月"
msgid "Timeago|1 week ago"
msgstr "1星期å‰"
@@ -9799,7 +10213,7 @@ msgid "Timeago|in %s minutes"
msgstr " %s 分钟åŽ"
msgid "Timeago|in %s months"
-msgstr " %s 个月åŽ"
+msgstr " %s个月åŽ"
msgid "Timeago|in %s seconds"
msgstr " %s 秒åŽ"
@@ -9855,16 +10269,16 @@ msgid "Title"
msgstr "标题"
msgid "Titles and Filenames"
-msgstr ""
+msgstr "标题和文件å称"
msgid "To %{link_to_help} of your domain, add the above key to a TXT record within to your DNS configuration."
-msgstr ""
+msgstr "è¦%{link_to_help}到您的域å,请将上述密钥添加到DNSé…置中的TXT记录。"
msgid "To GitLab"
msgstr "到GitLab"
msgid "To access this domain create a new DNS record"
-msgstr ""
+msgstr "è¦è®¿é—®æ­¤åŸŸï¼Œè¯·åˆ›å»ºæ–°çš„DNS记录"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "è¦æ·»åŠ ä¸€ä¸ª SSH 密钥, æ‚¨éœ€è¦ %{generate_link_start} 生æˆä¸€ä¸ª %{link_end} 或使用一个 %{existing_link_start} 现有的 key%{link_end}。"
@@ -9909,13 +10323,13 @@ msgid "To import an SVN repository, check out %{svn_link}."
msgstr "è¦å¯¼å…¥SVN仓库,请查看 %{svn_link}。"
msgid "To keep this project going, create a new issue"
-msgstr ""
+msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„进行,请创建一个新的议题"
msgid "To keep this project going, create a new merge request"
-msgstr ""
+msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„进行,请创建一个新的åˆå¹¶è¯·æ±‚"
msgid "To link Sentry to GitLab, enter your Sentry URL and Auth Token."
-msgstr ""
+msgstr "è¦å°†Sentry链接到GitLab,请输入您的Sentry URLå’ŒAuth Token。"
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 "如需将整个GitLab项目从å¦ä¸€ä¸ªGitLabæœåŠ¡å™¨ç§»åŠ¨æˆ–å¤åˆ¶åˆ°æ­¤æœåŠ¡å™¨ï¼Œè¯·è®¿é—®åŽŸé¡¹ç›®çš„设置页é¢ï¼Œç”Ÿæˆå¯¼å‡ºæ–‡ä»¶ï¼Œç„¶åŽåœ¨æ­¤å¤„上载。"
@@ -9924,13 +10338,13 @@ msgid "To only use CI/CD features for an external repository, choose <strong>CI/
msgstr "è¦ä»…为外部仓库使用CI / CD功能时,请选择</strong>使用外部仓库è¿è¡ŒCI/CD<strong>。"
msgid "To open Jaeger and easily view tracing from GitLab, link the %{link} page to your server"
-msgstr ""
+msgstr "请将%{link} 页é¢è¿žæŽ¥åˆ°æ‚¨çš„ Jaeger æœåŠ¡å™¨ï¼Œä»¥ä¾¿åœ¨ GitLab 打开并轻æ¾æŸ¥çœ‹è·Ÿè¸ª"
msgid "To preserve performance only <strong>%{display_size} of %{real_size}</strong> files are displayed."
-msgstr ""
+msgstr "为了ä¿æŒæ€§èƒ½ï¼Œä»…显示文件中的 <strong>%{display_size}/%{real_size}</strong>。"
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 ""
+msgstr "è¦ä»Žæ‰‹åŠ¨é…置的PrometheusæœåŠ¡æŽ¥æ”¶è­¦æŠ¥ï¼Œè¯·å°†ä»¥ä¸‹URL和授æƒå¯†é’¥æ·»åŠ åˆ°Prometheus webhooké…置文件中。了解更多关于 %{linkStart}é…ç½®Prometheus%{linkEnd} 将警报å‘é€åˆ°GitLab。"
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "通过Azure,Okta,Onelogin,Ping Identity或自定义SAML 2.0等身份验è¯ç¨‹åºä¸ºæ‚¨çš„群组设置SAML身份验è¯ï¼š"
@@ -9939,7 +10353,7 @@ msgid "To start serving your jobs you can add Runners to your group"
msgstr "è¦å¼€å§‹æ‰§è¡Œä»»åŠ¡ï¼Œè¯·æŠŠRunner加到群组中"
msgid "To start serving your jobs you can either add specific Runners to your project or use shared Runners"
-msgstr ""
+msgstr "è¦å¼€å§‹ä½¿ç”¨ä½œä¸šï¼Œæ‚¨å¯ä»¥å‘项目添加特定的è¿è¡Œå™¨æˆ–使用共享的è¿è¡Œå™¨"
msgid "To this GitLab instance"
msgstr "转至此GitLab实例"
@@ -9948,10 +10362,10 @@ msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' in
msgstr "如需验è¯GitLab CI设置,请访问当å‰é¡¹ç›®çš„'CI/CD → æµæ°´çº¿',然åŽç‚¹å‡»'CI Lint'按钮。"
msgid "To view the roadmap, add a start or due date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown."
-msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ªå²è¯—故事。在月视图中,åªæ˜¾ç¤ºä¸Šä¸ªæœˆï¼Œæœ¬æœˆä»¥åŠæŽ¥ä¸‹æ¥5个月的å²è¯—故事."
+msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ª epic。在月视图中,åªæ˜¾ç¤ºä¸Šä¸ªæœˆï¼Œæœ¬æœˆä»¥åŠæŽ¥ä¸‹æ¥5个月的 epic."
msgid "To widen your search, change or remove filters above"
-msgstr ""
+msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除上é¢çš„过滤器"
msgid "To widen your search, change or remove filters."
msgstr "需è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–移除过滤æ¡ä»¶ã€‚"
@@ -9969,13 +10383,13 @@ msgid "Toggle Sidebar"
msgstr "切æ¢ä¾§è¾¹æ "
msgid "Toggle comments for this file"
-msgstr ""
+msgstr "切æ¢æ­¤æ–‡ä»¶çš„评论"
msgid "Toggle commit description"
msgstr "切æ¢æ交æè¿°"
msgid "Toggle commit list"
-msgstr ""
+msgstr "切æ¢æ交列表"
msgid "Toggle discussion"
msgstr "开关讨论"
@@ -10041,10 +10455,10 @@ msgid "Trigger this manual action"
msgstr "触å‘此手动æ“作"
msgid "Trigger token:"
-msgstr ""
+msgstr "触å‘令牌:"
msgid "Trigger variables:"
-msgstr ""
+msgstr "触å‘å˜é‡ï¼š"
msgid "Triggers can force a specific branch or tag to get rebuilt with an API call. These tokens will impersonate their associated user including their access to projects and their project permissions."
msgstr "触å‘器å¯ä»¥é€šè¿‡ API 调用使特定的分支或标记被é‡æ–°æž„建,这些 token å¯ä»£è¡¨ä¸Žå…¶å…³è”的用户(包括该用户对项目的访问æƒé™ï¼‰"
@@ -10056,13 +10470,13 @@ msgid "Try again"
msgstr "请é‡è¯•"
msgid "Try again?"
-msgstr ""
+msgstr "é‡è¯•ï¼Ÿ"
msgid "Try all GitLab has to offer for 30 days."
msgstr "30天内体验GitLab的所有功能。"
msgid "Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now."
-msgstr ""
+msgstr "å°è¯•ä¸Žæ‚¨çš„设备通信。请将其æ’入并立å³æŒ‰ä¸‹ä¸Šçš„按钮。"
msgid "Turn on Service Desk"
msgstr "å¯ç”¨æœåŠ¡å°"
@@ -10077,7 +10491,7 @@ msgid "Type"
msgstr "类型"
msgid "URL"
-msgstr ""
+msgstr "URL"
msgid "Unable to load the diff. %{button_try_again}"
msgstr "无法加载差异。 %{button_try_again}"
@@ -10086,16 +10500,16 @@ msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
msgstr "由于\"%{reason}\"的原因,您暂时ä¸èƒ½è¿›å…¥é…置了SAML 的群组"
msgid "Unable to update this epic at this time."
-msgstr "当å‰æ— æ³•æ›´æ–°æ­¤å²è¯—故事。"
+msgstr "当å‰æ— æ³•æ›´æ–°æ­¤ epic。"
msgid "Unblock"
-msgstr ""
+msgstr "解除é”定"
msgid "Undo"
msgstr "撤消"
msgid "Unfortunately, your email message to GitLab could not be processed."
-msgstr ""
+msgstr "很é—憾,您å‘é€ç»™GitLab的电å­é‚®ä»¶æ— æ³•å¤„ç†ã€‚"
msgid "Unknown"
msgstr "未知的"
@@ -10146,7 +10560,7 @@ msgid "Unsubscribe at project level"
msgstr "在项目级别å–消订阅"
msgid "Unsubscribe from %{type}"
-msgstr ""
+msgstr "å–消订阅 %{type}"
msgid "Unverified"
msgstr "未验è¯"
@@ -10160,20 +10574,26 @@ msgstr "å³å°†å¼€å§‹"
msgid "Update"
msgstr "æ›´æ–°"
-msgid "Update failed"
+msgid "Update approvers"
msgstr ""
+msgid "Update failed"
+msgstr "更新失败"
+
msgid "Update now"
msgstr "ç«‹å³æ›´æ–°"
msgid "Update your group name, description, avatar, and visibility."
msgstr "更新您的群组å称ã€è¯´æ˜Žã€å¤´åƒä»¥åŠå¯è§æ€§ã€‚"
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "更新中"
msgid "Upgrade plan to unlock Canary Deployments feature"
-msgstr ""
+msgstr "å‡çº§åˆ°å¯ä½¿ç”¨é‡‘ä¸é›€éƒ¨ç½²åŠŸèƒ½çš„方案"
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "å‡çº§æ‚¨çš„订阅计划以å¯ç”¨é«˜çº§å…¨å±€æœç´¢ã€‚"
@@ -10194,28 +10614,28 @@ msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
msgstr "在这里上传 <code>GoogleCodeProjectHosting.json</code>:"
msgid "Upload CSV file"
-msgstr ""
+msgstr "上传CSV文件"
msgid "Upload New File"
msgstr "上传新文件"
msgid "Upload a certificate for your domain with all intermediates"
-msgstr ""
+msgstr "通过存储介质上传您的域åè¯ä¹¦"
msgid "Upload a private key for your certificate"
-msgstr ""
+msgstr "为您的è¯ä¹¦ä¸Šä¼ ä¸€ä¸ªç§é’¥"
msgid "Upload file"
msgstr "上传文件"
msgid "Upload object map"
-msgstr ""
+msgstr "上传对象图"
msgid "UploadLink|click to upload"
msgstr "点击上传"
msgid "Upstream"
-msgstr ""
+msgstr "上游"
msgid "Upvotes"
msgstr "顶"
@@ -10248,13 +10668,13 @@ msgid "Use your global notification setting"
msgstr "使用全局通知设置"
msgid "Use your smart card to authenticate with the LDAP server."
-msgstr ""
+msgstr "使用智能å¡å¯¹LDAPæœåŠ¡å™¨è¿›è¡Œèº«ä»½éªŒè¯ã€‚"
msgid "Used by members to sign in to your group in GitLab"
msgstr "ä¾›æˆå‘˜ç™»å½•æ‚¨çš„GitLab群组"
msgid "Used to help configure your identity provider"
-msgstr ""
+msgstr "用于帮助é…置您的身份æ供者"
msgid "User Cohorts are only shown when the %{usage_ping_link_start}usage ping%{usage_ping_link_end} is enabled."
msgstr "用户世代表仅在å¯ç”¨ %{usage_ping_link_start}使用情况检测(usage ping)%{usage_ping_link_end} 时显示。"
@@ -10281,22 +10701,22 @@ msgid "UserProfile|Edit profile"
msgstr "编辑个人资料"
msgid "UserProfile|Explore public groups to find projects to contribute to."
-msgstr ""
+msgstr "æµè§ˆå…¬å…±ç¾¤ç»„以查找è¦è´¡çŒ®çš„项目。"
msgid "UserProfile|Groups"
msgstr "群组"
msgid "UserProfile|Groups are the best way to manage projects and members."
-msgstr ""
+msgstr "群组是管ç†é¡¹ç›®å’Œæˆå‘˜çš„最佳方å¼ã€‚"
msgid "UserProfile|Join or create a group to start contributing by commenting on issues or submitting merge requests!"
-msgstr ""
+msgstr "加入或创建一个群组,通过评论议题或æ交åˆå¹¶è¯·æ±‚æ¥å¼€å§‹è´¡çŒ®ï¼"
msgid "UserProfile|Most Recent Activity"
msgstr "最新活动"
msgid "UserProfile|No snippets found."
-msgstr ""
+msgstr "未找到代ç ç‰‡æ®µ"
msgid "UserProfile|Overview"
msgstr "概览"
@@ -10311,19 +10731,19 @@ msgid "UserProfile|Snippets"
msgstr "代ç ç‰‡æ®µ"
msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
-msgstr ""
+msgstr "GitLab 中的代ç ç‰‡æ®µå¯ä»¥æ˜¯ç§æœ‰çš„ã€å†…部或公开。"
msgid "UserProfile|Subscribe"
msgstr "关注"
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "用户没有任何个人项目"
msgid "UserProfile|This user has a private profile"
msgstr "此用户具有éžå…¬å¼€ä¸ªäººèµ„料设置"
msgid "UserProfile|This user hasn't contributed to any projects"
-msgstr ""
+msgstr "此用户未对任何项目åšå‡ºè´¡çŒ®"
msgid "UserProfile|View all"
msgstr "查看全部"
@@ -10332,31 +10752,31 @@ msgid "UserProfile|View user in admin area"
msgstr "在管ç†åŒºåŸŸä¸­æŸ¥çœ‹ç”¨æˆ·"
msgid "UserProfile|You can create a group for several dependent projects."
-msgstr ""
+msgstr "您å¯ä»¥ä¸ºå¤šä¸ªä¾èµ–项目创建一个群组。"
msgid "UserProfile|You haven't created any personal projects."
-msgstr ""
+msgstr "您还没有创建任何个人项目"
msgid "UserProfile|You haven't created any snippets."
-msgstr ""
+msgstr "您还没有创建任何代ç ç‰‡æ®µ"
msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
-msgstr ""
+msgstr "您的项目å¯ä»¥æ ¹æ®æ‚¨çš„选择公开ã€å†…部或ç§ä¸‹æ供。"
msgid "Users"
msgstr "用户"
msgid "Users requesting access to"
-msgstr ""
+msgstr "请求访问的用户"
msgid "Validate"
-msgstr ""
+msgstr "验è¯"
msgid "Validate your GitLab CI configuration file"
-msgstr ""
+msgstr "验è¯æ‚¨çš„GitLab CIé…置文件"
msgid "Value"
-msgstr ""
+msgstr "值"
msgid "Various container registry settings."
msgstr "容器注册表相关设置。"
@@ -10365,7 +10785,7 @@ msgid "Various email settings."
msgstr "电å­é‚®ä»¶ç›¸å…³è®¾ç½®"
msgid "Various localization settings."
-msgstr ""
+msgstr "å„ç§æœ¬åœ°åŒ–设置。"
msgid "Various settings that affect GitLab performance."
msgstr "å½±å“GitLab性能相关设置。"
@@ -10374,7 +10794,7 @@ msgid "Verification information"
msgstr "验è¯ä¿¡æ¯"
msgid "Verification status"
-msgstr ""
+msgstr "验è¯çŠ¶æ€"
msgid "Verified"
msgstr "已验è¯"
@@ -10389,16 +10809,19 @@ msgid "View app"
msgstr "查看应用程åº"
msgid "View deployment"
-msgstr ""
+msgstr "查看部署"
msgid "View details: %{details_url}"
-msgstr ""
+msgstr "查看详细信æ¯: %{details_url}"
msgid "View documentation"
msgstr "查看文档"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
-msgstr "查看å²è¯—故事列表"
+msgstr "查看 epic 列表"
msgid "View file @ "
msgstr "æµè§ˆæ–‡ä»¶ @ "
@@ -10406,6 +10829,9 @@ msgstr "æµè§ˆæ–‡ä»¶ @ "
msgid "View group labels"
msgstr "查看群组标记"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "查看议题"
@@ -10434,7 +10860,7 @@ msgid "View the documentation"
msgstr "查看文档"
msgid "Viewing commit"
-msgstr ""
+msgstr "查看æ交"
msgid "Visibility and access controls"
msgstr "å¯è§æ€§ä¸Žè®¿é—®æŽ§åˆ¶"
@@ -10461,10 +10887,10 @@ msgid "VisibilityLevel|Unknown"
msgstr "未知"
msgid "Vulnerability Chart"
-msgstr ""
+msgstr "æ¼æ´žå›¾è¡¨"
msgid "Vulnerability List"
-msgstr ""
+msgstr "æ¼æ´žæ¸…å•"
msgid "Vulnerability|Class"
msgstr "类型"
@@ -10491,7 +10917,7 @@ msgid "Vulnerability|Project"
msgstr "项目"
msgid "Vulnerability|Report Type"
-msgstr ""
+msgstr "报告类型"
msgid "Vulnerability|Severity"
msgstr "严é‡æ€§"
@@ -10500,19 +10926,19 @@ msgid "Want to see the data? Please ask an administrator for access."
msgstr "æƒé™ä¸è¶³ã€‚如需查看相关数æ®ï¼Œè¯·å‘管ç†å‘˜ç”³è¯·æƒé™ã€‚"
msgid "We can't find an epic that matches what you are looking for."
-msgstr ""
+msgstr "我们找ä¸åˆ°ç¬¦åˆæ‚¨è¦æ±‚çš„epic。"
msgid "We can't find an issue that matches what you are looking for."
-msgstr ""
+msgstr "我们找ä¸åˆ°ä¸Žæ‚¨è¦æŸ¥æ‰¾çš„内容相匹é…的议题。"
msgid "We could not determine the path to remove the epic"
-msgstr ""
+msgstr "我们无法确定删除epic的路径"
msgid "We could not determine the path to remove the issue"
-msgstr ""
+msgstr "我们无法确定删除议题的路径"
msgid "We couldn't find any results matching"
-msgstr ""
+msgstr "我们找ä¸åˆ°ä»»ä½•åŒ¹é…的结果"
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "我们在%{humanized_resource_name}检测到潜在滥用行为。请输入此reCAPTCHA验è¯ç å¹¶ç»§ç»­ã€‚"
@@ -10521,16 +10947,16 @@ msgid "We don't have enough data to show this stage."
msgstr "该阶段的数æ®ä¸è¶³ï¼Œæ— æ³•æ˜¾ç¤ºã€‚"
msgid "We heard back from your U2F device. You have been authenticated."
-msgstr ""
+msgstr "我们从您的U2F设备收到了回å¤ã€‚您已通过身份验è¯ã€‚"
msgid "We want to be sure it is you, please confirm you are not a robot."
-msgstr "我们è¦ç¡®å®šä½ æ˜¯ä¸æ˜¯æœºå™¨äººã€‚"
+msgstr "我们è¦ç¡®å®šæ‚¨æ˜¯ä¸æ˜¯æœºå™¨äººã€‚"
msgid "Web IDE"
msgstr "Web IDE"
msgid "Web Terminal"
-msgstr ""
+msgstr "Web终端"
msgid "Web terminal"
msgstr "Web终端"
@@ -10557,7 +10983,7 @@ msgid "When leaving the URL blank, classification labels can still be specified
msgstr "å°†URLä¿ç•™ä¸ºç©ºç™½æ—¶ï¼Œä»å¯æŒ‡å®šåˆ†ç±»æ ‡ç­¾ï¼Œè€Œæ— éœ€ç¦ç”¨è·¨é¡¹ç›®åŠŸèƒ½æˆ–执行外部授æƒæ£€æŸ¥ã€‚"
msgid "When:"
-msgstr ""
+msgstr "当:"
msgid "Who can see this group?"
msgstr "哪些人å¯ä»¥çœ‹åˆ°è¿™ä¸ªç¾¤ç»„?"
@@ -10701,7 +11127,7 @@ msgid "Wiki|Wiki Pages"
msgstr "Wiki 页é¢"
msgid "Will deploy to"
-msgstr ""
+msgstr "将部署到"
msgid "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 "通过贡献分æžï¼Œæ‚¨å¯ä»¥ä»Žæ€»ä½“上了解您的组织åŠå…¶æˆå‘˜çš„议题〠åˆå¹¶è¯·æ±‚和推é€æ´»åŠ¨çš„情况。"
@@ -10709,11 +11135,14 @@ msgstr "通过贡献分æžï¼Œæ‚¨å¯ä»¥ä»Žæ€»ä½“上了解您的组织åŠå…¶æˆå‘˜
msgid "Withdraw Access Request"
msgstr "å–消æƒé™ç”³è¯·"
-msgid "Write a comment or drag your files here…"
+msgid "Write"
msgstr ""
+msgid "Write a comment or drag your files here…"
+msgstr "在此写评论或拖动您的文件到这里…"
+
msgid "Write milestone description..."
-msgstr ""
+msgstr "写入里程碑æè¿°..."
msgid "Yes"
msgstr "是"
@@ -10728,7 +11157,7 @@ msgid "Yesterday"
msgstr "昨天"
msgid "You"
-msgstr ""
+msgstr "您"
msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr "您是一å管ç†å‘˜ï¼Œè¿™æ„味ç€æŽˆäºˆå¯¹ <strong>%{client_name}</strong> 访问æƒé™å°†å…许他们作为管ç†å‘˜ä¸ŽGitLab进行交互。请谨慎æ“作。"
@@ -10749,7 +11178,7 @@ msgid "You are on a read-only GitLab instance."
msgstr "当å‰æ­£åœ¨è®¿é—®åªè¯» GitLab 实例。"
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
-msgstr ""
+msgstr "您收到此消æ¯æ˜¯å› ä¸ºæ‚¨æ˜¯ %{url} çš„GitLab管ç†å‘˜ã€‚"
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr "您å¯ä»¥ %{linkStart}查看BLOB%{linkEnd} 代替。"
@@ -10776,7 +11205,7 @@ 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 ""
+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 "您å¯ä»¥ä½¿ç”¨äº¤äº’模å¼ï¼Œé€šè¿‡é€‰æ‹© %{use_ours} 或 %{use_theirs} 按钮æ¥è§£å†³åˆå¹¶å†²çªã€‚也å¯ä»¥é€šè¿‡ç›´æŽ¥ç¼–辑文件æ¥è§£å†³åˆå¹¶å†²çªã€‚然åŽå°†è¿™äº›æ›´æ”¹æ交到 %{branch_name}"
@@ -10797,28 +11226,31 @@ msgid "You do not have any subscriptions yet"
msgstr "您当å‰å°šæœªè®¢é˜…任何计划"
msgid "You do not have permission to run the Web Terminal. Please contact a project administrator."
-msgstr ""
+msgstr "您无æƒè¿è¡ŒWeb终端。请è”系项目管ç†å‘˜ã€‚"
msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
msgstr "您没有更改LDAP组åŒæ­¥ä¸­è®¾ç½®çš„相应æƒé™ã€‚"
msgid "You don't have any applications"
-msgstr "你没有任何应用程åº"
+msgstr "您没有任何应用程åº"
msgid "You don't have any authorized applications"
msgstr "您没有任何授æƒçš„应用"
msgid "You don't have any deployments right now."
-msgstr ""
+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 may also add variables that are made available to the running application by prepending the variable key with <code>K8S_SECRET_</code>."
-msgstr ""
+msgstr "您还å¯ä»¥é€šè¿‡åœ¨å˜é‡é”®å‰é¢åŠ ä¸Š<code>K8S_SECRET_</code>æ¥æ·»åŠ å¯ç”¨äºŽæ­£åœ¨è¿è¡Œçš„应用程åºçš„å˜é‡ã€‚"
msgid "You must accept our Terms of Service and privacy policy in order to register an account"
msgstr "您必须接å—我们的æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–æ‰èƒ½æ³¨å†Œå¸æˆ·"
@@ -10830,7 +11262,7 @@ msgid "You need a different license to enable FileLocks feature"
msgstr "需è¦ä½¿ç”¨ä¸Žå½“å‰ä¸åŒçš„许å¯(license) æ‰èƒ½å¯ç”¨FileLocks功能"
msgid "You need a different license to enable Geo replication."
-msgstr ""
+msgstr "您需è¦ä¸åŒçš„许å¯è¯æ‰èƒ½å¯ç”¨ Geo å¤åˆ¶."
msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
msgstr "您需è¦git-lfs版本 %{min_git_lfs_version} (或更高版本)æ‰èƒ½ç»§ç»­ã€‚请访问https://git-lfs.github.com"
@@ -10839,13 +11271,13 @@ msgid "You need permission."
msgstr "需è¦ç›¸å…³çš„æƒé™ã€‚"
msgid "You need to register a two-factor authentication app before you can set up a U2F device."
-msgstr ""
+msgstr "在设置U2F设备之å‰ï¼Œæ‚¨éœ€è¦æ³¨å†ŒåŒå› ç´ èº«ä»½éªŒè¯åº”用程åºã€‚"
msgid "You will lose all changes you've made to this file. This action cannot be undone."
-msgstr ""
+msgstr "您将丢失对此文件所åšçš„所有更改。此æ“作无法撤消。"
msgid "You will lose all the unstaged changes you've made in this project. This action cannot be undone."
-msgstr ""
+msgstr "您将丢失在此项目中所åšçš„所有未暂存的修改,此æ“作无法撤消。"
msgid "You will not get any notifications via email"
msgstr "ä¸ä¼šæ”¶åˆ°ä»»ä½•é€šçŸ¥é‚®ä»¶"
@@ -10874,6 +11306,9 @@ msgstr "在您的个人资料中添加SSH密钥之å‰ï¼Œæ‚¨ä¸èƒ½é€šè¿‡SSHæ¥æ‹‰
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "需è¦ä½¿ç”¨ä¸åŒçš„分支æ‰èƒ½è¿›è¡Œæœ‰æ•ˆçš„比较。"
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr "您收到此电å­é‚®ä»¶ï¼Œæ˜¯å› ä¸º%{reason}。"
@@ -10887,7 +11322,7 @@ msgid "YouTube"
msgstr "YouTube"
msgid "Your Conversational Development Index 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 ""
+msgstr "您的会è¯å¼€å‘指数概述了从功能角度使用GitLabçš„æ–¹å¼ã€‚查看您与其他组织的比较,å‘现您未使用的功能,并通过åšå®¢æ–‡ç« å’Œç™½çš®ä¹¦äº†è§£æœ€ä½³å®žè·µã€‚"
msgid "Your Groups"
msgstr "您的群组"
@@ -10899,22 +11334,22 @@ msgid "Your Projects (default)"
msgstr "您的项目 (默认值)"
msgid "Your Projects' Activity"
-msgstr "您的项目活动"
+msgstr "您的项目动æ€"
msgid "Your Todos"
msgstr "您的待办事项"
msgid "Your U2F device needs to be set up. Plug it in (if not already) and click the button on the left."
-msgstr ""
+msgstr "您的 U2F 设备需è¦è®¾ç½®ã€‚请将将其æ’入,并点击左边的按钮。"
msgid "Your applications (%{size})"
-msgstr "你的应用程åº(%{size})"
+msgstr "您的应用程åº(%{size})"
msgid "Your authorized applications"
msgstr "您已授æƒçš„应用"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
-msgstr ""
+msgstr "您的æµè§ˆå™¨ä¸æ”¯æŒU2F。请使用Google Chromeæ¡Œé¢ç‰ˆï¼ˆ41或更高版本)。"
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "åˆå¹¶è¯·æ±‚已开å¯ï¼Œå¯ä»¥æ交å˜æ›´åˆ°%{branch_name}。"
@@ -10929,22 +11364,22 @@ msgid "Your comment will not be visible to the public."
msgstr "您的评论将ä¸ä¼šå…¬å¼€æ˜¾ç¤ºã€‚"
msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
-msgstr ""
+msgstr "您的设备已æˆåŠŸè®¾ç½®ï¼è¯·ç»™å®ƒå‘½å并将其注册到GitLabæœåŠ¡å™¨ã€‚"
msgid "Your groups"
msgstr "您的群组"
msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
-msgstr ""
+msgstr "您的议题正在导入。完æˆåŽï¼Œæ‚¨å°†æ”¶åˆ°ä¸€å°ç¡®è®¤ç”µå­é‚®ä»¶ã€‚"
msgid "Your issues will be imported in the background. Once finished, you'll get a confirmation email."
-msgstr ""
+msgstr "您的议题将在åŽå°å¯¼å…¥ã€‚完æˆåŽï¼Œæ‚¨å°†æ”¶åˆ°ä¸€å°ç¡®è®¤ç”µå­é‚®ä»¶ã€‚"
msgid "Your name"
msgstr "您的åå­—"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
-msgstr ""
+msgstr "您的被é™åˆ¶ä¸ºæœ€å¤§ %{limit} 个项目ï¼è¯·ä¸Žæ‚¨çš„管ç†å‘˜è”系以增加它"
msgid "Your projects"
msgstr "您的项目"
@@ -10956,7 +11391,7 @@ msgid "ago"
msgstr "å‰"
msgid "allowed to fail"
-msgstr ""
+msgstr "å…许失败"
msgid "among other things"
msgstr "åŠå…¶ä»–功能"
@@ -10965,6 +11400,9 @@ msgid "assign yourself"
msgstr "分é…给自己"
msgid "attach a new file"
+msgstr "附加一个文件"
+
+msgid "authored"
msgstr ""
msgid "branch name"
@@ -11046,6 +11484,9 @@ msgstr "代ç è´¨é‡"
msgid "ciReport|Confidence"
msgstr "置信水平"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "容器安全扫æ"
@@ -11056,7 +11497,7 @@ msgid "ciReport|DAST"
msgstr "DAST"
msgid "ciReport|Dependency Scanning"
-msgstr ""
+msgstr "ä¾èµ–扫æ"
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
msgstr "ä¾èµ–项扫æå¯ä»¥æ£€æµ‹æºä»£ç ä¾èµ–项中已知的æ¼æ´žã€‚"
@@ -11074,10 +11515,10 @@ msgid "ciReport|Dismissed by"
msgstr "忽略æ“作æ¥è‡ª"
msgid "ciReport|Download and apply the patch to fix this vulnerability."
-msgstr ""
+msgstr "下载并应用此修补程åºä»¥ä¿®å¤æ­¤æ¼æ´žã€‚"
msgid "ciReport|Download patch"
-msgstr ""
+msgstr "下载补ä¸"
msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
msgstr "动æ€åº”用程åºå®‰å…¨æµ‹è¯•ï¼ˆDAST)å¯æ£€æµ‹Web应用程åºä¸­çš„已知æ¼æ´žã€‚"
@@ -11138,9 +11579,6 @@ msgstr "性能指标无å˜åŒ–"
msgid "ciReport|Performance metrics"
msgstr "性能指标"
-msgid "ciReport|Revert dismissal"
-msgstr "å–消忽略"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11180,6 +11618,9 @@ msgstr "加载ä¾èµ–项扫æ报告时出错"
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "å–消忽略æ“作时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "å°† %{name} 从 %{version} å‡çº§åˆ° %{fixed}。"
@@ -11197,7 +11638,7 @@ msgid "command line instructions"
msgstr "命令行指å—"
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "评论 %{link_to_project}"
msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue."
msgstr "å³å°†å…³é—­ç§å¯†æ€§ã€‚这将使得 <strong>所有用户</strong>都å¯ä»¥æŸ¥çœ‹å¹¶ä¸”评论当å‰è®®é¢˜ã€‚"
@@ -11219,7 +11660,7 @@ msgid_plural "days"
msgstr[0] "天"
msgid "deleted"
-msgstr ""
+msgstr "已删除"
msgid "deploy token"
msgstr "部署令牌"
@@ -11229,7 +11670,7 @@ msgstr "å·²ç¦ç”¨"
msgid "discussion resolved"
msgid_plural "discussions resolved"
-msgstr[0] ""
+msgstr[0] "讨论已解决"
msgid "done"
msgstr "完æˆ"
@@ -11242,13 +11683,13 @@ msgid "enabled"
msgstr "å·²å¯ç”¨"
msgid "epic"
-msgstr ""
+msgstr "epic"
msgid "error"
-msgstr ""
+msgstr "错误"
msgid "error code:"
-msgstr ""
+msgstr "错误代ç ï¼š"
msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
msgstr "最åŽä¸€æ¬¡%{slash_command} 命令将更新预计时间。"
@@ -11260,7 +11701,7 @@ msgid "from"
msgstr "æ¥è‡ª"
msgid "group"
-msgstr ""
+msgstr "群组"
msgid "help"
msgstr "帮助"
@@ -11268,14 +11709,11 @@ msgstr "帮助"
msgid "here"
msgstr "此处"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://your-bitbucket-server"
msgid "image diff"
-msgstr ""
+msgstr "图åƒå·®å¼‚"
msgid "import flow"
msgstr "导入æµç¨‹"
@@ -11284,13 +11722,13 @@ msgid "importing"
msgstr "导入中"
msgid "in group %{link_to_group}"
-msgstr ""
+msgstr "在 %{link_to_group} 群组"
msgid "in project %{link_to_project}"
-msgstr ""
+msgstr "在 %{link_to_project} 项目"
msgid "index"
-msgstr ""
+msgstr "索引"
msgid "instance completed"
msgid_plural "instances completed"
@@ -11306,25 +11744,25 @@ msgid "is not a valid X509 certificate."
msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509è¯ä¹¦ã€‚"
msgid "is out of the hierarchy of the Group owning the template"
-msgstr ""
+msgstr "ä¸å±žäºŽæ‹¥æœ‰æ¨¡æ¿çš„群组层次结构"
msgid "issue"
-msgstr ""
+msgstr "议题"
msgid "issue boards"
msgstr "议题看æ¿"
msgid "it is stored externally"
-msgstr ""
+msgstr "它是外部存储的"
msgid "it is stored in LFS"
-msgstr ""
+msgstr "它存储在LFS中"
msgid "it is too large"
-msgstr ""
+msgstr "它太大了"
msgid "latest"
-msgstr ""
+msgstr "最新"
msgid "latest deployment"
msgstr "最新部署"
@@ -11339,26 +11777,26 @@ msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "被 %{path_lock_user_name} 在 %{created_at} é”定"
msgid "manual"
-msgstr ""
+msgstr "手动"
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "åˆå¹¶è¯·æ±‚"
msgid "missing"
-msgstr ""
+msgstr "丢失"
msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}."
-msgstr ""
+msgstr "%{commitCount} 和 %{mergeCommitCount} 将被添加到 %{targetBranch}。"
msgid "mrWidgetCommitsAdded|1 merge commit"
-msgstr ""
+msgstr "1个åˆå¹¶æ交"
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 ""
+msgstr "%{link_start}了解更多关于解决冲çª%{link_end}"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
msgstr "%{metricsLinkStart} 内存 %{metricsLinkEnd} å ç”¨ %{emphasisStart} ä¸‹é™ %{emphasisEnd},从 %{memoryFrom}MB 到 %{memoryTo}MB"
@@ -11376,10 +11814,10 @@ msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "å…许具有åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯æƒé™çš„æˆå‘˜æ交"
msgid "mrWidget|An error occurred while removing your approval."
-msgstr ""
+msgstr "删除您的核准时å‘生错误。"
msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
-msgstr ""
+msgstr "检索此åˆå¹¶è¯·æ±‚的核准数æ®æ—¶å‘生错误。"
msgid "mrWidget|An error occurred while submitting your approval."
msgstr "æ交批准时å‘生错误。"
@@ -11387,6 +11825,9 @@ msgstr "æ交批准时å‘生错误。"
msgid "mrWidget|Approve"
msgstr "批准"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "批准人:"
@@ -11418,7 +11859,7 @@ msgid "mrWidget|Create an issue to resolve them later"
msgstr "创建议题以便åŽç»­å¤„ç†"
msgid "mrWidget|Delete source branch"
-msgstr ""
+msgstr "删除æºåˆ†æ”¯"
msgid "mrWidget|Deployment statistics are not available currently"
msgstr "部署统计信æ¯å½“å‰ä¸å¯ç”¨"
@@ -11459,6 +11900,9 @@ msgstr "本地åˆå¹¶"
msgid "mrWidget|Merge request approved"
msgstr "åˆå¹¶è¯·æ±‚已批准"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "åˆå¹¶è¯·æ±‚已被批准; ä»å¯ä»¥æ·»åŠ é¢å¤–批准"
@@ -11518,6 +11962,9 @@ msgstr "还原"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "通过新的åˆå¹¶è¯·æ±‚中还原此åˆå¹¶è¯·æ±‚"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "设置:"
@@ -11537,19 +11984,19 @@ msgid "mrWidget|The source branch HEAD has recently changed. Please reload the p
msgstr "æºåˆ†æ”¯HEAD最近已更改。请在é‡æ–°åˆå¹¶ä¹‹å‰é‡æ–°åŠ è½½é¡µé¢å¹¶æŸ¥çœ‹æ›´æ”¹"
msgid "mrWidget|The source branch has been deleted"
-msgstr ""
+msgstr "æºåˆ†æ”¯å·²è¢«åˆ é™¤"
msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
msgstr "æºåˆ†æ”¯æ˜¯æ¯”目标分支%{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd}"
msgid "mrWidget|The source branch is being deleted"
-msgstr ""
+msgstr "æºåˆ†æ”¯æ­£åœ¨åˆ é™¤"
msgid "mrWidget|The source branch will be deleted"
-msgstr ""
+msgstr "æºåˆ†æ”¯å°†è¢«åˆ é™¤"
msgid "mrWidget|The source branch will not be deleted"
-msgstr ""
+msgstr "æºåˆ†æ”¯å°†ä¸ä¼šè¢«åˆ é™¤"
msgid "mrWidget|There are merge conflicts"
msgstr "存在åˆå¹¶å†²çª"
@@ -11558,7 +12005,7 @@ msgid "mrWidget|There are unresolved discussions. Please resolve these discussio
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 ""
+msgstr "此功能是从目标分支åˆå¹¶åˆ°æºåˆ†æ”¯çš„更改。您无法使用此功能,因为æºåˆ†æ”¯å—到ä¿æŠ¤ã€‚"
msgid "mrWidget|This merge request failed to be merged automatically"
msgstr "该åˆå¹¶è¯·æ±‚未能自动åˆå¹¶"
@@ -11573,7 +12020,7 @@ msgid "mrWidget|You are not allowed to edit this project directly. Please fork t
msgstr "ä¸å…许直接编辑此项目。请派生(fork)åŽè¿›è¡Œæ›´æ”¹ã€‚"
msgid "mrWidget|You can delete the source branch now"
-msgstr ""
+msgstr "您现在å¯ä»¥åˆ é™¤æºåˆ†æ”¯"
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "æ­¤åˆå¹¶è¯·æ±‚å¯ä»¥æ‰‹åŠ¨åˆå¹¶ï¼Œè¯·ä½¿ç”¨ä»¥ä¸‹"
@@ -11597,19 +12044,19 @@ msgid "new merge request"
msgstr "新建åˆå¹¶è¯·æ±‚"
msgid "none"
-msgstr ""
+msgstr "æ— "
msgid "notification emails"
msgstr "通知邮件"
msgid "nounSeries|%{firstItem} and %{lastItem}"
-msgstr ""
+msgstr "%{firstItem} 和 %{lastItem}"
msgid "nounSeries|%{item}, %{nextItem}"
-msgstr ""
+msgstr "%{item}, %{nextItem}"
msgid "nounSeries|%{item}, and %{lastItem}"
-msgstr ""
+msgstr "%{item},和 %{lastItem}"
msgid "or"
msgstr "或"
@@ -11629,7 +12076,7 @@ msgid "personal access token"
msgstr "个人访问令牌"
msgid "private"
-msgstr ""
+msgstr "ç§æœ‰"
msgid "private key does not match certificate."
msgstr "ç§é’¥ä¸Žè¯ä¹¦ä¸åŒ¹é…。"
@@ -11639,10 +12086,10 @@ msgid_plural "projects"
msgstr[0] "项目"
msgid "quick actions"
-msgstr ""
+msgstr "å¿«æ·æ“作"
msgid "register"
-msgstr ""
+msgstr "注册"
msgid "remaining"
msgstr "剩余"
@@ -11657,29 +12104,29 @@ msgid "remove weight"
msgstr "移除æƒé‡"
msgid "rendered diff"
-msgstr ""
+msgstr "渲染差异"
msgid "reply"
msgid_plural "replies"
msgstr[0] "æ¡å›žå¤"
msgid "score"
-msgstr ""
+msgstr "分"
msgid "should be higher than %{access} inherited membership from group %{group_name}"
-msgstr ""
+msgstr "应该从高于%{group_name} 群组继承æˆå‘˜èº«ä»½%{access}"
msgid "show less"
-msgstr ""
+msgstr "显示较少"
msgid "sign in"
-msgstr ""
+msgstr "登录"
msgid "source"
msgstr "æº"
msgid "source diff"
-msgstr ""
+msgstr "æºå·®å¼‚"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} 将会更新消耗的总时长。"
@@ -11688,13 +12135,13 @@ msgid "started"
msgstr "已开始"
msgid "stuck"
-msgstr ""
+msgstr "å¡ä½"
msgid "syntax is correct"
-msgstr ""
+msgstr "语法是正确的"
msgid "syntax is incorrect"
-msgstr ""
+msgstr "语法ä¸æ­£ç¡®"
msgid "this document"
msgstr "此文档"
@@ -11703,10 +12150,10 @@ msgid "to help your contributors communicate effectively!"
msgstr "帮助您的贡献者进行有效沟通ï¼"
msgid "triggered"
-msgstr ""
+msgstr "已触å‘"
msgid "updated"
-msgstr ""
+msgstr "已更新"
msgid "username"
msgstr "用户å"
@@ -11715,13 +12162,13 @@ msgid "uses Kubernetes clusters to deploy your code!"
msgstr "使用 Kubernetes 集群æ¥éƒ¨ç½²ä»£ç ï¼"
msgid "verify ownership"
-msgstr ""
+msgstr "验è¯æ‰€æœ‰æƒ"
msgid "view it on GitLab"
msgstr "使用GitLab查看"
msgid "view the blob"
-msgstr ""
+msgstr "查看blob"
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "å…± %{additions} æ¡æ–°å¢ž, %{deletions} æ¡åˆ é™¤."
@@ -11731,5 +12178,5 @@ msgid_plural "within %d minutes "
msgstr[0] "在 %d 分钟内 "
msgid "yaml invalid"
-msgstr ""
+msgstr "yaml无效"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index a6dfd5f6139..7df18cc4d70 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 08:13\n"
+"PO-Revision-Date: 2019-03-06 15:52\n"
msgid " Status"
msgstr ""
@@ -41,6 +41,10 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr ""
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] " %d 次æ交"
@@ -111,12 +115,25 @@ msgstr ""
msgid "%{count} %{alerts}"
msgstr ""
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr ""
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -131,15 +148,15 @@ msgstr ""
msgid "%{firstLabel} +%{labelCount} more"
msgstr ""
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -207,6 +224,9 @@ msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] "%{count}%{type} 個變更"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] ""
@@ -320,6 +344,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr ""
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "相關æŒçºŒé›†æˆçš„圖åƒé›†åˆ"
@@ -335,6 +374,9 @@ msgstr ""
msgid "A new branch will be created in your fork and a new merge request will be started."
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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr ""
@@ -419,24 +461,51 @@ msgstr ""
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr ""
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr ""
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr ""
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr ""
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr ""
@@ -605,6 +674,9 @@ msgstr ""
msgid "Advanced settings"
msgstr ""
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] ""
@@ -615,6 +687,9 @@ msgstr ""
msgid "All"
msgstr "全部"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr ""
@@ -684,7 +759,7 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -696,6 +771,15 @@ 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 previewing the blob"
msgstr ""
@@ -708,6 +792,9 @@ msgstr ""
msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr ""
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr ""
@@ -801,12 +891,18 @@ msgstr ""
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
msgid "An error occurred while unsubscribing to notifications."
msgstr ""
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr ""
@@ -897,6 +993,40 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -939,9 +1069,15 @@ msgstr ""
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1026,6 +1162,9 @@ msgstr ""
msgid "Assignee(s)"
msgstr ""
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1041,9 +1180,6 @@ msgstr ""
msgid "August"
msgstr ""
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr ""
@@ -1602,6 +1738,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1638,6 +1777,9 @@ msgstr "還原"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr ""
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr ""
@@ -1650,6 +1792,9 @@ msgstr "統計圖"
msgid "Chat"
msgstr ""
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr ""
@@ -1716,9 +1861,6 @@ msgstr ""
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
-msgid "Choose which repositories you want to import."
-msgstr ""
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr ""
@@ -1878,6 +2020,9 @@ msgstr ""
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1893,9 +2038,6 @@ msgstr ""
msgid "Closed"
msgstr ""
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr ""
@@ -1941,10 +2083,10 @@ msgstr ""
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+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}"
@@ -1983,6 +2125,9 @@ msgstr ""
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2079,7 +2224,7 @@ 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|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -2094,9 +2239,6 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
-msgid "ClusterIntegration|Install Prometheus"
-msgstr ""
-
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -2142,9 +2284,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr ""
@@ -2382,15 +2521,27 @@ msgstr ""
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr ""
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -2689,6 +2840,9 @@ msgstr ""
msgid "Copy ID to clipboard"
msgstr ""
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr ""
@@ -3176,6 +3330,9 @@ msgstr ""
msgid "Description:"
msgstr ""
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr ""
@@ -3254,6 +3411,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr ""
@@ -3425,6 +3585,9 @@ msgstr ""
msgid "Enable group Runners"
msgstr ""
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
@@ -3461,6 +3624,9 @@ msgstr ""
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3479,9 +3645,6 @@ msgstr ""
msgid "Enter the merge request title"
msgstr ""
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3506,6 +3669,12 @@ 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 ""
@@ -3557,15 +3726,33 @@ msgstr ""
msgid "Environments|Pod logs from"
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|Read more about environments"
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|Show all"
msgstr ""
@@ -3578,6 +3765,18 @@ msgstr ""
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr ""
@@ -3629,6 +3828,9 @@ msgstr ""
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr ""
@@ -3698,6 +3900,33 @@ msgstr ""
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3776,6 +4005,9 @@ msgstr ""
msgid "Expand all"
msgstr ""
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr ""
@@ -3863,7 +4095,7 @@ msgstr ""
msgid "Failed to load emoji list."
msgstr ""
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3929,9 +4161,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr ""
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr ""
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr ""
@@ -3989,9 +4218,6 @@ msgstr ""
msgid "FeatureFlags|New Feature Flag"
msgstr ""
-msgid "FeatureFlags|Save changes"
-msgstr ""
-
msgid "FeatureFlags|Status"
msgstr ""
@@ -4077,9 +4303,6 @@ msgstr ""
msgid "Filter..."
msgstr ""
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "按路徑查找"
@@ -4194,7 +4417,7 @@ msgstr ""
msgid "Free Trial of GitLab.com Gold"
msgstr ""
-msgid "From %{provider_title}"
+msgid "From %{providerTitle}"
msgstr ""
msgid "From Bitbucket"
@@ -4224,9 +4447,15 @@ msgstr ""
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr ""
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr ""
@@ -4659,15 +4888,24 @@ msgstr ""
msgid "Go Back"
msgstr ""
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr ""
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr ""
msgid "Go to %{link_to_google_takeout}."
msgstr ""
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr ""
@@ -4725,6 +4963,9 @@ msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr ""
@@ -5092,9 +5333,24 @@ msgstr "導入存儲庫"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr ""
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
@@ -5146,6 +5402,12 @@ msgstr ""
msgid "Input your repository URL"
msgstr ""
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5198,6 +5460,9 @@ msgstr "週期分æžç°¡ä»‹"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5216,6 +5481,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr ""
@@ -5258,7 +5526,7 @@ msgstr ""
msgid "Issues closed"
msgstr ""
-msgid "Issues, merge requests, pushes and comments."
+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"
@@ -5447,6 +5715,9 @@ msgstr ""
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr ""
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr ""
@@ -5529,6 +5800,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr ""
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "了解更多"
@@ -5701,6 +5975,15 @@ msgstr ""
msgid "Logs"
msgstr ""
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+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 ""
@@ -5746,6 +6029,9 @@ msgstr ""
msgid "Manifest file import"
msgstr ""
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
@@ -5773,36 +6059,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr ""
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a link"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a table"
-msgstr ""
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr ""
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr ""
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr ""
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr ""
-
-msgid "MarkdownToolbar|Insert code"
-msgstr ""
-
msgid "Maven Metadata"
msgstr ""
@@ -5857,6 +6113,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr ""
@@ -6007,9 +6266,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|System"
-msgstr ""
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr ""
@@ -6154,6 +6410,9 @@ msgstr ""
msgid "More information is available|here"
msgstr "幫助文檔"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr ""
@@ -6230,15 +6489,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "創建æµæ°´ç·šè¨ˆåŠƒ"
msgid "New Snippet"
msgstr ""
-msgid "New Snippets"
-msgstr ""
-
msgid "New branch"
msgstr "新增分支"
@@ -6299,9 +6558,15 @@ msgstr ""
msgid "No"
msgstr ""
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr ""
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6329,13 +6594,16 @@ msgstr ""
msgid "No credit card required."
msgstr ""
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr ""
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6431,6 +6699,9 @@ msgstr "數據ä¸è¶³"
msgid "Not now"
msgstr ""
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
@@ -6633,6 +6904,9 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -6642,6 +6916,9 @@ msgstr ""
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -6834,6 +7111,12 @@ msgstr "變é‡"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "自定義"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "æµæ°´ç·š"
@@ -6849,6 +7132,9 @@ msgstr ""
msgid "Pipelines for last year"
msgstr ""
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -6969,9 +7255,21 @@ msgstr ""
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr ""
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr ""
@@ -6981,9 +7279,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr ""
@@ -7008,6 +7315,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr ""
@@ -7206,9 +7516,6 @@ msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr ""
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7308,6 +7615,9 @@ msgstr ""
msgid "Project"
msgstr ""
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
@@ -7350,6 +7660,9 @@ msgstr "項目導出éˆæŽ¥å·²éŽæœŸã€‚請從項目設置中é‡æ–°ç”Ÿæˆé …目導
msgid "Project export started. A download link will be sent by email."
msgstr "項目導出已開始。下載éˆæŽ¥å°‡é€šéŽé›»å­éƒµä»¶ç™¼é€ã€‚"
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7449,6 +7762,9 @@ msgstr ""
msgid "Projects"
msgstr ""
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -7807,6 +8123,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr ""
@@ -7942,6 +8264,17 @@ msgstr ""
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
msgid "Resend invite"
msgstr ""
@@ -8099,6 +8432,9 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr ""
@@ -8129,6 +8465,9 @@ msgstr ""
msgid "SSL Verification"
msgstr ""
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr ""
@@ -8162,6 +8501,9 @@ msgstr ""
msgid "Schedules"
msgstr ""
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "æµæ°´ç·šè¨ˆåŠƒ"
@@ -8222,6 +8564,9 @@ msgstr ""
msgid "Search users"
msgstr ""
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr ""
@@ -8480,6 +8825,9 @@ msgstr ""
msgid "Set max session time for web terminal."
msgstr ""
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr ""
@@ -8504,6 +8852,9 @@ msgstr ""
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 ""
@@ -8561,9 +8912,15 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr ""
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr ""
@@ -8661,6 +9018,24 @@ msgstr ""
msgid "Snippets"
msgstr ""
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8931,6 +9306,12 @@ 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 "Stars"
msgstr ""
@@ -9141,6 +9522,9 @@ msgstr "切æ›åˆ†æ”¯/標籤"
msgid "Sync information"
msgstr ""
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
@@ -9330,6 +9714,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr ""
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
@@ -9453,6 +9840,9 @@ msgstr ""
msgid "There was an error loading users activity calendar."
msgstr ""
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr ""
@@ -9498,6 +9888,21 @@ msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr ""
@@ -9519,6 +9924,9 @@ msgstr ""
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -9603,6 +10011,12 @@ msgstr "在創建壹個空的存儲庫或導入ç¾æœ‰å­˜å„²åº«ä¹‹å‰ï¼Œæ‚¨å°‡ç„¡
msgid "This merge request is locked."
msgstr ""
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr ""
@@ -10160,6 +10574,9 @@ msgstr ""
msgid "Update"
msgstr ""
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10169,6 +10586,9 @@ msgstr ""
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr ""
@@ -10397,6 +10817,9 @@ msgstr ""
msgid "View documentation"
msgstr ""
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr ""
@@ -10406,6 +10829,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr ""
@@ -10709,6 +11135,9 @@ msgstr ""
msgid "Withdraw Access Request"
msgstr "å–消權é™ç”³è¯·"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10814,6 +11243,9 @@ 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 "您已é”到項目數é‡é™åˆ¶"
@@ -10874,6 +11306,9 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr ""
@@ -10967,6 +11402,9 @@ msgstr ""
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr ""
@@ -11046,6 +11484,9 @@ msgstr ""
msgid "ciReport|Confidence"
msgstr ""
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr ""
@@ -11138,9 +11579,6 @@ msgstr ""
msgid "ciReport|Performance metrics"
msgstr ""
-msgid "ciReport|Revert dismissal"
-msgstr ""
-
msgid "ciReport|SAST"
msgstr ""
@@ -11180,6 +11618,9 @@ msgstr ""
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr ""
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr ""
@@ -11268,9 +11709,6 @@ msgstr ""
msgid "here"
msgstr ""
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr ""
@@ -11387,6 +11825,9 @@ msgstr ""
msgid "mrWidget|Approve"
msgstr ""
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr ""
@@ -11459,6 +11900,9 @@ msgstr ""
msgid "mrWidget|Merge request approved"
msgstr ""
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr ""
@@ -11518,6 +11962,9 @@ msgstr ""
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr ""
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index c4a58650dae..f374616a5fb 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-02-11 10:20\n"
+"PO-Revision-Date: 2019-03-06 15:53\n"
msgid " Status"
msgstr " 狀態"
@@ -41,6 +41,10 @@ msgstr ""
msgid "\"%{query}\" in projects"
msgstr "在專案中查詢「%{query}ã€"
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d 則æ交"
@@ -111,12 +115,25 @@ msgstr "%{counter_storage}ï¼ˆå…§å« %{counter_repositories} 個版本庫ã€%{cou
msgid "%{count} %{alerts}"
msgstr "%{count} 個 %{alerts} æ醒"
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
msgid "%{count} more"
msgstr ""
msgid "%{count} more assignees"
msgstr "%{count} å以上的被指派者"
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} ä½åƒèˆ‡è€…"
@@ -131,15 +148,15 @@ msgstr "已刪除 %{filePath} 檔案"
msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel}(內å«å‰©é¤˜çš„ %{labelCount} 個)"
-msgid "%{firstOption} +%{extraOptionCount} more"
-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 "%{group_docs_link_start}群組%{group_docs_link_end} 讓您能跨管ç†ä»¥åŠå”作多個專案。群組的æˆå“¡å¯ä»¥å­˜å–群組之下的所有專案。"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "將移除 %{issuableType}ï¼ç¢ºå®šï¼Ÿ"
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
msgid "%{link_start}Read more%{link_end} about role permissions"
msgstr ""
@@ -207,6 +224,9 @@ msgstr "(還有 %{count} 個)"
msgid "+ %{moreCount} more"
msgstr "(還有 %{moreCount} 個)"
+msgid "+%{extraOptionCount} more"
+msgstr ""
+
msgid ", or "
msgstr ""
@@ -227,6 +247,10 @@ msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
msgstr[0] "%{count} 個 %{type} 變更"
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+
msgid "1 closed issue"
msgid_plural "%d closed issues"
msgstr[0] "%d 個關閉的議題"
@@ -320,6 +344,21 @@ msgstr ""
msgid "A 'Runner' is a process which runs a job. You can set up as many Runners as you need."
msgstr "「執行器ã€æ˜¯å€‹ç”¨ä¾†åŸ·è¡Œä½œæ¥­çš„程å¼ã€‚你能設定你所需的多個執行器。"
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+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 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 collection of graphs regarding Continuous Integration"
msgstr "ä¸é–“æ–·æ•´åˆçš„圖表集åˆ"
@@ -335,6 +374,9 @@ msgstr "GitLab 濫用檢閱團隊的æˆå“¡å°‡æœƒç›¡å¿«æª¢é–±ä½ çš„回報。"
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "將會在您的 fork 中建立一個新分支,並開啟新的åˆä½µè«‹æ±‚。"
+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 project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}."
msgstr "專案å¯è®“您存放檔案(版本庫)ã€è¨ˆåŠƒå·¥ä½œï¼ˆè­°é¡Œï¼‰ã€ç™¼ä½ˆæª”案(Wiki),還有這些:%{among_other_things_link}。"
@@ -419,24 +461,51 @@ msgstr "新增 Kubernetes å¢é›†"
msgid "Add README"
msgstr ""
+msgid "Add a bullet list"
+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 "在 Wiki 中新增包å«æ‚¨å°ˆæ¡ˆç›¸é—œè³‡è¨Šçš„首é ï¼Œä¹‹å¾Œ GitLab 將會顯示 Wiki 首é æ–¼æ­¤è™•è€Œéžé€™å‰‡è¨Šæ¯ã€‚"
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
msgid "Add a table"
msgstr "新增表格"
+msgid "Add a task list"
+msgstr ""
+
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
msgstr "新增顯示於所有電å­éƒµä»¶å°è©±çš„附加文字。最多 %{character_limit} 個字元。"
+msgid "Add approver(s)"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
msgid "Add comment now"
msgstr "ç«‹å³ç•™è¨€"
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
msgid "Add image comment"
msgstr "增加圖片留言"
+msgid "Add italic text"
+msgstr ""
+
msgid "Add license"
msgstr "新增授權資訊"
@@ -605,6 +674,9 @@ msgstr "進階權é™ï¼Œã€ã€Œå¤§åž‹æª”案儲存空間 (LFS)ã€å’Œã€Œå…©æ­¥é©Ÿé©—
msgid "Advanced settings"
msgstr "進階設定"
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
msgid "Alert"
msgid_plural "Alerts"
msgstr[0] "通知"
@@ -615,6 +687,9 @@ msgstr ""
msgid "All"
msgstr "全部"
+msgid "All Members"
+msgstr ""
+
msgid "All changes are committed"
msgstr "å·²æ交所有變更"
@@ -684,7 +759,7 @@ msgstr "空的 GitLab 使用者欄ä½å°‡æœƒåœ¨æ‰€æœ‰è­°é¡Œèˆ‡èªªæ˜Žçš„說明欄å
msgid "An error has occurred"
msgstr "發生了一個錯誤"
-msgid "An error occured while fetching the releases. Please try again."
+msgid "An error occured while loading designs. Please try again."
msgstr ""
msgid "An error occurred adding a draft to the discussion."
@@ -696,6 +771,15 @@ 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 previewing the blob"
msgstr "é è¦½ blob 檔案時發生錯誤"
@@ -708,6 +792,9 @@ msgstr "æ›´æ–°å•é¡Œæ¬Šé‡æ™‚發生錯誤"
msgid "An error occurred while adding approver"
msgstr "增加審核者時發生錯誤"
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
msgid "An error occurred while deleting the comment"
msgstr "刪除留言時發生錯誤"
@@ -744,6 +831,9 @@ 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 getting projects"
msgstr "å–得專案時發生錯誤"
@@ -801,12 +891,18 @@ msgstr "儲存 LDAP 覆蓋狀態時發生錯誤,請é‡è©¦ã€‚"
msgid "An error occurred while saving assignees"
msgstr "儲存被指派人時發生錯誤"
+msgid "An error occurred while saving the approval settings"
+msgstr ""
+
msgid "An error occurred while subscribing to notifications."
msgstr "訂閱通知時發生錯誤。"
msgid "An error occurred while unsubscribing to notifications."
msgstr "當å–消訂閱通知時發生錯誤"
+msgid "An error occurred while updating approvers"
+msgstr ""
+
msgid "An error occurred while updating the comment"
msgstr "更新留言時發生錯誤"
@@ -897,6 +993,40 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+
+msgid "ApprovalRuleRemove|Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked."
+msgstr[0] ""
+
+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] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+
+msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)"
+msgstr ""
+
+msgid "ApprovalRule|Members"
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|No. approvals required"
+msgstr ""
+
+msgid "ApprovalRule|e.g. QA, Security, etc."
+msgstr ""
+
msgid "Approvals"
msgstr ""
@@ -939,9 +1069,15 @@ msgstr "確èªé‡æ–°ç”¢ç”Ÿå…¬é‘°ï¼Ÿæ‚¨å°‡éœ€è¦åœ¨é‡æ–°é‹ä½œé¡åƒå‰ï¼Œæ›´æ–°
msgid "Are you sure you want to remove %{group_name}?"
msgstr "確定移除 %{group_name}?"
+msgid "Are you sure you want to remove approver %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove approver %{name}?"
msgstr ""
+msgid "Are you sure you want to remove group %{name}"
+msgstr ""
+
msgid "Are you sure you want to remove group %{name}?"
msgstr ""
@@ -1026,6 +1162,9 @@ msgstr "指派列表顯示了分é…給é¸å®šä½¿ç”¨è€…的所有議題"
msgid "Assignee(s)"
msgstr "執行者"
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
msgid "Attach a file"
msgstr ""
@@ -1041,9 +1180,6 @@ msgstr "八月"
msgid "August"
msgstr "八月"
-msgid "Auth Token"
-msgstr ""
-
msgid "Authentication Log"
msgstr "驗證紀錄"
@@ -1602,6 +1738,9 @@ msgstr "ä¸èƒ½è‡ªå‹•åˆä½µ"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "無法變更被管ç†çš„ Kubernetes å¢é›†"
+msgid "Cannot render the image. Maximum character count (%{charLimit}) has been exceeded."
+msgstr ""
+
msgid "Certificate"
msgstr ""
@@ -1638,6 +1777,9 @@ msgstr "復原"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "這將會建立新的æ交記錄,以還原ç¾æœ‰çš„變更。"
+msgid "Changes"
+msgstr ""
+
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
msgstr "è‹¥<b>來æº</b>修訂版正è¦åˆä½µåˆ°<b>目標</b>修訂版時顯示變更比較。"
@@ -1650,6 +1792,9 @@ msgstr "統計圖表"
msgid "Chat"
msgstr "å³æ™‚通訊"
+msgid "Check again"
+msgstr ""
+
msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
msgstr "檢查 %{docs_link_start} 檔案 %{docs_link_end}"
@@ -1716,9 +1861,6 @@ msgstr "é¸æ“‡æ‚¨å¸Œæœ›èˆ‡é€™å€‹æ¬¡è¦ç¯€é»žåŒæ­¥çš„群組"
msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr "é¸æ“‡ä½ æƒ³è¦é€£ç·šä¸¦åŸ·è¡Œ CI / CD 管線的版本庫。"
-msgid "Choose which repositories you want to import."
-msgstr "é¸æ“‡ä½ æƒ³åŒ¯å…¥çš„版本庫。"
-
msgid "Choose which shards you wish to synchronize to this secondary node."
msgstr "é¸æ“‡ä½ æƒ³è¦ç”¨ä¾†èˆ‡é€™å€‹æ¬¡è¦ç¯€é»žåŒæ­¥çš„碎片 (shards)。"
@@ -1878,6 +2020,9 @@ msgstr "複製版本庫"
msgid "Clone with %{http_label}"
msgstr ""
+msgid "Clone with KRB5"
+msgstr ""
+
msgid "Clone with SSH"
msgstr ""
@@ -1893,9 +2038,6 @@ msgstr ""
msgid "Closed"
msgstr "已關閉"
-msgid "Closed (moved)"
-msgstr ""
-
msgid "Closed issues"
msgstr "已關閉議題"
@@ -1941,12 +2083,12 @@ msgstr "å®‰è£ Ingress 後,您需è¦åœ¨ç”Ÿæˆçš„外部 IP ä½ç½®ä¸ŠæŒ‡å‘ DNSï
msgid "ClusterIntegration|Alternatively"
msgstr ""
-msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr "當嘗試å–得專案å€åŸŸæ™‚錯誤發生:%{error}"
-
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "嘗試連線到 Google Cloud API 時出錯,請ç¨å€™å†è©¦ã€‚"
+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 ""
@@ -1983,6 +2125,9 @@ msgstr "é¸æ“‡è¦å®‰è£åœ¨æ‚¨ Kubernetes å¢é›†ä¸Šçš„應用程å¼ã€‚Helm Tiller
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "é¸æ“‡è¦ä½¿ç”¨åœ¨æ­¤å¢é›†çš„環境。"
+msgid "ClusterIntegration|Cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters."
msgstr ""
@@ -2079,8 +2224,8 @@ 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 "如果你正在設定多個å¢é›†ä¸”正在使用自動 DevOps,%{help_link_start}請先閱讀這個說明%{help_link_end}。"
-msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
-msgstr "為了è¦é¡¯ç¤ºå¢é›†çš„å¥åº·ç‹€æ³ï¼Œæˆ‘們需è¦ç‚ºæ‚¨çš„å¢é›†è¨­å®š Prometheus 以收集所需的資訊。"
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below."
+msgstr ""
msgid "ClusterIntegration|Ingress"
msgstr "輸入"
@@ -2094,9 +2239,6 @@ msgstr "Ingress 為您æ供了一種將請求伺æœå™¨æˆ–路徑路由到æœå‹™ç
msgid "ClusterIntegration|Install"
msgstr "安è£"
-msgid "ClusterIntegration|Install Prometheus"
-msgstr "å®‰è£ Prometheus"
-
msgid "ClusterIntegration|Installed"
msgstr "已安è£"
@@ -2142,9 +2284,6 @@ msgstr "Kubernetes å¢é›†"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes å¢é›†è©³ç´°è³‡è¨Š"
-msgid "ClusterIntegration|Kubernetes cluster health"
-msgstr "Kubernetes å¢é›†å¥åº·ç¨‹åº¦"
-
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
msgstr "Kubernetes å¢é›†å·²ç¶“在 Google Kubernetes Engine 建立"
@@ -2382,15 +2521,27 @@ msgstr "註冊"
msgid "Code"
msgstr ""
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
msgid "Code owners"
msgstr "程å¼ç¢¼æ‰€æœ‰è€…"
+msgid "CodeOwner|Pattern"
+msgstr ""
+
msgid "Cohorts"
msgstr "Cohorts"
msgid "Collapse"
msgstr "收縮"
+msgid "Collapse approvers"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "收起å´é‚Šæ¬„"
@@ -2689,6 +2840,9 @@ msgstr "複製 %{protocol} 的複製 (clone) URL"
msgid "Copy ID to clipboard"
msgstr "複製 ID 到剪貼簿"
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
msgid "Copy SSH clone URL"
msgstr "複製 SSH 的複製 (clone) URL"
@@ -3176,6 +3330,9 @@ msgstr "《æ述模æ¿ã€‹å…許你為您專案的議題或åˆä½µè«‹æ±‚之æè¿°
msgid "Description:"
msgstr "說明:"
+msgid "Designs"
+msgstr ""
+
msgid "Destroy"
msgstr "銷毀"
@@ -3254,6 +3411,9 @@ msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
+msgid "Discussion"
+msgstr ""
+
msgid "Dismiss"
msgstr "忽略"
@@ -3425,6 +3585,9 @@ msgstr "為此專案啟用"
msgid "Enable group Runners"
msgstr "啟用群組執行器"
+msgid "Enable header and footer in emails"
+msgstr ""
+
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "啟用或åœç”¨ Pseudonymizer 的資料收集。"
@@ -3461,6 +3624,9 @@ msgstr "æ–¼ (UTC) çµæŸ"
msgid "Enforce SSO-only authentication for this group"
msgstr ""
+msgid "Enforce users to have dedicated group managed accounts for this group"
+msgstr ""
+
msgid "Enforced SSO"
msgstr ""
@@ -3479,9 +3645,6 @@ msgstr "請輸入åˆä½µè«‹æ±‚說明"
msgid "Enter the merge request title"
msgstr "請請輸入åˆä½µè«‹æ±‚標題"
-msgid "Enter your Sentry API URL"
-msgstr ""
-
msgid "Environment variables"
msgstr ""
@@ -3506,6 +3669,12 @@ 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 "åœæ­¢ç’°å¢ƒæ™‚發生錯誤,請é‡è©¦"
@@ -3557,15 +3726,33 @@ msgstr "打開實æ³ç’°å¢ƒ"
msgid "Environments|Pod logs from"
msgstr "Pod 記錄由"
+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|Read more about environments"
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|Show all"
msgstr "顯示所有內容"
@@ -3578,6 +3765,18 @@ msgstr "åœæ­¢ç’°å¢ƒ"
msgid "Environments|Stopping"
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 %{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|This action will run the job defined by staging 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|Updated"
msgstr "已更新"
@@ -3629,6 +3828,9 @@ msgstr "錯誤報告與記錄"
msgid "Error Tracking"
msgstr ""
+msgid "Error creating a new path"
+msgstr ""
+
msgid "Error creating epic"
msgstr "建立 epic 時發生錯誤"
@@ -3698,6 +3900,33 @@ msgstr "載入åˆä½µè«‹æ±‚時出錯。請é‡è©¦ã€‚"
msgid "Error:"
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|Find your hostname in your Sentry account settings page"
+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 ""
@@ -3776,6 +4005,9 @@ msgstr "展開"
msgid "Expand all"
msgstr "展開全部"
+msgid "Expand approvers"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "展開å´é‚Šæ¬„"
@@ -3863,7 +4095,7 @@ msgstr "無法部署到"
msgid "Failed to load emoji list."
msgstr "無法讀å–表情符號列表。"
-msgid "Failed to load errors from Sentry"
+msgid "Failed to load errors from Sentry. Error message: %{errorMessage}"
msgstr ""
msgid "Failed to remove issue from board, please try again."
@@ -3929,9 +4161,6 @@ msgstr ""
msgid "FeatureFlags|Description"
msgstr "說明"
-msgid "FeatureFlags|Edit %{feature_flag_name}"
-msgstr "編輯 %{feature_flag_name}"
-
msgid "FeatureFlags|Edit Feature Flag"
msgstr "編輯功能標籤"
@@ -3989,9 +4218,6 @@ msgstr "æ–°"
msgid "FeatureFlags|New Feature Flag"
msgstr "新增功能標籤"
-msgid "FeatureFlags|Save changes"
-msgstr "儲存"
-
msgid "FeatureFlags|Status"
msgstr "狀態"
@@ -4077,9 +4303,6 @@ msgstr ""
msgid "Filter..."
msgstr "篩é¸â€¦"
-msgid "Find and manage Auth Tokens in your Sentry account settings page."
-msgstr ""
-
msgid "Find by path"
msgstr "ä¾è·¯å¾‘æœå°‹"
@@ -4194,8 +4417,8 @@ msgstr "在您的 .gitlab-ci.yml 中找到錯誤:"
msgid "Free Trial of GitLab.com Gold"
msgstr "å…費試用 GitLab.com 黃金計畫"
-msgid "From %{provider_title}"
-msgstr "來自 %{provider_title}"
+msgid "From %{providerTitle}"
+msgstr ""
msgid "From Bitbucket"
msgstr "從 Bitbucket"
@@ -4224,9 +4447,15 @@ msgstr "來自里程碑:"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr "從 Kubernetes å¢é›†è©³ç´°è³‡æ–™é ï¼Œå¾žæ‡‰ç”¨ç¨‹å¼åˆ—表中安è£åŸ·è¡Œå™¨"
+msgid "GPG Key ID:"
+msgstr ""
+
msgid "GPG Keys"
msgstr "GPG 金鑰"
+msgid "GPG signature (loading...)"
+msgstr ""
+
msgid "General"
msgstr "一般"
@@ -4659,15 +4888,24 @@ msgstr ""
msgid "Go Back"
msgstr "返回"
+msgid "Go Micro is a framework for micro service development."
+msgstr ""
+
msgid "Go back"
msgstr "上一é "
+msgid "Go full screen"
+msgstr ""
+
msgid "Go to"
msgstr "å‰å¾€"
msgid "Go to %{link_to_google_takeout}."
msgstr "å‰å¾€ %{link_to_google_takeout}。"
+msgid "Go to project"
+msgstr ""
+
msgid "Google Code import"
msgstr "匯入 Google Code"
@@ -4725,6 +4963,9 @@ msgstr "群組資訊:"
msgid "Group maintainers can register group runners in the %{link}"
msgstr "群組維護者å¯ä»¥åœ¨ %{link} 註冊群組執行器"
+msgid "Group managed accounts"
+msgstr ""
+
msgid "Group name"
msgstr "群組å稱"
@@ -5092,9 +5333,24 @@ msgstr "匯入版本庫"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
+msgid "Import/Export illustration"
+msgstr ""
+
msgid "ImportButtons|Connect repositories from"
msgstr "連線版本庫自"
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the projects you want to import"
+msgstr ""
+
+msgid "ImportProjects|Updating the imported projects failed"
+msgstr ""
+
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "改善 GitLab ä¼æ¥­ç‰ˆæœ¬çš„議題看æ¿ã€‚"
@@ -5146,6 +5402,12 @@ msgstr "手動輸入主機金鑰"
msgid "Input your repository URL"
msgstr "輸入您的版本庫URL"
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -5198,6 +5460,9 @@ msgstr "週期分æžç°¡ä»‹"
msgid "Introducing Your Conversational Development Index"
msgstr ""
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -5216,6 +5481,9 @@ msgstr ""
msgid "Invoke Time"
msgstr ""
+msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})"
+msgstr ""
+
msgid "Issue"
msgstr "å•é¡Œ"
@@ -5258,8 +5526,8 @@ msgstr "è­°é¡Œå¯ä»¥è¨Žè«–臭蟲ã€å·¥ä½œä»¥åŠæƒ³æ³•ã€‚此外,å•é¡Œæ˜¯å¯æœ
msgid "Issues closed"
msgstr "議題已關閉"
-msgid "Issues, merge requests, pushes and comments."
-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 "在您為專案建立議題後,我們開始追蹤並顯示它們的指標"
@@ -5447,6 +5715,9 @@ msgstr "æå‡æ¨™ç±¤"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. This action cannot be reversed."
msgstr "æå‡ %{labelTitle} å°‡å¯ä»¥è®“所有 %{groupName} 內的專案都使用此標籤。ç¾æœ‰ç›¸åŒå稱的標籤將被åˆä½µã€‚該æ“作ä¸å¯å¾©åŽŸã€‚"
+msgid "Language"
+msgstr ""
+
msgid "Large File Storage"
msgstr "大檔案儲存"
@@ -5529,6 +5800,9 @@ msgstr ""
msgid "Learn more about protected branches"
msgstr "進一步了解å—ä¿è­·çš„分支"
+msgid "Learn more about signing commits"
+msgstr ""
+
msgid "Learn more in the"
msgstr "進一步了解於"
@@ -5701,6 +5975,15 @@ msgstr "使用 smartcard 登入"
msgid "Logs"
msgstr "記錄檔"
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Pending approvals"
+msgstr ""
+
msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "無論身在何處,都能讓您團隊中的æ¯å€‹äººéƒ½æ›´æœ‰æ•ˆçŽ‡ã€‚GitLab Geo 建立了您 GitLab 主機的唯讀é¡åƒï¼Œæ‰€ä»¥æ‚¨å¯ä»¥ç¸®çŸ­è¤‡è£½å’ŒæŠ“å–大型版本庫的時間。"
@@ -5746,6 +6029,9 @@ msgstr "Manifest"
msgid "Manifest file import"
msgstr "匯入 Manifest 檔案"
+msgid "Manual job"
+msgstr ""
+
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "å°‡ FogBugz 的帳號å°æ‡‰åˆ° GitLab 使用者"
@@ -5773,36 +6059,6 @@ msgstr ""
msgid "Markdown enabled"
msgstr "已啟用 Markdown"
-msgid "MarkdownToolbar|Add a bullet list"
-msgstr "增加項目清單"
-
-msgid "MarkdownToolbar|Add a link"
-msgstr "增加連çµ"
-
-msgid "MarkdownToolbar|Add a numbered list"
-msgstr "增加åºåˆ—清單"
-
-msgid "MarkdownToolbar|Add a table"
-msgstr "增加表格"
-
-msgid "MarkdownToolbar|Add a task list"
-msgstr "增加作業清單"
-
-msgid "MarkdownToolbar|Add bold text"
-msgstr "增加粗體文字"
-
-msgid "MarkdownToolbar|Add italic text"
-msgstr "增加斜體文字"
-
-msgid "MarkdownToolbar|Go full screen"
-msgstr "全螢幕顯示"
-
-msgid "MarkdownToolbar|Insert a quote"
-msgstr "æ’入引用"
-
-msgid "MarkdownToolbar|Insert code"
-msgstr "æ’入程å¼ç¢¼"
-
msgid "Maven Metadata"
msgstr "Maven 詮釋資料"
@@ -5857,6 +6113,9 @@ msgstr ""
msgid "Merge in progress"
msgstr ""
+msgid "Merge pipelines will try to validate the post-merge result prior to merging"
+msgstr ""
+
msgid "Merge request"
msgstr "åˆä½µè«‹æ±‚"
@@ -6007,9 +6266,6 @@ msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus 查詢檔案"
-msgid "Metrics|System"
-msgstr "系統"
-
msgid "Metrics|There was an error fetching the environments data, please try again"
msgstr "å–得環境資訊時發生錯誤,請é‡è©¦ã€‚"
@@ -6154,6 +6410,9 @@ msgstr "更多資訊"
msgid "More information is available|here"
msgstr "此處"
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
msgid "Most stars"
msgstr "最多星數"
@@ -6230,15 +6489,15 @@ msgstr ""
msgid "New Pages Domain"
msgstr ""
+msgid "New Password"
+msgstr ""
+
msgid "New Pipeline Schedule"
msgstr "建立排程管線"
msgid "New Snippet"
msgstr "新增片段"
-msgid "New Snippets"
-msgstr "新增片段"
-
msgid "New branch"
msgstr "新分支"
@@ -6299,9 +6558,15 @@ msgstr "新增…"
msgid "No"
msgstr "å¦"
+msgid "No %{providerTitle} repositories available to import"
+msgstr ""
+
msgid "No Label"
msgstr "沒有標籤"
+msgid "No Tag"
+msgstr ""
+
msgid "No activities found"
msgstr ""
@@ -6329,13 +6594,16 @@ msgstr "找ä¸åˆ°è²¢ç»"
msgid "No credit card required."
msgstr "無需信用å¡ã€‚"
+msgid "No designs found."
+msgstr ""
+
msgid "No details available"
msgstr ""
msgid "No due date"
msgstr "沒有到期時間"
-msgid "No errors to display"
+msgid "No errors to display."
msgstr ""
msgid "No estimate or time spent"
@@ -6431,6 +6699,9 @@ msgstr "資料ä¸è¶³"
msgid "Not now"
msgstr "ä¸æ˜¯ç¾åœ¨"
+msgid "Not started"
+msgstr ""
+
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "請注æ„,master 分支é è¨­ç‚ºå—ä¿è­·çš„。 %{link_to_protected_branches}"
@@ -6633,6 +6904,9 @@ msgstr "動作"
msgid "Operations Dashboard"
msgstr "維é‹å„€è¡¨æ¿"
+msgid "Operations Settings"
+msgstr ""
+
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "新增專案到儀表æ¿"
@@ -6642,6 +6916,9 @@ msgstr "維é‹å„€è¡¨æ¿æä¾›æ¯å€‹å°ˆæ¡ˆçš„執行狀æ³æ‘˜è¦ï¼ŒåŒ…括管線和
msgid "OperationsDashboard|Unable to add %{invalidProjects}. The Operations Dashboard is available for public projects, and private projects in groups with a Gold plan."
msgstr ""
+msgid "Optional"
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr "ä½ å¯ä»¥é¸æ“‡ %{link_to_customize} 如何將 FogBugz çš„é›»å­ä¿¡ç®±åŠä½¿ç”¨è€…å稱匯入 GitLab 。"
@@ -6834,6 +7111,12 @@ msgstr "變數"
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "自訂"
+msgid "PipelineStatusTooltip|Commit: %{ci_status}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
msgid "Pipelines"
msgstr "管線"
@@ -6849,6 +7132,9 @@ msgstr "上週的管線"
msgid "Pipelines for last year"
msgstr "去年的管線"
+msgid "Pipelines need to be configured to enable this feature."
+msgstr ""
+
msgid "Pipelines|Build with confidence"
msgstr "信任編譯"
@@ -6969,9 +7255,21 @@ msgstr "請將它們轉為 %{link_to_git} ,然後å†æ¬¡é€éŽ %{link_to_import
msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
msgstr "請將它們在 Google Code 上轉為 Git,然後å†æ¬¡é€éŽ %{link_to_import_flow} 。"
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
msgid "Please fill in a descriptive name for your group."
msgstr "請為您的群組填寫æ述性å稱。"
@@ -6981,9 +7279,18 @@ msgstr ""
msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr "請注æ„,這個應用程å¼ä¸æ˜¯ç”± GitLab 所æ供的,您應該在å…許訪å•ä¹‹å‰é©—證其真實性。"
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "è«‹é¸æ“‡è‡³å°‘一個篩é¸å™¨ä»¥æª¢è¦–çµæžœ"
+msgid "Please set a new password before proceeding."
+msgstr ""
+
msgid "Please solve the reCAPTCHA"
msgstr "請填寫此驗證碼"
@@ -7008,6 +7315,9 @@ msgstr "å好設定"
msgid "Preferences|Navigation theme"
msgstr "導航主題"
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
msgid "Press Enter or click to search"
msgstr "按下 Enter 或點é¸ä»¥æœå°‹"
@@ -7206,9 +7516,6 @@ msgstr "這個電å­éƒµä»¶å°‡ç”¨æ–¼Web的任何æ“作,例如編輯和åˆä½µã€‚
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
msgstr "這個表情符號和訊æ¯å°‡é¡¯ç¤ºæ–¼æ‚¨çš„個人資料和整個工作介é¢ä¸­ã€‚"
-msgid "Profiles|This feature is experimental and translations are not complete yet"
-msgstr ""
-
msgid "Profiles|This information will appear on your profile"
msgstr ""
@@ -7308,6 +7615,9 @@ msgstr "進度"
msgid "Project"
msgstr "專案"
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "正在刪除專案「%{project_name}ã€ã€‚"
@@ -7350,6 +7660,9 @@ msgstr "專案匯出連çµå·²å¤±æ•ˆï¼Œè«‹è‡³ã€Œå°ˆæ¡ˆè¨­å®šã€ç”¢ç”Ÿæ–°çš„匯出
msgid "Project export started. A download link will be sent by email."
msgstr "已開始專案匯出程åºã€‚完æˆå¾Œä¸‹è¼‰é€£çµå°‡é€åˆ°æ‚¨çš„信箱。"
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
msgid "Project members"
msgstr ""
@@ -7449,6 +7762,9 @@ msgstr "使用者åªèƒ½é€éŽä»–們自己通éŽé©—證的電å­ä¿¡ç®±ä¹‹ä¸€æ交
msgid "Projects"
msgstr "專案"
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "與 %{group_name} 分享的專案"
@@ -7807,6 +8123,12 @@ msgstr ""
msgid "Remove approver"
msgstr ""
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
msgid "Remove avatar"
msgstr "移除大頭貼"
@@ -7942,6 +8264,17 @@ msgstr "è¦æ±‚此群組中的所有使用者啟用兩步驟驗證"
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "è¦æ±‚所有使用者在訪å•GitLab時接å—æœå‹™æ¢æ¬¾å’Œéš±ç§æ”¿ç­–。"
+msgid "Require approval from code owners"
+msgstr ""
+
+msgid "Requires approval from %{names}."
+msgid_plural "Requires %{count} more approvals from %{names}."
+msgstr[0] ""
+
+msgid "Requires approval."
+msgid_plural "Requires %d more approvals."
+msgstr[0] ""
+
msgid "Resend invite"
msgstr ""
@@ -8099,6 +8432,9 @@ msgstr "您已經使用了所有分享的執行器多久的時間。"
msgid "Running"
msgstr "執行中"
+msgid "Running…"
+msgstr ""
+
msgid "SAML SSO"
msgstr "SAML SSO"
@@ -8129,6 +8465,9 @@ msgstr "SSH 公鑰"
msgid "SSL Verification"
msgstr "SSL é©—è­‰"
+msgid "Saturday"
+msgstr ""
+
msgid "Save"
msgstr "儲存"
@@ -8162,6 +8501,9 @@ msgstr "已排程"
msgid "Schedules"
msgstr "排程"
+msgid "Scheduling"
+msgstr ""
+
msgid "Scheduling Pipelines"
msgstr "排程管線"
@@ -8222,6 +8564,9 @@ msgstr "æœå°‹å°ˆæ¡ˆ"
msgid "Search users"
msgstr "æœå°‹ä½¿ç”¨è€…"
+msgid "Search users or groups"
+msgstr ""
+
msgid "Search your projects"
msgstr "æœå°‹ä½ çš„專案"
@@ -8480,6 +8825,9 @@ msgstr "設定實例範åœçš„模æ¿ç‰ˆæœ¬åº«"
msgid "Set max session time for web terminal."
msgstr "為網é çµ‚端器設定最長工作階段時間"
+msgid "Set new password"
+msgstr ""
+
msgid "Set notification email for abuse reports."
msgstr "為濫用回報設定通知電å­ä¿¡ç®±ã€‚"
@@ -8504,6 +8852,9 @@ msgstr "根據 %{docsLinkStart}這個檔案%{icon}%{docsLinkEnd} 設定斷言 /
msgid "Set up new U2F device"
msgstr ""
+msgid "Set up new password"
+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 "設定你的專案以自動推é€å’Œ/或從å¦ä¸€å€‹ç‰ˆæœ¬åº«æ‹‰å–變更。分支ã€æ¨™ç±¤åŠæ交將會自動åŒæ­¥ã€‚"
@@ -8561,9 +8912,15 @@ msgstr "é‡è¨­ç®¡ç·šå·²ç”¨æ™‚é–“"
msgid "Sherlock Transactions"
msgstr "Sherlock 交易"
+msgid "Show all activity"
+msgstr ""
+
msgid "Show command"
msgstr "顯示指令"
+msgid "Show comments only"
+msgstr ""
+
msgid "Show complete raw log"
msgstr "顯示完整的原始記錄"
@@ -8661,6 +9018,24 @@ msgstr ""
msgid "Snippets"
msgstr "程å¼ç¢¼ç‰‡æ®µ"
+msgid "SnippetsEmptyState|Explore public snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Snippets are small pieces of code or notes that you want to keep."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "SnippetsEmptyState|They can be either public or private."
+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 ""
@@ -8931,6 +9306,12 @@ 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 "Stars"
msgstr ""
@@ -9141,6 +9522,9 @@ msgstr "切æ›åˆ†æ”¯/標籤"
msgid "Sync information"
msgstr "åŒæ­¥è©³ç´°è³‡è¨Š"
+msgid "System"
+msgstr ""
+
msgid "System Hooks"
msgstr "系統觸發器"
@@ -9330,6 +9714,9 @@ msgstr ""
msgid "The maximum file size allowed is 200KB."
msgstr "最大檔案大å°ç‚º 200KB"
+msgid "The name %{entryName} is already taken in this directory."
+msgstr ""
+
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr "解密ç§é‘°æ‰€éœ€çš„密碼。這是é¸ç”¨ä¸”該值將會被加密儲存。"
@@ -9453,6 +9840,9 @@ msgstr "刪除待辦事項時出錯。"
msgid "There was an error loading users activity calendar."
msgstr "讀å–使用者行事曆活動時發生錯誤"
+msgid "There was an error saving your changes."
+msgstr ""
+
msgid "There was an error saving your notification settings."
msgstr "儲存您的通知設定時發生錯誤。"
@@ -9498,6 +9888,21 @@ msgstr "已縮å°æ­¤çœ‹æ¿ç¯„åœ"
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
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>verified</strong> 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>not verified</strong> to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an <strong>unverified</strong> signature."
+msgstr ""
+
msgid "This container registry has been scheduled for deletion."
msgstr "此容器登入表已經排定刪除。"
@@ -9519,6 +9924,9 @@ msgstr "這個資料夾"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
+msgid "This field is required."
+msgstr ""
+
msgid "This group"
msgstr "此群組"
@@ -9603,6 +10011,12 @@ msgstr "這代表在您建立一個空的版本庫或是匯入一個ç¾å­˜çš„版
msgid "This merge request is locked."
msgstr "這個åˆä½µè«‹æ±‚已被鎖定。"
+msgid "This merge request must be approved by members of these groups. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
+msgid "This merge request must be approved by these users. You can override the project settings by setting your own list of approvers."
+msgstr ""
+
msgid "This option is disabled as you don't have write permissions for the current branch"
msgstr "由於您沒有此分支的寫入權é™ï¼Œå› æ­¤ç¦ç”¨æ­¤é¸é …。"
@@ -10160,6 +10574,9 @@ msgstr "å³å°‡é–‹å§‹"
msgid "Update"
msgstr "æ›´æ–°"
+msgid "Update approvers"
+msgstr ""
+
msgid "Update failed"
msgstr ""
@@ -10169,6 +10586,9 @@ msgstr "ç«‹å³æ›´æ–°"
msgid "Update your group name, description, avatar, and visibility."
msgstr "更新你的群組å稱ã€èªªæ˜Žã€é ­åƒåŠå¯è¦‹æ€§ã€‚"
+msgid "Updated"
+msgstr ""
+
msgid "Updating"
msgstr "更新中"
@@ -10397,6 +10817,9 @@ msgstr ""
msgid "View documentation"
msgstr "檢視檔案"
+msgid "View eligible approvers"
+msgstr ""
+
msgid "View epics list"
msgstr "檢視 Epic 列表"
@@ -10406,6 +10829,9 @@ msgstr "ç€è¦½æª”案 @ "
msgid "View group labels"
msgstr "檢視群組標籤"
+msgid "View in Sentry"
+msgstr ""
+
msgid "View issue"
msgstr "檢視議題"
@@ -10709,6 +11135,9 @@ msgstr "é€éŽè²¢ç»åˆ†æžï¼Œæ‚¨å¯ä»¥å–得活動概覽,其包å«äº†æ‚¨çš„組
msgid "Withdraw Access Request"
msgstr "å–消權é™ç”³è«‹"
+msgid "Write"
+msgstr ""
+
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -10814,6 +11243,9 @@ 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 "您已é”到專案數é‡é™åˆ¶"
@@ -10874,6 +11306,9 @@ msgstr "在您的個人資料中新增 SSH 密鑰之å‰ï¼Œä½ ä¸èƒ½é€éŽ SSH ä¾
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "你需è¦é¸æ“‡å…©å€‹ä¸åŒçš„分支,æ‰èƒ½é€²è¡Œæ¯”較。"
+msgid "You're only seeing %{startTag}other activity%{endTag} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
msgid "You're receiving this email because %{reason}."
msgstr "您因為%{reason}收到此電å­éƒµä»¶ã€‚"
@@ -10967,6 +11402,9 @@ msgstr "指派給自己"
msgid "attach a new file"
msgstr ""
+msgid "authored"
+msgstr ""
+
msgid "branch name"
msgstr "分支å稱"
@@ -11046,6 +11484,9 @@ msgstr "程å¼ç¢¼å“質"
msgid "ciReport|Confidence"
msgstr "ä¿¡ä»»"
+msgid "ciReport|Container Scanning"
+msgstr ""
+
msgid "ciReport|Container scanning"
msgstr "正在掃æ容器"
@@ -11138,9 +11579,6 @@ msgstr "沒有效能指標的變動"
msgid "ciReport|Performance metrics"
msgstr "效能指標"
-msgid "ciReport|Revert dismissal"
-msgstr "撤回忽略"
-
msgid "ciReport|SAST"
msgstr "SAST"
@@ -11180,6 +11618,9 @@ msgstr "載入相ä¾æ€§æŽƒæ報告時發生錯誤。"
msgid "ciReport|There was an error reverting the dismissal. Please try again."
msgstr "撤回é§å›žæ™‚發生錯誤。請é‡è©¦ã€‚"
+msgid "ciReport|Undo dismiss"
+msgstr ""
+
msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
msgstr "å°‡ %{name} 從 %{version} å‡ç´šåˆ° %{fixed}。"
@@ -11268,9 +11709,6 @@ msgstr "幫助"
msgid "here"
msgstr "這裡"
-msgid "http://<sentry-host>/api/0/projects/{organization_slug}/{project_slug}/"
-msgstr ""
-
msgid "https://your-bitbucket-server"
msgstr "https://your-bitbucket-server"
@@ -11387,6 +11825,9 @@ msgstr "æ交你的請批準時發生錯誤。"
msgid "mrWidget|Approve"
msgstr "批准"
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
msgid "mrWidget|Approved by"
msgstr "批准由"
@@ -11459,6 +11900,9 @@ msgstr "本機åˆä½µ"
msgid "mrWidget|Merge request approved"
msgstr "åˆä½µè«‹æ±‚已經批准"
+msgid "mrWidget|Merge request approved."
+msgstr ""
+
msgid "mrWidget|Merge request approved; you can approve additionally"
msgstr "åˆä½µè«‹æ±‚已經被批准; ä½ å¯ä»¥å¦å¤–批准"
@@ -11518,6 +11962,9 @@ msgstr "還原"
msgid "mrWidget|Revert this merge request in a new merge request"
msgstr "é€éŽæ–°çš„åˆä½µè«‹æ±‚還原此åˆä½µè«‹æ±‚變更的項目"
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
msgid "mrWidget|Set by"
msgstr "設定者"
diff --git a/package.json b/package.json
index 3d96f8b80d9..d295e93ccaa 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
"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": "node node_modules/stylelint/bin/stylelint.js app/assets/stylesheets/**/*.*",
+ "stylelint": "node node_modules/stylelint/bin/stylelint.js app/assets/stylesheets/**/*.* --custom-formatter node_modules/stylelint-error-string-formatter",
"webpack": "webpack --config config/webpack.config.js",
"webpack-prod": "NODE_ENV=production webpack --config config/webpack.config.js"
},
@@ -30,9 +30,9 @@
"@babel/preset-env": "^7.3.1",
"@gitlab/csslab": "^1.8.0",
"@gitlab/svgs": "^1.54.0",
- "@gitlab/ui": "^2.0.4",
- "apollo-boost": "^0.1.20",
- "apollo-client": "^2.4.5",
+ "@gitlab/ui": "^2.2.2",
+ "apollo-boost": "^0.3.1",
+ "apollo-client": "^2.5.1",
"autosize": "^4.0.0",
"axios": "^0.17.1",
"babel-loader": "^8.0.5",
@@ -101,6 +101,7 @@
"sql.js": "^0.4.0",
"stickyfilljs": "^2.0.5",
"style-loader": "^0.23.1",
+ "stylelint-error-string-formatter": "^1.0.1",
"svg4everybody": "2.1.9",
"three": "^0.84.0",
"three-orbit-controls": "^82.1.0",
@@ -113,7 +114,7 @@
"url-loader": "^1.1.2",
"visibilityjs": "^1.2.4",
"vue": "^2.5.21",
- "vue-apollo": "^3.0.0-beta.25",
+ "vue-apollo": "^3.0.0-beta.28",
"vue-loader": "^15.4.2",
"vue-resource": "^1.5.1",
"vue-router": "^3.0.2",
@@ -128,17 +129,14 @@
"xterm": "^3.5.0"
},
"devDependencies": {
+ "@babel/plugin-transform-modules-commonjs": "^7.2.0",
"@gitlab/eslint-config": "^1.4.0",
"@vue/test-utils": "^1.0.0-beta.25",
"axios-mock-adapter": "^1.15.0",
- "babel-core": "^7.0.0-bridge",
- "babel-jest": "^23.6.0",
+ "babel-jest": "^24.1.0",
"babel-plugin-dynamic-import-node": "^2.2.0",
"babel-plugin-istanbul": "^5.1.0",
"babel-plugin-rewire": "^1.2.0",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
- "babel-template": "^6.26.0",
- "babel-types": "^6.26.0",
"chalk": "^2.4.1",
"commander": "^2.18.0",
"docdash": "^1.0.2",
@@ -148,7 +146,7 @@
"eslint-plugin-html": "5.0.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jasmine": "^2.10.1",
- "eslint-plugin-jest": "^22.1.0",
+ "eslint-plugin-jest": "^22.3.0",
"gettext-extractor": "^3.3.2",
"gettext-extractor-vue": "^4.0.1",
"graphql-tag": "^2.10.0",
@@ -156,8 +154,8 @@
"jasmine-core": "^2.9.0",
"jasmine-diff": "^0.1.3",
"jasmine-jquery": "^2.1.1",
- "jest": "^23.6.0",
- "jest-junit": "^5.2.0",
+ "jest": "^24.1.0",
+ "jest-junit": "^6.3.0",
"jsdoc": "^3.5.5",
"jsdoc-vue": "^1.0.0",
"karma": "^3.0.0",
@@ -175,10 +173,13 @@
"stylelint": "^9.10.1",
"stylelint-config-recommended": "^2.1.0",
"stylelint-scss": "^3.5.3",
- "vue-jest": "^3.0.2",
+ "vue-jest": "^4.0.0-beta.2",
"webpack-dev-server": "^3.1.14",
"yarn-deduplicate": "^1.1.0"
},
+ "resolutions": {
+ "vue-jest/ts-jest": "24.0.0"
+ },
"engines": {
"node": ">=8.10.0",
"yarn": "^1.10.0"
diff --git a/app/assets/images/emoji/100.png b/public/-/emojis/1/100.png
index 6903ff0304a..6903ff0304a 100644
--- a/app/assets/images/emoji/100.png
+++ b/public/-/emojis/1/100.png
Binary files differ
diff --git a/app/assets/images/emoji/1234.png b/public/-/emojis/1/1234.png
index 248dc7e55b6..248dc7e55b6 100644
--- a/app/assets/images/emoji/1234.png
+++ b/public/-/emojis/1/1234.png
Binary files differ
diff --git a/app/assets/images/emoji/1F627.png b/public/-/emojis/1/1F627.png
index f99026a3bc7..f99026a3bc7 100644
--- a/app/assets/images/emoji/1F627.png
+++ b/public/-/emojis/1/1F627.png
Binary files differ
diff --git a/app/assets/images/emoji/8ball.png b/public/-/emojis/1/8ball.png
index 38ca662eded..38ca662eded 100644
--- a/app/assets/images/emoji/8ball.png
+++ b/public/-/emojis/1/8ball.png
Binary files differ
diff --git a/app/assets/images/emoji/a.png b/public/-/emojis/1/a.png
index 8603ff05a17..8603ff05a17 100644
--- a/app/assets/images/emoji/a.png
+++ b/public/-/emojis/1/a.png
Binary files differ
diff --git a/app/assets/images/emoji/ab.png b/public/-/emojis/1/ab.png
index d9f2d17dea0..d9f2d17dea0 100644
--- a/app/assets/images/emoji/ab.png
+++ b/public/-/emojis/1/ab.png
Binary files differ
diff --git a/app/assets/images/emoji/abc.png b/public/-/emojis/1/abc.png
index 7688de692a9..7688de692a9 100644
--- a/app/assets/images/emoji/abc.png
+++ b/public/-/emojis/1/abc.png
Binary files differ
diff --git a/app/assets/images/emoji/abcd.png b/public/-/emojis/1/abcd.png
index 0996a870570..0996a870570 100644
--- a/app/assets/images/emoji/abcd.png
+++ b/public/-/emojis/1/abcd.png
Binary files differ
diff --git a/app/assets/images/emoji/accept.png b/public/-/emojis/1/accept.png
index 8afd7ce99cf..8afd7ce99cf 100644
--- a/app/assets/images/emoji/accept.png
+++ b/public/-/emojis/1/accept.png
Binary files differ
diff --git a/app/assets/images/emoji/aerial_tramway.png b/public/-/emojis/1/aerial_tramway.png
index 3eb4b61bf1d..3eb4b61bf1d 100644
--- a/app/assets/images/emoji/aerial_tramway.png
+++ b/public/-/emojis/1/aerial_tramway.png
Binary files differ
diff --git a/app/assets/images/emoji/airplane.png b/public/-/emojis/1/airplane.png
index 268d2ac3c8e..268d2ac3c8e 100644
--- a/app/assets/images/emoji/airplane.png
+++ b/public/-/emojis/1/airplane.png
Binary files differ
diff --git a/app/assets/images/emoji/airplane_arriving.png b/public/-/emojis/1/airplane_arriving.png
index d66841962f2..d66841962f2 100644
--- a/app/assets/images/emoji/airplane_arriving.png
+++ b/public/-/emojis/1/airplane_arriving.png
Binary files differ
diff --git a/app/assets/images/emoji/airplane_departure.png b/public/-/emojis/1/airplane_departure.png
index a5766f9f4ae..a5766f9f4ae 100644
--- a/app/assets/images/emoji/airplane_departure.png
+++ b/public/-/emojis/1/airplane_departure.png
Binary files differ
diff --git a/app/assets/images/emoji/airplane_small.png b/public/-/emojis/1/airplane_small.png
index b731b15e3a8..b731b15e3a8 100644
--- a/app/assets/images/emoji/airplane_small.png
+++ b/public/-/emojis/1/airplane_small.png
Binary files differ
diff --git a/app/assets/images/emoji/alarm_clock.png b/public/-/emojis/1/alarm_clock.png
index cdbc2fbb950..cdbc2fbb950 100644
--- a/app/assets/images/emoji/alarm_clock.png
+++ b/public/-/emojis/1/alarm_clock.png
Binary files differ
diff --git a/app/assets/images/emoji/alembic.png b/public/-/emojis/1/alembic.png
index 307a7324249..307a7324249 100644
--- a/app/assets/images/emoji/alembic.png
+++ b/public/-/emojis/1/alembic.png
Binary files differ
diff --git a/app/assets/images/emoji/alien.png b/public/-/emojis/1/alien.png
index 3b90e97433b..3b90e97433b 100644
--- a/app/assets/images/emoji/alien.png
+++ b/public/-/emojis/1/alien.png
Binary files differ
diff --git a/app/assets/images/emoji/ambulance.png b/public/-/emojis/1/ambulance.png
index 6fb8076d766..6fb8076d766 100644
--- a/app/assets/images/emoji/ambulance.png
+++ b/public/-/emojis/1/ambulance.png
Binary files differ
diff --git a/app/assets/images/emoji/amphora.png b/public/-/emojis/1/amphora.png
index 96de5056059..96de5056059 100644
--- a/app/assets/images/emoji/amphora.png
+++ b/public/-/emojis/1/amphora.png
Binary files differ
diff --git a/app/assets/images/emoji/anchor.png b/public/-/emojis/1/anchor.png
index b036f70a00b..b036f70a00b 100644
--- a/app/assets/images/emoji/anchor.png
+++ b/public/-/emojis/1/anchor.png
Binary files differ
diff --git a/app/assets/images/emoji/angel.png b/public/-/emojis/1/angel.png
index 66ea97a3b99..66ea97a3b99 100644
--- a/app/assets/images/emoji/angel.png
+++ b/public/-/emojis/1/angel.png
Binary files differ
diff --git a/app/assets/images/emoji/angel_tone1.png b/public/-/emojis/1/angel_tone1.png
index 391694dc07e..391694dc07e 100644
--- a/app/assets/images/emoji/angel_tone1.png
+++ b/public/-/emojis/1/angel_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/angel_tone2.png b/public/-/emojis/1/angel_tone2.png
index 700cbe6ed2c..700cbe6ed2c 100644
--- a/app/assets/images/emoji/angel_tone2.png
+++ b/public/-/emojis/1/angel_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/angel_tone3.png b/public/-/emojis/1/angel_tone3.png
index be597437d25..be597437d25 100644
--- a/app/assets/images/emoji/angel_tone3.png
+++ b/public/-/emojis/1/angel_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/angel_tone4.png b/public/-/emojis/1/angel_tone4.png
index b06d3c853ef..b06d3c853ef 100644
--- a/app/assets/images/emoji/angel_tone4.png
+++ b/public/-/emojis/1/angel_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/angel_tone5.png b/public/-/emojis/1/angel_tone5.png
index 17bd677e334..17bd677e334 100644
--- a/app/assets/images/emoji/angel_tone5.png
+++ b/public/-/emojis/1/angel_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/anger.png b/public/-/emojis/1/anger.png
index d63c2e000e4..d63c2e000e4 100644
--- a/app/assets/images/emoji/anger.png
+++ b/public/-/emojis/1/anger.png
Binary files differ
diff --git a/app/assets/images/emoji/anger_right.png b/public/-/emojis/1/anger_right.png
index f5c97c4d297..f5c97c4d297 100644
--- a/app/assets/images/emoji/anger_right.png
+++ b/public/-/emojis/1/anger_right.png
Binary files differ
diff --git a/app/assets/images/emoji/angry.png b/public/-/emojis/1/angry.png
index cfc4a6ecde5..cfc4a6ecde5 100644
--- a/app/assets/images/emoji/angry.png
+++ b/public/-/emojis/1/angry.png
Binary files differ
diff --git a/app/assets/images/emoji/ant.png b/public/-/emojis/1/ant.png
index 994127ed6b3..994127ed6b3 100644
--- a/app/assets/images/emoji/ant.png
+++ b/public/-/emojis/1/ant.png
Binary files differ
diff --git a/app/assets/images/emoji/apple.png b/public/-/emojis/1/apple.png
index da650c60f62..da650c60f62 100644
--- a/app/assets/images/emoji/apple.png
+++ b/public/-/emojis/1/apple.png
Binary files differ
diff --git a/app/assets/images/emoji/aquarius.png b/public/-/emojis/1/aquarius.png
index 641a4f68889..641a4f68889 100644
--- a/app/assets/images/emoji/aquarius.png
+++ b/public/-/emojis/1/aquarius.png
Binary files differ
diff --git a/app/assets/images/emoji/aries.png b/public/-/emojis/1/aries.png
index 21a189d0ede..21a189d0ede 100644
--- a/app/assets/images/emoji/aries.png
+++ b/public/-/emojis/1/aries.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_backward.png b/public/-/emojis/1/arrow_backward.png
index ee38e3b038e..ee38e3b038e 100644
--- a/app/assets/images/emoji/arrow_backward.png
+++ b/public/-/emojis/1/arrow_backward.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_double_down.png b/public/-/emojis/1/arrow_double_down.png
index 90193bfcb40..90193bfcb40 100644
--- a/app/assets/images/emoji/arrow_double_down.png
+++ b/public/-/emojis/1/arrow_double_down.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_double_up.png b/public/-/emojis/1/arrow_double_up.png
index 13543d5eef2..13543d5eef2 100644
--- a/app/assets/images/emoji/arrow_double_up.png
+++ b/public/-/emojis/1/arrow_double_up.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_down.png b/public/-/emojis/1/arrow_down.png
index b8eefd0b19f..b8eefd0b19f 100644
--- a/app/assets/images/emoji/arrow_down.png
+++ b/public/-/emojis/1/arrow_down.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_down_small.png b/public/-/emojis/1/arrow_down_small.png
index 5870b9a2241..5870b9a2241 100644
--- a/app/assets/images/emoji/arrow_down_small.png
+++ b/public/-/emojis/1/arrow_down_small.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_forward.png b/public/-/emojis/1/arrow_forward.png
index 4e2b682857c..4e2b682857c 100644
--- a/app/assets/images/emoji/arrow_forward.png
+++ b/public/-/emojis/1/arrow_forward.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_heading_down.png b/public/-/emojis/1/arrow_heading_down.png
index 2d9d24bca80..2d9d24bca80 100644
--- a/app/assets/images/emoji/arrow_heading_down.png
+++ b/public/-/emojis/1/arrow_heading_down.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_heading_up.png b/public/-/emojis/1/arrow_heading_up.png
index f29bfcfc0de..f29bfcfc0de 100644
--- a/app/assets/images/emoji/arrow_heading_up.png
+++ b/public/-/emojis/1/arrow_heading_up.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_left.png b/public/-/emojis/1/arrow_left.png
index 8c685e0a81b..8c685e0a81b 100644
--- a/app/assets/images/emoji/arrow_left.png
+++ b/public/-/emojis/1/arrow_left.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_lower_left.png b/public/-/emojis/1/arrow_lower_left.png
index 88b37716078..88b37716078 100644
--- a/app/assets/images/emoji/arrow_lower_left.png
+++ b/public/-/emojis/1/arrow_lower_left.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_lower_right.png b/public/-/emojis/1/arrow_lower_right.png
index 7e807da7392..7e807da7392 100644
--- a/app/assets/images/emoji/arrow_lower_right.png
+++ b/public/-/emojis/1/arrow_lower_right.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_right.png b/public/-/emojis/1/arrow_right.png
index 4755670b5cc..4755670b5cc 100644
--- a/app/assets/images/emoji/arrow_right.png
+++ b/public/-/emojis/1/arrow_right.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_right_hook.png b/public/-/emojis/1/arrow_right_hook.png
index e7258ad3268..e7258ad3268 100644
--- a/app/assets/images/emoji/arrow_right_hook.png
+++ b/public/-/emojis/1/arrow_right_hook.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_up.png b/public/-/emojis/1/arrow_up.png
index af8218a87f7..af8218a87f7 100644
--- a/app/assets/images/emoji/arrow_up.png
+++ b/public/-/emojis/1/arrow_up.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_up_down.png b/public/-/emojis/1/arrow_up_down.png
index dfa32b97186..dfa32b97186 100644
--- a/app/assets/images/emoji/arrow_up_down.png
+++ b/public/-/emojis/1/arrow_up_down.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_up_small.png b/public/-/emojis/1/arrow_up_small.png
index 20a13dcd5cd..20a13dcd5cd 100644
--- a/app/assets/images/emoji/arrow_up_small.png
+++ b/public/-/emojis/1/arrow_up_small.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_upper_left.png b/public/-/emojis/1/arrow_upper_left.png
index f38718fbe34..f38718fbe34 100644
--- a/app/assets/images/emoji/arrow_upper_left.png
+++ b/public/-/emojis/1/arrow_upper_left.png
Binary files differ
diff --git a/app/assets/images/emoji/arrow_upper_right.png b/public/-/emojis/1/arrow_upper_right.png
index c43e12d0f64..c43e12d0f64 100644
--- a/app/assets/images/emoji/arrow_upper_right.png
+++ b/public/-/emojis/1/arrow_upper_right.png
Binary files differ
diff --git a/app/assets/images/emoji/arrows_clockwise.png b/public/-/emojis/1/arrows_clockwise.png
index 26e49c38388..26e49c38388 100644
--- a/app/assets/images/emoji/arrows_clockwise.png
+++ b/public/-/emojis/1/arrows_clockwise.png
Binary files differ
diff --git a/app/assets/images/emoji/arrows_counterclockwise.png b/public/-/emojis/1/arrows_counterclockwise.png
index 8d06d8e0912..8d06d8e0912 100644
--- a/app/assets/images/emoji/arrows_counterclockwise.png
+++ b/public/-/emojis/1/arrows_counterclockwise.png
Binary files differ
diff --git a/app/assets/images/emoji/art.png b/public/-/emojis/1/art.png
index bd6afe9ff06..bd6afe9ff06 100644
--- a/app/assets/images/emoji/art.png
+++ b/public/-/emojis/1/art.png
Binary files differ
diff --git a/app/assets/images/emoji/articulated_lorry.png b/public/-/emojis/1/articulated_lorry.png
index c8217317132..c8217317132 100644
--- a/app/assets/images/emoji/articulated_lorry.png
+++ b/public/-/emojis/1/articulated_lorry.png
Binary files differ
diff --git a/app/assets/images/emoji/asterisk.png b/public/-/emojis/1/asterisk.png
index 2f8e5113803..2f8e5113803 100644
--- a/app/assets/images/emoji/asterisk.png
+++ b/public/-/emojis/1/asterisk.png
Binary files differ
diff --git a/app/assets/images/emoji/astonished.png b/public/-/emojis/1/astonished.png
index bd0ac55ec8e..bd0ac55ec8e 100644
--- a/app/assets/images/emoji/astonished.png
+++ b/public/-/emojis/1/astonished.png
Binary files differ
diff --git a/app/assets/images/emoji/athletic_shoe.png b/public/-/emojis/1/athletic_shoe.png
index 423fa07dd5d..423fa07dd5d 100644
--- a/app/assets/images/emoji/athletic_shoe.png
+++ b/public/-/emojis/1/athletic_shoe.png
Binary files differ
diff --git a/app/assets/images/emoji/atm.png b/public/-/emojis/1/atm.png
index 4d935307b94..4d935307b94 100644
--- a/app/assets/images/emoji/atm.png
+++ b/public/-/emojis/1/atm.png
Binary files differ
diff --git a/app/assets/images/emoji/atom.png b/public/-/emojis/1/atom.png
index 5f4567aa093..5f4567aa093 100644
--- a/app/assets/images/emoji/atom.png
+++ b/public/-/emojis/1/atom.png
Binary files differ
diff --git a/app/assets/images/emoji/avocado.png b/public/-/emojis/1/avocado.png
index 06f0d124aed..06f0d124aed 100644
--- a/app/assets/images/emoji/avocado.png
+++ b/public/-/emojis/1/avocado.png
Binary files differ
diff --git a/app/assets/images/emoji/b.png b/public/-/emojis/1/b.png
index 25875bc6a14..25875bc6a14 100644
--- a/app/assets/images/emoji/b.png
+++ b/public/-/emojis/1/b.png
Binary files differ
diff --git a/app/assets/images/emoji/baby.png b/public/-/emojis/1/baby.png
index a4af92c63c7..a4af92c63c7 100644
--- a/app/assets/images/emoji/baby.png
+++ b/public/-/emojis/1/baby.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_bottle.png b/public/-/emojis/1/baby_bottle.png
index 2bd10524180..2bd10524180 100644
--- a/app/assets/images/emoji/baby_bottle.png
+++ b/public/-/emojis/1/baby_bottle.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_chick.png b/public/-/emojis/1/baby_chick.png
index dccd96576ea..dccd96576ea 100644
--- a/app/assets/images/emoji/baby_chick.png
+++ b/public/-/emojis/1/baby_chick.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_symbol.png b/public/-/emojis/1/baby_symbol.png
index 64a10b71710..64a10b71710 100644
--- a/app/assets/images/emoji/baby_symbol.png
+++ b/public/-/emojis/1/baby_symbol.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_tone1.png b/public/-/emojis/1/baby_tone1.png
index d20911d40db..d20911d40db 100644
--- a/app/assets/images/emoji/baby_tone1.png
+++ b/public/-/emojis/1/baby_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_tone2.png b/public/-/emojis/1/baby_tone2.png
index b0a9b30ed17..b0a9b30ed17 100644
--- a/app/assets/images/emoji/baby_tone2.png
+++ b/public/-/emojis/1/baby_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_tone3.png b/public/-/emojis/1/baby_tone3.png
index 7de5286fac1..7de5286fac1 100644
--- a/app/assets/images/emoji/baby_tone3.png
+++ b/public/-/emojis/1/baby_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_tone4.png b/public/-/emojis/1/baby_tone4.png
index 9b7a86ac615..9b7a86ac615 100644
--- a/app/assets/images/emoji/baby_tone4.png
+++ b/public/-/emojis/1/baby_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/baby_tone5.png b/public/-/emojis/1/baby_tone5.png
index fe1be34cb88..fe1be34cb88 100644
--- a/app/assets/images/emoji/baby_tone5.png
+++ b/public/-/emojis/1/baby_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/back.png b/public/-/emojis/1/back.png
index d32c5d4f17f..d32c5d4f17f 100644
--- a/app/assets/images/emoji/back.png
+++ b/public/-/emojis/1/back.png
Binary files differ
diff --git a/app/assets/images/emoji/bacon.png b/public/-/emojis/1/bacon.png
index f38a485fbe4..f38a485fbe4 100644
--- a/app/assets/images/emoji/bacon.png
+++ b/public/-/emojis/1/bacon.png
Binary files differ
diff --git a/app/assets/images/emoji/badminton.png b/public/-/emojis/1/badminton.png
index 7ba15708990..7ba15708990 100644
--- a/app/assets/images/emoji/badminton.png
+++ b/public/-/emojis/1/badminton.png
Binary files differ
diff --git a/app/assets/images/emoji/baggage_claim.png b/public/-/emojis/1/baggage_claim.png
index 409b593e78a..409b593e78a 100644
--- a/app/assets/images/emoji/baggage_claim.png
+++ b/public/-/emojis/1/baggage_claim.png
Binary files differ
diff --git a/app/assets/images/emoji/balloon.png b/public/-/emojis/1/balloon.png
index 07916fe6df1..07916fe6df1 100644
--- a/app/assets/images/emoji/balloon.png
+++ b/public/-/emojis/1/balloon.png
Binary files differ
diff --git a/app/assets/images/emoji/ballot_box.png b/public/-/emojis/1/ballot_box.png
index 9b6767aea9e..9b6767aea9e 100644
--- a/app/assets/images/emoji/ballot_box.png
+++ b/public/-/emojis/1/ballot_box.png
Binary files differ
diff --git a/app/assets/images/emoji/ballot_box_with_check.png b/public/-/emojis/1/ballot_box_with_check.png
index 284d9573847..284d9573847 100644
--- a/app/assets/images/emoji/ballot_box_with_check.png
+++ b/public/-/emojis/1/ballot_box_with_check.png
Binary files differ
diff --git a/app/assets/images/emoji/bamboo.png b/public/-/emojis/1/bamboo.png
index 5d5e0e728a0..5d5e0e728a0 100644
--- a/app/assets/images/emoji/bamboo.png
+++ b/public/-/emojis/1/bamboo.png
Binary files differ
diff --git a/app/assets/images/emoji/banana.png b/public/-/emojis/1/banana.png
index f4987279580..f4987279580 100644
--- a/app/assets/images/emoji/banana.png
+++ b/public/-/emojis/1/banana.png
Binary files differ
diff --git a/app/assets/images/emoji/bangbang.png b/public/-/emojis/1/bangbang.png
index 58a9c528fca..58a9c528fca 100644
--- a/app/assets/images/emoji/bangbang.png
+++ b/public/-/emojis/1/bangbang.png
Binary files differ
diff --git a/app/assets/images/emoji/bank.png b/public/-/emojis/1/bank.png
index dffdcef36a1..dffdcef36a1 100644
--- a/app/assets/images/emoji/bank.png
+++ b/public/-/emojis/1/bank.png
Binary files differ
diff --git a/app/assets/images/emoji/bar_chart.png b/public/-/emojis/1/bar_chart.png
index 53c89455008..53c89455008 100644
--- a/app/assets/images/emoji/bar_chart.png
+++ b/public/-/emojis/1/bar_chart.png
Binary files differ
diff --git a/app/assets/images/emoji/barber.png b/public/-/emojis/1/barber.png
index 896f4d716cf..896f4d716cf 100644
--- a/app/assets/images/emoji/barber.png
+++ b/public/-/emojis/1/barber.png
Binary files differ
diff --git a/app/assets/images/emoji/baseball.png b/public/-/emojis/1/baseball.png
index f8463f1538b..f8463f1538b 100644
--- a/app/assets/images/emoji/baseball.png
+++ b/public/-/emojis/1/baseball.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball.png b/public/-/emojis/1/basketball.png
index 64c76b79c6d..64c76b79c6d 100644
--- a/app/assets/images/emoji/basketball.png
+++ b/public/-/emojis/1/basketball.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player.png b/public/-/emojis/1/basketball_player.png
index 8ce90c5cad6..8ce90c5cad6 100644
--- a/app/assets/images/emoji/basketball_player.png
+++ b/public/-/emojis/1/basketball_player.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player_tone1.png b/public/-/emojis/1/basketball_player_tone1.png
index cd12c7ab9bf..cd12c7ab9bf 100644
--- a/app/assets/images/emoji/basketball_player_tone1.png
+++ b/public/-/emojis/1/basketball_player_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player_tone2.png b/public/-/emojis/1/basketball_player_tone2.png
index f892fd596da..f892fd596da 100644
--- a/app/assets/images/emoji/basketball_player_tone2.png
+++ b/public/-/emojis/1/basketball_player_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player_tone3.png b/public/-/emojis/1/basketball_player_tone3.png
index e109997a91a..e109997a91a 100644
--- a/app/assets/images/emoji/basketball_player_tone3.png
+++ b/public/-/emojis/1/basketball_player_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player_tone4.png b/public/-/emojis/1/basketball_player_tone4.png
index 3b90b946af4..3b90b946af4 100644
--- a/app/assets/images/emoji/basketball_player_tone4.png
+++ b/public/-/emojis/1/basketball_player_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/basketball_player_tone5.png b/public/-/emojis/1/basketball_player_tone5.png
index bafed7828a7..bafed7828a7 100644
--- a/app/assets/images/emoji/basketball_player_tone5.png
+++ b/public/-/emojis/1/basketball_player_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bat.png b/public/-/emojis/1/bat.png
index 3152c047e00..3152c047e00 100644
--- a/app/assets/images/emoji/bat.png
+++ b/public/-/emojis/1/bat.png
Binary files differ
diff --git a/app/assets/images/emoji/bath.png b/public/-/emojis/1/bath.png
index 43fba5c8a28..43fba5c8a28 100644
--- a/app/assets/images/emoji/bath.png
+++ b/public/-/emojis/1/bath.png
Binary files differ
diff --git a/app/assets/images/emoji/bath_tone1.png b/public/-/emojis/1/bath_tone1.png
index 2152eabf2f5..2152eabf2f5 100644
--- a/app/assets/images/emoji/bath_tone1.png
+++ b/public/-/emojis/1/bath_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/bath_tone2.png b/public/-/emojis/1/bath_tone2.png
index 2102e6133e3..2102e6133e3 100644
--- a/app/assets/images/emoji/bath_tone2.png
+++ b/public/-/emojis/1/bath_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/bath_tone3.png b/public/-/emojis/1/bath_tone3.png
index fae66181e9f..fae66181e9f 100644
--- a/app/assets/images/emoji/bath_tone3.png
+++ b/public/-/emojis/1/bath_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/bath_tone4.png b/public/-/emojis/1/bath_tone4.png
index 1f8959d0d99..1f8959d0d99 100644
--- a/app/assets/images/emoji/bath_tone4.png
+++ b/public/-/emojis/1/bath_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/bath_tone5.png b/public/-/emojis/1/bath_tone5.png
index c8a08e84f25..c8a08e84f25 100644
--- a/app/assets/images/emoji/bath_tone5.png
+++ b/public/-/emojis/1/bath_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bathtub.png b/public/-/emojis/1/bathtub.png
index 9a5f09361eb..9a5f09361eb 100644
--- a/app/assets/images/emoji/bathtub.png
+++ b/public/-/emojis/1/bathtub.png
Binary files differ
diff --git a/app/assets/images/emoji/battery.png b/public/-/emojis/1/battery.png
index f593e2bdb65..f593e2bdb65 100644
--- a/app/assets/images/emoji/battery.png
+++ b/public/-/emojis/1/battery.png
Binary files differ
diff --git a/app/assets/images/emoji/beach.png b/public/-/emojis/1/beach.png
index 69108c8ea10..69108c8ea10 100644
--- a/app/assets/images/emoji/beach.png
+++ b/public/-/emojis/1/beach.png
Binary files differ
diff --git a/app/assets/images/emoji/beach_umbrella.png b/public/-/emojis/1/beach_umbrella.png
index 220a74f8132..220a74f8132 100644
--- a/app/assets/images/emoji/beach_umbrella.png
+++ b/public/-/emojis/1/beach_umbrella.png
Binary files differ
diff --git a/app/assets/images/emoji/bear.png b/public/-/emojis/1/bear.png
index 272d56bbbcc..272d56bbbcc 100644
--- a/app/assets/images/emoji/bear.png
+++ b/public/-/emojis/1/bear.png
Binary files differ
diff --git a/app/assets/images/emoji/bed.png b/public/-/emojis/1/bed.png
index 86f964e245d..86f964e245d 100644
--- a/app/assets/images/emoji/bed.png
+++ b/public/-/emojis/1/bed.png
Binary files differ
diff --git a/app/assets/images/emoji/bee.png b/public/-/emojis/1/bee.png
index 46156060096..46156060096 100644
--- a/app/assets/images/emoji/bee.png
+++ b/public/-/emojis/1/bee.png
Binary files differ
diff --git a/app/assets/images/emoji/beer.png b/public/-/emojis/1/beer.png
index b6d73dc0b7a..b6d73dc0b7a 100644
--- a/app/assets/images/emoji/beer.png
+++ b/public/-/emojis/1/beer.png
Binary files differ
diff --git a/app/assets/images/emoji/beers.png b/public/-/emojis/1/beers.png
index b55deb66b41..b55deb66b41 100644
--- a/app/assets/images/emoji/beers.png
+++ b/public/-/emojis/1/beers.png
Binary files differ
diff --git a/app/assets/images/emoji/beetle.png b/public/-/emojis/1/beetle.png
index 3d93174d7fc..3d93174d7fc 100644
--- a/app/assets/images/emoji/beetle.png
+++ b/public/-/emojis/1/beetle.png
Binary files differ
diff --git a/app/assets/images/emoji/beginner.png b/public/-/emojis/1/beginner.png
index bc434fb7cb5..bc434fb7cb5 100644
--- a/app/assets/images/emoji/beginner.png
+++ b/public/-/emojis/1/beginner.png
Binary files differ
diff --git a/app/assets/images/emoji/bell.png b/public/-/emojis/1/bell.png
index 5b3b0461999..5b3b0461999 100644
--- a/app/assets/images/emoji/bell.png
+++ b/public/-/emojis/1/bell.png
Binary files differ
diff --git a/app/assets/images/emoji/bellhop.png b/public/-/emojis/1/bellhop.png
index 6b3297ceaf7..6b3297ceaf7 100644
--- a/app/assets/images/emoji/bellhop.png
+++ b/public/-/emojis/1/bellhop.png
Binary files differ
diff --git a/app/assets/images/emoji/bento.png b/public/-/emojis/1/bento.png
index 83d41ca7eb9..83d41ca7eb9 100644
--- a/app/assets/images/emoji/bento.png
+++ b/public/-/emojis/1/bento.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist.png b/public/-/emojis/1/bicyclist.png
index 9274da11048..9274da11048 100644
--- a/app/assets/images/emoji/bicyclist.png
+++ b/public/-/emojis/1/bicyclist.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist_tone1.png b/public/-/emojis/1/bicyclist_tone1.png
index decc2f728fe..decc2f728fe 100644
--- a/app/assets/images/emoji/bicyclist_tone1.png
+++ b/public/-/emojis/1/bicyclist_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist_tone2.png b/public/-/emojis/1/bicyclist_tone2.png
index 0067717b80a..0067717b80a 100644
--- a/app/assets/images/emoji/bicyclist_tone2.png
+++ b/public/-/emojis/1/bicyclist_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist_tone3.png b/public/-/emojis/1/bicyclist_tone3.png
index a4f7b5e2776..a4f7b5e2776 100644
--- a/app/assets/images/emoji/bicyclist_tone3.png
+++ b/public/-/emojis/1/bicyclist_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist_tone4.png b/public/-/emojis/1/bicyclist_tone4.png
index a3c8a797db4..a3c8a797db4 100644
--- a/app/assets/images/emoji/bicyclist_tone4.png
+++ b/public/-/emojis/1/bicyclist_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/bicyclist_tone5.png b/public/-/emojis/1/bicyclist_tone5.png
index 1606a874051..1606a874051 100644
--- a/app/assets/images/emoji/bicyclist_tone5.png
+++ b/public/-/emojis/1/bicyclist_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bike.png b/public/-/emojis/1/bike.png
index 556ed70f1a7..556ed70f1a7 100644
--- a/app/assets/images/emoji/bike.png
+++ b/public/-/emojis/1/bike.png
Binary files differ
diff --git a/app/assets/images/emoji/bikini.png b/public/-/emojis/1/bikini.png
index 77a8a0aae5b..77a8a0aae5b 100644
--- a/app/assets/images/emoji/bikini.png
+++ b/public/-/emojis/1/bikini.png
Binary files differ
diff --git a/app/assets/images/emoji/biohazard.png b/public/-/emojis/1/biohazard.png
index 007b4fc2d85..007b4fc2d85 100644
--- a/app/assets/images/emoji/biohazard.png
+++ b/public/-/emojis/1/biohazard.png
Binary files differ
diff --git a/app/assets/images/emoji/bird.png b/public/-/emojis/1/bird.png
index e201c22be33..e201c22be33 100644
--- a/app/assets/images/emoji/bird.png
+++ b/public/-/emojis/1/bird.png
Binary files differ
diff --git a/app/assets/images/emoji/birthday.png b/public/-/emojis/1/birthday.png
index 317e9a41949..317e9a41949 100644
--- a/app/assets/images/emoji/birthday.png
+++ b/public/-/emojis/1/birthday.png
Binary files differ
diff --git a/app/assets/images/emoji/black_circle.png b/public/-/emojis/1/black_circle.png
index b62b87170e8..b62b87170e8 100644
--- a/app/assets/images/emoji/black_circle.png
+++ b/public/-/emojis/1/black_circle.png
Binary files differ
diff --git a/app/assets/images/emoji/black_heart.png b/public/-/emojis/1/black_heart.png
index b4068c3e6e8..b4068c3e6e8 100644
--- a/app/assets/images/emoji/black_heart.png
+++ b/public/-/emojis/1/black_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/black_joker.png b/public/-/emojis/1/black_joker.png
index 3d0924b68aa..3d0924b68aa 100644
--- a/app/assets/images/emoji/black_joker.png
+++ b/public/-/emojis/1/black_joker.png
Binary files differ
diff --git a/app/assets/images/emoji/black_large_square.png b/public/-/emojis/1/black_large_square.png
index 162f2bb4290..162f2bb4290 100644
--- a/app/assets/images/emoji/black_large_square.png
+++ b/public/-/emojis/1/black_large_square.png
Binary files differ
diff --git a/app/assets/images/emoji/black_medium_small_square.png b/public/-/emojis/1/black_medium_small_square.png
index 39765bba610..39765bba610 100644
--- a/app/assets/images/emoji/black_medium_small_square.png
+++ b/public/-/emojis/1/black_medium_small_square.png
Binary files differ
diff --git a/app/assets/images/emoji/black_medium_square.png b/public/-/emojis/1/black_medium_square.png
index 05a30a6aa2d..05a30a6aa2d 100644
--- a/app/assets/images/emoji/black_medium_square.png
+++ b/public/-/emojis/1/black_medium_square.png
Binary files differ
diff --git a/app/assets/images/emoji/black_nib.png b/public/-/emojis/1/black_nib.png
index 872d0ae1598..872d0ae1598 100644
--- a/app/assets/images/emoji/black_nib.png
+++ b/public/-/emojis/1/black_nib.png
Binary files differ
diff --git a/app/assets/images/emoji/black_small_square.png b/public/-/emojis/1/black_small_square.png
index 48595d3e1a9..48595d3e1a9 100644
--- a/app/assets/images/emoji/black_small_square.png
+++ b/public/-/emojis/1/black_small_square.png
Binary files differ
diff --git a/app/assets/images/emoji/black_square_button.png b/public/-/emojis/1/black_square_button.png
index a78fc2f6b63..a78fc2f6b63 100644
--- a/app/assets/images/emoji/black_square_button.png
+++ b/public/-/emojis/1/black_square_button.png
Binary files differ
diff --git a/app/assets/images/emoji/blossom.png b/public/-/emojis/1/blossom.png
index 4083026c157..4083026c157 100644
--- a/app/assets/images/emoji/blossom.png
+++ b/public/-/emojis/1/blossom.png
Binary files differ
diff --git a/app/assets/images/emoji/blowfish.png b/public/-/emojis/1/blowfish.png
index a10f4f84e35..a10f4f84e35 100644
--- a/app/assets/images/emoji/blowfish.png
+++ b/public/-/emojis/1/blowfish.png
Binary files differ
diff --git a/app/assets/images/emoji/blue_book.png b/public/-/emojis/1/blue_book.png
index e1e455401cc..e1e455401cc 100644
--- a/app/assets/images/emoji/blue_book.png
+++ b/public/-/emojis/1/blue_book.png
Binary files differ
diff --git a/app/assets/images/emoji/blue_car.png b/public/-/emojis/1/blue_car.png
index e8ba817d393..e8ba817d393 100644
--- a/app/assets/images/emoji/blue_car.png
+++ b/public/-/emojis/1/blue_car.png
Binary files differ
diff --git a/app/assets/images/emoji/blue_heart.png b/public/-/emojis/1/blue_heart.png
index bdf1287e55e..bdf1287e55e 100644
--- a/app/assets/images/emoji/blue_heart.png
+++ b/public/-/emojis/1/blue_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/blush.png b/public/-/emojis/1/blush.png
index aac1a424ad4..aac1a424ad4 100644
--- a/app/assets/images/emoji/blush.png
+++ b/public/-/emojis/1/blush.png
Binary files differ
diff --git a/app/assets/images/emoji/boar.png b/public/-/emojis/1/boar.png
index fead972633c..fead972633c 100644
--- a/app/assets/images/emoji/boar.png
+++ b/public/-/emojis/1/boar.png
Binary files differ
diff --git a/app/assets/images/emoji/bomb.png b/public/-/emojis/1/bomb.png
index c7f8f81c939..c7f8f81c939 100644
--- a/app/assets/images/emoji/bomb.png
+++ b/public/-/emojis/1/bomb.png
Binary files differ
diff --git a/app/assets/images/emoji/book.png b/public/-/emojis/1/book.png
index 0f4447ed396..0f4447ed396 100644
--- a/app/assets/images/emoji/book.png
+++ b/public/-/emojis/1/book.png
Binary files differ
diff --git a/app/assets/images/emoji/bookmark.png b/public/-/emojis/1/bookmark.png
index bbb444611f0..bbb444611f0 100644
--- a/app/assets/images/emoji/bookmark.png
+++ b/public/-/emojis/1/bookmark.png
Binary files differ
diff --git a/app/assets/images/emoji/bookmark_tabs.png b/public/-/emojis/1/bookmark_tabs.png
index f8d9e01b428..f8d9e01b428 100644
--- a/app/assets/images/emoji/bookmark_tabs.png
+++ b/public/-/emojis/1/bookmark_tabs.png
Binary files differ
diff --git a/app/assets/images/emoji/books.png b/public/-/emojis/1/books.png
index 59a8bafeb0d..59a8bafeb0d 100644
--- a/app/assets/images/emoji/books.png
+++ b/public/-/emojis/1/books.png
Binary files differ
diff --git a/app/assets/images/emoji/boom.png b/public/-/emojis/1/boom.png
index 9b0f027b1a8..9b0f027b1a8 100644
--- a/app/assets/images/emoji/boom.png
+++ b/public/-/emojis/1/boom.png
Binary files differ
diff --git a/app/assets/images/emoji/boot.png b/public/-/emojis/1/boot.png
index 11f1065ed07..11f1065ed07 100644
--- a/app/assets/images/emoji/boot.png
+++ b/public/-/emojis/1/boot.png
Binary files differ
diff --git a/app/assets/images/emoji/bouquet.png b/public/-/emojis/1/bouquet.png
index 11455af6df4..11455af6df4 100644
--- a/app/assets/images/emoji/bouquet.png
+++ b/public/-/emojis/1/bouquet.png
Binary files differ
diff --git a/app/assets/images/emoji/bow.png b/public/-/emojis/1/bow.png
index d8f793088dc..d8f793088dc 100644
--- a/app/assets/images/emoji/bow.png
+++ b/public/-/emojis/1/bow.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_and_arrow.png b/public/-/emojis/1/bow_and_arrow.png
index 6a538bf475f..6a538bf475f 100644
--- a/app/assets/images/emoji/bow_and_arrow.png
+++ b/public/-/emojis/1/bow_and_arrow.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_tone1.png b/public/-/emojis/1/bow_tone1.png
index 87afb7b54cf..87afb7b54cf 100644
--- a/app/assets/images/emoji/bow_tone1.png
+++ b/public/-/emojis/1/bow_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_tone2.png b/public/-/emojis/1/bow_tone2.png
index 3ccf7dc0850..3ccf7dc0850 100644
--- a/app/assets/images/emoji/bow_tone2.png
+++ b/public/-/emojis/1/bow_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_tone3.png b/public/-/emojis/1/bow_tone3.png
index 8b9eb64f926..8b9eb64f926 100644
--- a/app/assets/images/emoji/bow_tone3.png
+++ b/public/-/emojis/1/bow_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_tone4.png b/public/-/emojis/1/bow_tone4.png
index 683795ff40d..683795ff40d 100644
--- a/app/assets/images/emoji/bow_tone4.png
+++ b/public/-/emojis/1/bow_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/bow_tone5.png b/public/-/emojis/1/bow_tone5.png
index 7969d971752..7969d971752 100644
--- a/app/assets/images/emoji/bow_tone5.png
+++ b/public/-/emojis/1/bow_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bowling.png b/public/-/emojis/1/bowling.png
index 63add89e53b..63add89e53b 100644
--- a/app/assets/images/emoji/bowling.png
+++ b/public/-/emojis/1/bowling.png
Binary files differ
diff --git a/app/assets/images/emoji/boxing_glove.png b/public/-/emojis/1/boxing_glove.png
index 9838f24e51a..9838f24e51a 100644
--- a/app/assets/images/emoji/boxing_glove.png
+++ b/public/-/emojis/1/boxing_glove.png
Binary files differ
diff --git a/app/assets/images/emoji/boy.png b/public/-/emojis/1/boy.png
index 8ecfb0a4e92..8ecfb0a4e92 100644
--- a/app/assets/images/emoji/boy.png
+++ b/public/-/emojis/1/boy.png
Binary files differ
diff --git a/app/assets/images/emoji/boy_tone1.png b/public/-/emojis/1/boy_tone1.png
index 2fc436ea512..2fc436ea512 100644
--- a/app/assets/images/emoji/boy_tone1.png
+++ b/public/-/emojis/1/boy_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/boy_tone2.png b/public/-/emojis/1/boy_tone2.png
index 09a5f18d360..09a5f18d360 100644
--- a/app/assets/images/emoji/boy_tone2.png
+++ b/public/-/emojis/1/boy_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/boy_tone3.png b/public/-/emojis/1/boy_tone3.png
index 3cfe675dd3a..3cfe675dd3a 100644
--- a/app/assets/images/emoji/boy_tone3.png
+++ b/public/-/emojis/1/boy_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/boy_tone4.png b/public/-/emojis/1/boy_tone4.png
index 780be0ace36..780be0ace36 100644
--- a/app/assets/images/emoji/boy_tone4.png
+++ b/public/-/emojis/1/boy_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/boy_tone5.png b/public/-/emojis/1/boy_tone5.png
index f32fe22e35c..f32fe22e35c 100644
--- a/app/assets/images/emoji/boy_tone5.png
+++ b/public/-/emojis/1/boy_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bread.png b/public/-/emojis/1/bread.png
index 6676510aaa5..6676510aaa5 100644
--- a/app/assets/images/emoji/bread.png
+++ b/public/-/emojis/1/bread.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil.png b/public/-/emojis/1/bride_with_veil.png
index eaf4bd97890..eaf4bd97890 100644
--- a/app/assets/images/emoji/bride_with_veil.png
+++ b/public/-/emojis/1/bride_with_veil.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil_tone1.png b/public/-/emojis/1/bride_with_veil_tone1.png
index c4fb141ae8f..c4fb141ae8f 100644
--- a/app/assets/images/emoji/bride_with_veil_tone1.png
+++ b/public/-/emojis/1/bride_with_veil_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil_tone2.png b/public/-/emojis/1/bride_with_veil_tone2.png
index c248769fc06..c248769fc06 100644
--- a/app/assets/images/emoji/bride_with_veil_tone2.png
+++ b/public/-/emojis/1/bride_with_veil_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil_tone3.png b/public/-/emojis/1/bride_with_veil_tone3.png
index 962c0a6eedb..962c0a6eedb 100644
--- a/app/assets/images/emoji/bride_with_veil_tone3.png
+++ b/public/-/emojis/1/bride_with_veil_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil_tone4.png b/public/-/emojis/1/bride_with_veil_tone4.png
index 740ca208cd4..740ca208cd4 100644
--- a/app/assets/images/emoji/bride_with_veil_tone4.png
+++ b/public/-/emojis/1/bride_with_veil_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/bride_with_veil_tone5.png b/public/-/emojis/1/bride_with_veil_tone5.png
index 5cc5598587d..5cc5598587d 100644
--- a/app/assets/images/emoji/bride_with_veil_tone5.png
+++ b/public/-/emojis/1/bride_with_veil_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/bridge_at_night.png b/public/-/emojis/1/bridge_at_night.png
index 1d444e0be65..1d444e0be65 100644
--- a/app/assets/images/emoji/bridge_at_night.png
+++ b/public/-/emojis/1/bridge_at_night.png
Binary files differ
diff --git a/app/assets/images/emoji/briefcase.png b/public/-/emojis/1/briefcase.png
index b9912ba2148..b9912ba2148 100644
--- a/app/assets/images/emoji/briefcase.png
+++ b/public/-/emojis/1/briefcase.png
Binary files differ
diff --git a/app/assets/images/emoji/broken_heart.png b/public/-/emojis/1/broken_heart.png
index 718e26ee122..718e26ee122 100644
--- a/app/assets/images/emoji/broken_heart.png
+++ b/public/-/emojis/1/broken_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/bug.png b/public/-/emojis/1/bug.png
index e64e72f259a..e64e72f259a 100644
--- a/app/assets/images/emoji/bug.png
+++ b/public/-/emojis/1/bug.png
Binary files differ
diff --git a/app/assets/images/emoji/bulb.png b/public/-/emojis/1/bulb.png
index 38e32e02d9f..38e32e02d9f 100644
--- a/app/assets/images/emoji/bulb.png
+++ b/public/-/emojis/1/bulb.png
Binary files differ
diff --git a/app/assets/images/emoji/bullettrain_front.png b/public/-/emojis/1/bullettrain_front.png
index 4f698e056fa..4f698e056fa 100644
--- a/app/assets/images/emoji/bullettrain_front.png
+++ b/public/-/emojis/1/bullettrain_front.png
Binary files differ
diff --git a/app/assets/images/emoji/bullettrain_side.png b/public/-/emojis/1/bullettrain_side.png
index ed61c67bf07..ed61c67bf07 100644
--- a/app/assets/images/emoji/bullettrain_side.png
+++ b/public/-/emojis/1/bullettrain_side.png
Binary files differ
diff --git a/app/assets/images/emoji/burrito.png b/public/-/emojis/1/burrito.png
index 02bd5601df7..02bd5601df7 100644
--- a/app/assets/images/emoji/burrito.png
+++ b/public/-/emojis/1/burrito.png
Binary files differ
diff --git a/app/assets/images/emoji/bus.png b/public/-/emojis/1/bus.png
index 641ddc56ca7..641ddc56ca7 100644
--- a/app/assets/images/emoji/bus.png
+++ b/public/-/emojis/1/bus.png
Binary files differ
diff --git a/app/assets/images/emoji/busstop.png b/public/-/emojis/1/busstop.png
index b2b62208bfd..b2b62208bfd 100644
--- a/app/assets/images/emoji/busstop.png
+++ b/public/-/emojis/1/busstop.png
Binary files differ
diff --git a/app/assets/images/emoji/bust_in_silhouette.png b/public/-/emojis/1/bust_in_silhouette.png
index 123b2cbe1fb..123b2cbe1fb 100644
--- a/app/assets/images/emoji/bust_in_silhouette.png
+++ b/public/-/emojis/1/bust_in_silhouette.png
Binary files differ
diff --git a/app/assets/images/emoji/busts_in_silhouette.png b/public/-/emojis/1/busts_in_silhouette.png
index d7656860a1c..d7656860a1c 100644
--- a/app/assets/images/emoji/busts_in_silhouette.png
+++ b/public/-/emojis/1/busts_in_silhouette.png
Binary files differ
diff --git a/app/assets/images/emoji/butterfly.png b/public/-/emojis/1/butterfly.png
index 5631fe99226..5631fe99226 100644
--- a/app/assets/images/emoji/butterfly.png
+++ b/public/-/emojis/1/butterfly.png
Binary files differ
diff --git a/app/assets/images/emoji/cactus.png b/public/-/emojis/1/cactus.png
index 9b48ccf3d0c..9b48ccf3d0c 100644
--- a/app/assets/images/emoji/cactus.png
+++ b/public/-/emojis/1/cactus.png
Binary files differ
diff --git a/app/assets/images/emoji/cake.png b/public/-/emojis/1/cake.png
index 4368177be9a..4368177be9a 100644
--- a/app/assets/images/emoji/cake.png
+++ b/public/-/emojis/1/cake.png
Binary files differ
diff --git a/app/assets/images/emoji/calendar.png b/public/-/emojis/1/calendar.png
index 47353b74447..47353b74447 100644
--- a/app/assets/images/emoji/calendar.png
+++ b/public/-/emojis/1/calendar.png
Binary files differ
diff --git a/app/assets/images/emoji/calendar_spiral.png b/public/-/emojis/1/calendar_spiral.png
index dec8d49bfa8..dec8d49bfa8 100644
--- a/app/assets/images/emoji/calendar_spiral.png
+++ b/public/-/emojis/1/calendar_spiral.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me.png b/public/-/emojis/1/call_me.png
index a10c59ba711..a10c59ba711 100644
--- a/app/assets/images/emoji/call_me.png
+++ b/public/-/emojis/1/call_me.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me_tone1.png b/public/-/emojis/1/call_me_tone1.png
index 2c93201181a..2c93201181a 100644
--- a/app/assets/images/emoji/call_me_tone1.png
+++ b/public/-/emojis/1/call_me_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me_tone2.png b/public/-/emojis/1/call_me_tone2.png
index c39f45a41ed..c39f45a41ed 100644
--- a/app/assets/images/emoji/call_me_tone2.png
+++ b/public/-/emojis/1/call_me_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me_tone3.png b/public/-/emojis/1/call_me_tone3.png
index 83a57f63c29..83a57f63c29 100644
--- a/app/assets/images/emoji/call_me_tone3.png
+++ b/public/-/emojis/1/call_me_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me_tone4.png b/public/-/emojis/1/call_me_tone4.png
index 65b3468fe44..65b3468fe44 100644
--- a/app/assets/images/emoji/call_me_tone4.png
+++ b/public/-/emojis/1/call_me_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/call_me_tone5.png b/public/-/emojis/1/call_me_tone5.png
index 94ef68ff3b3..94ef68ff3b3 100644
--- a/app/assets/images/emoji/call_me_tone5.png
+++ b/public/-/emojis/1/call_me_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/calling.png b/public/-/emojis/1/calling.png
index e2f308f8e46..e2f308f8e46 100644
--- a/app/assets/images/emoji/calling.png
+++ b/public/-/emojis/1/calling.png
Binary files differ
diff --git a/app/assets/images/emoji/camel.png b/public/-/emojis/1/camel.png
index b421d07a805..b421d07a805 100644
--- a/app/assets/images/emoji/camel.png
+++ b/public/-/emojis/1/camel.png
Binary files differ
diff --git a/app/assets/images/emoji/camera.png b/public/-/emojis/1/camera.png
index 0a3429f72ef..0a3429f72ef 100644
--- a/app/assets/images/emoji/camera.png
+++ b/public/-/emojis/1/camera.png
Binary files differ
diff --git a/app/assets/images/emoji/camera_with_flash.png b/public/-/emojis/1/camera_with_flash.png
index 27471da2029..27471da2029 100644
--- a/app/assets/images/emoji/camera_with_flash.png
+++ b/public/-/emojis/1/camera_with_flash.png
Binary files differ
diff --git a/app/assets/images/emoji/camping.png b/public/-/emojis/1/camping.png
index d589cc1f44b..d589cc1f44b 100644
--- a/app/assets/images/emoji/camping.png
+++ b/public/-/emojis/1/camping.png
Binary files differ
diff --git a/app/assets/images/emoji/cancer.png b/public/-/emojis/1/cancer.png
index a64af07cb5f..a64af07cb5f 100644
--- a/app/assets/images/emoji/cancer.png
+++ b/public/-/emojis/1/cancer.png
Binary files differ
diff --git a/app/assets/images/emoji/candle.png b/public/-/emojis/1/candle.png
index 0b56444e355..0b56444e355 100644
--- a/app/assets/images/emoji/candle.png
+++ b/public/-/emojis/1/candle.png
Binary files differ
diff --git a/app/assets/images/emoji/candy.png b/public/-/emojis/1/candy.png
index 8c67ace3a35..8c67ace3a35 100644
--- a/app/assets/images/emoji/candy.png
+++ b/public/-/emojis/1/candy.png
Binary files differ
diff --git a/app/assets/images/emoji/canoe.png b/public/-/emojis/1/canoe.png
index e26cdb9da69..e26cdb9da69 100644
--- a/app/assets/images/emoji/canoe.png
+++ b/public/-/emojis/1/canoe.png
Binary files differ
diff --git a/app/assets/images/emoji/capital_abcd.png b/public/-/emojis/1/capital_abcd.png
index fe9482d2d8a..fe9482d2d8a 100644
--- a/app/assets/images/emoji/capital_abcd.png
+++ b/public/-/emojis/1/capital_abcd.png
Binary files differ
diff --git a/app/assets/images/emoji/capricorn.png b/public/-/emojis/1/capricorn.png
index 6293d31d4b1..6293d31d4b1 100644
--- a/app/assets/images/emoji/capricorn.png
+++ b/public/-/emojis/1/capricorn.png
Binary files differ
diff --git a/app/assets/images/emoji/card_box.png b/public/-/emojis/1/card_box.png
index f2e764ce59d..f2e764ce59d 100644
--- a/app/assets/images/emoji/card_box.png
+++ b/public/-/emojis/1/card_box.png
Binary files differ
diff --git a/app/assets/images/emoji/card_index.png b/public/-/emojis/1/card_index.png
index 151e11cb3b4..151e11cb3b4 100644
--- a/app/assets/images/emoji/card_index.png
+++ b/public/-/emojis/1/card_index.png
Binary files differ
diff --git a/app/assets/images/emoji/carousel_horse.png b/public/-/emojis/1/carousel_horse.png
index a17074edf05..a17074edf05 100644
--- a/app/assets/images/emoji/carousel_horse.png
+++ b/public/-/emojis/1/carousel_horse.png
Binary files differ
diff --git a/app/assets/images/emoji/carrot.png b/public/-/emojis/1/carrot.png
index c68829b58e7..c68829b58e7 100644
--- a/app/assets/images/emoji/carrot.png
+++ b/public/-/emojis/1/carrot.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel.png b/public/-/emojis/1/cartwheel.png
index cbcaa578253..cbcaa578253 100644
--- a/app/assets/images/emoji/cartwheel.png
+++ b/public/-/emojis/1/cartwheel.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel_tone1.png b/public/-/emojis/1/cartwheel_tone1.png
index db6d65895fb..db6d65895fb 100644
--- a/app/assets/images/emoji/cartwheel_tone1.png
+++ b/public/-/emojis/1/cartwheel_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel_tone2.png b/public/-/emojis/1/cartwheel_tone2.png
index e00ffbc27a8..e00ffbc27a8 100644
--- a/app/assets/images/emoji/cartwheel_tone2.png
+++ b/public/-/emojis/1/cartwheel_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel_tone3.png b/public/-/emojis/1/cartwheel_tone3.png
index 49321be391f..49321be391f 100644
--- a/app/assets/images/emoji/cartwheel_tone3.png
+++ b/public/-/emojis/1/cartwheel_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel_tone4.png b/public/-/emojis/1/cartwheel_tone4.png
index d4562b5e3dd..d4562b5e3dd 100644
--- a/app/assets/images/emoji/cartwheel_tone4.png
+++ b/public/-/emojis/1/cartwheel_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/cartwheel_tone5.png b/public/-/emojis/1/cartwheel_tone5.png
index 6e09a870767..6e09a870767 100644
--- a/app/assets/images/emoji/cartwheel_tone5.png
+++ b/public/-/emojis/1/cartwheel_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/cat.png b/public/-/emojis/1/cat.png
index efd82c2abf3..efd82c2abf3 100644
--- a/app/assets/images/emoji/cat.png
+++ b/public/-/emojis/1/cat.png
Binary files differ
diff --git a/app/assets/images/emoji/cat2.png b/public/-/emojis/1/cat2.png
index 46abe8cbc14..46abe8cbc14 100644
--- a/app/assets/images/emoji/cat2.png
+++ b/public/-/emojis/1/cat2.png
Binary files differ
diff --git a/app/assets/images/emoji/cd.png b/public/-/emojis/1/cd.png
index e6b01449cd9..e6b01449cd9 100644
--- a/app/assets/images/emoji/cd.png
+++ b/public/-/emojis/1/cd.png
Binary files differ
diff --git a/app/assets/images/emoji/chains.png b/public/-/emojis/1/chains.png
index 57f46139a06..57f46139a06 100644
--- a/app/assets/images/emoji/chains.png
+++ b/public/-/emojis/1/chains.png
Binary files differ
diff --git a/app/assets/images/emoji/champagne.png b/public/-/emojis/1/champagne.png
index 285a79a93d0..285a79a93d0 100644
--- a/app/assets/images/emoji/champagne.png
+++ b/public/-/emojis/1/champagne.png
Binary files differ
diff --git a/app/assets/images/emoji/champagne_glass.png b/public/-/emojis/1/champagne_glass.png
index 31937ae9392..31937ae9392 100644
--- a/app/assets/images/emoji/champagne_glass.png
+++ b/public/-/emojis/1/champagne_glass.png
Binary files differ
diff --git a/app/assets/images/emoji/chart.png b/public/-/emojis/1/chart.png
index 9773f03be22..9773f03be22 100644
--- a/app/assets/images/emoji/chart.png
+++ b/public/-/emojis/1/chart.png
Binary files differ
diff --git a/app/assets/images/emoji/chart_with_downwards_trend.png b/public/-/emojis/1/chart_with_downwards_trend.png
index 5222ec72d85..5222ec72d85 100644
--- a/app/assets/images/emoji/chart_with_downwards_trend.png
+++ b/public/-/emojis/1/chart_with_downwards_trend.png
Binary files differ
diff --git a/app/assets/images/emoji/chart_with_upwards_trend.png b/public/-/emojis/1/chart_with_upwards_trend.png
index f13cfcf9956..f13cfcf9956 100644
--- a/app/assets/images/emoji/chart_with_upwards_trend.png
+++ b/public/-/emojis/1/chart_with_upwards_trend.png
Binary files differ
diff --git a/app/assets/images/emoji/checkered_flag.png b/public/-/emojis/1/checkered_flag.png
index 5a71eecb89b..5a71eecb89b 100644
--- a/app/assets/images/emoji/checkered_flag.png
+++ b/public/-/emojis/1/checkered_flag.png
Binary files differ
diff --git a/app/assets/images/emoji/cheese.png b/public/-/emojis/1/cheese.png
index 00e99762286..00e99762286 100644
--- a/app/assets/images/emoji/cheese.png
+++ b/public/-/emojis/1/cheese.png
Binary files differ
diff --git a/app/assets/images/emoji/cherries.png b/public/-/emojis/1/cherries.png
index 9b10cbaac5e..9b10cbaac5e 100644
--- a/app/assets/images/emoji/cherries.png
+++ b/public/-/emojis/1/cherries.png
Binary files differ
diff --git a/app/assets/images/emoji/cherry_blossom.png b/public/-/emojis/1/cherry_blossom.png
index 282f3e7bc81..282f3e7bc81 100644
--- a/app/assets/images/emoji/cherry_blossom.png
+++ b/public/-/emojis/1/cherry_blossom.png
Binary files differ
diff --git a/app/assets/images/emoji/chestnut.png b/public/-/emojis/1/chestnut.png
index e9fb40468ed..e9fb40468ed 100644
--- a/app/assets/images/emoji/chestnut.png
+++ b/public/-/emojis/1/chestnut.png
Binary files differ
diff --git a/app/assets/images/emoji/chicken.png b/public/-/emojis/1/chicken.png
index 9a6992e55ba..9a6992e55ba 100644
--- a/app/assets/images/emoji/chicken.png
+++ b/public/-/emojis/1/chicken.png
Binary files differ
diff --git a/app/assets/images/emoji/children_crossing.png b/public/-/emojis/1/children_crossing.png
index fa4c091c7c3..fa4c091c7c3 100644
--- a/app/assets/images/emoji/children_crossing.png
+++ b/public/-/emojis/1/children_crossing.png
Binary files differ
diff --git a/app/assets/images/emoji/chipmunk.png b/public/-/emojis/1/chipmunk.png
index 2aac560cb22..2aac560cb22 100644
--- a/app/assets/images/emoji/chipmunk.png
+++ b/public/-/emojis/1/chipmunk.png
Binary files differ
diff --git a/app/assets/images/emoji/chocolate_bar.png b/public/-/emojis/1/chocolate_bar.png
index 318bbd40ef9..318bbd40ef9 100644
--- a/app/assets/images/emoji/chocolate_bar.png
+++ b/public/-/emojis/1/chocolate_bar.png
Binary files differ
diff --git a/app/assets/images/emoji/christmas_tree.png b/public/-/emojis/1/christmas_tree.png
index 4197d37a52b..4197d37a52b 100644
--- a/app/assets/images/emoji/christmas_tree.png
+++ b/public/-/emojis/1/christmas_tree.png
Binary files differ
diff --git a/app/assets/images/emoji/church.png b/public/-/emojis/1/church.png
index 8242fd272b3..8242fd272b3 100644
--- a/app/assets/images/emoji/church.png
+++ b/public/-/emojis/1/church.png
Binary files differ
diff --git a/app/assets/images/emoji/cinema.png b/public/-/emojis/1/cinema.png
index 65f27b386f2..65f27b386f2 100644
--- a/app/assets/images/emoji/cinema.png
+++ b/public/-/emojis/1/cinema.png
Binary files differ
diff --git a/app/assets/images/emoji/circus_tent.png b/public/-/emojis/1/circus_tent.png
index b0379775b12..b0379775b12 100644
--- a/app/assets/images/emoji/circus_tent.png
+++ b/public/-/emojis/1/circus_tent.png
Binary files differ
diff --git a/app/assets/images/emoji/city_dusk.png b/public/-/emojis/1/city_dusk.png
index 80cdff7cf5d..80cdff7cf5d 100644
--- a/app/assets/images/emoji/city_dusk.png
+++ b/public/-/emojis/1/city_dusk.png
Binary files differ
diff --git a/app/assets/images/emoji/city_sunset.png b/public/-/emojis/1/city_sunset.png
index 7cded0ba55b..7cded0ba55b 100644
--- a/app/assets/images/emoji/city_sunset.png
+++ b/public/-/emojis/1/city_sunset.png
Binary files differ
diff --git a/app/assets/images/emoji/cityscape.png b/public/-/emojis/1/cityscape.png
index d7b9844a0b4..d7b9844a0b4 100644
--- a/app/assets/images/emoji/cityscape.png
+++ b/public/-/emojis/1/cityscape.png
Binary files differ
diff --git a/app/assets/images/emoji/cl.png b/public/-/emojis/1/cl.png
index 8b01b4343e2..8b01b4343e2 100644
--- a/app/assets/images/emoji/cl.png
+++ b/public/-/emojis/1/cl.png
Binary files differ
diff --git a/app/assets/images/emoji/clap.png b/public/-/emojis/1/clap.png
index b0ffe928920..b0ffe928920 100644
--- a/app/assets/images/emoji/clap.png
+++ b/public/-/emojis/1/clap.png
Binary files differ
diff --git a/app/assets/images/emoji/clap_tone1.png b/public/-/emojis/1/clap_tone1.png
index de4bc837b96..de4bc837b96 100644
--- a/app/assets/images/emoji/clap_tone1.png
+++ b/public/-/emojis/1/clap_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/clap_tone2.png b/public/-/emojis/1/clap_tone2.png
index 1323de775ba..1323de775ba 100644
--- a/app/assets/images/emoji/clap_tone2.png
+++ b/public/-/emojis/1/clap_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/clap_tone3.png b/public/-/emojis/1/clap_tone3.png
index d448ca19dde..d448ca19dde 100644
--- a/app/assets/images/emoji/clap_tone3.png
+++ b/public/-/emojis/1/clap_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/clap_tone4.png b/public/-/emojis/1/clap_tone4.png
index c49f44ee91d..c49f44ee91d 100644
--- a/app/assets/images/emoji/clap_tone4.png
+++ b/public/-/emojis/1/clap_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/clap_tone5.png b/public/-/emojis/1/clap_tone5.png
index 29ee9bdf37c..29ee9bdf37c 100644
--- a/app/assets/images/emoji/clap_tone5.png
+++ b/public/-/emojis/1/clap_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/clapper.png b/public/-/emojis/1/clapper.png
index 81390883111..81390883111 100644
--- a/app/assets/images/emoji/clapper.png
+++ b/public/-/emojis/1/clapper.png
Binary files differ
diff --git a/app/assets/images/emoji/classical_building.png b/public/-/emojis/1/classical_building.png
index de7b559daaf..de7b559daaf 100644
--- a/app/assets/images/emoji/classical_building.png
+++ b/public/-/emojis/1/classical_building.png
Binary files differ
diff --git a/app/assets/images/emoji/clipboard.png b/public/-/emojis/1/clipboard.png
index 7edcfc52509..7edcfc52509 100644
--- a/app/assets/images/emoji/clipboard.png
+++ b/public/-/emojis/1/clipboard.png
Binary files differ
diff --git a/app/assets/images/emoji/clock.png b/public/-/emojis/1/clock.png
index ffdb451e3a8..ffdb451e3a8 100644
--- a/app/assets/images/emoji/clock.png
+++ b/public/-/emojis/1/clock.png
Binary files differ
diff --git a/app/assets/images/emoji/clock1.png b/public/-/emojis/1/clock1.png
index d6e34941f23..d6e34941f23 100644
--- a/app/assets/images/emoji/clock1.png
+++ b/public/-/emojis/1/clock1.png
Binary files differ
diff --git a/app/assets/images/emoji/clock10.png b/public/-/emojis/1/clock10.png
index e62b245cdbe..e62b245cdbe 100644
--- a/app/assets/images/emoji/clock10.png
+++ b/public/-/emojis/1/clock10.png
Binary files differ
diff --git a/app/assets/images/emoji/clock1030.png b/public/-/emojis/1/clock1030.png
index 0802b3c65b9..0802b3c65b9 100644
--- a/app/assets/images/emoji/clock1030.png
+++ b/public/-/emojis/1/clock1030.png
Binary files differ
diff --git a/app/assets/images/emoji/clock11.png b/public/-/emojis/1/clock11.png
index 0983345273b..0983345273b 100644
--- a/app/assets/images/emoji/clock11.png
+++ b/public/-/emojis/1/clock11.png
Binary files differ
diff --git a/app/assets/images/emoji/clock1130.png b/public/-/emojis/1/clock1130.png
index d970d03b809..d970d03b809 100644
--- a/app/assets/images/emoji/clock1130.png
+++ b/public/-/emojis/1/clock1130.png
Binary files differ
diff --git a/app/assets/images/emoji/clock12.png b/public/-/emojis/1/clock12.png
index e61caa4b3e2..e61caa4b3e2 100644
--- a/app/assets/images/emoji/clock12.png
+++ b/public/-/emojis/1/clock12.png
Binary files differ
diff --git a/app/assets/images/emoji/clock1230.png b/public/-/emojis/1/clock1230.png
index f2b1d261721..f2b1d261721 100644
--- a/app/assets/images/emoji/clock1230.png
+++ b/public/-/emojis/1/clock1230.png
Binary files differ
diff --git a/app/assets/images/emoji/clock130.png b/public/-/emojis/1/clock130.png
index 86b7689b84e..86b7689b84e 100644
--- a/app/assets/images/emoji/clock130.png
+++ b/public/-/emojis/1/clock130.png
Binary files differ
diff --git a/app/assets/images/emoji/clock2.png b/public/-/emojis/1/clock2.png
index a54253d7d57..a54253d7d57 100644
--- a/app/assets/images/emoji/clock2.png
+++ b/public/-/emojis/1/clock2.png
Binary files differ
diff --git a/app/assets/images/emoji/clock230.png b/public/-/emojis/1/clock230.png
index 7a787e018e6..7a787e018e6 100644
--- a/app/assets/images/emoji/clock230.png
+++ b/public/-/emojis/1/clock230.png
Binary files differ
diff --git a/app/assets/images/emoji/clock3.png b/public/-/emojis/1/clock3.png
index 27ec4b1f514..27ec4b1f514 100644
--- a/app/assets/images/emoji/clock3.png
+++ b/public/-/emojis/1/clock3.png
Binary files differ
diff --git a/app/assets/images/emoji/clock330.png b/public/-/emojis/1/clock330.png
index c6860395cec..c6860395cec 100644
--- a/app/assets/images/emoji/clock330.png
+++ b/public/-/emojis/1/clock330.png
Binary files differ
diff --git a/app/assets/images/emoji/clock4.png b/public/-/emojis/1/clock4.png
index 60a1ef4cc13..60a1ef4cc13 100644
--- a/app/assets/images/emoji/clock4.png
+++ b/public/-/emojis/1/clock4.png
Binary files differ
diff --git a/app/assets/images/emoji/clock430.png b/public/-/emojis/1/clock430.png
index 3c05b362122..3c05b362122 100644
--- a/app/assets/images/emoji/clock430.png
+++ b/public/-/emojis/1/clock430.png
Binary files differ
diff --git a/app/assets/images/emoji/clock5.png b/public/-/emojis/1/clock5.png
index c9382d1e094..c9382d1e094 100644
--- a/app/assets/images/emoji/clock5.png
+++ b/public/-/emojis/1/clock5.png
Binary files differ
diff --git a/app/assets/images/emoji/clock530.png b/public/-/emojis/1/clock530.png
index c21fa926db2..c21fa926db2 100644
--- a/app/assets/images/emoji/clock530.png
+++ b/public/-/emojis/1/clock530.png
Binary files differ
diff --git a/app/assets/images/emoji/clock6.png b/public/-/emojis/1/clock6.png
index 8fd5d3f5bd7..8fd5d3f5bd7 100644
--- a/app/assets/images/emoji/clock6.png
+++ b/public/-/emojis/1/clock6.png
Binary files differ
diff --git a/app/assets/images/emoji/clock630.png b/public/-/emojis/1/clock630.png
index 2aec87fefcf..2aec87fefcf 100644
--- a/app/assets/images/emoji/clock630.png
+++ b/public/-/emojis/1/clock630.png
Binary files differ
diff --git a/app/assets/images/emoji/clock7.png b/public/-/emojis/1/clock7.png
index 8c7084036f2..8c7084036f2 100644
--- a/app/assets/images/emoji/clock7.png
+++ b/public/-/emojis/1/clock7.png
Binary files differ
diff --git a/app/assets/images/emoji/clock730.png b/public/-/emojis/1/clock730.png
index f7a1135e03f..f7a1135e03f 100644
--- a/app/assets/images/emoji/clock730.png
+++ b/public/-/emojis/1/clock730.png
Binary files differ
diff --git a/app/assets/images/emoji/clock8.png b/public/-/emojis/1/clock8.png
index fcddf722e95..fcddf722e95 100644
--- a/app/assets/images/emoji/clock8.png
+++ b/public/-/emojis/1/clock8.png
Binary files differ
diff --git a/app/assets/images/emoji/clock830.png b/public/-/emojis/1/clock830.png
index 799b4aebc08..799b4aebc08 100644
--- a/app/assets/images/emoji/clock830.png
+++ b/public/-/emojis/1/clock830.png
Binary files differ
diff --git a/app/assets/images/emoji/clock9.png b/public/-/emojis/1/clock9.png
index dfbe0117981..dfbe0117981 100644
--- a/app/assets/images/emoji/clock9.png
+++ b/public/-/emojis/1/clock9.png
Binary files differ
diff --git a/app/assets/images/emoji/clock930.png b/public/-/emojis/1/clock930.png
index 4a2092ee6f0..4a2092ee6f0 100644
--- a/app/assets/images/emoji/clock930.png
+++ b/public/-/emojis/1/clock930.png
Binary files differ
diff --git a/app/assets/images/emoji/closed_book.png b/public/-/emojis/1/closed_book.png
index 6395cf2151e..6395cf2151e 100644
--- a/app/assets/images/emoji/closed_book.png
+++ b/public/-/emojis/1/closed_book.png
Binary files differ
diff --git a/app/assets/images/emoji/closed_lock_with_key.png b/public/-/emojis/1/closed_lock_with_key.png
index 1c1cd5d0741..1c1cd5d0741 100644
--- a/app/assets/images/emoji/closed_lock_with_key.png
+++ b/public/-/emojis/1/closed_lock_with_key.png
Binary files differ
diff --git a/app/assets/images/emoji/closed_umbrella.png b/public/-/emojis/1/closed_umbrella.png
index ecefba9e446..ecefba9e446 100644
--- a/app/assets/images/emoji/closed_umbrella.png
+++ b/public/-/emojis/1/closed_umbrella.png
Binary files differ
diff --git a/app/assets/images/emoji/cloud.png b/public/-/emojis/1/cloud.png
index 5b4f57f77ba..5b4f57f77ba 100644
--- a/app/assets/images/emoji/cloud.png
+++ b/public/-/emojis/1/cloud.png
Binary files differ
diff --git a/app/assets/images/emoji/cloud_lightning.png b/public/-/emojis/1/cloud_lightning.png
index 0831e88aa31..0831e88aa31 100644
--- a/app/assets/images/emoji/cloud_lightning.png
+++ b/public/-/emojis/1/cloud_lightning.png
Binary files differ
diff --git a/app/assets/images/emoji/cloud_rain.png b/public/-/emojis/1/cloud_rain.png
index 385685e0512..385685e0512 100644
--- a/app/assets/images/emoji/cloud_rain.png
+++ b/public/-/emojis/1/cloud_rain.png
Binary files differ
diff --git a/app/assets/images/emoji/cloud_snow.png b/public/-/emojis/1/cloud_snow.png
index 9720384eb99..9720384eb99 100644
--- a/app/assets/images/emoji/cloud_snow.png
+++ b/public/-/emojis/1/cloud_snow.png
Binary files differ
diff --git a/app/assets/images/emoji/cloud_tornado.png b/public/-/emojis/1/cloud_tornado.png
index 4821c89da1e..4821c89da1e 100644
--- a/app/assets/images/emoji/cloud_tornado.png
+++ b/public/-/emojis/1/cloud_tornado.png
Binary files differ
diff --git a/app/assets/images/emoji/clown.png b/public/-/emojis/1/clown.png
index 02b7ff70049..02b7ff70049 100644
--- a/app/assets/images/emoji/clown.png
+++ b/public/-/emojis/1/clown.png
Binary files differ
diff --git a/app/assets/images/emoji/clubs.png b/public/-/emojis/1/clubs.png
index 4f2abf791ca..4f2abf791ca 100644
--- a/app/assets/images/emoji/clubs.png
+++ b/public/-/emojis/1/clubs.png
Binary files differ
diff --git a/app/assets/images/emoji/cocktail.png b/public/-/emojis/1/cocktail.png
index 2e50c57e98d..2e50c57e98d 100644
--- a/app/assets/images/emoji/cocktail.png
+++ b/public/-/emojis/1/cocktail.png
Binary files differ
diff --git a/app/assets/images/emoji/coffee.png b/public/-/emojis/1/coffee.png
index 553061471b1..553061471b1 100644
--- a/app/assets/images/emoji/coffee.png
+++ b/public/-/emojis/1/coffee.png
Binary files differ
diff --git a/app/assets/images/emoji/coffin.png b/public/-/emojis/1/coffin.png
index fb2932aa5f6..fb2932aa5f6 100644
--- a/app/assets/images/emoji/coffin.png
+++ b/public/-/emojis/1/coffin.png
Binary files differ
diff --git a/app/assets/images/emoji/cold_sweat.png b/public/-/emojis/1/cold_sweat.png
index 85b2231bbf6..85b2231bbf6 100644
--- a/app/assets/images/emoji/cold_sweat.png
+++ b/public/-/emojis/1/cold_sweat.png
Binary files differ
diff --git a/app/assets/images/emoji/comet.png b/public/-/emojis/1/comet.png
index a99751f79be..a99751f79be 100644
--- a/app/assets/images/emoji/comet.png
+++ b/public/-/emojis/1/comet.png
Binary files differ
diff --git a/app/assets/images/emoji/compression.png b/public/-/emojis/1/compression.png
index d7eda7f362a..d7eda7f362a 100644
--- a/app/assets/images/emoji/compression.png
+++ b/public/-/emojis/1/compression.png
Binary files differ
diff --git a/app/assets/images/emoji/computer.png b/public/-/emojis/1/computer.png
index c1fee27e3a9..c1fee27e3a9 100644
--- a/app/assets/images/emoji/computer.png
+++ b/public/-/emojis/1/computer.png
Binary files differ
diff --git a/app/assets/images/emoji/confetti_ball.png b/public/-/emojis/1/confetti_ball.png
index ba4fd9b12be..ba4fd9b12be 100644
--- a/app/assets/images/emoji/confetti_ball.png
+++ b/public/-/emojis/1/confetti_ball.png
Binary files differ
diff --git a/app/assets/images/emoji/confounded.png b/public/-/emojis/1/confounded.png
index aa4b29e9375..aa4b29e9375 100644
--- a/app/assets/images/emoji/confounded.png
+++ b/public/-/emojis/1/confounded.png
Binary files differ
diff --git a/app/assets/images/emoji/confused.png b/public/-/emojis/1/confused.png
index 502b6bf0e0b..502b6bf0e0b 100644
--- a/app/assets/images/emoji/confused.png
+++ b/public/-/emojis/1/confused.png
Binary files differ
diff --git a/app/assets/images/emoji/congratulations.png b/public/-/emojis/1/congratulations.png
index ba8c89d95ee..ba8c89d95ee 100644
--- a/app/assets/images/emoji/congratulations.png
+++ b/public/-/emojis/1/congratulations.png
Binary files differ
diff --git a/app/assets/images/emoji/construction.png b/public/-/emojis/1/construction.png
index ef8db5f471c..ef8db5f471c 100644
--- a/app/assets/images/emoji/construction.png
+++ b/public/-/emojis/1/construction.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_site.png b/public/-/emojis/1/construction_site.png
index 8206a20f63f..8206a20f63f 100644
--- a/app/assets/images/emoji/construction_site.png
+++ b/public/-/emojis/1/construction_site.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker.png b/public/-/emojis/1/construction_worker.png
index a9970a89005..a9970a89005 100644
--- a/app/assets/images/emoji/construction_worker.png
+++ b/public/-/emojis/1/construction_worker.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker_tone1.png b/public/-/emojis/1/construction_worker_tone1.png
index 2f24a2bab24..2f24a2bab24 100644
--- a/app/assets/images/emoji/construction_worker_tone1.png
+++ b/public/-/emojis/1/construction_worker_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker_tone2.png b/public/-/emojis/1/construction_worker_tone2.png
index 93c8fec5a75..93c8fec5a75 100644
--- a/app/assets/images/emoji/construction_worker_tone2.png
+++ b/public/-/emojis/1/construction_worker_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker_tone3.png b/public/-/emojis/1/construction_worker_tone3.png
index abc1f2af2e0..abc1f2af2e0 100644
--- a/app/assets/images/emoji/construction_worker_tone3.png
+++ b/public/-/emojis/1/construction_worker_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker_tone4.png b/public/-/emojis/1/construction_worker_tone4.png
index eed83289aeb..eed83289aeb 100644
--- a/app/assets/images/emoji/construction_worker_tone4.png
+++ b/public/-/emojis/1/construction_worker_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/construction_worker_tone5.png b/public/-/emojis/1/construction_worker_tone5.png
index acbb220b8bb..acbb220b8bb 100644
--- a/app/assets/images/emoji/construction_worker_tone5.png
+++ b/public/-/emojis/1/construction_worker_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/control_knobs.png b/public/-/emojis/1/control_knobs.png
index 6635ac93b50..6635ac93b50 100644
--- a/app/assets/images/emoji/control_knobs.png
+++ b/public/-/emojis/1/control_knobs.png
Binary files differ
diff --git a/app/assets/images/emoji/convenience_store.png b/public/-/emojis/1/convenience_store.png
index 26b53b5669e..26b53b5669e 100644
--- a/app/assets/images/emoji/convenience_store.png
+++ b/public/-/emojis/1/convenience_store.png
Binary files differ
diff --git a/app/assets/images/emoji/cookie.png b/public/-/emojis/1/cookie.png
index 1b6bcb1554f..1b6bcb1554f 100644
--- a/app/assets/images/emoji/cookie.png
+++ b/public/-/emojis/1/cookie.png
Binary files differ
diff --git a/app/assets/images/emoji/cooking.png b/public/-/emojis/1/cooking.png
index 918c980577a..918c980577a 100644
--- a/app/assets/images/emoji/cooking.png
+++ b/public/-/emojis/1/cooking.png
Binary files differ
diff --git a/app/assets/images/emoji/cool.png b/public/-/emojis/1/cool.png
index 74674978d00..74674978d00 100644
--- a/app/assets/images/emoji/cool.png
+++ b/public/-/emojis/1/cool.png
Binary files differ
diff --git a/app/assets/images/emoji/cop.png b/public/-/emojis/1/cop.png
index 0b16d7c17b7..0b16d7c17b7 100644
--- a/app/assets/images/emoji/cop.png
+++ b/public/-/emojis/1/cop.png
Binary files differ
diff --git a/app/assets/images/emoji/cop_tone1.png b/public/-/emojis/1/cop_tone1.png
index 6ccba3879dc..6ccba3879dc 100644
--- a/app/assets/images/emoji/cop_tone1.png
+++ b/public/-/emojis/1/cop_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/cop_tone2.png b/public/-/emojis/1/cop_tone2.png
index 7814ea9f52d..7814ea9f52d 100644
--- a/app/assets/images/emoji/cop_tone2.png
+++ b/public/-/emojis/1/cop_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/cop_tone3.png b/public/-/emojis/1/cop_tone3.png
index d78e88ec872..d78e88ec872 100644
--- a/app/assets/images/emoji/cop_tone3.png
+++ b/public/-/emojis/1/cop_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/cop_tone4.png b/public/-/emojis/1/cop_tone4.png
index 2e13c508315..2e13c508315 100644
--- a/app/assets/images/emoji/cop_tone4.png
+++ b/public/-/emojis/1/cop_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/cop_tone5.png b/public/-/emojis/1/cop_tone5.png
index 2980d61cc2e..2980d61cc2e 100644
--- a/app/assets/images/emoji/cop_tone5.png
+++ b/public/-/emojis/1/cop_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/copyright.png b/public/-/emojis/1/copyright.png
index 6b9a6adbfd2..6b9a6adbfd2 100644
--- a/app/assets/images/emoji/copyright.png
+++ b/public/-/emojis/1/copyright.png
Binary files differ
diff --git a/app/assets/images/emoji/corn.png b/public/-/emojis/1/corn.png
index 36e20127931..36e20127931 100644
--- a/app/assets/images/emoji/corn.png
+++ b/public/-/emojis/1/corn.png
Binary files differ
diff --git a/app/assets/images/emoji/couch.png b/public/-/emojis/1/couch.png
index 27b19b13bb0..27b19b13bb0 100644
--- a/app/assets/images/emoji/couch.png
+++ b/public/-/emojis/1/couch.png
Binary files differ
diff --git a/app/assets/images/emoji/couple.png b/public/-/emojis/1/couple.png
index 960323f3c16..960323f3c16 100644
--- a/app/assets/images/emoji/couple.png
+++ b/public/-/emojis/1/couple.png
Binary files differ
diff --git a/app/assets/images/emoji/couple_mm.png b/public/-/emojis/1/couple_mm.png
index 8759fa5db87..8759fa5db87 100644
--- a/app/assets/images/emoji/couple_mm.png
+++ b/public/-/emojis/1/couple_mm.png
Binary files differ
diff --git a/app/assets/images/emoji/couple_with_heart.png b/public/-/emojis/1/couple_with_heart.png
index 62111601b36..62111601b36 100644
--- a/app/assets/images/emoji/couple_with_heart.png
+++ b/public/-/emojis/1/couple_with_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/couple_ww.png b/public/-/emojis/1/couple_ww.png
index 08fdabcdc5c..08fdabcdc5c 100644
--- a/app/assets/images/emoji/couple_ww.png
+++ b/public/-/emojis/1/couple_ww.png
Binary files differ
diff --git a/app/assets/images/emoji/couplekiss.png b/public/-/emojis/1/couplekiss.png
index 9aa519da9e8..9aa519da9e8 100644
--- a/app/assets/images/emoji/couplekiss.png
+++ b/public/-/emojis/1/couplekiss.png
Binary files differ
diff --git a/app/assets/images/emoji/cow.png b/public/-/emojis/1/cow.png
index 718a3986d64..718a3986d64 100644
--- a/app/assets/images/emoji/cow.png
+++ b/public/-/emojis/1/cow.png
Binary files differ
diff --git a/app/assets/images/emoji/cow2.png b/public/-/emojis/1/cow2.png
index 4d0ca534ff1..4d0ca534ff1 100644
--- a/app/assets/images/emoji/cow2.png
+++ b/public/-/emojis/1/cow2.png
Binary files differ
diff --git a/app/assets/images/emoji/cowboy.png b/public/-/emojis/1/cowboy.png
index 70dd5d0d9d1..70dd5d0d9d1 100644
--- a/app/assets/images/emoji/cowboy.png
+++ b/public/-/emojis/1/cowboy.png
Binary files differ
diff --git a/app/assets/images/emoji/crab.png b/public/-/emojis/1/crab.png
index 19f3047ab61..19f3047ab61 100644
--- a/app/assets/images/emoji/crab.png
+++ b/public/-/emojis/1/crab.png
Binary files differ
diff --git a/app/assets/images/emoji/crayon.png b/public/-/emojis/1/crayon.png
index 8d7b427aaa3..8d7b427aaa3 100644
--- a/app/assets/images/emoji/crayon.png
+++ b/public/-/emojis/1/crayon.png
Binary files differ
diff --git a/app/assets/images/emoji/credit_card.png b/public/-/emojis/1/credit_card.png
index 372777d5c61..372777d5c61 100644
--- a/app/assets/images/emoji/credit_card.png
+++ b/public/-/emojis/1/credit_card.png
Binary files differ
diff --git a/app/assets/images/emoji/crescent_moon.png b/public/-/emojis/1/crescent_moon.png
index 765420ecec7..765420ecec7 100644
--- a/app/assets/images/emoji/crescent_moon.png
+++ b/public/-/emojis/1/crescent_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/cricket.png b/public/-/emojis/1/cricket.png
index d602294a2cd..d602294a2cd 100644
--- a/app/assets/images/emoji/cricket.png
+++ b/public/-/emojis/1/cricket.png
Binary files differ
diff --git a/app/assets/images/emoji/crocodile.png b/public/-/emojis/1/crocodile.png
index 3005c46f176..3005c46f176 100644
--- a/app/assets/images/emoji/crocodile.png
+++ b/public/-/emojis/1/crocodile.png
Binary files differ
diff --git a/app/assets/images/emoji/croissant.png b/public/-/emojis/1/croissant.png
index fb33feb1a38..fb33feb1a38 100644
--- a/app/assets/images/emoji/croissant.png
+++ b/public/-/emojis/1/croissant.png
Binary files differ
diff --git a/app/assets/images/emoji/cross.png b/public/-/emojis/1/cross.png
index 42b10e82257..42b10e82257 100644
--- a/app/assets/images/emoji/cross.png
+++ b/public/-/emojis/1/cross.png
Binary files differ
diff --git a/app/assets/images/emoji/crossed_flags.png b/public/-/emojis/1/crossed_flags.png
index 273bd0f0fe5..273bd0f0fe5 100644
--- a/app/assets/images/emoji/crossed_flags.png
+++ b/public/-/emojis/1/crossed_flags.png
Binary files differ
diff --git a/app/assets/images/emoji/crossed_swords.png b/public/-/emojis/1/crossed_swords.png
index 907e9607134..907e9607134 100644
--- a/app/assets/images/emoji/crossed_swords.png
+++ b/public/-/emojis/1/crossed_swords.png
Binary files differ
diff --git a/app/assets/images/emoji/crown.png b/public/-/emojis/1/crown.png
index 93b82d92f04..93b82d92f04 100644
--- a/app/assets/images/emoji/crown.png
+++ b/public/-/emojis/1/crown.png
Binary files differ
diff --git a/app/assets/images/emoji/cruise_ship.png b/public/-/emojis/1/cruise_ship.png
index 19d4acbe40c..19d4acbe40c 100644
--- a/app/assets/images/emoji/cruise_ship.png
+++ b/public/-/emojis/1/cruise_ship.png
Binary files differ
diff --git a/app/assets/images/emoji/cry.png b/public/-/emojis/1/cry.png
index b7877f8a173..b7877f8a173 100644
--- a/app/assets/images/emoji/cry.png
+++ b/public/-/emojis/1/cry.png
Binary files differ
diff --git a/app/assets/images/emoji/crying_cat_face.png b/public/-/emojis/1/crying_cat_face.png
index b4f49715e00..b4f49715e00 100644
--- a/app/assets/images/emoji/crying_cat_face.png
+++ b/public/-/emojis/1/crying_cat_face.png
Binary files differ
diff --git a/app/assets/images/emoji/crystal_ball.png b/public/-/emojis/1/crystal_ball.png
index 485d5c888f1..485d5c888f1 100644
--- a/app/assets/images/emoji/crystal_ball.png
+++ b/public/-/emojis/1/crystal_ball.png
Binary files differ
diff --git a/app/assets/images/emoji/cucumber.png b/public/-/emojis/1/cucumber.png
index 500807059d2..500807059d2 100644
--- a/app/assets/images/emoji/cucumber.png
+++ b/public/-/emojis/1/cucumber.png
Binary files differ
diff --git a/app/assets/images/emoji/cupid.png b/public/-/emojis/1/cupid.png
index 2df0078ddd1..2df0078ddd1 100644
--- a/app/assets/images/emoji/cupid.png
+++ b/public/-/emojis/1/cupid.png
Binary files differ
diff --git a/app/assets/images/emoji/curly_loop.png b/public/-/emojis/1/curly_loop.png
index 440aa56d50e..440aa56d50e 100644
--- a/app/assets/images/emoji/curly_loop.png
+++ b/public/-/emojis/1/curly_loop.png
Binary files differ
diff --git a/app/assets/images/emoji/currency_exchange.png b/public/-/emojis/1/currency_exchange.png
index 4d46c6050e7..4d46c6050e7 100644
--- a/app/assets/images/emoji/currency_exchange.png
+++ b/public/-/emojis/1/currency_exchange.png
Binary files differ
diff --git a/app/assets/images/emoji/curry.png b/public/-/emojis/1/curry.png
index 69657ca8103..69657ca8103 100644
--- a/app/assets/images/emoji/curry.png
+++ b/public/-/emojis/1/curry.png
Binary files differ
diff --git a/app/assets/images/emoji/custard.png b/public/-/emojis/1/custard.png
index fa3df67b8f6..fa3df67b8f6 100644
--- a/app/assets/images/emoji/custard.png
+++ b/public/-/emojis/1/custard.png
Binary files differ
diff --git a/app/assets/images/emoji/customs.png b/public/-/emojis/1/customs.png
index 21b7ce2c69e..21b7ce2c69e 100644
--- a/app/assets/images/emoji/customs.png
+++ b/public/-/emojis/1/customs.png
Binary files differ
diff --git a/app/assets/images/emoji/cyclone.png b/public/-/emojis/1/cyclone.png
index ff00b1afe70..ff00b1afe70 100644
--- a/app/assets/images/emoji/cyclone.png
+++ b/public/-/emojis/1/cyclone.png
Binary files differ
diff --git a/app/assets/images/emoji/dagger.png b/public/-/emojis/1/dagger.png
index 66e97b0aa25..66e97b0aa25 100644
--- a/app/assets/images/emoji/dagger.png
+++ b/public/-/emojis/1/dagger.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer.png b/public/-/emojis/1/dancer.png
index 04b166991cb..04b166991cb 100644
--- a/app/assets/images/emoji/dancer.png
+++ b/public/-/emojis/1/dancer.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer_tone1.png b/public/-/emojis/1/dancer_tone1.png
index 2c7b11c3a6e..2c7b11c3a6e 100644
--- a/app/assets/images/emoji/dancer_tone1.png
+++ b/public/-/emojis/1/dancer_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer_tone2.png b/public/-/emojis/1/dancer_tone2.png
index cb04b1f907e..cb04b1f907e 100644
--- a/app/assets/images/emoji/dancer_tone2.png
+++ b/public/-/emojis/1/dancer_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer_tone3.png b/public/-/emojis/1/dancer_tone3.png
index 98c5bca7b64..98c5bca7b64 100644
--- a/app/assets/images/emoji/dancer_tone3.png
+++ b/public/-/emojis/1/dancer_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer_tone4.png b/public/-/emojis/1/dancer_tone4.png
index fdb1e00cbba..fdb1e00cbba 100644
--- a/app/assets/images/emoji/dancer_tone4.png
+++ b/public/-/emojis/1/dancer_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/dancer_tone5.png b/public/-/emojis/1/dancer_tone5.png
index 0e34e0e23f0..0e34e0e23f0 100644
--- a/app/assets/images/emoji/dancer_tone5.png
+++ b/public/-/emojis/1/dancer_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/dancers.png b/public/-/emojis/1/dancers.png
index 67e6ffacb76..67e6ffacb76 100644
--- a/app/assets/images/emoji/dancers.png
+++ b/public/-/emojis/1/dancers.png
Binary files differ
diff --git a/app/assets/images/emoji/dango.png b/public/-/emojis/1/dango.png
index f73f37b01c7..f73f37b01c7 100644
--- a/app/assets/images/emoji/dango.png
+++ b/public/-/emojis/1/dango.png
Binary files differ
diff --git a/app/assets/images/emoji/dark_sunglasses.png b/public/-/emojis/1/dark_sunglasses.png
index b1b6db0acff..b1b6db0acff 100644
--- a/app/assets/images/emoji/dark_sunglasses.png
+++ b/public/-/emojis/1/dark_sunglasses.png
Binary files differ
diff --git a/app/assets/images/emoji/dart.png b/public/-/emojis/1/dart.png
index f6704aeb8ba..f6704aeb8ba 100644
--- a/app/assets/images/emoji/dart.png
+++ b/public/-/emojis/1/dart.png
Binary files differ
diff --git a/app/assets/images/emoji/dash.png b/public/-/emojis/1/dash.png
index 064b8525c12..064b8525c12 100644
--- a/app/assets/images/emoji/dash.png
+++ b/public/-/emojis/1/dash.png
Binary files differ
diff --git a/app/assets/images/emoji/date.png b/public/-/emojis/1/date.png
index f05b3da97b8..f05b3da97b8 100644
--- a/app/assets/images/emoji/date.png
+++ b/public/-/emojis/1/date.png
Binary files differ
diff --git a/app/assets/images/emoji/deciduous_tree.png b/public/-/emojis/1/deciduous_tree.png
index 785fc1c30ea..785fc1c30ea 100644
--- a/app/assets/images/emoji/deciduous_tree.png
+++ b/public/-/emojis/1/deciduous_tree.png
Binary files differ
diff --git a/app/assets/images/emoji/deer.png b/public/-/emojis/1/deer.png
index d8698195ff0..d8698195ff0 100644
--- a/app/assets/images/emoji/deer.png
+++ b/public/-/emojis/1/deer.png
Binary files differ
diff --git a/app/assets/images/emoji/department_store.png b/public/-/emojis/1/department_store.png
index 58867c7a6e1..58867c7a6e1 100644
--- a/app/assets/images/emoji/department_store.png
+++ b/public/-/emojis/1/department_store.png
Binary files differ
diff --git a/app/assets/images/emoji/desert.png b/public/-/emojis/1/desert.png
index e9966ff8c65..e9966ff8c65 100644
--- a/app/assets/images/emoji/desert.png
+++ b/public/-/emojis/1/desert.png
Binary files differ
diff --git a/app/assets/images/emoji/desktop.png b/public/-/emojis/1/desktop.png
index 909bd42b5e1..909bd42b5e1 100644
--- a/app/assets/images/emoji/desktop.png
+++ b/public/-/emojis/1/desktop.png
Binary files differ
diff --git a/app/assets/images/emoji/diamond_shape_with_a_dot_inside.png b/public/-/emojis/1/diamond_shape_with_a_dot_inside.png
index 2a22a26d1e2..2a22a26d1e2 100644
--- a/app/assets/images/emoji/diamond_shape_with_a_dot_inside.png
+++ b/public/-/emojis/1/diamond_shape_with_a_dot_inside.png
Binary files differ
diff --git a/app/assets/images/emoji/diamonds.png b/public/-/emojis/1/diamonds.png
index 1f25f51f97a..1f25f51f97a 100644
--- a/app/assets/images/emoji/diamonds.png
+++ b/public/-/emojis/1/diamonds.png
Binary files differ
diff --git a/app/assets/images/emoji/disappointed.png b/public/-/emojis/1/disappointed.png
index efe4e67e23c..efe4e67e23c 100644
--- a/app/assets/images/emoji/disappointed.png
+++ b/public/-/emojis/1/disappointed.png
Binary files differ
diff --git a/app/assets/images/emoji/disappointed_relieved.png b/public/-/emojis/1/disappointed_relieved.png
index aef864d2b3d..aef864d2b3d 100644
--- a/app/assets/images/emoji/disappointed_relieved.png
+++ b/public/-/emojis/1/disappointed_relieved.png
Binary files differ
diff --git a/app/assets/images/emoji/dividers.png b/public/-/emojis/1/dividers.png
index 46a7e403f9d..46a7e403f9d 100644
--- a/app/assets/images/emoji/dividers.png
+++ b/public/-/emojis/1/dividers.png
Binary files differ
diff --git a/app/assets/images/emoji/dizzy.png b/public/-/emojis/1/dizzy.png
index 85f52efad24..85f52efad24 100644
--- a/app/assets/images/emoji/dizzy.png
+++ b/public/-/emojis/1/dizzy.png
Binary files differ
diff --git a/app/assets/images/emoji/dizzy_face.png b/public/-/emojis/1/dizzy_face.png
index 3120316ab5e..3120316ab5e 100644
--- a/app/assets/images/emoji/dizzy_face.png
+++ b/public/-/emojis/1/dizzy_face.png
Binary files differ
diff --git a/app/assets/images/emoji/do_not_litter.png b/public/-/emojis/1/do_not_litter.png
index 341d2575f4f..341d2575f4f 100644
--- a/app/assets/images/emoji/do_not_litter.png
+++ b/public/-/emojis/1/do_not_litter.png
Binary files differ
diff --git a/app/assets/images/emoji/dog.png b/public/-/emojis/1/dog.png
index 281b81d58bd..281b81d58bd 100644
--- a/app/assets/images/emoji/dog.png
+++ b/public/-/emojis/1/dog.png
Binary files differ
diff --git a/app/assets/images/emoji/dog2.png b/public/-/emojis/1/dog2.png
index 976143dbdbe..976143dbdbe 100644
--- a/app/assets/images/emoji/dog2.png
+++ b/public/-/emojis/1/dog2.png
Binary files differ
diff --git a/app/assets/images/emoji/dollar.png b/public/-/emojis/1/dollar.png
index a9904c28293..a9904c28293 100644
--- a/app/assets/images/emoji/dollar.png
+++ b/public/-/emojis/1/dollar.png
Binary files differ
diff --git a/app/assets/images/emoji/dolls.png b/public/-/emojis/1/dolls.png
index 10955615110..10955615110 100644
--- a/app/assets/images/emoji/dolls.png
+++ b/public/-/emojis/1/dolls.png
Binary files differ
diff --git a/app/assets/images/emoji/dolphin.png b/public/-/emojis/1/dolphin.png
index 81434809003..81434809003 100644
--- a/app/assets/images/emoji/dolphin.png
+++ b/public/-/emojis/1/dolphin.png
Binary files differ
diff --git a/app/assets/images/emoji/door.png b/public/-/emojis/1/door.png
index 36ae3e27494..36ae3e27494 100644
--- a/app/assets/images/emoji/door.png
+++ b/public/-/emojis/1/door.png
Binary files differ
diff --git a/app/assets/images/emoji/doughnut.png b/public/-/emojis/1/doughnut.png
index 0ca4cd0bde8..0ca4cd0bde8 100644
--- a/app/assets/images/emoji/doughnut.png
+++ b/public/-/emojis/1/doughnut.png
Binary files differ
diff --git a/app/assets/images/emoji/dove.png b/public/-/emojis/1/dove.png
index 9580c4917d7..9580c4917d7 100644
--- a/app/assets/images/emoji/dove.png
+++ b/public/-/emojis/1/dove.png
Binary files differ
diff --git a/app/assets/images/emoji/dragon.png b/public/-/emojis/1/dragon.png
index d6311cf5429..d6311cf5429 100644
--- a/app/assets/images/emoji/dragon.png
+++ b/public/-/emojis/1/dragon.png
Binary files differ
diff --git a/app/assets/images/emoji/dragon_face.png b/public/-/emojis/1/dragon_face.png
index 3c2720446c6..3c2720446c6 100644
--- a/app/assets/images/emoji/dragon_face.png
+++ b/public/-/emojis/1/dragon_face.png
Binary files differ
diff --git a/app/assets/images/emoji/dress.png b/public/-/emojis/1/dress.png
index a697ca5c57d..a697ca5c57d 100644
--- a/app/assets/images/emoji/dress.png
+++ b/public/-/emojis/1/dress.png
Binary files differ
diff --git a/app/assets/images/emoji/dromedary_camel.png b/public/-/emojis/1/dromedary_camel.png
index 5271637c7c4..5271637c7c4 100644
--- a/app/assets/images/emoji/dromedary_camel.png
+++ b/public/-/emojis/1/dromedary_camel.png
Binary files differ
diff --git a/app/assets/images/emoji/drooling_face.png b/public/-/emojis/1/drooling_face.png
index a5460532597..a5460532597 100644
--- a/app/assets/images/emoji/drooling_face.png
+++ b/public/-/emojis/1/drooling_face.png
Binary files differ
diff --git a/app/assets/images/emoji/droplet.png b/public/-/emojis/1/droplet.png
index 71241ec3061..71241ec3061 100644
--- a/app/assets/images/emoji/droplet.png
+++ b/public/-/emojis/1/droplet.png
Binary files differ
diff --git a/app/assets/images/emoji/drum.png b/public/-/emojis/1/drum.png
index b038727cc99..b038727cc99 100644
--- a/app/assets/images/emoji/drum.png
+++ b/public/-/emojis/1/drum.png
Binary files differ
diff --git a/app/assets/images/emoji/duck.png b/public/-/emojis/1/duck.png
index 74330b77ca3..74330b77ca3 100644
--- a/app/assets/images/emoji/duck.png
+++ b/public/-/emojis/1/duck.png
Binary files differ
diff --git a/app/assets/images/emoji/dvd.png b/public/-/emojis/1/dvd.png
index 045a6f7a08d..045a6f7a08d 100644
--- a/app/assets/images/emoji/dvd.png
+++ b/public/-/emojis/1/dvd.png
Binary files differ
diff --git a/app/assets/images/emoji/e-mail.png b/public/-/emojis/1/e-mail.png
index d22e654a20b..d22e654a20b 100644
--- a/app/assets/images/emoji/e-mail.png
+++ b/public/-/emojis/1/e-mail.png
Binary files differ
diff --git a/app/assets/images/emoji/eagle.png b/public/-/emojis/1/eagle.png
index 4f277debeef..4f277debeef 100644
--- a/app/assets/images/emoji/eagle.png
+++ b/public/-/emojis/1/eagle.png
Binary files differ
diff --git a/app/assets/images/emoji/ear.png b/public/-/emojis/1/ear.png
index f84f9ff154a..f84f9ff154a 100644
--- a/app/assets/images/emoji/ear.png
+++ b/public/-/emojis/1/ear.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_of_rice.png b/public/-/emojis/1/ear_of_rice.png
index 3564d9d643a..3564d9d643a 100644
--- a/app/assets/images/emoji/ear_of_rice.png
+++ b/public/-/emojis/1/ear_of_rice.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_tone1.png b/public/-/emojis/1/ear_tone1.png
index d09e1e41996..d09e1e41996 100644
--- a/app/assets/images/emoji/ear_tone1.png
+++ b/public/-/emojis/1/ear_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_tone2.png b/public/-/emojis/1/ear_tone2.png
index 300d60a9948..300d60a9948 100644
--- a/app/assets/images/emoji/ear_tone2.png
+++ b/public/-/emojis/1/ear_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_tone3.png b/public/-/emojis/1/ear_tone3.png
index 2a56eebe445..2a56eebe445 100644
--- a/app/assets/images/emoji/ear_tone3.png
+++ b/public/-/emojis/1/ear_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_tone4.png b/public/-/emojis/1/ear_tone4.png
index bd270f7763e..bd270f7763e 100644
--- a/app/assets/images/emoji/ear_tone4.png
+++ b/public/-/emojis/1/ear_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/ear_tone5.png b/public/-/emojis/1/ear_tone5.png
index b96bb441dff..b96bb441dff 100644
--- a/app/assets/images/emoji/ear_tone5.png
+++ b/public/-/emojis/1/ear_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/earth_africa.png b/public/-/emojis/1/earth_africa.png
index 66c3348c23a..66c3348c23a 100644
--- a/app/assets/images/emoji/earth_africa.png
+++ b/public/-/emojis/1/earth_africa.png
Binary files differ
diff --git a/app/assets/images/emoji/earth_americas.png b/public/-/emojis/1/earth_americas.png
index 538c3cddd68..538c3cddd68 100644
--- a/app/assets/images/emoji/earth_americas.png
+++ b/public/-/emojis/1/earth_americas.png
Binary files differ
diff --git a/app/assets/images/emoji/earth_asia.png b/public/-/emojis/1/earth_asia.png
index d8df97fec3c..d8df97fec3c 100644
--- a/app/assets/images/emoji/earth_asia.png
+++ b/public/-/emojis/1/earth_asia.png
Binary files differ
diff --git a/app/assets/images/emoji/egg.png b/public/-/emojis/1/egg.png
index c171974d993..c171974d993 100644
--- a/app/assets/images/emoji/egg.png
+++ b/public/-/emojis/1/egg.png
Binary files differ
diff --git a/app/assets/images/emoji/eggplant.png b/public/-/emojis/1/eggplant.png
index fafd7c1a14c..fafd7c1a14c 100644
--- a/app/assets/images/emoji/eggplant.png
+++ b/public/-/emojis/1/eggplant.png
Binary files differ
diff --git a/app/assets/images/emoji/eight.png b/public/-/emojis/1/eight.png
index 8c95874d4c5..8c95874d4c5 100644
--- a/app/assets/images/emoji/eight.png
+++ b/public/-/emojis/1/eight.png
Binary files differ
diff --git a/app/assets/images/emoji/eight_pointed_black_star.png b/public/-/emojis/1/eight_pointed_black_star.png
index 820179bda50..820179bda50 100644
--- a/app/assets/images/emoji/eight_pointed_black_star.png
+++ b/public/-/emojis/1/eight_pointed_black_star.png
Binary files differ
diff --git a/app/assets/images/emoji/eight_spoked_asterisk.png b/public/-/emojis/1/eight_spoked_asterisk.png
index 3307ffa62ee..3307ffa62ee 100644
--- a/app/assets/images/emoji/eight_spoked_asterisk.png
+++ b/public/-/emojis/1/eight_spoked_asterisk.png
Binary files differ
diff --git a/app/assets/images/emoji/eject.png b/public/-/emojis/1/eject.png
index ec5cfc48973..ec5cfc48973 100644
--- a/app/assets/images/emoji/eject.png
+++ b/public/-/emojis/1/eject.png
Binary files differ
diff --git a/app/assets/images/emoji/electric_plug.png b/public/-/emojis/1/electric_plug.png
index 31d1eb215b4..31d1eb215b4 100644
--- a/app/assets/images/emoji/electric_plug.png
+++ b/public/-/emojis/1/electric_plug.png
Binary files differ
diff --git a/app/assets/images/emoji/elephant.png b/public/-/emojis/1/elephant.png
index b8a6d140595..b8a6d140595 100644
--- a/app/assets/images/emoji/elephant.png
+++ b/public/-/emojis/1/elephant.png
Binary files differ
diff --git a/public/-/emojis/1/emojis.json b/public/-/emojis/1/emojis.json
new file mode 100644
index 00000000000..20a564720d1
--- /dev/null
+++ b/public/-/emojis/1/emojis.json
@@ -0,0 +1,10760 @@
+{
+ "100": {
+ "c": "symbols",
+ "e": "💯",
+ "d": "hundred points symbol",
+ "u": "6.0"
+ },
+ "1234": {
+ "c": "symbols",
+ "e": "🔢",
+ "d": "input symbol for numbers",
+ "u": "6.0"
+ },
+ "8ball": {
+ "c": "activity",
+ "e": "🎱",
+ "d": "billiards",
+ "u": "6.0"
+ },
+ "a": {
+ "c": "symbols",
+ "e": "🅰",
+ "d": "negative squared latin capital letter a",
+ "u": "6.0"
+ },
+ "ab": {
+ "c": "symbols",
+ "e": "🆎",
+ "d": "negative squared ab",
+ "u": "6.0"
+ },
+ "abc": {
+ "c": "symbols",
+ "e": "🔤",
+ "d": "input symbol for latin letters",
+ "u": "6.0"
+ },
+ "abcd": {
+ "c": "symbols",
+ "e": "🔡",
+ "d": "input symbol for latin small letters",
+ "u": "6.0"
+ },
+ "accept": {
+ "c": "symbols",
+ "e": "🉑",
+ "d": "circled ideograph accept",
+ "u": "6.0"
+ },
+ "aerial_tramway": {
+ "c": "travel",
+ "e": "🚡",
+ "d": "aerial tramway",
+ "u": "6.0"
+ },
+ "airplane": {
+ "c": "travel",
+ "e": "✈",
+ "d": "airplane",
+ "u": "1.1"
+ },
+ "airplane_arriving": {
+ "c": "travel",
+ "e": "🛬",
+ "d": "airplane arriving",
+ "u": "7.0"
+ },
+ "airplane_departure": {
+ "c": "travel",
+ "e": "🛫",
+ "d": "airplane departure",
+ "u": "7.0"
+ },
+ "airplane_small": {
+ "c": "travel",
+ "e": "🛩",
+ "d": "small airplane",
+ "u": "7.0"
+ },
+ "alarm_clock": {
+ "c": "objects",
+ "e": "â°",
+ "d": "alarm clock",
+ "u": "6.0"
+ },
+ "alembic": {
+ "c": "objects",
+ "e": "âš—",
+ "d": "alembic",
+ "u": "4.1"
+ },
+ "alien": {
+ "c": "people",
+ "e": "👽",
+ "d": "extraterrestrial alien",
+ "u": "6.0"
+ },
+ "ambulance": {
+ "c": "travel",
+ "e": "🚑",
+ "d": "ambulance",
+ "u": "6.0"
+ },
+ "amphora": {
+ "c": "objects",
+ "e": "ðŸº",
+ "d": "amphora",
+ "u": "8.0"
+ },
+ "anchor": {
+ "c": "travel",
+ "e": "âš“",
+ "d": "anchor",
+ "u": "4.1"
+ },
+ "angel": {
+ "c": "people",
+ "e": "👼",
+ "d": "baby angel",
+ "u": "6.0"
+ },
+ "angel_tone1": {
+ "c": "people",
+ "e": "👼ðŸ»",
+ "d": "baby angel tone 1",
+ "u": "8.0"
+ },
+ "angel_tone2": {
+ "c": "people",
+ "e": "👼ðŸ¼",
+ "d": "baby angel tone 2",
+ "u": "8.0"
+ },
+ "angel_tone3": {
+ "c": "people",
+ "e": "👼ðŸ½",
+ "d": "baby angel tone 3",
+ "u": "8.0"
+ },
+ "angel_tone4": {
+ "c": "people",
+ "e": "👼ðŸ¾",
+ "d": "baby angel tone 4",
+ "u": "8.0"
+ },
+ "angel_tone5": {
+ "c": "people",
+ "e": "👼ðŸ¿",
+ "d": "baby angel tone 5",
+ "u": "8.0"
+ },
+ "anger": {
+ "c": "symbols",
+ "e": "💢",
+ "d": "anger symbol",
+ "u": "6.0"
+ },
+ "anger_right": {
+ "c": "symbols",
+ "e": "🗯",
+ "d": "right anger bubble",
+ "u": "7.0"
+ },
+ "angry": {
+ "c": "people",
+ "e": "😠",
+ "d": "angry face",
+ "u": "6.0"
+ },
+ "ant": {
+ "c": "nature",
+ "e": "ðŸœ",
+ "d": "ant",
+ "u": "6.0"
+ },
+ "apple": {
+ "c": "food",
+ "e": "ðŸŽ",
+ "d": "red apple",
+ "u": "6.0"
+ },
+ "aquarius": {
+ "c": "symbols",
+ "e": "â™’",
+ "d": "aquarius",
+ "u": "1.1"
+ },
+ "aries": {
+ "c": "symbols",
+ "e": "♈",
+ "d": "aries",
+ "u": "1.1"
+ },
+ "arrow_backward": {
+ "c": "symbols",
+ "e": "â—€",
+ "d": "black left-pointing triangle",
+ "u": "1.1"
+ },
+ "arrow_double_down": {
+ "c": "symbols",
+ "e": "â¬",
+ "d": "black down-pointing double triangle",
+ "u": "6.0"
+ },
+ "arrow_double_up": {
+ "c": "symbols",
+ "e": "â«",
+ "d": "black up-pointing double triangle",
+ "u": "6.0"
+ },
+ "arrow_down": {
+ "c": "symbols",
+ "e": "⬇",
+ "d": "downwards black arrow",
+ "u": "4.0"
+ },
+ "arrow_down_small": {
+ "c": "symbols",
+ "e": "🔽",
+ "d": "down-pointing small red triangle",
+ "u": "6.0"
+ },
+ "arrow_forward": {
+ "c": "symbols",
+ "e": "â–¶",
+ "d": "black right-pointing triangle",
+ "u": "1.1"
+ },
+ "arrow_heading_down": {
+ "c": "symbols",
+ "e": "⤵",
+ "d": "arrow pointing rightwards then curving downwards",
+ "u": "3.2"
+ },
+ "arrow_heading_up": {
+ "c": "symbols",
+ "e": "⤴",
+ "d": "arrow pointing rightwards then curving upwards",
+ "u": "3.2"
+ },
+ "arrow_left": {
+ "c": "symbols",
+ "e": "⬅",
+ "d": "leftwards black arrow",
+ "u": "4.0"
+ },
+ "arrow_lower_left": {
+ "c": "symbols",
+ "e": "↙",
+ "d": "south west arrow",
+ "u": "1.1"
+ },
+ "arrow_lower_right": {
+ "c": "symbols",
+ "e": "↘",
+ "d": "south east arrow",
+ "u": "1.1"
+ },
+ "arrow_right": {
+ "c": "symbols",
+ "e": "âž¡",
+ "d": "black rightwards arrow",
+ "u": "1.1"
+ },
+ "arrow_right_hook": {
+ "c": "symbols",
+ "e": "↪",
+ "d": "rightwards arrow with hook",
+ "u": "1.1"
+ },
+ "arrow_up": {
+ "c": "symbols",
+ "e": "⬆",
+ "d": "upwards black arrow",
+ "u": "4.0"
+ },
+ "arrow_up_down": {
+ "c": "symbols",
+ "e": "↕",
+ "d": "up down arrow",
+ "u": "1.1"
+ },
+ "arrow_up_small": {
+ "c": "symbols",
+ "e": "🔼",
+ "d": "up-pointing small red triangle",
+ "u": "6.0"
+ },
+ "arrow_upper_left": {
+ "c": "symbols",
+ "e": "↖",
+ "d": "north west arrow",
+ "u": "1.1"
+ },
+ "arrow_upper_right": {
+ "c": "symbols",
+ "e": "↗",
+ "d": "north east arrow",
+ "u": "1.1"
+ },
+ "arrows_clockwise": {
+ "c": "symbols",
+ "e": "🔃",
+ "d": "clockwise downwards and upwards open circle arrows",
+ "u": "6.0"
+ },
+ "arrows_counterclockwise": {
+ "c": "symbols",
+ "e": "🔄",
+ "d": "anticlockwise downwards and upwards open circle ar",
+ "u": "6.0"
+ },
+ "art": {
+ "c": "activity",
+ "e": "🎨",
+ "d": "artist palette",
+ "u": "6.0"
+ },
+ "articulated_lorry": {
+ "c": "travel",
+ "e": "🚛",
+ "d": "articulated lorry",
+ "u": "6.0"
+ },
+ "asterisk": {
+ "c": "symbols",
+ "e": "*⃣",
+ "d": "keycap asterisk",
+ "u": "3.0"
+ },
+ "astonished": {
+ "c": "people",
+ "e": "😲",
+ "d": "astonished face",
+ "u": "6.0"
+ },
+ "athletic_shoe": {
+ "c": "people",
+ "e": "👟",
+ "d": "athletic shoe",
+ "u": "6.0"
+ },
+ "atm": {
+ "c": "symbols",
+ "e": "ðŸ§",
+ "d": "automated teller machine",
+ "u": "6.0"
+ },
+ "atom": {
+ "c": "symbols",
+ "e": "âš›",
+ "d": "atom symbol",
+ "u": "4.1"
+ },
+ "avocado": {
+ "c": "food",
+ "e": "🥑",
+ "d": "avocado",
+ "u": "9.0"
+ },
+ "b": {
+ "c": "symbols",
+ "e": "🅱",
+ "d": "negative squared latin capital letter b",
+ "u": "6.0"
+ },
+ "baby": {
+ "c": "people",
+ "e": "👶",
+ "d": "baby",
+ "u": "6.0"
+ },
+ "baby_bottle": {
+ "c": "food",
+ "e": "ðŸ¼",
+ "d": "baby bottle",
+ "u": "6.0"
+ },
+ "baby_chick": {
+ "c": "nature",
+ "e": "ðŸ¤",
+ "d": "baby chick",
+ "u": "6.0"
+ },
+ "baby_symbol": {
+ "c": "symbols",
+ "e": "🚼",
+ "d": "baby symbol",
+ "u": "6.0"
+ },
+ "baby_tone1": {
+ "c": "people",
+ "e": "👶ðŸ»",
+ "d": "baby tone 1",
+ "u": "8.0"
+ },
+ "baby_tone2": {
+ "c": "people",
+ "e": "👶ðŸ¼",
+ "d": "baby tone 2",
+ "u": "8.0"
+ },
+ "baby_tone3": {
+ "c": "people",
+ "e": "👶ðŸ½",
+ "d": "baby tone 3",
+ "u": "8.0"
+ },
+ "baby_tone4": {
+ "c": "people",
+ "e": "👶ðŸ¾",
+ "d": "baby tone 4",
+ "u": "8.0"
+ },
+ "baby_tone5": {
+ "c": "people",
+ "e": "👶ðŸ¿",
+ "d": "baby tone 5",
+ "u": "8.0"
+ },
+ "back": {
+ "c": "symbols",
+ "e": "🔙",
+ "d": "back with leftwards arrow above",
+ "u": "6.0"
+ },
+ "bacon": {
+ "c": "food",
+ "e": "🥓",
+ "d": "bacon",
+ "u": "9.0"
+ },
+ "badminton": {
+ "c": "activity",
+ "e": "ðŸ¸",
+ "d": "badminton racquet",
+ "u": "8.0"
+ },
+ "baggage_claim": {
+ "c": "symbols",
+ "e": "🛄",
+ "d": "baggage claim",
+ "u": "6.0"
+ },
+ "balloon": {
+ "c": "objects",
+ "e": "🎈",
+ "d": "balloon",
+ "u": "6.0"
+ },
+ "ballot_box": {
+ "c": "objects",
+ "e": "🗳",
+ "d": "ballot box with ballot",
+ "u": "7.0"
+ },
+ "ballot_box_with_check": {
+ "c": "symbols",
+ "e": "☑",
+ "d": "ballot box with check",
+ "u": "1.1"
+ },
+ "bamboo": {
+ "c": "nature",
+ "e": "ðŸŽ",
+ "d": "pine decoration",
+ "u": "6.0"
+ },
+ "banana": {
+ "c": "food",
+ "e": "ðŸŒ",
+ "d": "banana",
+ "u": "6.0"
+ },
+ "bangbang": {
+ "c": "symbols",
+ "e": "‼",
+ "d": "double exclamation mark",
+ "u": "1.1"
+ },
+ "bank": {
+ "c": "travel",
+ "e": "ðŸ¦",
+ "d": "bank",
+ "u": "6.0"
+ },
+ "bar_chart": {
+ "c": "objects",
+ "e": "📊",
+ "d": "bar chart",
+ "u": "6.0"
+ },
+ "barber": {
+ "c": "objects",
+ "e": "💈",
+ "d": "barber pole",
+ "u": "6.0"
+ },
+ "baseball": {
+ "c": "activity",
+ "e": "âš¾",
+ "d": "baseball",
+ "u": "5.2"
+ },
+ "basketball": {
+ "c": "activity",
+ "e": "ðŸ€",
+ "d": "basketball and hoop",
+ "u": "6.0"
+ },
+ "basketball_player": {
+ "c": "activity",
+ "e": "⛹",
+ "d": "person with ball",
+ "u": "5.2"
+ },
+ "basketball_player_tone1": {
+ "c": "activity",
+ "e": "⛹ðŸ»",
+ "d": "person with ball tone 1",
+ "u": "8.0"
+ },
+ "basketball_player_tone2": {
+ "c": "activity",
+ "e": "⛹ðŸ¼",
+ "d": "person with ball tone 2",
+ "u": "8.0"
+ },
+ "basketball_player_tone3": {
+ "c": "activity",
+ "e": "⛹ðŸ½",
+ "d": "person with ball tone 3",
+ "u": "8.0"
+ },
+ "basketball_player_tone4": {
+ "c": "activity",
+ "e": "⛹ðŸ¾",
+ "d": "person with ball tone 4",
+ "u": "8.0"
+ },
+ "basketball_player_tone5": {
+ "c": "activity",
+ "e": "⛹ðŸ¿",
+ "d": "person with ball tone 5",
+ "u": "8.0"
+ },
+ "bat": {
+ "c": "nature",
+ "e": "🦇",
+ "d": "bat",
+ "u": "9.0"
+ },
+ "bath": {
+ "c": "activity",
+ "e": "🛀",
+ "d": "bath",
+ "u": "6.0"
+ },
+ "bath_tone1": {
+ "c": "activity",
+ "e": "🛀ðŸ»",
+ "d": "bath tone 1",
+ "u": "8.0"
+ },
+ "bath_tone2": {
+ "c": "activity",
+ "e": "🛀ðŸ¼",
+ "d": "bath tone 2",
+ "u": "8.0"
+ },
+ "bath_tone3": {
+ "c": "activity",
+ "e": "🛀ðŸ½",
+ "d": "bath tone 3",
+ "u": "8.0"
+ },
+ "bath_tone4": {
+ "c": "activity",
+ "e": "🛀ðŸ¾",
+ "d": "bath tone 4",
+ "u": "8.0"
+ },
+ "bath_tone5": {
+ "c": "activity",
+ "e": "🛀ðŸ¿",
+ "d": "bath tone 5",
+ "u": "8.0"
+ },
+ "bathtub": {
+ "c": "objects",
+ "e": "ðŸ›",
+ "d": "bathtub",
+ "u": "6.0"
+ },
+ "battery": {
+ "c": "objects",
+ "e": "🔋",
+ "d": "battery",
+ "u": "6.0"
+ },
+ "beach": {
+ "c": "travel",
+ "e": "ðŸ–",
+ "d": "beach with umbrella",
+ "u": "7.0"
+ },
+ "beach_umbrella": {
+ "c": "objects",
+ "e": "â›±",
+ "d": "umbrella on ground",
+ "u": "5.2"
+ },
+ "bear": {
+ "c": "nature",
+ "e": "ðŸ»",
+ "d": "bear face",
+ "u": "6.0"
+ },
+ "bed": {
+ "c": "objects",
+ "e": "ðŸ›",
+ "d": "bed",
+ "u": "7.0"
+ },
+ "bee": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "honeybee",
+ "u": "6.0"
+ },
+ "beer": {
+ "c": "food",
+ "e": "ðŸº",
+ "d": "beer mug",
+ "u": "6.0"
+ },
+ "beers": {
+ "c": "food",
+ "e": "ðŸ»",
+ "d": "clinking beer mugs",
+ "u": "6.0"
+ },
+ "beetle": {
+ "c": "nature",
+ "e": "ðŸž",
+ "d": "lady beetle",
+ "u": "6.0"
+ },
+ "beginner": {
+ "c": "symbols",
+ "e": "🔰",
+ "d": "japanese symbol for beginner",
+ "u": "6.0"
+ },
+ "bell": {
+ "c": "symbols",
+ "e": "🔔",
+ "d": "bell",
+ "u": "6.0"
+ },
+ "bellhop": {
+ "c": "objects",
+ "e": "🛎",
+ "d": "bellhop bell",
+ "u": "7.0"
+ },
+ "bento": {
+ "c": "food",
+ "e": "ðŸ±",
+ "d": "bento box",
+ "u": "6.0"
+ },
+ "bicyclist": {
+ "c": "activity",
+ "e": "🚴",
+ "d": "bicyclist",
+ "u": "6.0"
+ },
+ "bicyclist_tone1": {
+ "c": "activity",
+ "e": "🚴ðŸ»",
+ "d": "bicyclist tone 1",
+ "u": "8.0"
+ },
+ "bicyclist_tone2": {
+ "c": "activity",
+ "e": "🚴ðŸ¼",
+ "d": "bicyclist tone 2",
+ "u": "8.0"
+ },
+ "bicyclist_tone3": {
+ "c": "activity",
+ "e": "🚴ðŸ½",
+ "d": "bicyclist tone 3",
+ "u": "8.0"
+ },
+ "bicyclist_tone4": {
+ "c": "activity",
+ "e": "🚴ðŸ¾",
+ "d": "bicyclist tone 4",
+ "u": "8.0"
+ },
+ "bicyclist_tone5": {
+ "c": "activity",
+ "e": "🚴ðŸ¿",
+ "d": "bicyclist tone 5",
+ "u": "8.0"
+ },
+ "bike": {
+ "c": "travel",
+ "e": "🚲",
+ "d": "bicycle",
+ "u": "6.0"
+ },
+ "bikini": {
+ "c": "people",
+ "e": "👙",
+ "d": "bikini",
+ "u": "6.0"
+ },
+ "biohazard": {
+ "c": "symbols",
+ "e": "☣",
+ "d": "biohazard sign",
+ "u": "1.1"
+ },
+ "bird": {
+ "c": "nature",
+ "e": "ðŸ¦",
+ "d": "bird",
+ "u": "6.0"
+ },
+ "birthday": {
+ "c": "food",
+ "e": "🎂",
+ "d": "birthday cake",
+ "u": "6.0"
+ },
+ "black_circle": {
+ "c": "symbols",
+ "e": "âš«",
+ "d": "medium black circle",
+ "u": "4.1"
+ },
+ "black_heart": {
+ "c": "symbols",
+ "e": "🖤",
+ "d": "black heart",
+ "u": "9.0"
+ },
+ "black_joker": {
+ "c": "symbols",
+ "e": "ðŸƒ",
+ "d": "playing card black joker",
+ "u": "6.0"
+ },
+ "black_large_square": {
+ "c": "symbols",
+ "e": "⬛",
+ "d": "black large square",
+ "u": "5.1"
+ },
+ "black_medium_small_square": {
+ "c": "symbols",
+ "e": "â—¾",
+ "d": "black medium small square",
+ "u": "3.2"
+ },
+ "black_medium_square": {
+ "c": "symbols",
+ "e": "â—¼",
+ "d": "black medium square",
+ "u": "3.2"
+ },
+ "black_nib": {
+ "c": "objects",
+ "e": "✒",
+ "d": "black nib",
+ "u": "1.1"
+ },
+ "black_small_square": {
+ "c": "symbols",
+ "e": "â–ª",
+ "d": "black small square",
+ "u": "1.1"
+ },
+ "black_square_button": {
+ "c": "symbols",
+ "e": "🔲",
+ "d": "black square button",
+ "u": "6.0"
+ },
+ "blossom": {
+ "c": "nature",
+ "e": "🌼",
+ "d": "blossom",
+ "u": "6.0"
+ },
+ "blowfish": {
+ "c": "nature",
+ "e": "ðŸ¡",
+ "d": "blowfish",
+ "u": "6.0"
+ },
+ "blue_book": {
+ "c": "objects",
+ "e": "📘",
+ "d": "blue book",
+ "u": "6.0"
+ },
+ "blue_car": {
+ "c": "travel",
+ "e": "🚙",
+ "d": "recreational vehicle",
+ "u": "6.0"
+ },
+ "blue_heart": {
+ "c": "symbols",
+ "e": "💙",
+ "d": "blue heart",
+ "u": "6.0"
+ },
+ "blush": {
+ "c": "people",
+ "e": "😊",
+ "d": "smiling face with smiling eyes",
+ "u": "6.0"
+ },
+ "boar": {
+ "c": "nature",
+ "e": "ðŸ—",
+ "d": "boar",
+ "u": "6.0"
+ },
+ "bomb": {
+ "c": "objects",
+ "e": "💣",
+ "d": "bomb",
+ "u": "6.0"
+ },
+ "book": {
+ "c": "objects",
+ "e": "📖",
+ "d": "open book",
+ "u": "6.0"
+ },
+ "bookmark": {
+ "c": "objects",
+ "e": "🔖",
+ "d": "bookmark",
+ "u": "6.0"
+ },
+ "bookmark_tabs": {
+ "c": "objects",
+ "e": "📑",
+ "d": "bookmark tabs",
+ "u": "6.0"
+ },
+ "books": {
+ "c": "objects",
+ "e": "📚",
+ "d": "books",
+ "u": "6.0"
+ },
+ "boom": {
+ "c": "nature",
+ "e": "💥",
+ "d": "collision symbol",
+ "u": "6.0"
+ },
+ "boot": {
+ "c": "people",
+ "e": "👢",
+ "d": "womans boots",
+ "u": "6.0"
+ },
+ "bouquet": {
+ "c": "nature",
+ "e": "ðŸ’",
+ "d": "bouquet",
+ "u": "6.0"
+ },
+ "bow": {
+ "c": "people",
+ "e": "🙇",
+ "d": "person bowing deeply",
+ "u": "6.0"
+ },
+ "bow_and_arrow": {
+ "c": "activity",
+ "e": "ðŸ¹",
+ "d": "bow and arrow",
+ "u": "8.0"
+ },
+ "bow_tone1": {
+ "c": "people",
+ "e": "🙇ðŸ»",
+ "d": "person bowing deeply tone 1",
+ "u": "8.0"
+ },
+ "bow_tone2": {
+ "c": "people",
+ "e": "🙇ðŸ¼",
+ "d": "person bowing deeply tone 2",
+ "u": "8.0"
+ },
+ "bow_tone3": {
+ "c": "people",
+ "e": "🙇ðŸ½",
+ "d": "person bowing deeply tone 3",
+ "u": "8.0"
+ },
+ "bow_tone4": {
+ "c": "people",
+ "e": "🙇ðŸ¾",
+ "d": "person bowing deeply tone 4",
+ "u": "8.0"
+ },
+ "bow_tone5": {
+ "c": "people",
+ "e": "🙇ðŸ¿",
+ "d": "person bowing deeply tone 5",
+ "u": "8.0"
+ },
+ "bowling": {
+ "c": "activity",
+ "e": "🎳",
+ "d": "bowling",
+ "u": "6.0"
+ },
+ "boxing_glove": {
+ "c": "activity",
+ "e": "🥊",
+ "d": "boxing glove",
+ "u": "9.0"
+ },
+ "boy": {
+ "c": "people",
+ "e": "👦",
+ "d": "boy",
+ "u": "6.0"
+ },
+ "boy_tone1": {
+ "c": "people",
+ "e": "👦ðŸ»",
+ "d": "boy tone 1",
+ "u": "8.0"
+ },
+ "boy_tone2": {
+ "c": "people",
+ "e": "👦ðŸ¼",
+ "d": "boy tone 2",
+ "u": "8.0"
+ },
+ "boy_tone3": {
+ "c": "people",
+ "e": "👦ðŸ½",
+ "d": "boy tone 3",
+ "u": "8.0"
+ },
+ "boy_tone4": {
+ "c": "people",
+ "e": "👦ðŸ¾",
+ "d": "boy tone 4",
+ "u": "8.0"
+ },
+ "boy_tone5": {
+ "c": "people",
+ "e": "👦ðŸ¿",
+ "d": "boy tone 5",
+ "u": "8.0"
+ },
+ "bread": {
+ "c": "food",
+ "e": "ðŸž",
+ "d": "bread",
+ "u": "6.0"
+ },
+ "bride_with_veil": {
+ "c": "people",
+ "e": "👰",
+ "d": "bride with veil",
+ "u": "6.0"
+ },
+ "bride_with_veil_tone1": {
+ "c": "people",
+ "e": "👰ðŸ»",
+ "d": "bride with veil tone 1",
+ "u": "8.0"
+ },
+ "bride_with_veil_tone2": {
+ "c": "people",
+ "e": "👰ðŸ¼",
+ "d": "bride with veil tone 2",
+ "u": "8.0"
+ },
+ "bride_with_veil_tone3": {
+ "c": "people",
+ "e": "👰ðŸ½",
+ "d": "bride with veil tone 3",
+ "u": "8.0"
+ },
+ "bride_with_veil_tone4": {
+ "c": "people",
+ "e": "👰ðŸ¾",
+ "d": "bride with veil tone 4",
+ "u": "8.0"
+ },
+ "bride_with_veil_tone5": {
+ "c": "people",
+ "e": "👰ðŸ¿",
+ "d": "bride with veil tone 5",
+ "u": "8.0"
+ },
+ "bridge_at_night": {
+ "c": "travel",
+ "e": "🌉",
+ "d": "bridge at night",
+ "u": "6.0"
+ },
+ "briefcase": {
+ "c": "people",
+ "e": "💼",
+ "d": "briefcase",
+ "u": "6.0"
+ },
+ "broken_heart": {
+ "c": "symbols",
+ "e": "💔",
+ "d": "broken heart",
+ "u": "6.0"
+ },
+ "bug": {
+ "c": "nature",
+ "e": "ðŸ›",
+ "d": "bug",
+ "u": "6.0"
+ },
+ "bulb": {
+ "c": "objects",
+ "e": "💡",
+ "d": "electric light bulb",
+ "u": "6.0"
+ },
+ "bullettrain_front": {
+ "c": "travel",
+ "e": "🚅",
+ "d": "high-speed train with bullet nose",
+ "u": "6.0"
+ },
+ "bullettrain_side": {
+ "c": "travel",
+ "e": "🚄",
+ "d": "high-speed train",
+ "u": "6.0"
+ },
+ "burrito": {
+ "c": "food",
+ "e": "🌯",
+ "d": "burrito",
+ "u": "8.0"
+ },
+ "bus": {
+ "c": "travel",
+ "e": "🚌",
+ "d": "bus",
+ "u": "6.0"
+ },
+ "busstop": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "bus stop",
+ "u": "6.0"
+ },
+ "bust_in_silhouette": {
+ "c": "people",
+ "e": "👤",
+ "d": "bust in silhouette",
+ "u": "6.0"
+ },
+ "busts_in_silhouette": {
+ "c": "people",
+ "e": "👥",
+ "d": "busts in silhouette",
+ "u": "6.0"
+ },
+ "butterfly": {
+ "c": "nature",
+ "e": "🦋",
+ "d": "butterfly",
+ "u": "9.0"
+ },
+ "cactus": {
+ "c": "nature",
+ "e": "🌵",
+ "d": "cactus",
+ "u": "6.0"
+ },
+ "cake": {
+ "c": "food",
+ "e": "ðŸ°",
+ "d": "shortcake",
+ "u": "6.0"
+ },
+ "calendar": {
+ "c": "objects",
+ "e": "📆",
+ "d": "tear-off calendar",
+ "u": "6.0"
+ },
+ "calendar_spiral": {
+ "c": "objects",
+ "e": "🗓",
+ "d": "spiral calendar pad",
+ "u": "7.0"
+ },
+ "call_me": {
+ "c": "people",
+ "e": "🤙",
+ "d": "call me hand",
+ "u": "9.0"
+ },
+ "call_me_tone1": {
+ "c": "people",
+ "e": "🤙ðŸ»",
+ "d": "call me hand tone 1",
+ "u": "9.0"
+ },
+ "call_me_tone2": {
+ "c": "people",
+ "e": "🤙ðŸ¼",
+ "d": "call me hand tone 2",
+ "u": "9.0"
+ },
+ "call_me_tone3": {
+ "c": "people",
+ "e": "🤙ðŸ½",
+ "d": "call me hand tone 3",
+ "u": "9.0"
+ },
+ "call_me_tone4": {
+ "c": "people",
+ "e": "🤙ðŸ¾",
+ "d": "call me hand tone 4",
+ "u": "9.0"
+ },
+ "call_me_tone5": {
+ "c": "people",
+ "e": "🤙ðŸ¿",
+ "d": "call me hand tone 5",
+ "u": "9.0"
+ },
+ "calling": {
+ "c": "objects",
+ "e": "📲",
+ "d": "mobile phone with rightwards arrow at left",
+ "u": "6.0"
+ },
+ "camel": {
+ "c": "nature",
+ "e": "ðŸ«",
+ "d": "bactrian camel",
+ "u": "6.0"
+ },
+ "camera": {
+ "c": "objects",
+ "e": "📷",
+ "d": "camera",
+ "u": "6.0"
+ },
+ "camera_with_flash": {
+ "c": "objects",
+ "e": "📸",
+ "d": "camera with flash",
+ "u": "7.0"
+ },
+ "camping": {
+ "c": "travel",
+ "e": "ðŸ•",
+ "d": "camping",
+ "u": "7.0"
+ },
+ "cancer": {
+ "c": "symbols",
+ "e": "♋",
+ "d": "cancer",
+ "u": "1.1"
+ },
+ "candle": {
+ "c": "objects",
+ "e": "🕯",
+ "d": "candle",
+ "u": "7.0"
+ },
+ "candy": {
+ "c": "food",
+ "e": "ðŸ¬",
+ "d": "candy",
+ "u": "6.0"
+ },
+ "canoe": {
+ "c": "travel",
+ "e": "🛶",
+ "d": "canoe",
+ "u": "9.0"
+ },
+ "capital_abcd": {
+ "c": "symbols",
+ "e": "🔠",
+ "d": "input symbol for latin capital letters",
+ "u": "6.0"
+ },
+ "capricorn": {
+ "c": "symbols",
+ "e": "♑",
+ "d": "capricorn",
+ "u": "1.1"
+ },
+ "card_box": {
+ "c": "objects",
+ "e": "🗃",
+ "d": "card file box",
+ "u": "7.0"
+ },
+ "card_index": {
+ "c": "objects",
+ "e": "📇",
+ "d": "card index",
+ "u": "6.0"
+ },
+ "carousel_horse": {
+ "c": "travel",
+ "e": "🎠",
+ "d": "carousel horse",
+ "u": "6.0"
+ },
+ "carrot": {
+ "c": "food",
+ "e": "🥕",
+ "d": "carrot",
+ "u": "9.0"
+ },
+ "cartwheel": {
+ "c": "activity",
+ "e": "🤸",
+ "d": "person doing cartwheel",
+ "u": "9.0"
+ },
+ "cartwheel_tone1": {
+ "c": "activity",
+ "e": "🤸ðŸ»",
+ "d": "person doing cartwheel tone 1",
+ "u": "9.0"
+ },
+ "cartwheel_tone2": {
+ "c": "activity",
+ "e": "🤸ðŸ¼",
+ "d": "person doing cartwheel tone 2",
+ "u": "9.0"
+ },
+ "cartwheel_tone3": {
+ "c": "activity",
+ "e": "🤸ðŸ½",
+ "d": "person doing cartwheel tone 3",
+ "u": "9.0"
+ },
+ "cartwheel_tone4": {
+ "c": "activity",
+ "e": "🤸ðŸ¾",
+ "d": "person doing cartwheel tone 4",
+ "u": "9.0"
+ },
+ "cartwheel_tone5": {
+ "c": "activity",
+ "e": "🤸ðŸ¿",
+ "d": "person doing cartwheel tone 5",
+ "u": "9.0"
+ },
+ "cat": {
+ "c": "nature",
+ "e": "ðŸ±",
+ "d": "cat face",
+ "u": "6.0"
+ },
+ "cat2": {
+ "c": "nature",
+ "e": "ðŸˆ",
+ "d": "cat",
+ "u": "6.0"
+ },
+ "cd": {
+ "c": "objects",
+ "e": "💿",
+ "d": "optical disc",
+ "u": "6.0"
+ },
+ "chains": {
+ "c": "objects",
+ "e": "⛓",
+ "d": "chains",
+ "u": "5.2"
+ },
+ "champagne": {
+ "c": "food",
+ "e": "ðŸ¾",
+ "d": "bottle with popping cork",
+ "u": "8.0"
+ },
+ "champagne_glass": {
+ "c": "food",
+ "e": "🥂",
+ "d": "clinking glasses",
+ "u": "9.0"
+ },
+ "chart": {
+ "c": "symbols",
+ "e": "💹",
+ "d": "chart with upwards trend and yen sign",
+ "u": "6.0"
+ },
+ "chart_with_downwards_trend": {
+ "c": "objects",
+ "e": "📉",
+ "d": "chart with downwards trend",
+ "u": "6.0"
+ },
+ "chart_with_upwards_trend": {
+ "c": "objects",
+ "e": "📈",
+ "d": "chart with upwards trend",
+ "u": "6.0"
+ },
+ "checkered_flag": {
+ "c": "travel",
+ "e": "ðŸ",
+ "d": "chequered flag",
+ "u": "6.0"
+ },
+ "cheese": {
+ "c": "food",
+ "e": "🧀",
+ "d": "cheese wedge",
+ "u": "8.0"
+ },
+ "cherries": {
+ "c": "food",
+ "e": "ðŸ’",
+ "d": "cherries",
+ "u": "6.0"
+ },
+ "cherry_blossom": {
+ "c": "nature",
+ "e": "🌸",
+ "d": "cherry blossom",
+ "u": "6.0"
+ },
+ "chestnut": {
+ "c": "nature",
+ "e": "🌰",
+ "d": "chestnut",
+ "u": "6.0"
+ },
+ "chicken": {
+ "c": "nature",
+ "e": "ðŸ”",
+ "d": "chicken",
+ "u": "6.0"
+ },
+ "children_crossing": {
+ "c": "symbols",
+ "e": "🚸",
+ "d": "children crossing",
+ "u": "6.0"
+ },
+ "chipmunk": {
+ "c": "nature",
+ "e": "ðŸ¿",
+ "d": "chipmunk",
+ "u": "7.0"
+ },
+ "chocolate_bar": {
+ "c": "food",
+ "e": "ðŸ«",
+ "d": "chocolate bar",
+ "u": "6.0"
+ },
+ "christmas_tree": {
+ "c": "nature",
+ "e": "🎄",
+ "d": "christmas tree",
+ "u": "6.0"
+ },
+ "church": {
+ "c": "travel",
+ "e": "⛪",
+ "d": "church",
+ "u": "5.2"
+ },
+ "cinema": {
+ "c": "symbols",
+ "e": "🎦",
+ "d": "cinema",
+ "u": "6.0"
+ },
+ "circus_tent": {
+ "c": "activity",
+ "e": "🎪",
+ "d": "circus tent",
+ "u": "6.0"
+ },
+ "city_dusk": {
+ "c": "travel",
+ "e": "🌆",
+ "d": "cityscape at dusk",
+ "u": "6.0"
+ },
+ "city_sunset": {
+ "c": "travel",
+ "e": "🌇",
+ "d": "sunset over buildings",
+ "u": "6.0"
+ },
+ "cityscape": {
+ "c": "travel",
+ "e": "ðŸ™",
+ "d": "cityscape",
+ "u": "7.0"
+ },
+ "cl": {
+ "c": "symbols",
+ "e": "🆑",
+ "d": "squared cl",
+ "u": "6.0"
+ },
+ "clap": {
+ "c": "people",
+ "e": "ðŸ‘",
+ "d": "clapping hands sign",
+ "u": "6.0"
+ },
+ "clap_tone1": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ»",
+ "d": "clapping hands sign tone 1",
+ "u": "8.0"
+ },
+ "clap_tone2": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¼",
+ "d": "clapping hands sign tone 2",
+ "u": "8.0"
+ },
+ "clap_tone3": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ½",
+ "d": "clapping hands sign tone 3",
+ "u": "8.0"
+ },
+ "clap_tone4": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¾",
+ "d": "clapping hands sign tone 4",
+ "u": "8.0"
+ },
+ "clap_tone5": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¿",
+ "d": "clapping hands sign tone 5",
+ "u": "8.0"
+ },
+ "clapper": {
+ "c": "activity",
+ "e": "🎬",
+ "d": "clapper board",
+ "u": "6.0"
+ },
+ "classical_building": {
+ "c": "travel",
+ "e": "ðŸ›",
+ "d": "classical building",
+ "u": "7.0"
+ },
+ "clipboard": {
+ "c": "objects",
+ "e": "📋",
+ "d": "clipboard",
+ "u": "6.0"
+ },
+ "clock": {
+ "c": "objects",
+ "e": "🕰",
+ "d": "mantlepiece clock",
+ "u": "7.0"
+ },
+ "clock1": {
+ "c": "symbols",
+ "e": "ðŸ•",
+ "d": "clock face one oclock",
+ "u": "6.0"
+ },
+ "clock10": {
+ "c": "symbols",
+ "e": "🕙",
+ "d": "clock face ten oclock",
+ "u": "6.0"
+ },
+ "clock1030": {
+ "c": "symbols",
+ "e": "🕥",
+ "d": "clock face ten-thirty",
+ "u": "6.0"
+ },
+ "clock11": {
+ "c": "symbols",
+ "e": "🕚",
+ "d": "clock face eleven oclock",
+ "u": "6.0"
+ },
+ "clock1130": {
+ "c": "symbols",
+ "e": "🕦",
+ "d": "clock face eleven-thirty",
+ "u": "6.0"
+ },
+ "clock12": {
+ "c": "symbols",
+ "e": "🕛",
+ "d": "clock face twelve oclock",
+ "u": "6.0"
+ },
+ "clock1230": {
+ "c": "symbols",
+ "e": "🕧",
+ "d": "clock face twelve-thirty",
+ "u": "6.0"
+ },
+ "clock130": {
+ "c": "symbols",
+ "e": "🕜",
+ "d": "clock face one-thirty",
+ "u": "6.0"
+ },
+ "clock2": {
+ "c": "symbols",
+ "e": "🕑",
+ "d": "clock face two oclock",
+ "u": "6.0"
+ },
+ "clock230": {
+ "c": "symbols",
+ "e": "ðŸ•",
+ "d": "clock face two-thirty",
+ "u": "6.0"
+ },
+ "clock3": {
+ "c": "symbols",
+ "e": "🕒",
+ "d": "clock face three oclock",
+ "u": "6.0"
+ },
+ "clock330": {
+ "c": "symbols",
+ "e": "🕞",
+ "d": "clock face three-thirty",
+ "u": "6.0"
+ },
+ "clock4": {
+ "c": "symbols",
+ "e": "🕓",
+ "d": "clock face four oclock",
+ "u": "6.0"
+ },
+ "clock430": {
+ "c": "symbols",
+ "e": "🕟",
+ "d": "clock face four-thirty",
+ "u": "6.0"
+ },
+ "clock5": {
+ "c": "symbols",
+ "e": "🕔",
+ "d": "clock face five oclock",
+ "u": "6.0"
+ },
+ "clock530": {
+ "c": "symbols",
+ "e": "🕠",
+ "d": "clock face five-thirty",
+ "u": "6.0"
+ },
+ "clock6": {
+ "c": "symbols",
+ "e": "🕕",
+ "d": "clock face six oclock",
+ "u": "6.0"
+ },
+ "clock630": {
+ "c": "symbols",
+ "e": "🕡",
+ "d": "clock face six-thirty",
+ "u": "6.0"
+ },
+ "clock7": {
+ "c": "symbols",
+ "e": "🕖",
+ "d": "clock face seven oclock",
+ "u": "6.0"
+ },
+ "clock730": {
+ "c": "symbols",
+ "e": "🕢",
+ "d": "clock face seven-thirty",
+ "u": "6.0"
+ },
+ "clock8": {
+ "c": "symbols",
+ "e": "🕗",
+ "d": "clock face eight oclock",
+ "u": "6.0"
+ },
+ "clock830": {
+ "c": "symbols",
+ "e": "🕣",
+ "d": "clock face eight-thirty",
+ "u": "6.0"
+ },
+ "clock9": {
+ "c": "symbols",
+ "e": "🕘",
+ "d": "clock face nine oclock",
+ "u": "6.0"
+ },
+ "clock930": {
+ "c": "symbols",
+ "e": "🕤",
+ "d": "clock face nine-thirty",
+ "u": "6.0"
+ },
+ "closed_book": {
+ "c": "objects",
+ "e": "📕",
+ "d": "closed book",
+ "u": "6.0"
+ },
+ "closed_lock_with_key": {
+ "c": "objects",
+ "e": "ðŸ”",
+ "d": "closed lock with key",
+ "u": "6.0"
+ },
+ "closed_umbrella": {
+ "c": "people",
+ "e": "🌂",
+ "d": "closed umbrella",
+ "u": "6.0"
+ },
+ "cloud": {
+ "c": "nature",
+ "e": "â˜",
+ "d": "cloud",
+ "u": "1.1"
+ },
+ "cloud_lightning": {
+ "c": "nature",
+ "e": "🌩",
+ "d": "cloud with lightning",
+ "u": "7.0"
+ },
+ "cloud_rain": {
+ "c": "nature",
+ "e": "🌧",
+ "d": "cloud with rain",
+ "u": "7.0"
+ },
+ "cloud_snow": {
+ "c": "nature",
+ "e": "🌨",
+ "d": "cloud with snow",
+ "u": "7.0"
+ },
+ "cloud_tornado": {
+ "c": "nature",
+ "e": "🌪",
+ "d": "cloud with tornado",
+ "u": "7.0"
+ },
+ "clown": {
+ "c": "people",
+ "e": "🤡",
+ "d": "clown face",
+ "u": "9.0"
+ },
+ "clubs": {
+ "c": "symbols",
+ "e": "♣",
+ "d": "black club suit",
+ "u": "1.1"
+ },
+ "cocktail": {
+ "c": "food",
+ "e": "ðŸ¸",
+ "d": "cocktail glass",
+ "u": "6.0"
+ },
+ "coffee": {
+ "c": "food",
+ "e": "☕",
+ "d": "hot beverage",
+ "u": "4.0"
+ },
+ "coffin": {
+ "c": "objects",
+ "e": "âš°",
+ "d": "coffin",
+ "u": "4.1"
+ },
+ "cold_sweat": {
+ "c": "people",
+ "e": "😰",
+ "d": "face with open mouth and cold sweat",
+ "u": "6.0"
+ },
+ "comet": {
+ "c": "nature",
+ "e": "☄",
+ "d": "comet",
+ "u": "1.1"
+ },
+ "compression": {
+ "c": "objects",
+ "e": "🗜",
+ "d": "compression",
+ "u": "7.0"
+ },
+ "computer": {
+ "c": "objects",
+ "e": "💻",
+ "d": "personal computer",
+ "u": "6.0"
+ },
+ "confetti_ball": {
+ "c": "objects",
+ "e": "🎊",
+ "d": "confetti ball",
+ "u": "6.0"
+ },
+ "confounded": {
+ "c": "people",
+ "e": "😖",
+ "d": "confounded face",
+ "u": "6.0"
+ },
+ "confused": {
+ "c": "people",
+ "e": "😕",
+ "d": "confused face",
+ "u": "6.1"
+ },
+ "congratulations": {
+ "c": "symbols",
+ "e": "㊗",
+ "d": "circled ideograph congratulation",
+ "u": "1.1"
+ },
+ "construction": {
+ "c": "travel",
+ "e": "🚧",
+ "d": "construction sign",
+ "u": "6.0"
+ },
+ "construction_site": {
+ "c": "travel",
+ "e": "ðŸ—",
+ "d": "building construction",
+ "u": "7.0"
+ },
+ "construction_worker": {
+ "c": "people",
+ "e": "👷",
+ "d": "construction worker",
+ "u": "6.0"
+ },
+ "construction_worker_tone1": {
+ "c": "people",
+ "e": "👷ðŸ»",
+ "d": "construction worker tone 1",
+ "u": "8.0"
+ },
+ "construction_worker_tone2": {
+ "c": "people",
+ "e": "👷ðŸ¼",
+ "d": "construction worker tone 2",
+ "u": "8.0"
+ },
+ "construction_worker_tone3": {
+ "c": "people",
+ "e": "👷ðŸ½",
+ "d": "construction worker tone 3",
+ "u": "8.0"
+ },
+ "construction_worker_tone4": {
+ "c": "people",
+ "e": "👷ðŸ¾",
+ "d": "construction worker tone 4",
+ "u": "8.0"
+ },
+ "construction_worker_tone5": {
+ "c": "people",
+ "e": "👷ðŸ¿",
+ "d": "construction worker tone 5",
+ "u": "8.0"
+ },
+ "control_knobs": {
+ "c": "objects",
+ "e": "🎛",
+ "d": "control knobs",
+ "u": "7.0"
+ },
+ "convenience_store": {
+ "c": "travel",
+ "e": "ðŸª",
+ "d": "convenience store",
+ "u": "6.0"
+ },
+ "cookie": {
+ "c": "food",
+ "e": "ðŸª",
+ "d": "cookie",
+ "u": "6.0"
+ },
+ "cooking": {
+ "c": "food",
+ "e": "ðŸ³",
+ "d": "cooking",
+ "u": "6.0"
+ },
+ "cool": {
+ "c": "symbols",
+ "e": "🆒",
+ "d": "squared cool",
+ "u": "6.0"
+ },
+ "cop": {
+ "c": "people",
+ "e": "👮",
+ "d": "police officer",
+ "u": "6.0"
+ },
+ "cop_tone1": {
+ "c": "people",
+ "e": "👮ðŸ»",
+ "d": "police officer tone 1",
+ "u": "8.0"
+ },
+ "cop_tone2": {
+ "c": "people",
+ "e": "👮ðŸ¼",
+ "d": "police officer tone 2",
+ "u": "8.0"
+ },
+ "cop_tone3": {
+ "c": "people",
+ "e": "👮ðŸ½",
+ "d": "police officer tone 3",
+ "u": "8.0"
+ },
+ "cop_tone4": {
+ "c": "people",
+ "e": "👮ðŸ¾",
+ "d": "police officer tone 4",
+ "u": "8.0"
+ },
+ "cop_tone5": {
+ "c": "people",
+ "e": "👮ðŸ¿",
+ "d": "police officer tone 5",
+ "u": "8.0"
+ },
+ "copyright": {
+ "c": "symbols",
+ "e": "©",
+ "d": "copyright sign",
+ "u": "1.1"
+ },
+ "corn": {
+ "c": "food",
+ "e": "🌽",
+ "d": "ear of maize",
+ "u": "6.0"
+ },
+ "couch": {
+ "c": "objects",
+ "e": "🛋",
+ "d": "couch and lamp",
+ "u": "7.0"
+ },
+ "couple": {
+ "c": "people",
+ "e": "👫",
+ "d": "man and woman holding hands",
+ "u": "6.0"
+ },
+ "couple_mm": {
+ "c": "people",
+ "e": "👨â€â¤ï¸â€ðŸ‘¨",
+ "d": "couple (man,man)",
+ "u": "6.0"
+ },
+ "couple_with_heart": {
+ "c": "people",
+ "e": "💑",
+ "d": "couple with heart",
+ "u": "6.0"
+ },
+ "couple_ww": {
+ "c": "people",
+ "e": "👩â€â¤ï¸â€ðŸ‘©",
+ "d": "couple (woman,woman)",
+ "u": "6.0"
+ },
+ "couplekiss": {
+ "c": "people",
+ "e": "ðŸ’",
+ "d": "kiss",
+ "u": "6.0"
+ },
+ "cow": {
+ "c": "nature",
+ "e": "ðŸ®",
+ "d": "cow face",
+ "u": "6.0"
+ },
+ "cow2": {
+ "c": "nature",
+ "e": "ðŸ„",
+ "d": "cow",
+ "u": "6.0"
+ },
+ "cowboy": {
+ "c": "people",
+ "e": "🤠",
+ "d": "face with cowboy hat",
+ "u": "9.0"
+ },
+ "crab": {
+ "c": "nature",
+ "e": "🦀",
+ "d": "crab",
+ "u": "8.0"
+ },
+ "crayon": {
+ "c": "objects",
+ "e": "ðŸ–",
+ "d": "lower left crayon",
+ "u": "7.0"
+ },
+ "credit_card": {
+ "c": "objects",
+ "e": "💳",
+ "d": "credit card",
+ "u": "6.0"
+ },
+ "crescent_moon": {
+ "c": "nature",
+ "e": "🌙",
+ "d": "crescent moon",
+ "u": "6.0"
+ },
+ "cricket": {
+ "c": "activity",
+ "e": "ðŸ",
+ "d": "cricket bat and ball",
+ "u": "8.0"
+ },
+ "crocodile": {
+ "c": "nature",
+ "e": "ðŸŠ",
+ "d": "crocodile",
+ "u": "6.0"
+ },
+ "croissant": {
+ "c": "food",
+ "e": "ðŸ¥",
+ "d": "croissant",
+ "u": "9.0"
+ },
+ "cross": {
+ "c": "symbols",
+ "e": "âœ",
+ "d": "latin cross",
+ "u": "1.1"
+ },
+ "crossed_flags": {
+ "c": "objects",
+ "e": "🎌",
+ "d": "crossed flags",
+ "u": "6.0"
+ },
+ "crossed_swords": {
+ "c": "objects",
+ "e": "âš”",
+ "d": "crossed swords",
+ "u": "4.1"
+ },
+ "crown": {
+ "c": "people",
+ "e": "👑",
+ "d": "crown",
+ "u": "6.0"
+ },
+ "cruise_ship": {
+ "c": "travel",
+ "e": "🛳",
+ "d": "passenger ship",
+ "u": "7.0"
+ },
+ "cry": {
+ "c": "people",
+ "e": "😢",
+ "d": "crying face",
+ "u": "6.0"
+ },
+ "crying_cat_face": {
+ "c": "people",
+ "e": "😿",
+ "d": "crying cat face",
+ "u": "6.0"
+ },
+ "crystal_ball": {
+ "c": "objects",
+ "e": "🔮",
+ "d": "crystal ball",
+ "u": "6.0"
+ },
+ "cucumber": {
+ "c": "food",
+ "e": "🥒",
+ "d": "cucumber",
+ "u": "9.0"
+ },
+ "cupid": {
+ "c": "symbols",
+ "e": "💘",
+ "d": "heart with arrow",
+ "u": "6.0"
+ },
+ "curly_loop": {
+ "c": "symbols",
+ "e": "âž°",
+ "d": "curly loop",
+ "u": "6.0"
+ },
+ "currency_exchange": {
+ "c": "symbols",
+ "e": "💱",
+ "d": "currency exchange",
+ "u": "6.0"
+ },
+ "curry": {
+ "c": "food",
+ "e": "ðŸ›",
+ "d": "curry and rice",
+ "u": "6.0"
+ },
+ "custard": {
+ "c": "food",
+ "e": "ðŸ®",
+ "d": "custard",
+ "u": "6.0"
+ },
+ "customs": {
+ "c": "symbols",
+ "e": "🛃",
+ "d": "customs",
+ "u": "6.0"
+ },
+ "cyclone": {
+ "c": "symbols",
+ "e": "🌀",
+ "d": "cyclone",
+ "u": "6.0"
+ },
+ "dagger": {
+ "c": "objects",
+ "e": "🗡",
+ "d": "dagger knife",
+ "u": "7.0"
+ },
+ "dancer": {
+ "c": "people",
+ "e": "💃",
+ "d": "dancer",
+ "u": "6.0"
+ },
+ "dancer_tone1": {
+ "c": "people",
+ "e": "💃ðŸ»",
+ "d": "dancer tone 1",
+ "u": "8.0"
+ },
+ "dancer_tone2": {
+ "c": "people",
+ "e": "💃ðŸ¼",
+ "d": "dancer tone 2",
+ "u": "8.0"
+ },
+ "dancer_tone3": {
+ "c": "people",
+ "e": "💃ðŸ½",
+ "d": "dancer tone 3",
+ "u": "8.0"
+ },
+ "dancer_tone4": {
+ "c": "people",
+ "e": "💃ðŸ¾",
+ "d": "dancer tone 4",
+ "u": "8.0"
+ },
+ "dancer_tone5": {
+ "c": "people",
+ "e": "💃ðŸ¿",
+ "d": "dancer tone 5",
+ "u": "8.0"
+ },
+ "dancers": {
+ "c": "people",
+ "e": "👯",
+ "d": "woman with bunny ears",
+ "u": "6.0"
+ },
+ "dango": {
+ "c": "food",
+ "e": "ðŸ¡",
+ "d": "dango",
+ "u": "6.0"
+ },
+ "dark_sunglasses": {
+ "c": "people",
+ "e": "🕶",
+ "d": "dark sunglasses",
+ "u": "7.0"
+ },
+ "dart": {
+ "c": "activity",
+ "e": "🎯",
+ "d": "direct hit",
+ "u": "6.0"
+ },
+ "dash": {
+ "c": "nature",
+ "e": "💨",
+ "d": "dash symbol",
+ "u": "6.0"
+ },
+ "date": {
+ "c": "objects",
+ "e": "📅",
+ "d": "calendar",
+ "u": "6.0"
+ },
+ "deciduous_tree": {
+ "c": "nature",
+ "e": "🌳",
+ "d": "deciduous tree",
+ "u": "6.0"
+ },
+ "deer": {
+ "c": "nature",
+ "e": "🦌",
+ "d": "deer",
+ "u": "9.0"
+ },
+ "department_store": {
+ "c": "travel",
+ "e": "ðŸ¬",
+ "d": "department store",
+ "u": "6.0"
+ },
+ "desert": {
+ "c": "travel",
+ "e": "ðŸœ",
+ "d": "desert",
+ "u": "7.0"
+ },
+ "desktop": {
+ "c": "objects",
+ "e": "🖥",
+ "d": "desktop computer",
+ "u": "7.0"
+ },
+ "diamond_shape_with_a_dot_inside": {
+ "c": "symbols",
+ "e": "💠",
+ "d": "diamond shape with a dot inside",
+ "u": "6.0"
+ },
+ "diamonds": {
+ "c": "symbols",
+ "e": "♦",
+ "d": "black diamond suit",
+ "u": "1.1"
+ },
+ "disappointed": {
+ "c": "people",
+ "e": "😞",
+ "d": "disappointed face",
+ "u": "6.0"
+ },
+ "disappointed_relieved": {
+ "c": "people",
+ "e": "😥",
+ "d": "disappointed but relieved face",
+ "u": "6.0"
+ },
+ "dividers": {
+ "c": "objects",
+ "e": "🗂",
+ "d": "card index dividers",
+ "u": "7.0"
+ },
+ "dizzy": {
+ "c": "nature",
+ "e": "💫",
+ "d": "dizzy symbol",
+ "u": "6.0"
+ },
+ "dizzy_face": {
+ "c": "people",
+ "e": "😵",
+ "d": "dizzy face",
+ "u": "6.0"
+ },
+ "do_not_litter": {
+ "c": "symbols",
+ "e": "🚯",
+ "d": "do not litter symbol",
+ "u": "6.0"
+ },
+ "dog": {
+ "c": "nature",
+ "e": "ðŸ¶",
+ "d": "dog face",
+ "u": "6.0"
+ },
+ "dog2": {
+ "c": "nature",
+ "e": "ðŸ•",
+ "d": "dog",
+ "u": "6.0"
+ },
+ "dollar": {
+ "c": "objects",
+ "e": "💵",
+ "d": "banknote with dollar sign",
+ "u": "6.0"
+ },
+ "dolls": {
+ "c": "objects",
+ "e": "🎎",
+ "d": "japanese dolls",
+ "u": "6.0"
+ },
+ "dolphin": {
+ "c": "nature",
+ "e": "ðŸ¬",
+ "d": "dolphin",
+ "u": "6.0"
+ },
+ "door": {
+ "c": "objects",
+ "e": "🚪",
+ "d": "door",
+ "u": "6.0"
+ },
+ "doughnut": {
+ "c": "food",
+ "e": "ðŸ©",
+ "d": "doughnut",
+ "u": "6.0"
+ },
+ "dove": {
+ "c": "nature",
+ "e": "🕊",
+ "d": "dove of peace",
+ "u": "7.0"
+ },
+ "dragon": {
+ "c": "nature",
+ "e": "ðŸ‰",
+ "d": "dragon",
+ "u": "6.0"
+ },
+ "dragon_face": {
+ "c": "nature",
+ "e": "ðŸ²",
+ "d": "dragon face",
+ "u": "6.0"
+ },
+ "dress": {
+ "c": "people",
+ "e": "👗",
+ "d": "dress",
+ "u": "6.0"
+ },
+ "dromedary_camel": {
+ "c": "nature",
+ "e": "ðŸª",
+ "d": "dromedary camel",
+ "u": "6.0"
+ },
+ "drooling_face": {
+ "c": "people",
+ "e": "🤤",
+ "d": "drooling face",
+ "u": "9.0"
+ },
+ "droplet": {
+ "c": "nature",
+ "e": "💧",
+ "d": "droplet",
+ "u": "6.0"
+ },
+ "drum": {
+ "c": "activity",
+ "e": "ðŸ¥",
+ "d": "drum with drumsticks",
+ "u": "9.0"
+ },
+ "duck": {
+ "c": "nature",
+ "e": "🦆",
+ "d": "duck",
+ "u": "9.0"
+ },
+ "dvd": {
+ "c": "objects",
+ "e": "📀",
+ "d": "dvd",
+ "u": "6.0"
+ },
+ "e-mail": {
+ "c": "objects",
+ "e": "📧",
+ "d": "e-mail symbol",
+ "u": "6.0"
+ },
+ "eagle": {
+ "c": "nature",
+ "e": "🦅",
+ "d": "eagle",
+ "u": "9.0"
+ },
+ "ear": {
+ "c": "people",
+ "e": "👂",
+ "d": "ear",
+ "u": "6.0"
+ },
+ "ear_of_rice": {
+ "c": "nature",
+ "e": "🌾",
+ "d": "ear of rice",
+ "u": "6.0"
+ },
+ "ear_tone1": {
+ "c": "people",
+ "e": "👂ðŸ»",
+ "d": "ear tone 1",
+ "u": "8.0"
+ },
+ "ear_tone2": {
+ "c": "people",
+ "e": "👂ðŸ¼",
+ "d": "ear tone 2",
+ "u": "8.0"
+ },
+ "ear_tone3": {
+ "c": "people",
+ "e": "👂ðŸ½",
+ "d": "ear tone 3",
+ "u": "8.0"
+ },
+ "ear_tone4": {
+ "c": "people",
+ "e": "👂ðŸ¾",
+ "d": "ear tone 4",
+ "u": "8.0"
+ },
+ "ear_tone5": {
+ "c": "people",
+ "e": "👂ðŸ¿",
+ "d": "ear tone 5",
+ "u": "8.0"
+ },
+ "earth_africa": {
+ "c": "nature",
+ "e": "ðŸŒ",
+ "d": "earth globe europe-africa",
+ "u": "6.0"
+ },
+ "earth_americas": {
+ "c": "nature",
+ "e": "🌎",
+ "d": "earth globe americas",
+ "u": "6.0"
+ },
+ "earth_asia": {
+ "c": "nature",
+ "e": "ðŸŒ",
+ "d": "earth globe asia-australia",
+ "u": "6.0"
+ },
+ "egg": {
+ "c": "food",
+ "e": "🥚",
+ "d": "egg",
+ "u": "9.0"
+ },
+ "eggplant": {
+ "c": "food",
+ "e": "ðŸ†",
+ "d": "aubergine",
+ "u": "6.0"
+ },
+ "eight": {
+ "c": "symbols",
+ "e": "8ï¸âƒ£",
+ "d": "keycap digit eight",
+ "u": "3.0"
+ },
+ "eight_pointed_black_star": {
+ "c": "symbols",
+ "e": "✴",
+ "d": "eight pointed black star",
+ "u": "1.1"
+ },
+ "eight_spoked_asterisk": {
+ "c": "symbols",
+ "e": "✳",
+ "d": "eight spoked asterisk",
+ "u": "1.1"
+ },
+ "eject": {
+ "c": "symbols",
+ "e": "â",
+ "d": "eject symbol",
+ "u": "4.0"
+ },
+ "electric_plug": {
+ "c": "objects",
+ "e": "🔌",
+ "d": "electric plug",
+ "u": "6.0"
+ },
+ "elephant": {
+ "c": "nature",
+ "e": "ðŸ˜",
+ "d": "elephant",
+ "u": "6.0"
+ },
+ "end": {
+ "c": "symbols",
+ "e": "🔚",
+ "d": "end with leftwards arrow above",
+ "u": "6.0"
+ },
+ "envelope": {
+ "c": "objects",
+ "e": "✉",
+ "d": "envelope",
+ "u": "1.1"
+ },
+ "envelope_with_arrow": {
+ "c": "objects",
+ "e": "📩",
+ "d": "envelope with downwards arrow above",
+ "u": "6.0"
+ },
+ "euro": {
+ "c": "objects",
+ "e": "💶",
+ "d": "banknote with euro sign",
+ "u": "6.0"
+ },
+ "european_castle": {
+ "c": "travel",
+ "e": "ðŸ°",
+ "d": "european castle",
+ "u": "6.0"
+ },
+ "european_post_office": {
+ "c": "travel",
+ "e": "ðŸ¤",
+ "d": "european post office",
+ "u": "6.0"
+ },
+ "evergreen_tree": {
+ "c": "nature",
+ "e": "🌲",
+ "d": "evergreen tree",
+ "u": "6.0"
+ },
+ "exclamation": {
+ "c": "symbols",
+ "e": "â—",
+ "d": "heavy exclamation mark symbol",
+ "u": "5.2"
+ },
+ "expressionless": {
+ "c": "people",
+ "e": "😑",
+ "d": "expressionless face",
+ "u": "6.1"
+ },
+ "eye": {
+ "c": "people",
+ "e": "ðŸ‘",
+ "d": "eye",
+ "u": "7.0"
+ },
+ "eye_in_speech_bubble": {
+ "c": "symbols",
+ "e": "ðŸ‘â€ðŸ—¨",
+ "d": "eye in speech bubble",
+ "u": "7.0"
+ },
+ "eyeglasses": {
+ "c": "people",
+ "e": "👓",
+ "d": "eyeglasses",
+ "u": "6.0"
+ },
+ "eyes": {
+ "c": "people",
+ "e": "👀",
+ "d": "eyes",
+ "u": "6.0"
+ },
+ "face_palm": {
+ "c": "people",
+ "e": "🤦",
+ "d": "face palm",
+ "u": "9.0"
+ },
+ "face_palm_tone1": {
+ "c": "people",
+ "e": "🤦ðŸ»",
+ "d": "face palm tone 1",
+ "u": "9.0"
+ },
+ "face_palm_tone2": {
+ "c": "people",
+ "e": "🤦ðŸ¼",
+ "d": "face palm tone 2",
+ "u": "9.0"
+ },
+ "face_palm_tone3": {
+ "c": "people",
+ "e": "🤦ðŸ½",
+ "d": "face palm tone 3",
+ "u": "9.0"
+ },
+ "face_palm_tone4": {
+ "c": "people",
+ "e": "🤦ðŸ¾",
+ "d": "face palm tone 4",
+ "u": "9.0"
+ },
+ "face_palm_tone5": {
+ "c": "people",
+ "e": "🤦ðŸ¿",
+ "d": "face palm tone 5",
+ "u": "9.0"
+ },
+ "factory": {
+ "c": "travel",
+ "e": "ðŸ­",
+ "d": "factory",
+ "u": "6.0"
+ },
+ "fallen_leaf": {
+ "c": "nature",
+ "e": "ðŸ‚",
+ "d": "fallen leaf",
+ "u": "6.0"
+ },
+ "family": {
+ "c": "people",
+ "e": "👪",
+ "d": "family",
+ "u": "6.0"
+ },
+ "family_mmb": {
+ "c": "people",
+ "e": "👨â€ðŸ‘¨â€ðŸ‘¦",
+ "d": "family (man,man,boy)",
+ "u": "6.0"
+ },
+ "family_mmbb": {
+ "c": "people",
+ "e": "👨â€ðŸ‘¨â€ðŸ‘¦â€ðŸ‘¦",
+ "d": "family (man,man,boy,boy)",
+ "u": "6.0"
+ },
+ "family_mmg": {
+ "c": "people",
+ "e": "👨â€ðŸ‘¨â€ðŸ‘§",
+ "d": "family (man,man,girl)",
+ "u": "6.0"
+ },
+ "family_mmgb": {
+ "c": "people",
+ "e": "👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘¦",
+ "d": "family (man,man,girl,boy)",
+ "u": "6.0"
+ },
+ "family_mmgg": {
+ "c": "people",
+ "e": "👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘§",
+ "d": "family (man,man,girl,girl)",
+ "u": "6.0"
+ },
+ "family_mwbb": {
+ "c": "people",
+ "e": "👨â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦",
+ "d": "family (man,woman,boy,boy)",
+ "u": "6.0"
+ },
+ "family_mwg": {
+ "c": "people",
+ "e": "👨â€ðŸ‘©â€ðŸ‘§",
+ "d": "family (man,woman,girl)",
+ "u": "6.0"
+ },
+ "family_mwgb": {
+ "c": "people",
+ "e": "👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦",
+ "d": "family (man,woman,girl,boy)",
+ "u": "6.0"
+ },
+ "family_mwgg": {
+ "c": "people",
+ "e": "👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§",
+ "d": "family (man,woman,girl,girl)",
+ "u": "6.0"
+ },
+ "family_wwb": {
+ "c": "people",
+ "e": "👩â€ðŸ‘©â€ðŸ‘¦",
+ "d": "family (woman,woman,boy)",
+ "u": "6.0"
+ },
+ "family_wwbb": {
+ "c": "people",
+ "e": "👩â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦",
+ "d": "family (woman,woman,boy,boy)",
+ "u": "6.0"
+ },
+ "family_wwg": {
+ "c": "people",
+ "e": "👩â€ðŸ‘©â€ðŸ‘§",
+ "d": "family (woman,woman,girl)",
+ "u": "6.0"
+ },
+ "family_wwgb": {
+ "c": "people",
+ "e": "👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦",
+ "d": "family (woman,woman,girl,boy)",
+ "u": "6.0"
+ },
+ "family_wwgg": {
+ "c": "people",
+ "e": "👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§",
+ "d": "family (woman,woman,girl,girl)",
+ "u": "6.0"
+ },
+ "fast_forward": {
+ "c": "symbols",
+ "e": "â©",
+ "d": "black right-pointing double triangle",
+ "u": "6.0"
+ },
+ "fax": {
+ "c": "objects",
+ "e": "📠",
+ "d": "fax machine",
+ "u": "6.0"
+ },
+ "fearful": {
+ "c": "people",
+ "e": "😨",
+ "d": "fearful face",
+ "u": "6.0"
+ },
+ "feet": {
+ "c": "nature",
+ "e": "ðŸ¾",
+ "d": "paw prints",
+ "u": "6.0"
+ },
+ "fencer": {
+ "c": "activity",
+ "e": "🤺",
+ "d": "fencer",
+ "u": "9.0"
+ },
+ "ferris_wheel": {
+ "c": "travel",
+ "e": "🎡",
+ "d": "ferris wheel",
+ "u": "6.0"
+ },
+ "ferry": {
+ "c": "travel",
+ "e": "â›´",
+ "d": "ferry",
+ "u": "5.2"
+ },
+ "field_hockey": {
+ "c": "activity",
+ "e": "ðŸ‘",
+ "d": "field hockey stick and ball",
+ "u": "8.0"
+ },
+ "file_cabinet": {
+ "c": "objects",
+ "e": "🗄",
+ "d": "file cabinet",
+ "u": "7.0"
+ },
+ "file_folder": {
+ "c": "objects",
+ "e": "ðŸ“",
+ "d": "file folder",
+ "u": "6.0"
+ },
+ "film_frames": {
+ "c": "objects",
+ "e": "🎞",
+ "d": "film frames",
+ "u": "7.0"
+ },
+ "fingers_crossed": {
+ "c": "people",
+ "e": "🤞",
+ "d": "hand with first and index finger crossed",
+ "u": "9.0"
+ },
+ "fingers_crossed_tone1": {
+ "c": "people",
+ "e": "🤞ðŸ»",
+ "d": "hand with index and middle fingers crossed tone 1",
+ "u": "9.0"
+ },
+ "fingers_crossed_tone2": {
+ "c": "people",
+ "e": "🤞ðŸ¼",
+ "d": "hand with index and middle fingers crossed tone 2",
+ "u": "9.0"
+ },
+ "fingers_crossed_tone3": {
+ "c": "people",
+ "e": "🤞ðŸ½",
+ "d": "hand with index and middle fingers crossed tone 3",
+ "u": "9.0"
+ },
+ "fingers_crossed_tone4": {
+ "c": "people",
+ "e": "🤞ðŸ¾",
+ "d": "hand with index and middle fingers crossed tone 4",
+ "u": "9.0"
+ },
+ "fingers_crossed_tone5": {
+ "c": "people",
+ "e": "🤞ðŸ¿",
+ "d": "hand with index and middle fingers crossed tone 5",
+ "u": "9.0"
+ },
+ "fire": {
+ "c": "nature",
+ "e": "🔥",
+ "d": "fire",
+ "u": "6.0"
+ },
+ "fire_engine": {
+ "c": "travel",
+ "e": "🚒",
+ "d": "fire engine",
+ "u": "6.0"
+ },
+ "fireworks": {
+ "c": "travel",
+ "e": "🎆",
+ "d": "fireworks",
+ "u": "6.0"
+ },
+ "first_place": {
+ "c": "activity",
+ "e": "🥇",
+ "d": "first place medal",
+ "u": "9.0"
+ },
+ "first_quarter_moon": {
+ "c": "nature",
+ "e": "🌓",
+ "d": "first quarter moon symbol",
+ "u": "6.0"
+ },
+ "first_quarter_moon_with_face": {
+ "c": "nature",
+ "e": "🌛",
+ "d": "first quarter moon with face",
+ "u": "6.0"
+ },
+ "fish": {
+ "c": "nature",
+ "e": "ðŸŸ",
+ "d": "fish",
+ "u": "6.0"
+ },
+ "fish_cake": {
+ "c": "food",
+ "e": "ðŸ¥",
+ "d": "fish cake with swirl design",
+ "u": "6.0"
+ },
+ "fishing_pole_and_fish": {
+ "c": "activity",
+ "e": "🎣",
+ "d": "fishing pole and fish",
+ "u": "6.0"
+ },
+ "fist": {
+ "c": "people",
+ "e": "✊",
+ "d": "raised fist",
+ "u": "6.0"
+ },
+ "fist_tone1": {
+ "c": "people",
+ "e": "✊ðŸ»",
+ "d": "raised fist tone 1",
+ "u": "8.0"
+ },
+ "fist_tone2": {
+ "c": "people",
+ "e": "✊ðŸ¼",
+ "d": "raised fist tone 2",
+ "u": "8.0"
+ },
+ "fist_tone3": {
+ "c": "people",
+ "e": "✊ðŸ½",
+ "d": "raised fist tone 3",
+ "u": "8.0"
+ },
+ "fist_tone4": {
+ "c": "people",
+ "e": "✊ðŸ¾",
+ "d": "raised fist tone 4",
+ "u": "8.0"
+ },
+ "fist_tone5": {
+ "c": "people",
+ "e": "✊ðŸ¿",
+ "d": "raised fist tone 5",
+ "u": "8.0"
+ },
+ "five": {
+ "c": "symbols",
+ "e": "5ï¸âƒ£",
+ "d": "keycap digit five",
+ "u": "3.0"
+ },
+ "flag_ac": {
+ "c": "flags",
+ "e": "🇦🇨",
+ "d": "ascension",
+ "u": "6.0"
+ },
+ "flag_ad": {
+ "c": "flags",
+ "e": "🇦🇩",
+ "d": "andorra",
+ "u": "6.0"
+ },
+ "flag_ae": {
+ "c": "flags",
+ "e": "🇦🇪",
+ "d": "the united arab emirates",
+ "u": "6.0"
+ },
+ "flag_af": {
+ "c": "flags",
+ "e": "🇦🇫",
+ "d": "afghanistan",
+ "u": "6.0"
+ },
+ "flag_ag": {
+ "c": "flags",
+ "e": "🇦🇬",
+ "d": "antigua and barbuda",
+ "u": "6.0"
+ },
+ "flag_ai": {
+ "c": "flags",
+ "e": "🇦🇮",
+ "d": "anguilla",
+ "u": "6.0"
+ },
+ "flag_al": {
+ "c": "flags",
+ "e": "🇦🇱",
+ "d": "albania",
+ "u": "6.0"
+ },
+ "flag_am": {
+ "c": "flags",
+ "e": "🇦🇲",
+ "d": "armenia",
+ "u": "6.0"
+ },
+ "flag_ao": {
+ "c": "flags",
+ "e": "🇦🇴",
+ "d": "angola",
+ "u": "6.0"
+ },
+ "flag_aq": {
+ "c": "flags",
+ "e": "🇦🇶",
+ "d": "antarctica",
+ "u": "6.0"
+ },
+ "flag_ar": {
+ "c": "flags",
+ "e": "🇦🇷",
+ "d": "argentina",
+ "u": "6.0"
+ },
+ "flag_as": {
+ "c": "flags",
+ "e": "🇦🇸",
+ "d": "american samoa",
+ "u": "6.0"
+ },
+ "flag_at": {
+ "c": "flags",
+ "e": "🇦🇹",
+ "d": "austria",
+ "u": "6.0"
+ },
+ "flag_au": {
+ "c": "flags",
+ "e": "🇦🇺",
+ "d": "australia",
+ "u": "6.0"
+ },
+ "flag_aw": {
+ "c": "flags",
+ "e": "🇦🇼",
+ "d": "aruba",
+ "u": "6.0"
+ },
+ "flag_ax": {
+ "c": "flags",
+ "e": "🇦🇽",
+ "d": "Ã¥land islands",
+ "u": "6.0"
+ },
+ "flag_az": {
+ "c": "flags",
+ "e": "🇦🇿",
+ "d": "azerbaijan",
+ "u": "6.0"
+ },
+ "flag_ba": {
+ "c": "flags",
+ "e": "🇧🇦",
+ "d": "bosnia and herzegovina",
+ "u": "6.0"
+ },
+ "flag_bb": {
+ "c": "flags",
+ "e": "🇧🇧",
+ "d": "barbados",
+ "u": "6.0"
+ },
+ "flag_bd": {
+ "c": "flags",
+ "e": "🇧🇩",
+ "d": "bangladesh",
+ "u": "6.0"
+ },
+ "flag_be": {
+ "c": "flags",
+ "e": "🇧🇪",
+ "d": "belgium",
+ "u": "6.0"
+ },
+ "flag_bf": {
+ "c": "flags",
+ "e": "🇧🇫",
+ "d": "burkina faso",
+ "u": "6.0"
+ },
+ "flag_bg": {
+ "c": "flags",
+ "e": "🇧🇬",
+ "d": "bulgaria",
+ "u": "6.0"
+ },
+ "flag_bh": {
+ "c": "flags",
+ "e": "🇧🇭",
+ "d": "bahrain",
+ "u": "6.0"
+ },
+ "flag_bi": {
+ "c": "flags",
+ "e": "🇧🇮",
+ "d": "burundi",
+ "u": "6.0"
+ },
+ "flag_bj": {
+ "c": "flags",
+ "e": "🇧🇯",
+ "d": "benin",
+ "u": "6.0"
+ },
+ "flag_bl": {
+ "c": "flags",
+ "e": "🇧🇱",
+ "d": "saint barthélemy",
+ "u": "6.0"
+ },
+ "flag_black": {
+ "c": "objects",
+ "e": "ðŸ´",
+ "d": "waving black flag",
+ "u": "6.0"
+ },
+ "flag_bm": {
+ "c": "flags",
+ "e": "🇧🇲",
+ "d": "bermuda",
+ "u": "6.0"
+ },
+ "flag_bn": {
+ "c": "flags",
+ "e": "🇧🇳",
+ "d": "brunei",
+ "u": "6.0"
+ },
+ "flag_bo": {
+ "c": "flags",
+ "e": "🇧🇴",
+ "d": "bolivia",
+ "u": "6.0"
+ },
+ "flag_bq": {
+ "c": "flags",
+ "e": "🇧🇶",
+ "d": "caribbean netherlands",
+ "u": "6.0"
+ },
+ "flag_br": {
+ "c": "flags",
+ "e": "🇧🇷",
+ "d": "brazil",
+ "u": "6.0"
+ },
+ "flag_bs": {
+ "c": "flags",
+ "e": "🇧🇸",
+ "d": "the bahamas",
+ "u": "6.0"
+ },
+ "flag_bt": {
+ "c": "flags",
+ "e": "🇧🇹",
+ "d": "bhutan",
+ "u": "6.0"
+ },
+ "flag_bv": {
+ "c": "flags",
+ "e": "🇧🇻",
+ "d": "bouvet island",
+ "u": "6.0"
+ },
+ "flag_bw": {
+ "c": "flags",
+ "e": "🇧🇼",
+ "d": "botswana",
+ "u": "6.0"
+ },
+ "flag_by": {
+ "c": "flags",
+ "e": "🇧🇾",
+ "d": "belarus",
+ "u": "6.0"
+ },
+ "flag_bz": {
+ "c": "flags",
+ "e": "🇧🇿",
+ "d": "belize",
+ "u": "6.0"
+ },
+ "flag_ca": {
+ "c": "flags",
+ "e": "🇨🇦",
+ "d": "canada",
+ "u": "6.0"
+ },
+ "flag_cc": {
+ "c": "flags",
+ "e": "🇨🇨",
+ "d": "cocos (keeling) islands",
+ "u": "6.0"
+ },
+ "flag_cd": {
+ "c": "flags",
+ "e": "🇨🇩",
+ "d": "the democratic republic of the congo",
+ "u": "6.0"
+ },
+ "flag_cf": {
+ "c": "flags",
+ "e": "🇨🇫",
+ "d": "central african republic",
+ "u": "6.0"
+ },
+ "flag_cg": {
+ "c": "flags",
+ "e": "🇨🇬",
+ "d": "the republic of the congo",
+ "u": "6.0"
+ },
+ "flag_ch": {
+ "c": "flags",
+ "e": "🇨🇭",
+ "d": "switzerland",
+ "u": "6.0"
+ },
+ "flag_ci": {
+ "c": "flags",
+ "e": "🇨🇮",
+ "d": "cote d'ivoire",
+ "u": "6.0"
+ },
+ "flag_ck": {
+ "c": "flags",
+ "e": "🇨🇰",
+ "d": "cook islands",
+ "u": "6.0"
+ },
+ "flag_cl": {
+ "c": "flags",
+ "e": "🇨🇱",
+ "d": "chile",
+ "u": "6.0"
+ },
+ "flag_cm": {
+ "c": "flags",
+ "e": "🇨🇲",
+ "d": "cameroon",
+ "u": "6.0"
+ },
+ "flag_cn": {
+ "c": "flags",
+ "e": "🇨🇳",
+ "d": "china",
+ "u": "6.0"
+ },
+ "flag_co": {
+ "c": "flags",
+ "e": "🇨🇴",
+ "d": "colombia",
+ "u": "6.0"
+ },
+ "flag_cp": {
+ "c": "flags",
+ "e": "🇨🇵",
+ "d": "clipperton island",
+ "u": "6.0"
+ },
+ "flag_cr": {
+ "c": "flags",
+ "e": "🇨🇷",
+ "d": "costa rica",
+ "u": "6.0"
+ },
+ "flag_cu": {
+ "c": "flags",
+ "e": "🇨🇺",
+ "d": "cuba",
+ "u": "6.0"
+ },
+ "flag_cv": {
+ "c": "flags",
+ "e": "🇨🇻",
+ "d": "cape verde",
+ "u": "6.0"
+ },
+ "flag_cw": {
+ "c": "flags",
+ "e": "🇨🇼",
+ "d": "curaçao",
+ "u": "6.0"
+ },
+ "flag_cx": {
+ "c": "flags",
+ "e": "🇨🇽",
+ "d": "christmas island",
+ "u": "6.0"
+ },
+ "flag_cy": {
+ "c": "flags",
+ "e": "🇨🇾",
+ "d": "cyprus",
+ "u": "6.0"
+ },
+ "flag_cz": {
+ "c": "flags",
+ "e": "🇨🇿",
+ "d": "the czech republic",
+ "u": "6.0"
+ },
+ "flag_de": {
+ "c": "flags",
+ "e": "🇩🇪",
+ "d": "germany",
+ "u": "6.0"
+ },
+ "flag_dg": {
+ "c": "flags",
+ "e": "🇩🇬",
+ "d": "diego garcia",
+ "u": "6.0"
+ },
+ "flag_dj": {
+ "c": "flags",
+ "e": "🇩🇯",
+ "d": "djibouti",
+ "u": "6.0"
+ },
+ "flag_dk": {
+ "c": "flags",
+ "e": "🇩🇰",
+ "d": "denmark",
+ "u": "6.0"
+ },
+ "flag_dm": {
+ "c": "flags",
+ "e": "🇩🇲",
+ "d": "dominica",
+ "u": "6.0"
+ },
+ "flag_do": {
+ "c": "flags",
+ "e": "🇩🇴",
+ "d": "the dominican republic",
+ "u": "6.0"
+ },
+ "flag_dz": {
+ "c": "flags",
+ "e": "🇩🇿",
+ "d": "algeria",
+ "u": "6.0"
+ },
+ "flag_ea": {
+ "c": "flags",
+ "e": "🇪🇦",
+ "d": "ceuta, melilla",
+ "u": "6.0"
+ },
+ "flag_ec": {
+ "c": "flags",
+ "e": "🇪🇨",
+ "d": "ecuador",
+ "u": "6.0"
+ },
+ "flag_ee": {
+ "c": "flags",
+ "e": "🇪🇪",
+ "d": "estonia",
+ "u": "6.0"
+ },
+ "flag_eg": {
+ "c": "flags",
+ "e": "🇪🇬",
+ "d": "egypt",
+ "u": "6.0"
+ },
+ "flag_eh": {
+ "c": "flags",
+ "e": "🇪🇭",
+ "d": "western sahara",
+ "u": "6.0"
+ },
+ "flag_er": {
+ "c": "flags",
+ "e": "🇪🇷",
+ "d": "eritrea",
+ "u": "6.0"
+ },
+ "flag_es": {
+ "c": "flags",
+ "e": "🇪🇸",
+ "d": "spain",
+ "u": "6.0"
+ },
+ "flag_et": {
+ "c": "flags",
+ "e": "🇪🇹",
+ "d": "ethiopia",
+ "u": "6.0"
+ },
+ "flag_eu": {
+ "c": "flags",
+ "e": "🇪🇺",
+ "d": "european union",
+ "u": "6.0"
+ },
+ "flag_fi": {
+ "c": "flags",
+ "e": "🇫🇮",
+ "d": "finland",
+ "u": "6.0"
+ },
+ "flag_fj": {
+ "c": "flags",
+ "e": "🇫🇯",
+ "d": "fiji",
+ "u": "6.0"
+ },
+ "flag_fk": {
+ "c": "flags",
+ "e": "🇫🇰",
+ "d": "falkland islands",
+ "u": "6.0"
+ },
+ "flag_fm": {
+ "c": "flags",
+ "e": "🇫🇲",
+ "d": "micronesia",
+ "u": "6.0"
+ },
+ "flag_fo": {
+ "c": "flags",
+ "e": "🇫🇴",
+ "d": "faroe islands",
+ "u": "6.0"
+ },
+ "flag_fr": {
+ "c": "flags",
+ "e": "🇫🇷",
+ "d": "france",
+ "u": "6.0"
+ },
+ "flag_ga": {
+ "c": "flags",
+ "e": "🇬🇦",
+ "d": "gabon",
+ "u": "6.0"
+ },
+ "flag_gb": {
+ "c": "flags",
+ "e": "🇬🇧",
+ "d": "great britain",
+ "u": "6.0"
+ },
+ "flag_gd": {
+ "c": "flags",
+ "e": "🇬🇩",
+ "d": "grenada",
+ "u": "6.0"
+ },
+ "flag_ge": {
+ "c": "flags",
+ "e": "🇬🇪",
+ "d": "georgia",
+ "u": "6.0"
+ },
+ "flag_gf": {
+ "c": "flags",
+ "e": "🇬🇫",
+ "d": "french guiana",
+ "u": "6.0"
+ },
+ "flag_gg": {
+ "c": "flags",
+ "e": "🇬🇬",
+ "d": "guernsey",
+ "u": "6.0"
+ },
+ "flag_gh": {
+ "c": "flags",
+ "e": "🇬🇭",
+ "d": "ghana",
+ "u": "6.0"
+ },
+ "flag_gi": {
+ "c": "flags",
+ "e": "🇬🇮",
+ "d": "gibraltar",
+ "u": "6.0"
+ },
+ "flag_gl": {
+ "c": "flags",
+ "e": "🇬🇱",
+ "d": "greenland",
+ "u": "6.0"
+ },
+ "flag_gm": {
+ "c": "flags",
+ "e": "🇬🇲",
+ "d": "the gambia",
+ "u": "6.0"
+ },
+ "flag_gn": {
+ "c": "flags",
+ "e": "🇬🇳",
+ "d": "guinea",
+ "u": "6.0"
+ },
+ "flag_gp": {
+ "c": "flags",
+ "e": "🇬🇵",
+ "d": "guadeloupe",
+ "u": "6.0"
+ },
+ "flag_gq": {
+ "c": "flags",
+ "e": "🇬🇶",
+ "d": "equatorial guinea",
+ "u": "6.0"
+ },
+ "flag_gr": {
+ "c": "flags",
+ "e": "🇬🇷",
+ "d": "greece",
+ "u": "6.0"
+ },
+ "flag_gs": {
+ "c": "flags",
+ "e": "🇬🇸",
+ "d": "south georgia",
+ "u": "6.0"
+ },
+ "flag_gt": {
+ "c": "flags",
+ "e": "🇬🇹",
+ "d": "guatemala",
+ "u": "6.0"
+ },
+ "flag_gu": {
+ "c": "flags",
+ "e": "🇬🇺",
+ "d": "guam",
+ "u": "6.0"
+ },
+ "flag_gw": {
+ "c": "flags",
+ "e": "🇬🇼",
+ "d": "guinea-bissau",
+ "u": "6.0"
+ },
+ "flag_gy": {
+ "c": "flags",
+ "e": "🇬🇾",
+ "d": "guyana",
+ "u": "6.0"
+ },
+ "flag_hk": {
+ "c": "flags",
+ "e": "🇭🇰",
+ "d": "hong kong",
+ "u": "6.0"
+ },
+ "flag_hm": {
+ "c": "flags",
+ "e": "🇭🇲",
+ "d": "heard island and mcdonald islands",
+ "u": "6.0"
+ },
+ "flag_hn": {
+ "c": "flags",
+ "e": "🇭🇳",
+ "d": "honduras",
+ "u": "6.0"
+ },
+ "flag_hr": {
+ "c": "flags",
+ "e": "🇭🇷",
+ "d": "croatia",
+ "u": "6.0"
+ },
+ "flag_ht": {
+ "c": "flags",
+ "e": "🇭🇹",
+ "d": "haiti",
+ "u": "6.0"
+ },
+ "flag_hu": {
+ "c": "flags",
+ "e": "🇭🇺",
+ "d": "hungary",
+ "u": "6.0"
+ },
+ "flag_ic": {
+ "c": "flags",
+ "e": "🇮🇨",
+ "d": "canary islands",
+ "u": "6.0"
+ },
+ "flag_id": {
+ "c": "flags",
+ "e": "🇮🇩",
+ "d": "indonesia",
+ "u": "6.0"
+ },
+ "flag_ie": {
+ "c": "flags",
+ "e": "🇮🇪",
+ "d": "ireland",
+ "u": "6.0"
+ },
+ "flag_il": {
+ "c": "flags",
+ "e": "🇮🇱",
+ "d": "israel",
+ "u": "6.0"
+ },
+ "flag_im": {
+ "c": "flags",
+ "e": "🇮🇲",
+ "d": "isle of man",
+ "u": "6.0"
+ },
+ "flag_in": {
+ "c": "flags",
+ "e": "🇮🇳",
+ "d": "india",
+ "u": "6.0"
+ },
+ "flag_io": {
+ "c": "flags",
+ "e": "🇮🇴",
+ "d": "british indian ocean territory",
+ "u": "6.0"
+ },
+ "flag_iq": {
+ "c": "flags",
+ "e": "🇮🇶",
+ "d": "iraq",
+ "u": "6.0"
+ },
+ "flag_ir": {
+ "c": "flags",
+ "e": "🇮🇷",
+ "d": "iran",
+ "u": "6.0"
+ },
+ "flag_is": {
+ "c": "flags",
+ "e": "🇮🇸",
+ "d": "iceland",
+ "u": "6.0"
+ },
+ "flag_it": {
+ "c": "flags",
+ "e": "🇮🇹",
+ "d": "italy",
+ "u": "6.0"
+ },
+ "flag_je": {
+ "c": "flags",
+ "e": "🇯🇪",
+ "d": "jersey",
+ "u": "6.0"
+ },
+ "flag_jm": {
+ "c": "flags",
+ "e": "🇯🇲",
+ "d": "jamaica",
+ "u": "6.0"
+ },
+ "flag_jo": {
+ "c": "flags",
+ "e": "🇯🇴",
+ "d": "jordan",
+ "u": "6.0"
+ },
+ "flag_jp": {
+ "c": "flags",
+ "e": "🇯🇵",
+ "d": "japan",
+ "u": "6.0"
+ },
+ "flag_ke": {
+ "c": "flags",
+ "e": "🇰🇪",
+ "d": "kenya",
+ "u": "6.0"
+ },
+ "flag_kg": {
+ "c": "flags",
+ "e": "🇰🇬",
+ "d": "kyrgyzstan",
+ "u": "6.0"
+ },
+ "flag_kh": {
+ "c": "flags",
+ "e": "🇰🇭",
+ "d": "cambodia",
+ "u": "6.0"
+ },
+ "flag_ki": {
+ "c": "flags",
+ "e": "🇰🇮",
+ "d": "kiribati",
+ "u": "6.0"
+ },
+ "flag_km": {
+ "c": "flags",
+ "e": "🇰🇲",
+ "d": "the comoros",
+ "u": "6.0"
+ },
+ "flag_kn": {
+ "c": "flags",
+ "e": "🇰🇳",
+ "d": "saint kitts and nevis",
+ "u": "6.0"
+ },
+ "flag_kp": {
+ "c": "flags",
+ "e": "🇰🇵",
+ "d": "north korea",
+ "u": "6.0"
+ },
+ "flag_kr": {
+ "c": "flags",
+ "e": "🇰🇷",
+ "d": "korea",
+ "u": "6.0"
+ },
+ "flag_kw": {
+ "c": "flags",
+ "e": "🇰🇼",
+ "d": "kuwait",
+ "u": "6.0"
+ },
+ "flag_ky": {
+ "c": "flags",
+ "e": "🇰🇾",
+ "d": "cayman islands",
+ "u": "6.0"
+ },
+ "flag_kz": {
+ "c": "flags",
+ "e": "🇰🇿",
+ "d": "kazakhstan",
+ "u": "6.0"
+ },
+ "flag_la": {
+ "c": "flags",
+ "e": "🇱🇦",
+ "d": "laos",
+ "u": "6.0"
+ },
+ "flag_lb": {
+ "c": "flags",
+ "e": "🇱🇧",
+ "d": "lebanon",
+ "u": "6.0"
+ },
+ "flag_lc": {
+ "c": "flags",
+ "e": "🇱🇨",
+ "d": "saint lucia",
+ "u": "6.0"
+ },
+ "flag_li": {
+ "c": "flags",
+ "e": "🇱🇮",
+ "d": "liechtenstein",
+ "u": "6.0"
+ },
+ "flag_lk": {
+ "c": "flags",
+ "e": "🇱🇰",
+ "d": "sri lanka",
+ "u": "6.0"
+ },
+ "flag_lr": {
+ "c": "flags",
+ "e": "🇱🇷",
+ "d": "liberia",
+ "u": "6.0"
+ },
+ "flag_ls": {
+ "c": "flags",
+ "e": "🇱🇸",
+ "d": "lesotho",
+ "u": "6.0"
+ },
+ "flag_lt": {
+ "c": "flags",
+ "e": "🇱🇹",
+ "d": "lithuania",
+ "u": "6.0"
+ },
+ "flag_lu": {
+ "c": "flags",
+ "e": "🇱🇺",
+ "d": "luxembourg",
+ "u": "6.0"
+ },
+ "flag_lv": {
+ "c": "flags",
+ "e": "🇱🇻",
+ "d": "latvia",
+ "u": "6.0"
+ },
+ "flag_ly": {
+ "c": "flags",
+ "e": "🇱🇾",
+ "d": "libya",
+ "u": "6.0"
+ },
+ "flag_ma": {
+ "c": "flags",
+ "e": "🇲🇦",
+ "d": "morocco",
+ "u": "6.0"
+ },
+ "flag_mc": {
+ "c": "flags",
+ "e": "🇲🇨",
+ "d": "monaco",
+ "u": "6.0"
+ },
+ "flag_md": {
+ "c": "flags",
+ "e": "🇲🇩",
+ "d": "moldova",
+ "u": "6.0"
+ },
+ "flag_me": {
+ "c": "flags",
+ "e": "🇲🇪",
+ "d": "montenegro",
+ "u": "6.0"
+ },
+ "flag_mf": {
+ "c": "flags",
+ "e": "🇲🇫",
+ "d": "saint martin",
+ "u": "6.0"
+ },
+ "flag_mg": {
+ "c": "flags",
+ "e": "🇲🇬",
+ "d": "madagascar",
+ "u": "6.0"
+ },
+ "flag_mh": {
+ "c": "flags",
+ "e": "🇲🇭",
+ "d": "the marshall islands",
+ "u": "6.0"
+ },
+ "flag_mk": {
+ "c": "flags",
+ "e": "🇲🇰",
+ "d": "macedonia",
+ "u": "6.0"
+ },
+ "flag_ml": {
+ "c": "flags",
+ "e": "🇲🇱",
+ "d": "mali",
+ "u": "6.0"
+ },
+ "flag_mm": {
+ "c": "flags",
+ "e": "🇲🇲",
+ "d": "myanmar",
+ "u": "6.0"
+ },
+ "flag_mn": {
+ "c": "flags",
+ "e": "🇲🇳",
+ "d": "mongolia",
+ "u": "6.0"
+ },
+ "flag_mo": {
+ "c": "flags",
+ "e": "🇲🇴",
+ "d": "macau",
+ "u": "6.0"
+ },
+ "flag_mp": {
+ "c": "flags",
+ "e": "🇲🇵",
+ "d": "northern mariana islands",
+ "u": "6.0"
+ },
+ "flag_mq": {
+ "c": "flags",
+ "e": "🇲🇶",
+ "d": "martinique",
+ "u": "6.0"
+ },
+ "flag_mr": {
+ "c": "flags",
+ "e": "🇲🇷",
+ "d": "mauritania",
+ "u": "6.0"
+ },
+ "flag_ms": {
+ "c": "flags",
+ "e": "🇲🇸",
+ "d": "montserrat",
+ "u": "6.0"
+ },
+ "flag_mt": {
+ "c": "flags",
+ "e": "🇲🇹",
+ "d": "malta",
+ "u": "6.0"
+ },
+ "flag_mu": {
+ "c": "flags",
+ "e": "🇲🇺",
+ "d": "mauritius",
+ "u": "6.0"
+ },
+ "flag_mv": {
+ "c": "flags",
+ "e": "🇲🇻",
+ "d": "maldives",
+ "u": "6.0"
+ },
+ "flag_mw": {
+ "c": "flags",
+ "e": "🇲🇼",
+ "d": "malawi",
+ "u": "6.0"
+ },
+ "flag_mx": {
+ "c": "flags",
+ "e": "🇲🇽",
+ "d": "mexico",
+ "u": "6.0"
+ },
+ "flag_my": {
+ "c": "flags",
+ "e": "🇲🇾",
+ "d": "malaysia",
+ "u": "6.0"
+ },
+ "flag_mz": {
+ "c": "flags",
+ "e": "🇲🇿",
+ "d": "mozambique",
+ "u": "6.0"
+ },
+ "flag_na": {
+ "c": "flags",
+ "e": "🇳🇦",
+ "d": "namibia",
+ "u": "6.0"
+ },
+ "flag_nc": {
+ "c": "flags",
+ "e": "🇳🇨",
+ "d": "new caledonia",
+ "u": "6.0"
+ },
+ "flag_ne": {
+ "c": "flags",
+ "e": "🇳🇪",
+ "d": "niger",
+ "u": "6.0"
+ },
+ "flag_nf": {
+ "c": "flags",
+ "e": "🇳🇫",
+ "d": "norfolk island",
+ "u": "6.0"
+ },
+ "flag_ng": {
+ "c": "flags",
+ "e": "🇳🇬",
+ "d": "nigeria",
+ "u": "6.0"
+ },
+ "flag_ni": {
+ "c": "flags",
+ "e": "🇳🇮",
+ "d": "nicaragua",
+ "u": "6.0"
+ },
+ "flag_nl": {
+ "c": "flags",
+ "e": "🇳🇱",
+ "d": "the netherlands",
+ "u": "6.0"
+ },
+ "flag_no": {
+ "c": "flags",
+ "e": "🇳🇴",
+ "d": "norway",
+ "u": "6.0"
+ },
+ "flag_np": {
+ "c": "flags",
+ "e": "🇳🇵",
+ "d": "nepal",
+ "u": "6.0"
+ },
+ "flag_nr": {
+ "c": "flags",
+ "e": "🇳🇷",
+ "d": "nauru",
+ "u": "6.0"
+ },
+ "flag_nu": {
+ "c": "flags",
+ "e": "🇳🇺",
+ "d": "niue",
+ "u": "6.0"
+ },
+ "flag_nz": {
+ "c": "flags",
+ "e": "🇳🇿",
+ "d": "new zealand",
+ "u": "6.0"
+ },
+ "flag_om": {
+ "c": "flags",
+ "e": "🇴🇲",
+ "d": "oman",
+ "u": "6.0"
+ },
+ "flag_pa": {
+ "c": "flags",
+ "e": "🇵🇦",
+ "d": "panama",
+ "u": "6.0"
+ },
+ "flag_pe": {
+ "c": "flags",
+ "e": "🇵🇪",
+ "d": "peru",
+ "u": "6.0"
+ },
+ "flag_pf": {
+ "c": "flags",
+ "e": "🇵🇫",
+ "d": "french polynesia",
+ "u": "6.0"
+ },
+ "flag_pg": {
+ "c": "flags",
+ "e": "🇵🇬",
+ "d": "papua new guinea",
+ "u": "6.0"
+ },
+ "flag_ph": {
+ "c": "flags",
+ "e": "🇵🇭",
+ "d": "the philippines",
+ "u": "6.0"
+ },
+ "flag_pk": {
+ "c": "flags",
+ "e": "🇵🇰",
+ "d": "pakistan",
+ "u": "6.0"
+ },
+ "flag_pl": {
+ "c": "flags",
+ "e": "🇵🇱",
+ "d": "poland",
+ "u": "6.0"
+ },
+ "flag_pm": {
+ "c": "flags",
+ "e": "🇵🇲",
+ "d": "saint pierre and miquelon",
+ "u": "6.0"
+ },
+ "flag_pn": {
+ "c": "flags",
+ "e": "🇵🇳",
+ "d": "pitcairn",
+ "u": "6.0"
+ },
+ "flag_pr": {
+ "c": "flags",
+ "e": "🇵🇷",
+ "d": "puerto rico",
+ "u": "6.0"
+ },
+ "flag_ps": {
+ "c": "flags",
+ "e": "🇵🇸",
+ "d": "palestinian authority",
+ "u": "6.0"
+ },
+ "flag_pt": {
+ "c": "flags",
+ "e": "🇵🇹",
+ "d": "portugal",
+ "u": "6.0"
+ },
+ "flag_pw": {
+ "c": "flags",
+ "e": "🇵🇼",
+ "d": "palau",
+ "u": "6.0"
+ },
+ "flag_py": {
+ "c": "flags",
+ "e": "🇵🇾",
+ "d": "paraguay",
+ "u": "6.0"
+ },
+ "flag_qa": {
+ "c": "flags",
+ "e": "🇶🇦",
+ "d": "qatar",
+ "u": "6.0"
+ },
+ "flag_re": {
+ "c": "flags",
+ "e": "🇷🇪",
+ "d": "réunion",
+ "u": "6.0"
+ },
+ "flag_ro": {
+ "c": "flags",
+ "e": "🇷🇴",
+ "d": "romania",
+ "u": "6.0"
+ },
+ "flag_rs": {
+ "c": "flags",
+ "e": "🇷🇸",
+ "d": "serbia",
+ "u": "6.0"
+ },
+ "flag_ru": {
+ "c": "flags",
+ "e": "🇷🇺",
+ "d": "russia",
+ "u": "6.0"
+ },
+ "flag_rw": {
+ "c": "flags",
+ "e": "🇷🇼",
+ "d": "rwanda",
+ "u": "6.0"
+ },
+ "flag_sa": {
+ "c": "flags",
+ "e": "🇸🇦",
+ "d": "saudi arabia",
+ "u": "6.0"
+ },
+ "flag_sb": {
+ "c": "flags",
+ "e": "🇸🇧",
+ "d": "the solomon islands",
+ "u": "6.0"
+ },
+ "flag_sc": {
+ "c": "flags",
+ "e": "🇸🇨",
+ "d": "the seychelles",
+ "u": "6.0"
+ },
+ "flag_sd": {
+ "c": "flags",
+ "e": "🇸🇩",
+ "d": "sudan",
+ "u": "6.0"
+ },
+ "flag_se": {
+ "c": "flags",
+ "e": "🇸🇪",
+ "d": "sweden",
+ "u": "6.0"
+ },
+ "flag_sg": {
+ "c": "flags",
+ "e": "🇸🇬",
+ "d": "singapore",
+ "u": "6.0"
+ },
+ "flag_sh": {
+ "c": "flags",
+ "e": "🇸🇭",
+ "d": "saint helena",
+ "u": "6.0"
+ },
+ "flag_si": {
+ "c": "flags",
+ "e": "🇸🇮",
+ "d": "slovenia",
+ "u": "6.0"
+ },
+ "flag_sj": {
+ "c": "flags",
+ "e": "🇸🇯",
+ "d": "svalbard and jan mayen",
+ "u": "6.0"
+ },
+ "flag_sk": {
+ "c": "flags",
+ "e": "🇸🇰",
+ "d": "slovakia",
+ "u": "6.0"
+ },
+ "flag_sl": {
+ "c": "flags",
+ "e": "🇸🇱",
+ "d": "sierra leone",
+ "u": "6.0"
+ },
+ "flag_sm": {
+ "c": "flags",
+ "e": "🇸🇲",
+ "d": "san marino",
+ "u": "6.0"
+ },
+ "flag_sn": {
+ "c": "flags",
+ "e": "🇸🇳",
+ "d": "senegal",
+ "u": "6.0"
+ },
+ "flag_so": {
+ "c": "flags",
+ "e": "🇸🇴",
+ "d": "somalia",
+ "u": "6.0"
+ },
+ "flag_sr": {
+ "c": "flags",
+ "e": "🇸🇷",
+ "d": "suriname",
+ "u": "6.0"
+ },
+ "flag_ss": {
+ "c": "flags",
+ "e": "🇸🇸",
+ "d": "south sudan",
+ "u": "6.0"
+ },
+ "flag_st": {
+ "c": "flags",
+ "e": "🇸🇹",
+ "d": "sao tome and principe",
+ "u": "6.0"
+ },
+ "flag_sv": {
+ "c": "flags",
+ "e": "🇸🇻",
+ "d": "el salvador",
+ "u": "6.0"
+ },
+ "flag_sx": {
+ "c": "flags",
+ "e": "🇸🇽",
+ "d": "sint maarten",
+ "u": "6.0"
+ },
+ "flag_sy": {
+ "c": "flags",
+ "e": "🇸🇾",
+ "d": "syria",
+ "u": "6.0"
+ },
+ "flag_sz": {
+ "c": "flags",
+ "e": "🇸🇿",
+ "d": "swaziland",
+ "u": "6.0"
+ },
+ "flag_ta": {
+ "c": "flags",
+ "e": "🇹🇦",
+ "d": "tristan da cunha",
+ "u": "6.0"
+ },
+ "flag_tc": {
+ "c": "flags",
+ "e": "🇹🇨",
+ "d": "turks and caicos islands",
+ "u": "6.0"
+ },
+ "flag_td": {
+ "c": "flags",
+ "e": "🇹🇩",
+ "d": "chad",
+ "u": "6.0"
+ },
+ "flag_tf": {
+ "c": "flags",
+ "e": "🇹🇫",
+ "d": "french southern territories",
+ "u": "6.0"
+ },
+ "flag_tg": {
+ "c": "flags",
+ "e": "🇹🇬",
+ "d": "togo",
+ "u": "6.0"
+ },
+ "flag_th": {
+ "c": "flags",
+ "e": "🇹🇭",
+ "d": "thailand",
+ "u": "6.0"
+ },
+ "flag_tj": {
+ "c": "flags",
+ "e": "🇹🇯",
+ "d": "tajikistan",
+ "u": "6.0"
+ },
+ "flag_tk": {
+ "c": "flags",
+ "e": "🇹🇰",
+ "d": "tokelau",
+ "u": "6.0"
+ },
+ "flag_tl": {
+ "c": "flags",
+ "e": "🇹🇱",
+ "d": "east timor",
+ "u": "6.0"
+ },
+ "flag_tm": {
+ "c": "flags",
+ "e": "🇹🇲",
+ "d": "turkmenistan",
+ "u": "6.0"
+ },
+ "flag_tn": {
+ "c": "flags",
+ "e": "🇹🇳",
+ "d": "tunisia",
+ "u": "6.0"
+ },
+ "flag_to": {
+ "c": "flags",
+ "e": "🇹🇴",
+ "d": "tonga",
+ "u": "6.0"
+ },
+ "flag_tr": {
+ "c": "flags",
+ "e": "🇹🇷",
+ "d": "turkey",
+ "u": "6.0"
+ },
+ "flag_tt": {
+ "c": "flags",
+ "e": "🇹🇹",
+ "d": "trinidad and tobago",
+ "u": "6.0"
+ },
+ "flag_tv": {
+ "c": "flags",
+ "e": "🇹🇻",
+ "d": "tuvalu",
+ "u": "6.0"
+ },
+ "flag_tw": {
+ "c": "flags",
+ "e": "🇹🇼",
+ "d": "the republic of china",
+ "u": "6.0"
+ },
+ "flag_tz": {
+ "c": "flags",
+ "e": "🇹🇿",
+ "d": "tanzania",
+ "u": "6.0"
+ },
+ "flag_ua": {
+ "c": "flags",
+ "e": "🇺🇦",
+ "d": "ukraine",
+ "u": "6.0"
+ },
+ "flag_ug": {
+ "c": "flags",
+ "e": "🇺🇬",
+ "d": "uganda",
+ "u": "6.0"
+ },
+ "flag_um": {
+ "c": "flags",
+ "e": "🇺🇲",
+ "d": "united states minor outlying islands",
+ "u": "6.0"
+ },
+ "flag_us": {
+ "c": "flags",
+ "e": "🇺🇸",
+ "d": "united states",
+ "u": "6.0"
+ },
+ "flag_uy": {
+ "c": "flags",
+ "e": "🇺🇾",
+ "d": "uruguay",
+ "u": "6.0"
+ },
+ "flag_uz": {
+ "c": "flags",
+ "e": "🇺🇿",
+ "d": "uzbekistan",
+ "u": "6.0"
+ },
+ "flag_va": {
+ "c": "flags",
+ "e": "🇻🇦",
+ "d": "the vatican city",
+ "u": "6.0"
+ },
+ "flag_vc": {
+ "c": "flags",
+ "e": "🇻🇨",
+ "d": "saint vincent and the grenadines",
+ "u": "6.0"
+ },
+ "flag_ve": {
+ "c": "flags",
+ "e": "🇻🇪",
+ "d": "venezuela",
+ "u": "6.0"
+ },
+ "flag_vg": {
+ "c": "flags",
+ "e": "🇻🇬",
+ "d": "british virgin islands",
+ "u": "6.0"
+ },
+ "flag_vi": {
+ "c": "flags",
+ "e": "🇻🇮",
+ "d": "u.s. virgin islands",
+ "u": "6.0"
+ },
+ "flag_vn": {
+ "c": "flags",
+ "e": "🇻🇳",
+ "d": "vietnam",
+ "u": "6.0"
+ },
+ "flag_vu": {
+ "c": "flags",
+ "e": "🇻🇺",
+ "d": "vanuatu",
+ "u": "6.0"
+ },
+ "flag_wf": {
+ "c": "flags",
+ "e": "🇼🇫",
+ "d": "wallis and futuna",
+ "u": "6.0"
+ },
+ "flag_white": {
+ "c": "objects",
+ "e": "ðŸ³",
+ "d": "waving white flag",
+ "u": "6.0"
+ },
+ "flag_ws": {
+ "c": "flags",
+ "e": "🇼🇸",
+ "d": "samoa",
+ "u": "6.0"
+ },
+ "flag_xk": {
+ "c": "flags",
+ "e": "🇽🇰",
+ "d": "kosovo",
+ "u": "6.0"
+ },
+ "flag_ye": {
+ "c": "flags",
+ "e": "🇾🇪",
+ "d": "yemen",
+ "u": "6.0"
+ },
+ "flag_yt": {
+ "c": "flags",
+ "e": "🇾🇹",
+ "d": "mayotte",
+ "u": "6.0"
+ },
+ "flag_za": {
+ "c": "flags",
+ "e": "🇿🇦",
+ "d": "south africa",
+ "u": "6.0"
+ },
+ "flag_zm": {
+ "c": "flags",
+ "e": "🇿🇲",
+ "d": "zambia",
+ "u": "6.0"
+ },
+ "flag_zw": {
+ "c": "flags",
+ "e": "🇿🇼",
+ "d": "zimbabwe",
+ "u": "6.0"
+ },
+ "flags": {
+ "c": "objects",
+ "e": "ðŸŽ",
+ "d": "carp streamer",
+ "u": "6.0"
+ },
+ "flashlight": {
+ "c": "objects",
+ "e": "🔦",
+ "d": "electric torch",
+ "u": "6.0"
+ },
+ "fleur-de-lis": {
+ "c": "symbols",
+ "e": "⚜",
+ "d": "fleur-de-lis",
+ "u": "4.1"
+ },
+ "floppy_disk": {
+ "c": "objects",
+ "e": "💾",
+ "d": "floppy disk",
+ "u": "6.0"
+ },
+ "flower_playing_cards": {
+ "c": "symbols",
+ "e": "🎴",
+ "d": "flower playing cards",
+ "u": "6.0"
+ },
+ "flushed": {
+ "c": "people",
+ "e": "😳",
+ "d": "flushed face",
+ "u": "6.0"
+ },
+ "fog": {
+ "c": "nature",
+ "e": "🌫",
+ "d": "fog",
+ "u": "7.0"
+ },
+ "foggy": {
+ "c": "travel",
+ "e": "ðŸŒ",
+ "d": "foggy",
+ "u": "6.0"
+ },
+ "football": {
+ "c": "activity",
+ "e": "ðŸˆ",
+ "d": "american football",
+ "u": "6.0"
+ },
+ "footprints": {
+ "c": "people",
+ "e": "👣",
+ "d": "footprints",
+ "u": "6.0"
+ },
+ "fork_and_knife": {
+ "c": "food",
+ "e": "ðŸ´",
+ "d": "fork and knife",
+ "u": "6.0"
+ },
+ "fork_knife_plate": {
+ "c": "food",
+ "e": "ðŸ½",
+ "d": "fork and knife with plate",
+ "u": "7.0"
+ },
+ "fountain": {
+ "c": "travel",
+ "e": "⛲",
+ "d": "fountain",
+ "u": "5.2"
+ },
+ "four": {
+ "c": "symbols",
+ "e": "4ï¸âƒ£",
+ "d": "keycap digit four",
+ "u": "3.0"
+ },
+ "four_leaf_clover": {
+ "c": "nature",
+ "e": "ðŸ€",
+ "d": "four leaf clover",
+ "u": "6.0"
+ },
+ "fox": {
+ "c": "nature",
+ "e": "🦊",
+ "d": "fox face",
+ "u": "9.0"
+ },
+ "frame_photo": {
+ "c": "objects",
+ "e": "🖼",
+ "d": "frame with picture",
+ "u": "7.0"
+ },
+ "free": {
+ "c": "symbols",
+ "e": "🆓",
+ "d": "squared free",
+ "u": "6.0"
+ },
+ "french_bread": {
+ "c": "food",
+ "e": "🥖",
+ "d": "baguette bread",
+ "u": "9.0"
+ },
+ "fried_shrimp": {
+ "c": "food",
+ "e": "ðŸ¤",
+ "d": "fried shrimp",
+ "u": "6.0"
+ },
+ "fries": {
+ "c": "food",
+ "e": "ðŸŸ",
+ "d": "french fries",
+ "u": "6.0"
+ },
+ "frog": {
+ "c": "nature",
+ "e": "ðŸ¸",
+ "d": "frog face",
+ "u": "6.0"
+ },
+ "frowning": {
+ "c": "people",
+ "e": "😦",
+ "d": "frowning face with open mouth",
+ "u": "6.1"
+ },
+ "frowning2": {
+ "c": "people",
+ "e": "☹",
+ "d": "white frowning face",
+ "u": "1.1"
+ },
+ "fuelpump": {
+ "c": "travel",
+ "e": "⛽",
+ "d": "fuel pump",
+ "u": "5.2"
+ },
+ "full_moon": {
+ "c": "nature",
+ "e": "🌕",
+ "d": "full moon symbol",
+ "u": "6.0"
+ },
+ "full_moon_with_face": {
+ "c": "nature",
+ "e": "ðŸŒ",
+ "d": "full moon with face",
+ "u": "6.0"
+ },
+ "game_die": {
+ "c": "activity",
+ "e": "🎲",
+ "d": "game die",
+ "u": "6.0"
+ },
+ "gear": {
+ "c": "objects",
+ "e": "âš™",
+ "d": "gear",
+ "u": "4.1"
+ },
+ "gem": {
+ "c": "objects",
+ "e": "💎",
+ "d": "gem stone",
+ "u": "6.0"
+ },
+ "gay_pride_flag": {
+ "c": "flags",
+ "e": "ðŸ³ðŸŒˆ",
+ "d": "gay_pride_flag",
+ "u": "6.0"
+ },
+ "gemini": {
+ "c": "symbols",
+ "e": "♊",
+ "d": "gemini",
+ "u": "1.1"
+ },
+ "ghost": {
+ "c": "people",
+ "e": "👻",
+ "d": "ghost",
+ "u": "6.0"
+ },
+ "gift": {
+ "c": "objects",
+ "e": "ðŸŽ",
+ "d": "wrapped present",
+ "u": "6.0"
+ },
+ "gift_heart": {
+ "c": "symbols",
+ "e": "ðŸ’",
+ "d": "heart with ribbon",
+ "u": "6.0"
+ },
+ "girl": {
+ "c": "people",
+ "e": "👧",
+ "d": "girl",
+ "u": "6.0"
+ },
+ "girl_tone1": {
+ "c": "people",
+ "e": "👧ðŸ»",
+ "d": "girl tone 1",
+ "u": "8.0"
+ },
+ "girl_tone2": {
+ "c": "people",
+ "e": "👧ðŸ¼",
+ "d": "girl tone 2",
+ "u": "8.0"
+ },
+ "girl_tone3": {
+ "c": "people",
+ "e": "👧ðŸ½",
+ "d": "girl tone 3",
+ "u": "8.0"
+ },
+ "girl_tone4": {
+ "c": "people",
+ "e": "👧ðŸ¾",
+ "d": "girl tone 4",
+ "u": "8.0"
+ },
+ "girl_tone5": {
+ "c": "people",
+ "e": "👧ðŸ¿",
+ "d": "girl tone 5",
+ "u": "8.0"
+ },
+ "globe_with_meridians": {
+ "c": "symbols",
+ "e": "ðŸŒ",
+ "d": "globe with meridians",
+ "u": "6.0"
+ },
+ "goal": {
+ "c": "activity",
+ "e": "🥅",
+ "d": "goal net",
+ "u": "9.0"
+ },
+ "goat": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "goat",
+ "u": "6.0"
+ },
+ "golf": {
+ "c": "activity",
+ "e": "⛳",
+ "d": "flag in hole",
+ "u": "5.2"
+ },
+ "golfer": {
+ "c": "activity",
+ "e": "ðŸŒ",
+ "d": "golfer",
+ "u": "7.0"
+ },
+ "gorilla": {
+ "c": "nature",
+ "e": "ðŸ¦",
+ "d": "gorilla",
+ "u": "9.0"
+ },
+ "grapes": {
+ "c": "food",
+ "e": "ðŸ‡",
+ "d": "grapes",
+ "u": "6.0"
+ },
+ "green_apple": {
+ "c": "food",
+ "e": "ðŸ",
+ "d": "green apple",
+ "u": "6.0"
+ },
+ "green_book": {
+ "c": "objects",
+ "e": "📗",
+ "d": "green book",
+ "u": "6.0"
+ },
+ "green_heart": {
+ "c": "symbols",
+ "e": "💚",
+ "d": "green heart",
+ "u": "6.0"
+ },
+ "grey_exclamation": {
+ "c": "symbols",
+ "e": "â•",
+ "d": "white exclamation mark ornament",
+ "u": "6.0"
+ },
+ "grey_question": {
+ "c": "symbols",
+ "e": "â”",
+ "d": "white question mark ornament",
+ "u": "6.0"
+ },
+ "grimacing": {
+ "c": "people",
+ "e": "😬",
+ "d": "grimacing face",
+ "u": "6.1"
+ },
+ "grin": {
+ "c": "people",
+ "e": "ðŸ˜",
+ "d": "grinning face with smiling eyes",
+ "u": "6.0"
+ },
+ "grinning": {
+ "c": "people",
+ "e": "😀",
+ "d": "grinning face",
+ "u": "6.1"
+ },
+ "guardsman": {
+ "c": "people",
+ "e": "💂",
+ "d": "guardsman",
+ "u": "6.0"
+ },
+ "guardsman_tone1": {
+ "c": "people",
+ "e": "💂ðŸ»",
+ "d": "guardsman tone 1",
+ "u": "8.0"
+ },
+ "guardsman_tone2": {
+ "c": "people",
+ "e": "💂ðŸ¼",
+ "d": "guardsman tone 2",
+ "u": "8.0"
+ },
+ "guardsman_tone3": {
+ "c": "people",
+ "e": "💂ðŸ½",
+ "d": "guardsman tone 3",
+ "u": "8.0"
+ },
+ "guardsman_tone4": {
+ "c": "people",
+ "e": "💂ðŸ¾",
+ "d": "guardsman tone 4",
+ "u": "8.0"
+ },
+ "guardsman_tone5": {
+ "c": "people",
+ "e": "💂ðŸ¿",
+ "d": "guardsman tone 5",
+ "u": "8.0"
+ },
+ "guitar": {
+ "c": "activity",
+ "e": "🎸",
+ "d": "guitar",
+ "u": "6.0"
+ },
+ "gun": {
+ "c": "objects",
+ "e": "🔫",
+ "d": "pistol",
+ "u": "6.0"
+ },
+ "haircut": {
+ "c": "people",
+ "e": "💇",
+ "d": "haircut",
+ "u": "6.0"
+ },
+ "haircut_tone1": {
+ "c": "people",
+ "e": "💇ðŸ»",
+ "d": "haircut tone 1",
+ "u": "8.0"
+ },
+ "haircut_tone2": {
+ "c": "people",
+ "e": "💇ðŸ¼",
+ "d": "haircut tone 2",
+ "u": "8.0"
+ },
+ "haircut_tone3": {
+ "c": "people",
+ "e": "💇ðŸ½",
+ "d": "haircut tone 3",
+ "u": "8.0"
+ },
+ "haircut_tone4": {
+ "c": "people",
+ "e": "💇ðŸ¾",
+ "d": "haircut tone 4",
+ "u": "8.0"
+ },
+ "haircut_tone5": {
+ "c": "people",
+ "e": "💇ðŸ¿",
+ "d": "haircut tone 5",
+ "u": "8.0"
+ },
+ "hamburger": {
+ "c": "food",
+ "e": "ðŸ”",
+ "d": "hamburger",
+ "u": "6.0"
+ },
+ "hammer": {
+ "c": "objects",
+ "e": "🔨",
+ "d": "hammer",
+ "u": "6.0"
+ },
+ "hammer_pick": {
+ "c": "objects",
+ "e": "âš’",
+ "d": "hammer and pick",
+ "u": "4.1"
+ },
+ "hamster": {
+ "c": "nature",
+ "e": "ðŸ¹",
+ "d": "hamster face",
+ "u": "6.0"
+ },
+ "hand_splayed": {
+ "c": "people",
+ "e": "ðŸ–",
+ "d": "raised hand with fingers splayed",
+ "u": "7.0"
+ },
+ "hand_splayed_tone1": {
+ "c": "people",
+ "e": "ðŸ–ðŸ»",
+ "d": "raised hand with fingers splayed tone 1",
+ "u": "8.0"
+ },
+ "hand_splayed_tone2": {
+ "c": "people",
+ "e": "ðŸ–ðŸ¼",
+ "d": "raised hand with fingers splayed tone 2",
+ "u": "8.0"
+ },
+ "hand_splayed_tone3": {
+ "c": "people",
+ "e": "ðŸ–ðŸ½",
+ "d": "raised hand with fingers splayed tone 3",
+ "u": "8.0"
+ },
+ "hand_splayed_tone4": {
+ "c": "people",
+ "e": "ðŸ–ðŸ¾",
+ "d": "raised hand with fingers splayed tone 4",
+ "u": "8.0"
+ },
+ "hand_splayed_tone5": {
+ "c": "people",
+ "e": "ðŸ–ðŸ¿",
+ "d": "raised hand with fingers splayed tone 5",
+ "u": "8.0"
+ },
+ "handbag": {
+ "c": "people",
+ "e": "👜",
+ "d": "handbag",
+ "u": "6.0"
+ },
+ "handball": {
+ "c": "activity",
+ "e": "🤾",
+ "d": "handball",
+ "u": "9.0"
+ },
+ "handball_tone1": {
+ "c": "activity",
+ "e": "🤾ðŸ»",
+ "d": "handball tone 1",
+ "u": "9.0"
+ },
+ "handball_tone2": {
+ "c": "activity",
+ "e": "🤾ðŸ¼",
+ "d": "handball tone 2",
+ "u": "9.0"
+ },
+ "handball_tone3": {
+ "c": "activity",
+ "e": "🤾ðŸ½",
+ "d": "handball tone 3",
+ "u": "9.0"
+ },
+ "handball_tone4": {
+ "c": "activity",
+ "e": "🤾ðŸ¾",
+ "d": "handball tone 4",
+ "u": "9.0"
+ },
+ "handball_tone5": {
+ "c": "activity",
+ "e": "🤾ðŸ¿",
+ "d": "handball tone 5",
+ "u": "9.0"
+ },
+ "handshake": {
+ "c": "people",
+ "e": "ðŸ¤",
+ "d": "handshake",
+ "u": "9.0"
+ },
+ "handshake_tone1": {
+ "c": "people",
+ "e": "ðŸ¤ðŸ»",
+ "d": "handshake tone 1",
+ "u": "9.0"
+ },
+ "handshake_tone2": {
+ "c": "people",
+ "e": "ðŸ¤ðŸ¼",
+ "d": "handshake tone 2",
+ "u": "9.0"
+ },
+ "handshake_tone3": {
+ "c": "people",
+ "e": "ðŸ¤ðŸ½",
+ "d": "handshake tone 3",
+ "u": "9.0"
+ },
+ "handshake_tone4": {
+ "c": "people",
+ "e": "ðŸ¤ðŸ¾",
+ "d": "handshake tone 4",
+ "u": "9.0"
+ },
+ "handshake_tone5": {
+ "c": "people",
+ "e": "ðŸ¤ðŸ¿",
+ "d": "handshake tone 5",
+ "u": "9.0"
+ },
+ "hash": {
+ "c": "symbols",
+ "e": "#⃣",
+ "d": "number sign",
+ "u": "3.0"
+ },
+ "hatched_chick": {
+ "c": "nature",
+ "e": "ðŸ¥",
+ "d": "front-facing baby chick",
+ "u": "6.0"
+ },
+ "hatching_chick": {
+ "c": "nature",
+ "e": "ðŸ£",
+ "d": "hatching chick",
+ "u": "6.0"
+ },
+ "head_bandage": {
+ "c": "people",
+ "e": "🤕",
+ "d": "face with head-bandage",
+ "u": "8.0"
+ },
+ "headphones": {
+ "c": "activity",
+ "e": "🎧",
+ "d": "headphone",
+ "u": "6.0"
+ },
+ "hear_no_evil": {
+ "c": "nature",
+ "e": "🙉",
+ "d": "hear-no-evil monkey",
+ "u": "6.0"
+ },
+ "heart": {
+ "c": "symbols",
+ "e": "â¤",
+ "d": "heavy black heart",
+ "u": "1.1"
+ },
+ "heart_decoration": {
+ "c": "symbols",
+ "e": "💟",
+ "d": "heart decoration",
+ "u": "6.0"
+ },
+ "heart_exclamation": {
+ "c": "symbols",
+ "e": "â£",
+ "d": "heavy heart exclamation mark ornament",
+ "u": "1.1"
+ },
+ "heart_eyes": {
+ "c": "people",
+ "e": "ðŸ˜",
+ "d": "smiling face with heart-shaped eyes",
+ "u": "6.0"
+ },
+ "heart_eyes_cat": {
+ "c": "people",
+ "e": "😻",
+ "d": "smiling cat face with heart-shaped eyes",
+ "u": "6.0"
+ },
+ "heartbeat": {
+ "c": "symbols",
+ "e": "💓",
+ "d": "beating heart",
+ "u": "6.0"
+ },
+ "heartpulse": {
+ "c": "symbols",
+ "e": "💗",
+ "d": "growing heart",
+ "u": "6.0"
+ },
+ "hearts": {
+ "c": "symbols",
+ "e": "♥",
+ "d": "black heart suit",
+ "u": "1.1"
+ },
+ "heavy_check_mark": {
+ "c": "symbols",
+ "e": "✔",
+ "d": "heavy check mark",
+ "u": "1.1"
+ },
+ "heavy_division_sign": {
+ "c": "symbols",
+ "e": "âž—",
+ "d": "heavy division sign",
+ "u": "6.0"
+ },
+ "heavy_dollar_sign": {
+ "c": "symbols",
+ "e": "💲",
+ "d": "heavy dollar sign",
+ "u": "6.0"
+ },
+ "heavy_minus_sign": {
+ "c": "symbols",
+ "e": "âž–",
+ "d": "heavy minus sign",
+ "u": "6.0"
+ },
+ "heavy_multiplication_x": {
+ "c": "symbols",
+ "e": "✖",
+ "d": "heavy multiplication x",
+ "u": "1.1"
+ },
+ "heavy_plus_sign": {
+ "c": "symbols",
+ "e": "âž•",
+ "d": "heavy plus sign",
+ "u": "6.0"
+ },
+ "helicopter": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "helicopter",
+ "u": "6.0"
+ },
+ "helmet_with_cross": {
+ "c": "people",
+ "e": "⛑",
+ "d": "helmet with white cross",
+ "u": "5.2"
+ },
+ "herb": {
+ "c": "nature",
+ "e": "🌿",
+ "d": "herb",
+ "u": "6.0"
+ },
+ "hibiscus": {
+ "c": "nature",
+ "e": "🌺",
+ "d": "hibiscus",
+ "u": "6.0"
+ },
+ "high_brightness": {
+ "c": "symbols",
+ "e": "🔆",
+ "d": "high brightness symbol",
+ "u": "6.0"
+ },
+ "high_heel": {
+ "c": "people",
+ "e": "👠",
+ "d": "high-heeled shoe",
+ "u": "6.0"
+ },
+ "hockey": {
+ "c": "activity",
+ "e": "ðŸ’",
+ "d": "ice hockey stick and puck",
+ "u": "8.0"
+ },
+ "hole": {
+ "c": "objects",
+ "e": "🕳",
+ "d": "hole",
+ "u": "7.0"
+ },
+ "homes": {
+ "c": "travel",
+ "e": "ðŸ˜",
+ "d": "house buildings",
+ "u": "7.0"
+ },
+ "honey_pot": {
+ "c": "food",
+ "e": "ðŸ¯",
+ "d": "honey pot",
+ "u": "6.0"
+ },
+ "horse": {
+ "c": "nature",
+ "e": "ðŸ´",
+ "d": "horse face",
+ "u": "6.0"
+ },
+ "horse_racing": {
+ "c": "activity",
+ "e": "ðŸ‡",
+ "d": "horse racing",
+ "u": "6.0"
+ },
+ "horse_racing_tone1": {
+ "c": "activity",
+ "e": "ðŸ‡ðŸ»",
+ "d": "horse racing tone 1",
+ "u": "8.0"
+ },
+ "horse_racing_tone2": {
+ "c": "activity",
+ "e": "ðŸ‡ðŸ¼",
+ "d": "horse racing tone 2",
+ "u": "8.0"
+ },
+ "horse_racing_tone3": {
+ "c": "activity",
+ "e": "ðŸ‡ðŸ½",
+ "d": "horse racing tone 3",
+ "u": "8.0"
+ },
+ "horse_racing_tone4": {
+ "c": "activity",
+ "e": "ðŸ‡ðŸ¾",
+ "d": "horse racing tone 4",
+ "u": "8.0"
+ },
+ "horse_racing_tone5": {
+ "c": "activity",
+ "e": "ðŸ‡ðŸ¿",
+ "d": "horse racing tone 5",
+ "u": "8.0"
+ },
+ "hospital": {
+ "c": "travel",
+ "e": "ðŸ¥",
+ "d": "hospital",
+ "u": "6.0"
+ },
+ "hot_pepper": {
+ "c": "food",
+ "e": "🌶",
+ "d": "hot pepper",
+ "u": "7.0"
+ },
+ "hotdog": {
+ "c": "food",
+ "e": "🌭",
+ "d": "hot dog",
+ "u": "8.0"
+ },
+ "hotel": {
+ "c": "travel",
+ "e": "ðŸ¨",
+ "d": "hotel",
+ "u": "6.0"
+ },
+ "hotsprings": {
+ "c": "symbols",
+ "e": "♨",
+ "d": "hot springs",
+ "u": "1.1"
+ },
+ "hourglass": {
+ "c": "objects",
+ "e": "⌛",
+ "d": "hourglass",
+ "u": "1.1"
+ },
+ "hourglass_flowing_sand": {
+ "c": "objects",
+ "e": "â³",
+ "d": "hourglass with flowing sand",
+ "u": "6.0"
+ },
+ "house": {
+ "c": "travel",
+ "e": "ðŸ ",
+ "d": "house building",
+ "u": "6.0"
+ },
+ "house_abandoned": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "derelict house building",
+ "u": "7.0"
+ },
+ "house_with_garden": {
+ "c": "travel",
+ "e": "ðŸ¡",
+ "d": "house with garden",
+ "u": "6.0"
+ },
+ "hugging": {
+ "c": "people",
+ "e": "🤗",
+ "d": "hugging face",
+ "u": "8.0"
+ },
+ "hushed": {
+ "c": "people",
+ "e": "😯",
+ "d": "hushed face",
+ "u": "6.1"
+ },
+ "ice_cream": {
+ "c": "food",
+ "e": "ðŸ¨",
+ "d": "ice cream",
+ "u": "6.0"
+ },
+ "ice_skate": {
+ "c": "activity",
+ "e": "⛸",
+ "d": "ice skate",
+ "u": "5.2"
+ },
+ "icecream": {
+ "c": "food",
+ "e": "ðŸ¦",
+ "d": "soft ice cream",
+ "u": "6.0"
+ },
+ "id": {
+ "c": "symbols",
+ "e": "🆔",
+ "d": "squared id",
+ "u": "6.0"
+ },
+ "ideograph_advantage": {
+ "c": "symbols",
+ "e": "ðŸ‰",
+ "d": "circled ideograph advantage",
+ "u": "6.0"
+ },
+ "imp": {
+ "c": "people",
+ "e": "👿",
+ "d": "imp",
+ "u": "6.0"
+ },
+ "inbox_tray": {
+ "c": "objects",
+ "e": "📥",
+ "d": "inbox tray",
+ "u": "6.0"
+ },
+ "incoming_envelope": {
+ "c": "objects",
+ "e": "📨",
+ "d": "incoming envelope",
+ "u": "6.0"
+ },
+ "information_desk_person": {
+ "c": "people",
+ "e": "ðŸ’",
+ "d": "information desk person",
+ "u": "6.0"
+ },
+ "information_desk_person_tone1": {
+ "c": "people",
+ "e": "ðŸ’ðŸ»",
+ "d": "information desk person tone 1",
+ "u": "8.0"
+ },
+ "information_desk_person_tone2": {
+ "c": "people",
+ "e": "ðŸ’ðŸ¼",
+ "d": "information desk person tone 2",
+ "u": "8.0"
+ },
+ "information_desk_person_tone3": {
+ "c": "people",
+ "e": "ðŸ’ðŸ½",
+ "d": "information desk person tone 3",
+ "u": "8.0"
+ },
+ "information_desk_person_tone4": {
+ "c": "people",
+ "e": "ðŸ’ðŸ¾",
+ "d": "information desk person tone 4",
+ "u": "8.0"
+ },
+ "information_desk_person_tone5": {
+ "c": "people",
+ "e": "ðŸ’ðŸ¿",
+ "d": "information desk person tone 5",
+ "u": "8.0"
+ },
+ "information_source": {
+ "c": "symbols",
+ "e": "ℹ",
+ "d": "information source",
+ "u": "3.0"
+ },
+ "innocent": {
+ "c": "people",
+ "e": "😇",
+ "d": "smiling face with halo",
+ "u": "6.0"
+ },
+ "interrobang": {
+ "c": "symbols",
+ "e": "â‰",
+ "d": "exclamation question mark",
+ "u": "3.0"
+ },
+ "iphone": {
+ "c": "objects",
+ "e": "📱",
+ "d": "mobile phone",
+ "u": "6.0"
+ },
+ "island": {
+ "c": "travel",
+ "e": "ðŸ",
+ "d": "desert island",
+ "u": "7.0"
+ },
+ "izakaya_lantern": {
+ "c": "objects",
+ "e": "ðŸ®",
+ "d": "izakaya lantern",
+ "u": "6.0"
+ },
+ "jack_o_lantern": {
+ "c": "nature",
+ "e": "🎃",
+ "d": "jack-o-lantern",
+ "u": "6.0"
+ },
+ "japan": {
+ "c": "travel",
+ "e": "🗾",
+ "d": "silhouette of japan",
+ "u": "6.0"
+ },
+ "japanese_castle": {
+ "c": "travel",
+ "e": "ðŸ¯",
+ "d": "japanese castle",
+ "u": "6.0"
+ },
+ "japanese_goblin": {
+ "c": "people",
+ "e": "👺",
+ "d": "japanese goblin",
+ "u": "6.0"
+ },
+ "japanese_ogre": {
+ "c": "people",
+ "e": "👹",
+ "d": "japanese ogre",
+ "u": "6.0"
+ },
+ "jeans": {
+ "c": "people",
+ "e": "👖",
+ "d": "jeans",
+ "u": "6.0"
+ },
+ "joy": {
+ "c": "people",
+ "e": "😂",
+ "d": "face with tears of joy",
+ "u": "6.0"
+ },
+ "joy_cat": {
+ "c": "people",
+ "e": "😹",
+ "d": "cat face with tears of joy",
+ "u": "6.0"
+ },
+ "joystick": {
+ "c": "objects",
+ "e": "🕹",
+ "d": "joystick",
+ "u": "7.0"
+ },
+ "juggling": {
+ "c": "activity",
+ "e": "🤹",
+ "d": "juggling",
+ "u": "9.0"
+ },
+ "juggling_tone1": {
+ "c": "activity",
+ "e": "🤹ðŸ»",
+ "d": "juggling tone 1",
+ "u": "9.0"
+ },
+ "juggling_tone2": {
+ "c": "activity",
+ "e": "🤹ðŸ¼",
+ "d": "juggling tone 2",
+ "u": "9.0"
+ },
+ "juggling_tone3": {
+ "c": "activity",
+ "e": "🤹ðŸ½",
+ "d": "juggling tone 3",
+ "u": "9.0"
+ },
+ "juggling_tone4": {
+ "c": "activity",
+ "e": "🤹ðŸ¾",
+ "d": "juggling tone 4",
+ "u": "9.0"
+ },
+ "juggling_tone5": {
+ "c": "activity",
+ "e": "🤹ðŸ¿",
+ "d": "juggling tone 5",
+ "u": "9.0"
+ },
+ "kaaba": {
+ "c": "travel",
+ "e": "🕋",
+ "d": "kaaba",
+ "u": "8.0"
+ },
+ "key": {
+ "c": "objects",
+ "e": "🔑",
+ "d": "key",
+ "u": "6.0"
+ },
+ "key2": {
+ "c": "objects",
+ "e": "ðŸ—",
+ "d": "old key",
+ "u": "7.0"
+ },
+ "keyboard": {
+ "c": "objects",
+ "e": "⌨",
+ "d": "keyboard",
+ "u": "1.1"
+ },
+ "kimono": {
+ "c": "people",
+ "e": "👘",
+ "d": "kimono",
+ "u": "6.0"
+ },
+ "kiss": {
+ "c": "people",
+ "e": "💋",
+ "d": "kiss mark",
+ "u": "6.0"
+ },
+ "kiss_mm": {
+ "c": "people",
+ "e": "👨â€â¤ï¸â€ðŸ’‹â€ðŸ‘¨",
+ "d": "kiss (man,man)",
+ "u": "6.0"
+ },
+ "kiss_ww": {
+ "c": "people",
+ "e": "👩â€â¤ï¸â€ðŸ’‹â€ðŸ‘©",
+ "d": "kiss (woman,woman)",
+ "u": "6.0"
+ },
+ "kissing": {
+ "c": "people",
+ "e": "😗",
+ "d": "kissing face",
+ "u": "6.1"
+ },
+ "kissing_cat": {
+ "c": "people",
+ "e": "😽",
+ "d": "kissing cat face with closed eyes",
+ "u": "6.0"
+ },
+ "kissing_closed_eyes": {
+ "c": "people",
+ "e": "😚",
+ "d": "kissing face with closed eyes",
+ "u": "6.0"
+ },
+ "kissing_heart": {
+ "c": "people",
+ "e": "😘",
+ "d": "face throwing a kiss",
+ "u": "6.0"
+ },
+ "kissing_smiling_eyes": {
+ "c": "people",
+ "e": "😙",
+ "d": "kissing face with smiling eyes",
+ "u": "6.1"
+ },
+ "kiwi": {
+ "c": "food",
+ "e": "ðŸ¥",
+ "d": "kiwifruit",
+ "u": "9.0"
+ },
+ "knife": {
+ "c": "objects",
+ "e": "🔪",
+ "d": "hocho",
+ "u": "6.0"
+ },
+ "koala": {
+ "c": "nature",
+ "e": "ðŸ¨",
+ "d": "koala",
+ "u": "6.0"
+ },
+ "koko": {
+ "c": "symbols",
+ "e": "ðŸˆ",
+ "d": "squared katakana koko",
+ "u": "6.0"
+ },
+ "label": {
+ "c": "objects",
+ "e": "ðŸ·",
+ "d": "label",
+ "u": "7.0"
+ },
+ "large_blue_circle": {
+ "c": "symbols",
+ "e": "🔵",
+ "d": "large blue circle",
+ "u": "6.0"
+ },
+ "large_blue_diamond": {
+ "c": "symbols",
+ "e": "🔷",
+ "d": "large blue diamond",
+ "u": "6.0"
+ },
+ "large_orange_diamond": {
+ "c": "symbols",
+ "e": "🔶",
+ "d": "large orange diamond",
+ "u": "6.0"
+ },
+ "last_quarter_moon": {
+ "c": "nature",
+ "e": "🌗",
+ "d": "last quarter moon symbol",
+ "u": "6.0"
+ },
+ "last_quarter_moon_with_face": {
+ "c": "nature",
+ "e": "🌜",
+ "d": "last quarter moon with face",
+ "u": "6.0"
+ },
+ "laughing": {
+ "c": "people",
+ "e": "😆",
+ "d": "smiling face with open mouth and tightly-closed ey",
+ "u": "6.0"
+ },
+ "leaves": {
+ "c": "nature",
+ "e": "ðŸƒ",
+ "d": "leaf fluttering in wind",
+ "u": "6.0"
+ },
+ "ledger": {
+ "c": "objects",
+ "e": "📒",
+ "d": "ledger",
+ "u": "6.0"
+ },
+ "left_facing_fist": {
+ "c": "people",
+ "e": "🤛",
+ "d": "left-facing fist",
+ "u": "9.0"
+ },
+ "left_facing_fist_tone1": {
+ "c": "people",
+ "e": "🤛ðŸ»",
+ "d": "left facing fist tone 1",
+ "u": "9.0"
+ },
+ "left_facing_fist_tone2": {
+ "c": "people",
+ "e": "🤛ðŸ¼",
+ "d": "left facing fist tone 2",
+ "u": "9.0"
+ },
+ "left_facing_fist_tone3": {
+ "c": "people",
+ "e": "🤛ðŸ½",
+ "d": "left facing fist tone 3",
+ "u": "9.0"
+ },
+ "left_facing_fist_tone4": {
+ "c": "people",
+ "e": "🤛ðŸ¾",
+ "d": "left facing fist tone 4",
+ "u": "9.0"
+ },
+ "left_facing_fist_tone5": {
+ "c": "people",
+ "e": "🤛ðŸ¿",
+ "d": "left facing fist tone 5",
+ "u": "9.0"
+ },
+ "left_luggage": {
+ "c": "symbols",
+ "e": "🛅",
+ "d": "left luggage",
+ "u": "6.0"
+ },
+ "left_right_arrow": {
+ "c": "symbols",
+ "e": "↔",
+ "d": "left right arrow",
+ "u": "1.1"
+ },
+ "leftwards_arrow_with_hook": {
+ "c": "symbols",
+ "e": "↩",
+ "d": "leftwards arrow with hook",
+ "u": "1.1"
+ },
+ "lemon": {
+ "c": "food",
+ "e": "ðŸ‹",
+ "d": "lemon",
+ "u": "6.0"
+ },
+ "leo": {
+ "c": "symbols",
+ "e": "♌",
+ "d": "leo",
+ "u": "1.1"
+ },
+ "leopard": {
+ "c": "nature",
+ "e": "ðŸ†",
+ "d": "leopard",
+ "u": "6.0"
+ },
+ "level_slider": {
+ "c": "objects",
+ "e": "🎚",
+ "d": "level slider",
+ "u": "7.0"
+ },
+ "levitate": {
+ "c": "activity",
+ "e": "🕴",
+ "d": "man in business suit levitating",
+ "u": "7.0"
+ },
+ "libra": {
+ "c": "symbols",
+ "e": "♎",
+ "d": "libra",
+ "u": "1.1"
+ },
+ "lifter": {
+ "c": "activity",
+ "e": "ðŸ‹",
+ "d": "weight lifter",
+ "u": "7.0"
+ },
+ "lifter_tone1": {
+ "c": "activity",
+ "e": "ðŸ‹ðŸ»",
+ "d": "weight lifter tone 1",
+ "u": "8.0"
+ },
+ "lifter_tone2": {
+ "c": "activity",
+ "e": "ðŸ‹ðŸ¼",
+ "d": "weight lifter tone 2",
+ "u": "8.0"
+ },
+ "lifter_tone3": {
+ "c": "activity",
+ "e": "ðŸ‹ðŸ½",
+ "d": "weight lifter tone 3",
+ "u": "8.0"
+ },
+ "lifter_tone4": {
+ "c": "activity",
+ "e": "ðŸ‹ðŸ¾",
+ "d": "weight lifter tone 4",
+ "u": "8.0"
+ },
+ "lifter_tone5": {
+ "c": "activity",
+ "e": "ðŸ‹ðŸ¿",
+ "d": "weight lifter tone 5",
+ "u": "8.0"
+ },
+ "light_rail": {
+ "c": "travel",
+ "e": "🚈",
+ "d": "light rail",
+ "u": "6.0"
+ },
+ "link": {
+ "c": "objects",
+ "e": "🔗",
+ "d": "link symbol",
+ "u": "6.0"
+ },
+ "lion_face": {
+ "c": "nature",
+ "e": "ðŸ¦",
+ "d": "lion face",
+ "u": "8.0"
+ },
+ "lips": {
+ "c": "people",
+ "e": "👄",
+ "d": "mouth",
+ "u": "6.0"
+ },
+ "lipstick": {
+ "c": "people",
+ "e": "💄",
+ "d": "lipstick",
+ "u": "6.0"
+ },
+ "lizard": {
+ "c": "nature",
+ "e": "🦎",
+ "d": "lizard",
+ "u": "9.0"
+ },
+ "lock": {
+ "c": "objects",
+ "e": "🔒",
+ "d": "lock",
+ "u": "6.0"
+ },
+ "lock_with_ink_pen": {
+ "c": "objects",
+ "e": "ðŸ”",
+ "d": "lock with ink pen",
+ "u": "6.0"
+ },
+ "lollipop": {
+ "c": "food",
+ "e": "ðŸ­",
+ "d": "lollipop",
+ "u": "6.0"
+ },
+ "loop": {
+ "c": "symbols",
+ "e": "âž¿",
+ "d": "double curly loop",
+ "u": "6.0"
+ },
+ "loud_sound": {
+ "c": "symbols",
+ "e": "🔊",
+ "d": "speaker with three sound waves",
+ "u": "6.0"
+ },
+ "loudspeaker": {
+ "c": "symbols",
+ "e": "📢",
+ "d": "public address loudspeaker",
+ "u": "6.0"
+ },
+ "love_hotel": {
+ "c": "travel",
+ "e": "ðŸ©",
+ "d": "love hotel",
+ "u": "6.0"
+ },
+ "love_letter": {
+ "c": "objects",
+ "e": "💌",
+ "d": "love letter",
+ "u": "6.0"
+ },
+ "low_brightness": {
+ "c": "symbols",
+ "e": "🔅",
+ "d": "low brightness symbol",
+ "u": "6.0"
+ },
+ "lying_face": {
+ "c": "people",
+ "e": "🤥",
+ "d": "lying face",
+ "u": "9.0"
+ },
+ "m": {
+ "c": "symbols",
+ "e": "â“‚",
+ "d": "circled latin capital letter m",
+ "u": "1.1"
+ },
+ "mag": {
+ "c": "objects",
+ "e": "ðŸ”",
+ "d": "left-pointing magnifying glass",
+ "u": "6.0"
+ },
+ "mag_right": {
+ "c": "objects",
+ "e": "🔎",
+ "d": "right-pointing magnifying glass",
+ "u": "6.0"
+ },
+ "mahjong": {
+ "c": "symbols",
+ "e": "🀄",
+ "d": "mahjong tile red dragon",
+ "u": "5.1"
+ },
+ "mailbox": {
+ "c": "objects",
+ "e": "📫",
+ "d": "closed mailbox with raised flag",
+ "u": "6.0"
+ },
+ "mailbox_closed": {
+ "c": "objects",
+ "e": "📪",
+ "d": "closed mailbox with lowered flag",
+ "u": "6.0"
+ },
+ "mailbox_with_mail": {
+ "c": "objects",
+ "e": "📬",
+ "d": "open mailbox with raised flag",
+ "u": "6.0"
+ },
+ "mailbox_with_no_mail": {
+ "c": "objects",
+ "e": "📭",
+ "d": "open mailbox with lowered flag",
+ "u": "6.0"
+ },
+ "man": {
+ "c": "people",
+ "e": "👨",
+ "d": "man",
+ "u": "6.0"
+ },
+ "man_dancing": {
+ "c": "people",
+ "e": "🕺",
+ "d": "man dancing",
+ "u": "9.0"
+ },
+ "man_dancing_tone1": {
+ "c": "activity",
+ "e": "🕺ðŸ»",
+ "d": "man dancing tone 1",
+ "u": "9.0"
+ },
+ "man_dancing_tone2": {
+ "c": "activity",
+ "e": "🕺ðŸ¼",
+ "d": "man dancing tone 2",
+ "u": "9.0"
+ },
+ "man_dancing_tone3": {
+ "c": "activity",
+ "e": "🕺ðŸ½",
+ "d": "man dancing tone 3",
+ "u": "9.0"
+ },
+ "man_dancing_tone4": {
+ "c": "activity",
+ "e": "🕺ðŸ¾",
+ "d": "man dancing tone 4",
+ "u": "9.0"
+ },
+ "man_dancing_tone5": {
+ "c": "activity",
+ "e": "🕺ðŸ¿",
+ "d": "man dancing tone 5",
+ "u": "9.0"
+ },
+ "man_in_tuxedo": {
+ "c": "people",
+ "e": "🤵",
+ "d": "man in tuxedo",
+ "u": "9.0"
+ },
+ "man_in_tuxedo_tone1": {
+ "c": "people",
+ "e": "🤵ðŸ»",
+ "d": "man in tuxedo tone 1",
+ "u": "9.0"
+ },
+ "man_in_tuxedo_tone2": {
+ "c": "people",
+ "e": "🤵ðŸ¼",
+ "d": "man in tuxedo tone 2",
+ "u": "9.0"
+ },
+ "man_in_tuxedo_tone3": {
+ "c": "people",
+ "e": "🤵ðŸ½",
+ "d": "man in tuxedo tone 3",
+ "u": "9.0"
+ },
+ "man_in_tuxedo_tone4": {
+ "c": "people",
+ "e": "🤵ðŸ¾",
+ "d": "man in tuxedo tone 4",
+ "u": "9.0"
+ },
+ "man_in_tuxedo_tone5": {
+ "c": "people",
+ "e": "🤵ðŸ¿",
+ "d": "man in tuxedo tone 5",
+ "u": "9.0"
+ },
+ "man_tone1": {
+ "c": "people",
+ "e": "👨ðŸ»",
+ "d": "man tone 1",
+ "u": "8.0"
+ },
+ "man_tone2": {
+ "c": "people",
+ "e": "👨ðŸ¼",
+ "d": "man tone 2",
+ "u": "8.0"
+ },
+ "man_tone3": {
+ "c": "people",
+ "e": "👨ðŸ½",
+ "d": "man tone 3",
+ "u": "8.0"
+ },
+ "man_tone4": {
+ "c": "people",
+ "e": "👨ðŸ¾",
+ "d": "man tone 4",
+ "u": "8.0"
+ },
+ "man_tone5": {
+ "c": "people",
+ "e": "👨ðŸ¿",
+ "d": "man tone 5",
+ "u": "8.0"
+ },
+ "man_with_gua_pi_mao": {
+ "c": "people",
+ "e": "👲",
+ "d": "man with gua pi mao",
+ "u": "6.0"
+ },
+ "man_with_gua_pi_mao_tone1": {
+ "c": "people",
+ "e": "👲ðŸ»",
+ "d": "man with gua pi mao tone 1",
+ "u": "8.0"
+ },
+ "man_with_gua_pi_mao_tone2": {
+ "c": "people",
+ "e": "👲ðŸ¼",
+ "d": "man with gua pi mao tone 2",
+ "u": "8.0"
+ },
+ "man_with_gua_pi_mao_tone3": {
+ "c": "people",
+ "e": "👲ðŸ½",
+ "d": "man with gua pi mao tone 3",
+ "u": "8.0"
+ },
+ "man_with_gua_pi_mao_tone4": {
+ "c": "people",
+ "e": "👲ðŸ¾",
+ "d": "man with gua pi mao tone 4",
+ "u": "8.0"
+ },
+ "man_with_gua_pi_mao_tone5": {
+ "c": "people",
+ "e": "👲ðŸ¿",
+ "d": "man with gua pi mao tone 5",
+ "u": "8.0"
+ },
+ "man_with_turban": {
+ "c": "people",
+ "e": "👳",
+ "d": "man with turban",
+ "u": "6.0"
+ },
+ "man_with_turban_tone1": {
+ "c": "people",
+ "e": "👳ðŸ»",
+ "d": "man with turban tone 1",
+ "u": "8.0"
+ },
+ "man_with_turban_tone2": {
+ "c": "people",
+ "e": "👳ðŸ¼",
+ "d": "man with turban tone 2",
+ "u": "8.0"
+ },
+ "man_with_turban_tone3": {
+ "c": "people",
+ "e": "👳ðŸ½",
+ "d": "man with turban tone 3",
+ "u": "8.0"
+ },
+ "man_with_turban_tone4": {
+ "c": "people",
+ "e": "👳ðŸ¾",
+ "d": "man with turban tone 4",
+ "u": "8.0"
+ },
+ "man_with_turban_tone5": {
+ "c": "people",
+ "e": "👳ðŸ¿",
+ "d": "man with turban tone 5",
+ "u": "8.0"
+ },
+ "mans_shoe": {
+ "c": "people",
+ "e": "👞",
+ "d": "mans shoe",
+ "u": "6.0"
+ },
+ "map": {
+ "c": "objects",
+ "e": "🗺",
+ "d": "world map",
+ "u": "7.0"
+ },
+ "maple_leaf": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "maple leaf",
+ "u": "6.0"
+ },
+ "martial_arts_uniform": {
+ "c": "activity",
+ "e": "🥋",
+ "d": "martial arts uniform",
+ "u": "9.0"
+ },
+ "mask": {
+ "c": "people",
+ "e": "😷",
+ "d": "face with medical mask",
+ "u": "6.0"
+ },
+ "massage": {
+ "c": "people",
+ "e": "💆",
+ "d": "face massage",
+ "u": "6.0"
+ },
+ "massage_tone1": {
+ "c": "people",
+ "e": "💆ðŸ»",
+ "d": "face massage tone 1",
+ "u": "8.0"
+ },
+ "massage_tone2": {
+ "c": "people",
+ "e": "💆ðŸ¼",
+ "d": "face massage tone 2",
+ "u": "8.0"
+ },
+ "massage_tone3": {
+ "c": "people",
+ "e": "💆ðŸ½",
+ "d": "face massage tone 3",
+ "u": "8.0"
+ },
+ "massage_tone4": {
+ "c": "people",
+ "e": "💆ðŸ¾",
+ "d": "face massage tone 4",
+ "u": "8.0"
+ },
+ "massage_tone5": {
+ "c": "people",
+ "e": "💆ðŸ¿",
+ "d": "face massage tone 5",
+ "u": "8.0"
+ },
+ "meat_on_bone": {
+ "c": "food",
+ "e": "ðŸ–",
+ "d": "meat on bone",
+ "u": "6.0"
+ },
+ "medal": {
+ "c": "activity",
+ "e": "ðŸ…",
+ "d": "sports medal",
+ "u": "7.0"
+ },
+ "mega": {
+ "c": "symbols",
+ "e": "📣",
+ "d": "cheering megaphone",
+ "u": "6.0"
+ },
+ "melon": {
+ "c": "food",
+ "e": "ðŸˆ",
+ "d": "melon",
+ "u": "6.0"
+ },
+ "menorah": {
+ "c": "symbols",
+ "e": "🕎",
+ "d": "menorah with nine branches",
+ "u": "8.0"
+ },
+ "mens": {
+ "c": "symbols",
+ "e": "🚹",
+ "d": "mens symbol",
+ "u": "6.0"
+ },
+ "metal": {
+ "c": "people",
+ "e": "🤘",
+ "d": "sign of the horns",
+ "u": "8.0"
+ },
+ "metal_tone1": {
+ "c": "people",
+ "e": "🤘ðŸ»",
+ "d": "sign of the horns tone 1",
+ "u": "8.0"
+ },
+ "metal_tone2": {
+ "c": "people",
+ "e": "🤘ðŸ¼",
+ "d": "sign of the horns tone 2",
+ "u": "8.0"
+ },
+ "metal_tone3": {
+ "c": "people",
+ "e": "🤘ðŸ½",
+ "d": "sign of the horns tone 3",
+ "u": "8.0"
+ },
+ "metal_tone4": {
+ "c": "people",
+ "e": "🤘ðŸ¾",
+ "d": "sign of the horns tone 4",
+ "u": "8.0"
+ },
+ "metal_tone5": {
+ "c": "people",
+ "e": "🤘ðŸ¿",
+ "d": "sign of the horns tone 5",
+ "u": "8.0"
+ },
+ "metro": {
+ "c": "travel",
+ "e": "🚇",
+ "d": "metro",
+ "u": "6.0"
+ },
+ "microphone": {
+ "c": "activity",
+ "e": "🎤",
+ "d": "microphone",
+ "u": "6.0"
+ },
+ "microphone2": {
+ "c": "objects",
+ "e": "🎙",
+ "d": "studio microphone",
+ "u": "7.0"
+ },
+ "microscope": {
+ "c": "objects",
+ "e": "🔬",
+ "d": "microscope",
+ "u": "6.0"
+ },
+ "middle_finger": {
+ "c": "people",
+ "e": "🖕",
+ "d": "reversed hand with middle finger extended",
+ "u": "7.0"
+ },
+ "middle_finger_tone1": {
+ "c": "people",
+ "e": "🖕ðŸ»",
+ "d": "reversed hand with middle finger extended tone 1",
+ "u": "8.0"
+ },
+ "middle_finger_tone2": {
+ "c": "people",
+ "e": "🖕ðŸ¼",
+ "d": "reversed hand with middle finger extended tone 2",
+ "u": "8.0"
+ },
+ "middle_finger_tone3": {
+ "c": "people",
+ "e": "🖕ðŸ½",
+ "d": "reversed hand with middle finger extended tone 3",
+ "u": "8.0"
+ },
+ "middle_finger_tone4": {
+ "c": "people",
+ "e": "🖕ðŸ¾",
+ "d": "reversed hand with middle finger extended tone 4",
+ "u": "8.0"
+ },
+ "middle_finger_tone5": {
+ "c": "people",
+ "e": "🖕ðŸ¿",
+ "d": "reversed hand with middle finger extended tone 5",
+ "u": "8.0"
+ },
+ "military_medal": {
+ "c": "activity",
+ "e": "🎖",
+ "d": "military medal",
+ "u": "7.0"
+ },
+ "milk": {
+ "c": "food",
+ "e": "🥛",
+ "d": "glass of milk",
+ "u": "9.0"
+ },
+ "milky_way": {
+ "c": "travel",
+ "e": "🌌",
+ "d": "milky way",
+ "u": "6.0"
+ },
+ "minibus": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "minibus",
+ "u": "6.0"
+ },
+ "minidisc": {
+ "c": "objects",
+ "e": "💽",
+ "d": "minidisc",
+ "u": "6.0"
+ },
+ "mobile_phone_off": {
+ "c": "symbols",
+ "e": "📴",
+ "d": "mobile phone off",
+ "u": "6.0"
+ },
+ "money_mouth": {
+ "c": "people",
+ "e": "🤑",
+ "d": "money-mouth face",
+ "u": "8.0"
+ },
+ "money_with_wings": {
+ "c": "objects",
+ "e": "💸",
+ "d": "money with wings",
+ "u": "6.0"
+ },
+ "moneybag": {
+ "c": "objects",
+ "e": "💰",
+ "d": "money bag",
+ "u": "6.0"
+ },
+ "monkey": {
+ "c": "nature",
+ "e": "ðŸ’",
+ "d": "monkey",
+ "u": "6.0"
+ },
+ "monkey_face": {
+ "c": "nature",
+ "e": "ðŸµ",
+ "d": "monkey face",
+ "u": "6.0"
+ },
+ "monorail": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "monorail",
+ "u": "6.0"
+ },
+ "mortar_board": {
+ "c": "people",
+ "e": "🎓",
+ "d": "graduation cap",
+ "u": "6.0"
+ },
+ "mosque": {
+ "c": "travel",
+ "e": "🕌",
+ "d": "mosque",
+ "u": "8.0"
+ },
+ "motor_scooter": {
+ "c": "travel",
+ "e": "🛵",
+ "d": "motor scooter",
+ "u": "9.0"
+ },
+ "motorboat": {
+ "c": "travel",
+ "e": "🛥",
+ "d": "motorboat",
+ "u": "7.0"
+ },
+ "motorcycle": {
+ "c": "travel",
+ "e": "ðŸ",
+ "d": "racing motorcycle",
+ "u": "7.0"
+ },
+ "motorway": {
+ "c": "travel",
+ "e": "🛣",
+ "d": "motorway",
+ "u": "7.0"
+ },
+ "mount_fuji": {
+ "c": "travel",
+ "e": "🗻",
+ "d": "mount fuji",
+ "u": "6.0"
+ },
+ "mountain": {
+ "c": "travel",
+ "e": "â›°",
+ "d": "mountain",
+ "u": "5.2"
+ },
+ "mountain_bicyclist": {
+ "c": "activity",
+ "e": "🚵",
+ "d": "mountain bicyclist",
+ "u": "6.0"
+ },
+ "mountain_bicyclist_tone1": {
+ "c": "activity",
+ "e": "🚵ðŸ»",
+ "d": "mountain bicyclist tone 1",
+ "u": "8.0"
+ },
+ "mountain_bicyclist_tone2": {
+ "c": "activity",
+ "e": "🚵ðŸ¼",
+ "d": "mountain bicyclist tone 2",
+ "u": "8.0"
+ },
+ "mountain_bicyclist_tone3": {
+ "c": "activity",
+ "e": "🚵ðŸ½",
+ "d": "mountain bicyclist tone 3",
+ "u": "8.0"
+ },
+ "mountain_bicyclist_tone4": {
+ "c": "activity",
+ "e": "🚵ðŸ¾",
+ "d": "mountain bicyclist tone 4",
+ "u": "8.0"
+ },
+ "mountain_bicyclist_tone5": {
+ "c": "activity",
+ "e": "🚵ðŸ¿",
+ "d": "mountain bicyclist tone 5",
+ "u": "8.0"
+ },
+ "mountain_cableway": {
+ "c": "travel",
+ "e": "🚠",
+ "d": "mountain cableway",
+ "u": "6.0"
+ },
+ "mountain_railway": {
+ "c": "travel",
+ "e": "🚞",
+ "d": "mountain railway",
+ "u": "6.0"
+ },
+ "mountain_snow": {
+ "c": "travel",
+ "e": "ðŸ”",
+ "d": "snow capped mountain",
+ "u": "7.0"
+ },
+ "mouse": {
+ "c": "nature",
+ "e": "ðŸ­",
+ "d": "mouse face",
+ "u": "6.0"
+ },
+ "mouse2": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "mouse",
+ "u": "6.0"
+ },
+ "mouse_three_button": {
+ "c": "objects",
+ "e": "🖱",
+ "d": "three button mouse",
+ "u": "7.0"
+ },
+ "movie_camera": {
+ "c": "objects",
+ "e": "🎥",
+ "d": "movie camera",
+ "u": "6.0"
+ },
+ "moyai": {
+ "c": "objects",
+ "e": "🗿",
+ "d": "moyai",
+ "u": "6.0"
+ },
+ "mrs_claus": {
+ "c": "people",
+ "e": "🤶",
+ "d": "mother christmas",
+ "u": "9.0"
+ },
+ "mrs_claus_tone1": {
+ "c": "people",
+ "e": "🤶ðŸ»",
+ "d": "mother christmas tone 1",
+ "u": "9.0"
+ },
+ "mrs_claus_tone2": {
+ "c": "people",
+ "e": "🤶ðŸ¼",
+ "d": "mother christmas tone 2",
+ "u": "9.0"
+ },
+ "mrs_claus_tone3": {
+ "c": "people",
+ "e": "🤶ðŸ½",
+ "d": "mother christmas tone 3",
+ "u": "9.0"
+ },
+ "mrs_claus_tone4": {
+ "c": "people",
+ "e": "🤶ðŸ¾",
+ "d": "mother christmas tone 4",
+ "u": "9.0"
+ },
+ "mrs_claus_tone5": {
+ "c": "people",
+ "e": "🤶ðŸ¿",
+ "d": "mother christmas tone 5",
+ "u": "9.0"
+ },
+ "muscle": {
+ "c": "people",
+ "e": "💪",
+ "d": "flexed biceps",
+ "u": "6.0"
+ },
+ "muscle_tone1": {
+ "c": "people",
+ "e": "💪ðŸ»",
+ "d": "flexed biceps tone 1",
+ "u": "8.0"
+ },
+ "muscle_tone2": {
+ "c": "people",
+ "e": "💪ðŸ¼",
+ "d": "flexed biceps tone 2",
+ "u": "8.0"
+ },
+ "muscle_tone3": {
+ "c": "people",
+ "e": "💪ðŸ½",
+ "d": "flexed biceps tone 3",
+ "u": "8.0"
+ },
+ "muscle_tone4": {
+ "c": "people",
+ "e": "💪ðŸ¾",
+ "d": "flexed biceps tone 4",
+ "u": "8.0"
+ },
+ "muscle_tone5": {
+ "c": "people",
+ "e": "💪ðŸ¿",
+ "d": "flexed biceps tone 5",
+ "u": "8.0"
+ },
+ "mushroom": {
+ "c": "nature",
+ "e": "ðŸ„",
+ "d": "mushroom",
+ "u": "6.0"
+ },
+ "musical_keyboard": {
+ "c": "activity",
+ "e": "🎹",
+ "d": "musical keyboard",
+ "u": "6.0"
+ },
+ "musical_note": {
+ "c": "symbols",
+ "e": "🎵",
+ "d": "musical note",
+ "u": "6.0"
+ },
+ "musical_score": {
+ "c": "activity",
+ "e": "🎼",
+ "d": "musical score",
+ "u": "6.0"
+ },
+ "mute": {
+ "c": "symbols",
+ "e": "🔇",
+ "d": "speaker with cancellation stroke",
+ "u": "6.0"
+ },
+ "nail_care": {
+ "c": "people",
+ "e": "💅",
+ "d": "nail polish",
+ "u": "6.0"
+ },
+ "nail_care_tone1": {
+ "c": "people",
+ "e": "💅ðŸ»",
+ "d": "nail polish tone 1",
+ "u": "8.0"
+ },
+ "nail_care_tone2": {
+ "c": "people",
+ "e": "💅ðŸ¼",
+ "d": "nail polish tone 2",
+ "u": "8.0"
+ },
+ "nail_care_tone3": {
+ "c": "people",
+ "e": "💅ðŸ½",
+ "d": "nail polish tone 3",
+ "u": "8.0"
+ },
+ "nail_care_tone4": {
+ "c": "people",
+ "e": "💅ðŸ¾",
+ "d": "nail polish tone 4",
+ "u": "8.0"
+ },
+ "nail_care_tone5": {
+ "c": "people",
+ "e": "💅ðŸ¿",
+ "d": "nail polish tone 5",
+ "u": "8.0"
+ },
+ "name_badge": {
+ "c": "symbols",
+ "e": "📛",
+ "d": "name badge",
+ "u": "6.0"
+ },
+ "nauseated_face": {
+ "c": "people",
+ "e": "🤢",
+ "d": "nauseated face",
+ "u": "9.0"
+ },
+ "necktie": {
+ "c": "people",
+ "e": "👔",
+ "d": "necktie",
+ "u": "6.0"
+ },
+ "negative_squared_cross_mark": {
+ "c": "symbols",
+ "e": "âŽ",
+ "d": "negative squared cross mark",
+ "u": "6.0"
+ },
+ "nerd": {
+ "c": "people",
+ "e": "🤓",
+ "d": "nerd face",
+ "u": "8.0"
+ },
+ "neutral_face": {
+ "c": "people",
+ "e": "ðŸ˜",
+ "d": "neutral face",
+ "u": "6.0"
+ },
+ "new": {
+ "c": "symbols",
+ "e": "🆕",
+ "d": "squared new",
+ "u": "6.0"
+ },
+ "new_moon": {
+ "c": "nature",
+ "e": "🌑",
+ "d": "new moon symbol",
+ "u": "6.0"
+ },
+ "new_moon_with_face": {
+ "c": "nature",
+ "e": "🌚",
+ "d": "new moon with face",
+ "u": "6.0"
+ },
+ "newspaper": {
+ "c": "objects",
+ "e": "📰",
+ "d": "newspaper",
+ "u": "6.0"
+ },
+ "newspaper2": {
+ "c": "objects",
+ "e": "🗞",
+ "d": "rolled-up newspaper",
+ "u": "7.0"
+ },
+ "ng": {
+ "c": "symbols",
+ "e": "🆖",
+ "d": "squared ng",
+ "u": "6.0"
+ },
+ "night_with_stars": {
+ "c": "travel",
+ "e": "🌃",
+ "d": "night with stars",
+ "u": "6.0"
+ },
+ "nine": {
+ "c": "symbols",
+ "e": "9ï¸âƒ£",
+ "d": "keycap digit nine",
+ "u": "3.0"
+ },
+ "no_bell": {
+ "c": "symbols",
+ "e": "🔕",
+ "d": "bell with cancellation stroke",
+ "u": "6.0"
+ },
+ "no_bicycles": {
+ "c": "symbols",
+ "e": "🚳",
+ "d": "no bicycles",
+ "u": "6.0"
+ },
+ "no_entry": {
+ "c": "symbols",
+ "e": "â›”",
+ "d": "no entry",
+ "u": "5.2"
+ },
+ "no_entry_sign": {
+ "c": "symbols",
+ "e": "🚫",
+ "d": "no entry sign",
+ "u": "6.0"
+ },
+ "no_good": {
+ "c": "people",
+ "e": "🙅",
+ "d": "face with no good gesture",
+ "u": "6.0"
+ },
+ "no_good_tone1": {
+ "c": "people",
+ "e": "🙅ðŸ»",
+ "d": "face with no good gesture tone 1",
+ "u": "8.0"
+ },
+ "no_good_tone2": {
+ "c": "people",
+ "e": "🙅ðŸ¼",
+ "d": "face with no good gesture tone 2",
+ "u": "8.0"
+ },
+ "no_good_tone3": {
+ "c": "people",
+ "e": "🙅ðŸ½",
+ "d": "face with no good gesture tone 3",
+ "u": "8.0"
+ },
+ "no_good_tone4": {
+ "c": "people",
+ "e": "🙅ðŸ¾",
+ "d": "face with no good gesture tone 4",
+ "u": "8.0"
+ },
+ "no_good_tone5": {
+ "c": "people",
+ "e": "🙅ðŸ¿",
+ "d": "face with no good gesture tone 5",
+ "u": "8.0"
+ },
+ "no_mobile_phones": {
+ "c": "symbols",
+ "e": "📵",
+ "d": "no mobile phones",
+ "u": "6.0"
+ },
+ "no_mouth": {
+ "c": "people",
+ "e": "😶",
+ "d": "face without mouth",
+ "u": "6.0"
+ },
+ "no_pedestrians": {
+ "c": "symbols",
+ "e": "🚷",
+ "d": "no pedestrians",
+ "u": "6.0"
+ },
+ "no_smoking": {
+ "c": "symbols",
+ "e": "🚭",
+ "d": "no smoking symbol",
+ "u": "6.0"
+ },
+ "non-potable_water": {
+ "c": "symbols",
+ "e": "🚱",
+ "d": "non-potable water symbol",
+ "u": "6.0"
+ },
+ "nose": {
+ "c": "people",
+ "e": "👃",
+ "d": "nose",
+ "u": "6.0"
+ },
+ "nose_tone1": {
+ "c": "people",
+ "e": "👃ðŸ»",
+ "d": "nose tone 1",
+ "u": "8.0"
+ },
+ "nose_tone2": {
+ "c": "people",
+ "e": "👃ðŸ¼",
+ "d": "nose tone 2",
+ "u": "8.0"
+ },
+ "nose_tone3": {
+ "c": "people",
+ "e": "👃ðŸ½",
+ "d": "nose tone 3",
+ "u": "8.0"
+ },
+ "nose_tone4": {
+ "c": "people",
+ "e": "👃ðŸ¾",
+ "d": "nose tone 4",
+ "u": "8.0"
+ },
+ "nose_tone5": {
+ "c": "people",
+ "e": "👃ðŸ¿",
+ "d": "nose tone 5",
+ "u": "8.0"
+ },
+ "notebook": {
+ "c": "objects",
+ "e": "📓",
+ "d": "notebook",
+ "u": "6.0"
+ },
+ "notebook_with_decorative_cover": {
+ "c": "objects",
+ "e": "📔",
+ "d": "notebook with decorative cover",
+ "u": "6.0"
+ },
+ "notepad_spiral": {
+ "c": "objects",
+ "e": "🗒",
+ "d": "spiral note pad",
+ "u": "7.0"
+ },
+ "notes": {
+ "c": "symbols",
+ "e": "🎶",
+ "d": "multiple musical notes",
+ "u": "6.0"
+ },
+ "nut_and_bolt": {
+ "c": "objects",
+ "e": "🔩",
+ "d": "nut and bolt",
+ "u": "6.0"
+ },
+ "o": {
+ "c": "symbols",
+ "e": "â­•",
+ "d": "heavy large circle",
+ "u": "5.2"
+ },
+ "o2": {
+ "c": "symbols",
+ "e": "🅾",
+ "d": "negative squared latin capital letter o",
+ "u": "6.0"
+ },
+ "ocean": {
+ "c": "nature",
+ "e": "🌊",
+ "d": "water wave",
+ "u": "6.0"
+ },
+ "octagonal_sign": {
+ "c": "symbols",
+ "e": "🛑",
+ "d": "octagonal sign",
+ "u": "9.0"
+ },
+ "octopus": {
+ "c": "nature",
+ "e": "ðŸ™",
+ "d": "octopus",
+ "u": "6.0"
+ },
+ "oden": {
+ "c": "food",
+ "e": "ðŸ¢",
+ "d": "oden",
+ "u": "6.0"
+ },
+ "office": {
+ "c": "travel",
+ "e": "ðŸ¢",
+ "d": "office building",
+ "u": "6.0"
+ },
+ "oil": {
+ "c": "objects",
+ "e": "🛢",
+ "d": "oil drum",
+ "u": "7.0"
+ },
+ "ok": {
+ "c": "symbols",
+ "e": "🆗",
+ "d": "squared ok",
+ "u": "6.0"
+ },
+ "ok_hand": {
+ "c": "people",
+ "e": "👌",
+ "d": "ok hand sign",
+ "u": "6.0"
+ },
+ "ok_hand_tone1": {
+ "c": "people",
+ "e": "👌ðŸ»",
+ "d": "ok hand sign tone 1",
+ "u": "8.0"
+ },
+ "ok_hand_tone2": {
+ "c": "people",
+ "e": "👌ðŸ¼",
+ "d": "ok hand sign tone 2",
+ "u": "8.0"
+ },
+ "ok_hand_tone3": {
+ "c": "people",
+ "e": "👌ðŸ½",
+ "d": "ok hand sign tone 3",
+ "u": "8.0"
+ },
+ "ok_hand_tone4": {
+ "c": "people",
+ "e": "👌ðŸ¾",
+ "d": "ok hand sign tone 4",
+ "u": "8.0"
+ },
+ "ok_hand_tone5": {
+ "c": "people",
+ "e": "👌ðŸ¿",
+ "d": "ok hand sign tone 5",
+ "u": "8.0"
+ },
+ "ok_woman": {
+ "c": "people",
+ "e": "🙆",
+ "d": "face with ok gesture",
+ "u": "6.0"
+ },
+ "ok_woman_tone1": {
+ "c": "people",
+ "e": "🙆ðŸ»",
+ "d": "face with ok gesture tone1",
+ "u": "8.0"
+ },
+ "ok_woman_tone2": {
+ "c": "people",
+ "e": "🙆ðŸ¼",
+ "d": "face with ok gesture tone2",
+ "u": "8.0"
+ },
+ "ok_woman_tone3": {
+ "c": "people",
+ "e": "🙆ðŸ½",
+ "d": "face with ok gesture tone3",
+ "u": "8.0"
+ },
+ "ok_woman_tone4": {
+ "c": "people",
+ "e": "🙆ðŸ¾",
+ "d": "face with ok gesture tone4",
+ "u": "8.0"
+ },
+ "ok_woman_tone5": {
+ "c": "people",
+ "e": "🙆ðŸ¿",
+ "d": "face with ok gesture tone5",
+ "u": "8.0"
+ },
+ "older_man": {
+ "c": "people",
+ "e": "👴",
+ "d": "older man",
+ "u": "6.0"
+ },
+ "older_man_tone1": {
+ "c": "people",
+ "e": "👴ðŸ»",
+ "d": "older man tone 1",
+ "u": "8.0"
+ },
+ "older_man_tone2": {
+ "c": "people",
+ "e": "👴ðŸ¼",
+ "d": "older man tone 2",
+ "u": "8.0"
+ },
+ "older_man_tone3": {
+ "c": "people",
+ "e": "👴ðŸ½",
+ "d": "older man tone 3",
+ "u": "8.0"
+ },
+ "older_man_tone4": {
+ "c": "people",
+ "e": "👴ðŸ¾",
+ "d": "older man tone 4",
+ "u": "8.0"
+ },
+ "older_man_tone5": {
+ "c": "people",
+ "e": "👴ðŸ¿",
+ "d": "older man tone 5",
+ "u": "8.0"
+ },
+ "older_woman": {
+ "c": "people",
+ "e": "👵",
+ "d": "older woman",
+ "u": "6.0"
+ },
+ "older_woman_tone1": {
+ "c": "people",
+ "e": "👵ðŸ»",
+ "d": "older woman tone 1",
+ "u": "8.0"
+ },
+ "older_woman_tone2": {
+ "c": "people",
+ "e": "👵ðŸ¼",
+ "d": "older woman tone 2",
+ "u": "8.0"
+ },
+ "older_woman_tone3": {
+ "c": "people",
+ "e": "👵ðŸ½",
+ "d": "older woman tone 3",
+ "u": "8.0"
+ },
+ "older_woman_tone4": {
+ "c": "people",
+ "e": "👵ðŸ¾",
+ "d": "older woman tone 4",
+ "u": "8.0"
+ },
+ "older_woman_tone5": {
+ "c": "people",
+ "e": "👵ðŸ¿",
+ "d": "older woman tone 5",
+ "u": "8.0"
+ },
+ "om_symbol": {
+ "c": "symbols",
+ "e": "🕉",
+ "d": "om symbol",
+ "u": "7.0"
+ },
+ "on": {
+ "c": "symbols",
+ "e": "🔛",
+ "d": "on with exclamation mark with left right arrow abo",
+ "u": "6.0"
+ },
+ "oncoming_automobile": {
+ "c": "travel",
+ "e": "🚘",
+ "d": "oncoming automobile",
+ "u": "6.0"
+ },
+ "oncoming_bus": {
+ "c": "travel",
+ "e": "ðŸš",
+ "d": "oncoming bus",
+ "u": "6.0"
+ },
+ "oncoming_police_car": {
+ "c": "travel",
+ "e": "🚔",
+ "d": "oncoming police car",
+ "u": "6.0"
+ },
+ "oncoming_taxi": {
+ "c": "travel",
+ "e": "🚖",
+ "d": "oncoming taxi",
+ "u": "6.0"
+ },
+ "one": {
+ "c": "symbols",
+ "e": "1ï¸âƒ£",
+ "d": "keycap digit one",
+ "u": "3.0"
+ },
+ "open_file_folder": {
+ "c": "objects",
+ "e": "📂",
+ "d": "open file folder",
+ "u": "6.0"
+ },
+ "open_hands": {
+ "c": "people",
+ "e": "ðŸ‘",
+ "d": "open hands sign",
+ "u": "6.0"
+ },
+ "open_hands_tone1": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ»",
+ "d": "open hands sign tone 1",
+ "u": "8.0"
+ },
+ "open_hands_tone2": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¼",
+ "d": "open hands sign tone 2",
+ "u": "8.0"
+ },
+ "open_hands_tone3": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ½",
+ "d": "open hands sign tone 3",
+ "u": "8.0"
+ },
+ "open_hands_tone4": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¾",
+ "d": "open hands sign tone 4",
+ "u": "8.0"
+ },
+ "open_hands_tone5": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¿",
+ "d": "open hands sign tone 5",
+ "u": "8.0"
+ },
+ "open_mouth": {
+ "c": "people",
+ "e": "😮",
+ "d": "face with open mouth",
+ "u": "6.1"
+ },
+ "ophiuchus": {
+ "c": "symbols",
+ "e": "⛎",
+ "d": "ophiuchus",
+ "u": "6.0"
+ },
+ "orange_book": {
+ "c": "objects",
+ "e": "📙",
+ "d": "orange book",
+ "u": "6.0"
+ },
+ "orthodox_cross": {
+ "c": "symbols",
+ "e": "☦",
+ "d": "orthodox cross",
+ "u": "1.1"
+ },
+ "outbox_tray": {
+ "c": "objects",
+ "e": "📤",
+ "d": "outbox tray",
+ "u": "6.0"
+ },
+ "owl": {
+ "c": "nature",
+ "e": "🦉",
+ "d": "owl",
+ "u": "9.0"
+ },
+ "ox": {
+ "c": "nature",
+ "e": "ðŸ‚",
+ "d": "ox",
+ "u": "6.0"
+ },
+ "package": {
+ "c": "objects",
+ "e": "📦",
+ "d": "package",
+ "u": "6.0"
+ },
+ "page_facing_up": {
+ "c": "objects",
+ "e": "📄",
+ "d": "page facing up",
+ "u": "6.0"
+ },
+ "page_with_curl": {
+ "c": "objects",
+ "e": "📃",
+ "d": "page with curl",
+ "u": "6.0"
+ },
+ "pager": {
+ "c": "objects",
+ "e": "📟",
+ "d": "pager",
+ "u": "6.0"
+ },
+ "paintbrush": {
+ "c": "objects",
+ "e": "🖌",
+ "d": "lower left paintbrush",
+ "u": "7.0"
+ },
+ "palm_tree": {
+ "c": "nature",
+ "e": "🌴",
+ "d": "palm tree",
+ "u": "6.0"
+ },
+ "pancakes": {
+ "c": "food",
+ "e": "🥞",
+ "d": "pancakes",
+ "u": "9.0"
+ },
+ "panda_face": {
+ "c": "nature",
+ "e": "ðŸ¼",
+ "d": "panda face",
+ "u": "6.0"
+ },
+ "paperclip": {
+ "c": "objects",
+ "e": "📎",
+ "d": "paperclip",
+ "u": "6.0"
+ },
+ "paperclips": {
+ "c": "objects",
+ "e": "🖇",
+ "d": "linked paperclips",
+ "u": "7.0"
+ },
+ "park": {
+ "c": "travel",
+ "e": "ðŸž",
+ "d": "national park",
+ "u": "7.0"
+ },
+ "parking": {
+ "c": "symbols",
+ "e": "🅿",
+ "d": "negative squared latin capital letter p",
+ "u": "5.2"
+ },
+ "part_alternation_mark": {
+ "c": "symbols",
+ "e": "〽",
+ "d": "part alternation mark",
+ "u": "3.2"
+ },
+ "partly_sunny": {
+ "c": "nature",
+ "e": "â›…",
+ "d": "sun behind cloud",
+ "u": "5.2"
+ },
+ "passport_control": {
+ "c": "symbols",
+ "e": "🛂",
+ "d": "passport control",
+ "u": "6.0"
+ },
+ "pause_button": {
+ "c": "symbols",
+ "e": "â¸",
+ "d": "double vertical bar",
+ "u": "7.0"
+ },
+ "peace": {
+ "c": "symbols",
+ "e": "☮",
+ "d": "peace symbol",
+ "u": "1.1"
+ },
+ "peach": {
+ "c": "food",
+ "e": "ðŸ‘",
+ "d": "peach",
+ "u": "6.0"
+ },
+ "peanuts": {
+ "c": "food",
+ "e": "🥜",
+ "d": "peanuts",
+ "u": "9.0"
+ },
+ "pear": {
+ "c": "food",
+ "e": "ðŸ",
+ "d": "pear",
+ "u": "6.0"
+ },
+ "pen_ballpoint": {
+ "c": "objects",
+ "e": "🖊",
+ "d": "lower left ballpoint pen",
+ "u": "7.0"
+ },
+ "pen_fountain": {
+ "c": "objects",
+ "e": "🖋",
+ "d": "lower left fountain pen",
+ "u": "7.0"
+ },
+ "pencil": {
+ "c": "objects",
+ "e": "ðŸ“",
+ "d": "memo",
+ "u": "6.0"
+ },
+ "pencil2": {
+ "c": "objects",
+ "e": "âœ",
+ "d": "pencil",
+ "u": "1.1"
+ },
+ "penguin": {
+ "c": "nature",
+ "e": "ðŸ§",
+ "d": "penguin",
+ "u": "6.0"
+ },
+ "pensive": {
+ "c": "people",
+ "e": "😔",
+ "d": "pensive face",
+ "u": "6.0"
+ },
+ "performing_arts": {
+ "c": "activity",
+ "e": "🎭",
+ "d": "performing arts",
+ "u": "6.0"
+ },
+ "persevere": {
+ "c": "people",
+ "e": "😣",
+ "d": "persevering face",
+ "u": "6.0"
+ },
+ "person_frowning": {
+ "c": "people",
+ "e": "ðŸ™",
+ "d": "person frowning",
+ "u": "6.0"
+ },
+ "person_frowning_tone1": {
+ "c": "people",
+ "e": "ðŸ™ðŸ»",
+ "d": "person frowning tone 1",
+ "u": "8.0"
+ },
+ "person_frowning_tone2": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¼",
+ "d": "person frowning tone 2",
+ "u": "8.0"
+ },
+ "person_frowning_tone3": {
+ "c": "people",
+ "e": "ðŸ™ðŸ½",
+ "d": "person frowning tone 3",
+ "u": "8.0"
+ },
+ "person_frowning_tone4": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¾",
+ "d": "person frowning tone 4",
+ "u": "8.0"
+ },
+ "person_frowning_tone5": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¿",
+ "d": "person frowning tone 5",
+ "u": "8.0"
+ },
+ "person_with_blond_hair": {
+ "c": "people",
+ "e": "👱",
+ "d": "person with blond hair",
+ "u": "6.0"
+ },
+ "person_with_blond_hair_tone1": {
+ "c": "people",
+ "e": "👱ðŸ»",
+ "d": "person with blond hair tone 1",
+ "u": "8.0"
+ },
+ "person_with_blond_hair_tone2": {
+ "c": "people",
+ "e": "👱ðŸ¼",
+ "d": "person with blond hair tone 2",
+ "u": "8.0"
+ },
+ "person_with_blond_hair_tone3": {
+ "c": "people",
+ "e": "👱ðŸ½",
+ "d": "person with blond hair tone 3",
+ "u": "8.0"
+ },
+ "person_with_blond_hair_tone4": {
+ "c": "people",
+ "e": "👱ðŸ¾",
+ "d": "person with blond hair tone 4",
+ "u": "8.0"
+ },
+ "person_with_blond_hair_tone5": {
+ "c": "people",
+ "e": "👱ðŸ¿",
+ "d": "person with blond hair tone 5",
+ "u": "8.0"
+ },
+ "person_with_pouting_face": {
+ "c": "people",
+ "e": "🙎",
+ "d": "person with pouting face",
+ "u": "6.0"
+ },
+ "person_with_pouting_face_tone1": {
+ "c": "people",
+ "e": "🙎ðŸ»",
+ "d": "person with pouting face tone1",
+ "u": "8.0"
+ },
+ "person_with_pouting_face_tone2": {
+ "c": "people",
+ "e": "🙎ðŸ¼",
+ "d": "person with pouting face tone2",
+ "u": "8.0"
+ },
+ "person_with_pouting_face_tone3": {
+ "c": "people",
+ "e": "🙎ðŸ½",
+ "d": "person with pouting face tone3",
+ "u": "8.0"
+ },
+ "person_with_pouting_face_tone4": {
+ "c": "people",
+ "e": "🙎ðŸ¾",
+ "d": "person with pouting face tone4",
+ "u": "8.0"
+ },
+ "person_with_pouting_face_tone5": {
+ "c": "people",
+ "e": "🙎ðŸ¿",
+ "d": "person with pouting face tone5",
+ "u": "8.0"
+ },
+ "pick": {
+ "c": "objects",
+ "e": "â›",
+ "d": "pick",
+ "u": "5.2"
+ },
+ "pig": {
+ "c": "nature",
+ "e": "ðŸ·",
+ "d": "pig face",
+ "u": "6.0"
+ },
+ "pig2": {
+ "c": "nature",
+ "e": "ðŸ–",
+ "d": "pig",
+ "u": "6.0"
+ },
+ "pig_nose": {
+ "c": "nature",
+ "e": "ðŸ½",
+ "d": "pig nose",
+ "u": "6.0"
+ },
+ "pill": {
+ "c": "objects",
+ "e": "💊",
+ "d": "pill",
+ "u": "6.0"
+ },
+ "pineapple": {
+ "c": "food",
+ "e": "ðŸ",
+ "d": "pineapple",
+ "u": "6.0"
+ },
+ "ping_pong": {
+ "c": "activity",
+ "e": "ðŸ“",
+ "d": "table tennis paddle and ball",
+ "u": "8.0"
+ },
+ "pisces": {
+ "c": "symbols",
+ "e": "♓",
+ "d": "pisces",
+ "u": "1.1"
+ },
+ "pizza": {
+ "c": "food",
+ "e": "ðŸ•",
+ "d": "slice of pizza",
+ "u": "6.0"
+ },
+ "place_of_worship": {
+ "c": "symbols",
+ "e": "ðŸ›",
+ "d": "place of worship",
+ "u": "8.0"
+ },
+ "play_pause": {
+ "c": "symbols",
+ "e": "â¯",
+ "d": "black right-pointing double triangle with double vertical bar",
+ "u": "6.0"
+ },
+ "point_down": {
+ "c": "people",
+ "e": "👇",
+ "d": "white down pointing backhand index",
+ "u": "6.0"
+ },
+ "point_down_tone1": {
+ "c": "people",
+ "e": "👇ðŸ»",
+ "d": "white down pointing backhand index tone 1",
+ "u": "8.0"
+ },
+ "point_down_tone2": {
+ "c": "people",
+ "e": "👇ðŸ¼",
+ "d": "white down pointing backhand index tone 2",
+ "u": "8.0"
+ },
+ "point_down_tone3": {
+ "c": "people",
+ "e": "👇ðŸ½",
+ "d": "white down pointing backhand index tone 3",
+ "u": "8.0"
+ },
+ "point_down_tone4": {
+ "c": "people",
+ "e": "👇ðŸ¾",
+ "d": "white down pointing backhand index tone 4",
+ "u": "8.0"
+ },
+ "point_down_tone5": {
+ "c": "people",
+ "e": "👇ðŸ¿",
+ "d": "white down pointing backhand index tone 5",
+ "u": "8.0"
+ },
+ "point_left": {
+ "c": "people",
+ "e": "👈",
+ "d": "white left pointing backhand index",
+ "u": "6.0"
+ },
+ "point_left_tone1": {
+ "c": "people",
+ "e": "👈ðŸ»",
+ "d": "white left pointing backhand index tone 1",
+ "u": "8.0"
+ },
+ "point_left_tone2": {
+ "c": "people",
+ "e": "👈ðŸ¼",
+ "d": "white left pointing backhand index tone 2",
+ "u": "8.0"
+ },
+ "point_left_tone3": {
+ "c": "people",
+ "e": "👈ðŸ½",
+ "d": "white left pointing backhand index tone 3",
+ "u": "8.0"
+ },
+ "point_left_tone4": {
+ "c": "people",
+ "e": "👈ðŸ¾",
+ "d": "white left pointing backhand index tone 4",
+ "u": "8.0"
+ },
+ "point_left_tone5": {
+ "c": "people",
+ "e": "👈ðŸ¿",
+ "d": "white left pointing backhand index tone 5",
+ "u": "8.0"
+ },
+ "point_right": {
+ "c": "people",
+ "e": "👉",
+ "d": "white right pointing backhand index",
+ "u": "6.0"
+ },
+ "point_right_tone1": {
+ "c": "people",
+ "e": "👉ðŸ»",
+ "d": "white right pointing backhand index tone 1",
+ "u": "8.0"
+ },
+ "point_right_tone2": {
+ "c": "people",
+ "e": "👉ðŸ¼",
+ "d": "white right pointing backhand index tone 2",
+ "u": "8.0"
+ },
+ "point_right_tone3": {
+ "c": "people",
+ "e": "👉ðŸ½",
+ "d": "white right pointing backhand index tone 3",
+ "u": "8.0"
+ },
+ "point_right_tone4": {
+ "c": "people",
+ "e": "👉ðŸ¾",
+ "d": "white right pointing backhand index tone 4",
+ "u": "8.0"
+ },
+ "point_right_tone5": {
+ "c": "people",
+ "e": "👉ðŸ¿",
+ "d": "white right pointing backhand index tone 5",
+ "u": "8.0"
+ },
+ "point_up": {
+ "c": "people",
+ "e": "â˜",
+ "d": "white up pointing index",
+ "u": "1.1"
+ },
+ "point_up_2": {
+ "c": "people",
+ "e": "👆",
+ "d": "white up pointing backhand index",
+ "u": "6.0"
+ },
+ "point_up_2_tone1": {
+ "c": "people",
+ "e": "👆ðŸ»",
+ "d": "white up pointing backhand index tone 1",
+ "u": "8.0"
+ },
+ "point_up_2_tone2": {
+ "c": "people",
+ "e": "👆ðŸ¼",
+ "d": "white up pointing backhand index tone 2",
+ "u": "8.0"
+ },
+ "point_up_2_tone3": {
+ "c": "people",
+ "e": "👆ðŸ½",
+ "d": "white up pointing backhand index tone 3",
+ "u": "8.0"
+ },
+ "point_up_2_tone4": {
+ "c": "people",
+ "e": "👆ðŸ¾",
+ "d": "white up pointing backhand index tone 4",
+ "u": "8.0"
+ },
+ "point_up_2_tone5": {
+ "c": "people",
+ "e": "👆ðŸ¿",
+ "d": "white up pointing backhand index tone 5",
+ "u": "8.0"
+ },
+ "point_up_tone1": {
+ "c": "people",
+ "e": "â˜ðŸ»",
+ "d": "white up pointing index tone 1",
+ "u": "8.0"
+ },
+ "point_up_tone2": {
+ "c": "people",
+ "e": "â˜ðŸ¼",
+ "d": "white up pointing index tone 2",
+ "u": "8.0"
+ },
+ "point_up_tone3": {
+ "c": "people",
+ "e": "â˜ðŸ½",
+ "d": "white up pointing index tone 3",
+ "u": "8.0"
+ },
+ "point_up_tone4": {
+ "c": "people",
+ "e": "â˜ðŸ¾",
+ "d": "white up pointing index tone 4",
+ "u": "8.0"
+ },
+ "point_up_tone5": {
+ "c": "people",
+ "e": "â˜ðŸ¿",
+ "d": "white up pointing index tone 5",
+ "u": "8.0"
+ },
+ "police_car": {
+ "c": "travel",
+ "e": "🚓",
+ "d": "police car",
+ "u": "6.0"
+ },
+ "poodle": {
+ "c": "nature",
+ "e": "ðŸ©",
+ "d": "poodle",
+ "u": "6.0"
+ },
+ "poop": {
+ "c": "people",
+ "e": "💩",
+ "d": "pile of poo",
+ "u": "6.0"
+ },
+ "popcorn": {
+ "c": "food",
+ "e": "ðŸ¿",
+ "d": "popcorn",
+ "u": "8.0"
+ },
+ "post_office": {
+ "c": "travel",
+ "e": "ðŸ£",
+ "d": "japanese post office",
+ "u": "6.0"
+ },
+ "postal_horn": {
+ "c": "objects",
+ "e": "📯",
+ "d": "postal horn",
+ "u": "6.0"
+ },
+ "postbox": {
+ "c": "objects",
+ "e": "📮",
+ "d": "postbox",
+ "u": "6.0"
+ },
+ "potable_water": {
+ "c": "symbols",
+ "e": "🚰",
+ "d": "potable water symbol",
+ "u": "6.0"
+ },
+ "potato": {
+ "c": "food",
+ "e": "🥔",
+ "d": "potato",
+ "u": "9.0"
+ },
+ "pouch": {
+ "c": "people",
+ "e": "ðŸ‘",
+ "d": "pouch",
+ "u": "6.0"
+ },
+ "poultry_leg": {
+ "c": "food",
+ "e": "ðŸ—",
+ "d": "poultry leg",
+ "u": "6.0"
+ },
+ "pound": {
+ "c": "objects",
+ "e": "💷",
+ "d": "banknote with pound sign",
+ "u": "6.0"
+ },
+ "pouting_cat": {
+ "c": "people",
+ "e": "😾",
+ "d": "pouting cat face",
+ "u": "6.0"
+ },
+ "pray": {
+ "c": "people",
+ "e": "ðŸ™",
+ "d": "person with folded hands",
+ "u": "6.0"
+ },
+ "pray_tone1": {
+ "c": "people",
+ "e": "ðŸ™ðŸ»",
+ "d": "person with folded hands tone 1",
+ "u": "8.0"
+ },
+ "pray_tone2": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¼",
+ "d": "person with folded hands tone 2",
+ "u": "8.0"
+ },
+ "pray_tone3": {
+ "c": "people",
+ "e": "ðŸ™ðŸ½",
+ "d": "person with folded hands tone 3",
+ "u": "8.0"
+ },
+ "pray_tone4": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¾",
+ "d": "person with folded hands tone 4",
+ "u": "8.0"
+ },
+ "pray_tone5": {
+ "c": "people",
+ "e": "ðŸ™ðŸ¿",
+ "d": "person with folded hands tone 5",
+ "u": "8.0"
+ },
+ "prayer_beads": {
+ "c": "objects",
+ "e": "📿",
+ "d": "prayer beads",
+ "u": "8.0"
+ },
+ "pregnant_woman": {
+ "c": "people",
+ "e": "🤰",
+ "d": "pregnant woman",
+ "u": "9.0"
+ },
+ "pregnant_woman_tone1": {
+ "c": "people",
+ "e": "🤰ðŸ»",
+ "d": "pregnant woman tone 1",
+ "u": "9.0"
+ },
+ "pregnant_woman_tone2": {
+ "c": "people",
+ "e": "🤰ðŸ¼",
+ "d": "pregnant woman tone 2",
+ "u": "9.0"
+ },
+ "pregnant_woman_tone3": {
+ "c": "people",
+ "e": "🤰ðŸ½",
+ "d": "pregnant woman tone 3",
+ "u": "9.0"
+ },
+ "pregnant_woman_tone4": {
+ "c": "people",
+ "e": "🤰ðŸ¾",
+ "d": "pregnant woman tone 4",
+ "u": "9.0"
+ },
+ "pregnant_woman_tone5": {
+ "c": "people",
+ "e": "🤰ðŸ¿",
+ "d": "pregnant woman tone 5",
+ "u": "9.0"
+ },
+ "prince": {
+ "c": "people",
+ "e": "🤴",
+ "d": "prince",
+ "u": "9.0"
+ },
+ "prince_tone1": {
+ "c": "people",
+ "e": "🤴ðŸ»",
+ "d": "prince tone 1",
+ "u": "9.0"
+ },
+ "prince_tone2": {
+ "c": "people",
+ "e": "🤴ðŸ¼",
+ "d": "prince tone 2",
+ "u": "9.0"
+ },
+ "prince_tone3": {
+ "c": "people",
+ "e": "🤴ðŸ½",
+ "d": "prince tone 3",
+ "u": "9.0"
+ },
+ "prince_tone4": {
+ "c": "people",
+ "e": "🤴ðŸ¾",
+ "d": "prince tone 4",
+ "u": "9.0"
+ },
+ "prince_tone5": {
+ "c": "people",
+ "e": "🤴ðŸ¿",
+ "d": "prince tone 5",
+ "u": "9.0"
+ },
+ "princess": {
+ "c": "people",
+ "e": "👸",
+ "d": "princess",
+ "u": "6.0"
+ },
+ "princess_tone1": {
+ "c": "people",
+ "e": "👸ðŸ»",
+ "d": "princess tone 1",
+ "u": "8.0"
+ },
+ "princess_tone2": {
+ "c": "people",
+ "e": "👸ðŸ¼",
+ "d": "princess tone 2",
+ "u": "8.0"
+ },
+ "princess_tone3": {
+ "c": "people",
+ "e": "👸ðŸ½",
+ "d": "princess tone 3",
+ "u": "8.0"
+ },
+ "princess_tone4": {
+ "c": "people",
+ "e": "👸ðŸ¾",
+ "d": "princess tone 4",
+ "u": "8.0"
+ },
+ "princess_tone5": {
+ "c": "people",
+ "e": "👸ðŸ¿",
+ "d": "princess tone 5",
+ "u": "8.0"
+ },
+ "printer": {
+ "c": "objects",
+ "e": "🖨",
+ "d": "printer",
+ "u": "7.0"
+ },
+ "projector": {
+ "c": "objects",
+ "e": "📽",
+ "d": "film projector",
+ "u": "7.0"
+ },
+ "punch": {
+ "c": "people",
+ "e": "👊",
+ "d": "fisted hand sign",
+ "u": "6.0"
+ },
+ "punch_tone1": {
+ "c": "people",
+ "e": "👊ðŸ»",
+ "d": "fisted hand sign tone 1",
+ "u": "8.0"
+ },
+ "punch_tone2": {
+ "c": "people",
+ "e": "👊ðŸ¼",
+ "d": "fisted hand sign tone 2",
+ "u": "8.0"
+ },
+ "punch_tone3": {
+ "c": "people",
+ "e": "👊ðŸ½",
+ "d": "fisted hand sign tone 3",
+ "u": "8.0"
+ },
+ "punch_tone4": {
+ "c": "people",
+ "e": "👊ðŸ¾",
+ "d": "fisted hand sign tone 4",
+ "u": "8.0"
+ },
+ "punch_tone5": {
+ "c": "people",
+ "e": "👊ðŸ¿",
+ "d": "fisted hand sign tone 5",
+ "u": "8.0"
+ },
+ "purple_heart": {
+ "c": "symbols",
+ "e": "💜",
+ "d": "purple heart",
+ "u": "6.0"
+ },
+ "purse": {
+ "c": "people",
+ "e": "👛",
+ "d": "purse",
+ "u": "6.0"
+ },
+ "pushpin": {
+ "c": "objects",
+ "e": "📌",
+ "d": "pushpin",
+ "u": "6.0"
+ },
+ "put_litter_in_its_place": {
+ "c": "symbols",
+ "e": "🚮",
+ "d": "put litter in its place symbol",
+ "u": "6.0"
+ },
+ "question": {
+ "c": "symbols",
+ "e": "â“",
+ "d": "black question mark ornament",
+ "u": "6.0"
+ },
+ "rabbit": {
+ "c": "nature",
+ "e": "ðŸ°",
+ "d": "rabbit face",
+ "u": "6.0"
+ },
+ "rabbit2": {
+ "c": "nature",
+ "e": "ðŸ‡",
+ "d": "rabbit",
+ "u": "6.0"
+ },
+ "race_car": {
+ "c": "travel",
+ "e": "ðŸŽ",
+ "d": "racing car",
+ "u": "7.0"
+ },
+ "racehorse": {
+ "c": "nature",
+ "e": "ðŸŽ",
+ "d": "horse",
+ "u": "6.0"
+ },
+ "radio": {
+ "c": "objects",
+ "e": "📻",
+ "d": "radio",
+ "u": "6.0"
+ },
+ "radio_button": {
+ "c": "symbols",
+ "e": "🔘",
+ "d": "radio button",
+ "u": "6.0"
+ },
+ "radioactive": {
+ "c": "symbols",
+ "e": "☢",
+ "d": "radioactive sign",
+ "u": "1.1"
+ },
+ "rage": {
+ "c": "people",
+ "e": "😡",
+ "d": "pouting face",
+ "u": "6.0"
+ },
+ "railway_car": {
+ "c": "travel",
+ "e": "🚃",
+ "d": "railway car",
+ "u": "6.0"
+ },
+ "railway_track": {
+ "c": "travel",
+ "e": "🛤",
+ "d": "railway track",
+ "u": "7.0"
+ },
+ "rainbow": {
+ "c": "travel",
+ "e": "🌈",
+ "d": "rainbow",
+ "u": "6.0"
+ },
+ "raised_back_of_hand": {
+ "c": "people",
+ "e": "🤚",
+ "d": "raised back of hand",
+ "u": "9.0"
+ },
+ "raised_back_of_hand_tone1": {
+ "c": "people",
+ "e": "🤚ðŸ»",
+ "d": "raised back of hand tone 1",
+ "u": "9.0"
+ },
+ "raised_back_of_hand_tone2": {
+ "c": "people",
+ "e": "🤚ðŸ¼",
+ "d": "raised back of hand tone 2",
+ "u": "9.0"
+ },
+ "raised_back_of_hand_tone3": {
+ "c": "people",
+ "e": "🤚ðŸ½",
+ "d": "raised back of hand tone 3",
+ "u": "9.0"
+ },
+ "raised_back_of_hand_tone4": {
+ "c": "people",
+ "e": "🤚ðŸ¾",
+ "d": "raised back of hand tone 4",
+ "u": "9.0"
+ },
+ "raised_back_of_hand_tone5": {
+ "c": "people",
+ "e": "🤚ðŸ¿",
+ "d": "raised back of hand tone 5",
+ "u": "9.0"
+ },
+ "raised_hand": {
+ "c": "people",
+ "e": "✋",
+ "d": "raised hand",
+ "u": "6.0"
+ },
+ "raised_hand_tone1": {
+ "c": "people",
+ "e": "✋ðŸ»",
+ "d": "raised hand tone 1",
+ "u": "8.0"
+ },
+ "raised_hand_tone2": {
+ "c": "people",
+ "e": "✋ðŸ¼",
+ "d": "raised hand tone 2",
+ "u": "8.0"
+ },
+ "raised_hand_tone3": {
+ "c": "people",
+ "e": "✋ðŸ½",
+ "d": "raised hand tone 3",
+ "u": "8.0"
+ },
+ "raised_hand_tone4": {
+ "c": "people",
+ "e": "✋ðŸ¾",
+ "d": "raised hand tone 4",
+ "u": "8.0"
+ },
+ "raised_hand_tone5": {
+ "c": "people",
+ "e": "✋ðŸ¿",
+ "d": "raised hand tone 5",
+ "u": "8.0"
+ },
+ "raised_hands": {
+ "c": "people",
+ "e": "🙌",
+ "d": "person raising both hands in celebration",
+ "u": "6.0"
+ },
+ "raised_hands_tone1": {
+ "c": "people",
+ "e": "🙌ðŸ»",
+ "d": "person raising both hands in celebration tone 1",
+ "u": "8.0"
+ },
+ "raised_hands_tone2": {
+ "c": "people",
+ "e": "🙌ðŸ¼",
+ "d": "person raising both hands in celebration tone 2",
+ "u": "8.0"
+ },
+ "raised_hands_tone3": {
+ "c": "people",
+ "e": "🙌ðŸ½",
+ "d": "person raising both hands in celebration tone 3",
+ "u": "8.0"
+ },
+ "raised_hands_tone4": {
+ "c": "people",
+ "e": "🙌ðŸ¾",
+ "d": "person raising both hands in celebration tone 4",
+ "u": "8.0"
+ },
+ "raised_hands_tone5": {
+ "c": "people",
+ "e": "🙌ðŸ¿",
+ "d": "person raising both hands in celebration tone 5",
+ "u": "8.0"
+ },
+ "raising_hand": {
+ "c": "people",
+ "e": "🙋",
+ "d": "happy person raising one hand",
+ "u": "6.0"
+ },
+ "raising_hand_tone1": {
+ "c": "people",
+ "e": "🙋ðŸ»",
+ "d": "happy person raising one hand tone1",
+ "u": "8.0"
+ },
+ "raising_hand_tone2": {
+ "c": "people",
+ "e": "🙋ðŸ¼",
+ "d": "happy person raising one hand tone2",
+ "u": "8.0"
+ },
+ "raising_hand_tone3": {
+ "c": "people",
+ "e": "🙋ðŸ½",
+ "d": "happy person raising one hand tone3",
+ "u": "8.0"
+ },
+ "raising_hand_tone4": {
+ "c": "people",
+ "e": "🙋ðŸ¾",
+ "d": "happy person raising one hand tone4",
+ "u": "8.0"
+ },
+ "raising_hand_tone5": {
+ "c": "people",
+ "e": "🙋ðŸ¿",
+ "d": "happy person raising one hand tone5",
+ "u": "8.0"
+ },
+ "ram": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "ram",
+ "u": "6.0"
+ },
+ "ramen": {
+ "c": "food",
+ "e": "ðŸœ",
+ "d": "steaming bowl",
+ "u": "6.0"
+ },
+ "rat": {
+ "c": "nature",
+ "e": "ðŸ€",
+ "d": "rat",
+ "u": "6.0"
+ },
+ "record_button": {
+ "c": "symbols",
+ "e": "âº",
+ "d": "black circle for record",
+ "u": "7.0"
+ },
+ "recycle": {
+ "c": "symbols",
+ "e": "â™»",
+ "d": "black universal recycling symbol",
+ "u": "3.2"
+ },
+ "red_car": {
+ "c": "travel",
+ "e": "🚗",
+ "d": "automobile",
+ "u": "6.0"
+ },
+ "red_circle": {
+ "c": "symbols",
+ "e": "🔴",
+ "d": "large red circle",
+ "u": "6.0"
+ },
+ "registered": {
+ "c": "symbols",
+ "e": "®",
+ "d": "registered sign",
+ "u": "1.1"
+ },
+ "relaxed": {
+ "c": "people",
+ "e": "☺",
+ "d": "white smiling face",
+ "u": "1.1"
+ },
+ "relieved": {
+ "c": "people",
+ "e": "😌",
+ "d": "relieved face",
+ "u": "6.0"
+ },
+ "reminder_ribbon": {
+ "c": "activity",
+ "e": "🎗",
+ "d": "reminder ribbon",
+ "u": "7.0"
+ },
+ "repeat": {
+ "c": "symbols",
+ "e": "ðŸ”",
+ "d": "clockwise rightwards and leftwards open circle arr",
+ "u": "6.0"
+ },
+ "repeat_one": {
+ "c": "symbols",
+ "e": "🔂",
+ "d": "clockwise rightwards and leftwards open circle arr",
+ "u": "6.0"
+ },
+ "restroom": {
+ "c": "symbols",
+ "e": "🚻",
+ "d": "restroom",
+ "u": "6.0"
+ },
+ "revolving_hearts": {
+ "c": "symbols",
+ "e": "💞",
+ "d": "revolving hearts",
+ "u": "6.0"
+ },
+ "rewind": {
+ "c": "symbols",
+ "e": "âª",
+ "d": "black left-pointing double triangle",
+ "u": "6.0"
+ },
+ "rhino": {
+ "c": "nature",
+ "e": "ðŸ¦",
+ "d": "rhinoceros",
+ "u": "9.0"
+ },
+ "ribbon": {
+ "c": "objects",
+ "e": "🎀",
+ "d": "ribbon",
+ "u": "6.0"
+ },
+ "rice": {
+ "c": "food",
+ "e": "ðŸš",
+ "d": "cooked rice",
+ "u": "6.0"
+ },
+ "rice_ball": {
+ "c": "food",
+ "e": "ðŸ™",
+ "d": "rice ball",
+ "u": "6.0"
+ },
+ "rice_cracker": {
+ "c": "food",
+ "e": "ðŸ˜",
+ "d": "rice cracker",
+ "u": "6.0"
+ },
+ "rice_scene": {
+ "c": "travel",
+ "e": "🎑",
+ "d": "moon viewing ceremony",
+ "u": "6.0"
+ },
+ "right_facing_fist": {
+ "c": "people",
+ "e": "🤜",
+ "d": "right-facing fist",
+ "u": "9.0"
+ },
+ "right_facing_fist_tone1": {
+ "c": "people",
+ "e": "🤜ðŸ»",
+ "d": "right facing fist tone 1",
+ "u": "9.0"
+ },
+ "right_facing_fist_tone2": {
+ "c": "people",
+ "e": "🤜ðŸ¼",
+ "d": "right facing fist tone 2",
+ "u": "9.0"
+ },
+ "right_facing_fist_tone3": {
+ "c": "people",
+ "e": "🤜ðŸ½",
+ "d": "right facing fist tone 3",
+ "u": "9.0"
+ },
+ "right_facing_fist_tone4": {
+ "c": "people",
+ "e": "🤜ðŸ¾",
+ "d": "right facing fist tone 4",
+ "u": "9.0"
+ },
+ "right_facing_fist_tone5": {
+ "c": "people",
+ "e": "🤜ðŸ¿",
+ "d": "right facing fist tone 5",
+ "u": "9.0"
+ },
+ "ring": {
+ "c": "people",
+ "e": "ðŸ’",
+ "d": "ring",
+ "u": "6.0"
+ },
+ "robot": {
+ "c": "people",
+ "e": "🤖",
+ "d": "robot face",
+ "u": "8.0"
+ },
+ "rocket": {
+ "c": "travel",
+ "e": "🚀",
+ "d": "rocket",
+ "u": "6.0"
+ },
+ "rofl": {
+ "c": "people",
+ "e": "🤣",
+ "d": "rolling on the floor laughing",
+ "u": "9.0"
+ },
+ "roller_coaster": {
+ "c": "travel",
+ "e": "🎢",
+ "d": "roller coaster",
+ "u": "6.0"
+ },
+ "rolling_eyes": {
+ "c": "people",
+ "e": "🙄",
+ "d": "face with rolling eyes",
+ "u": "8.0"
+ },
+ "rooster": {
+ "c": "nature",
+ "e": "ðŸ“",
+ "d": "rooster",
+ "u": "6.0"
+ },
+ "rose": {
+ "c": "nature",
+ "e": "🌹",
+ "d": "rose",
+ "u": "6.0"
+ },
+ "rosette": {
+ "c": "activity",
+ "e": "ðŸµ",
+ "d": "rosette",
+ "u": "7.0"
+ },
+ "rotating_light": {
+ "c": "travel",
+ "e": "🚨",
+ "d": "police cars revolving light",
+ "u": "6.0"
+ },
+ "round_pushpin": {
+ "c": "objects",
+ "e": "ðŸ“",
+ "d": "round pushpin",
+ "u": "6.0"
+ },
+ "rowboat": {
+ "c": "activity",
+ "e": "🚣",
+ "d": "rowboat",
+ "u": "6.0"
+ },
+ "rowboat_tone1": {
+ "c": "activity",
+ "e": "🚣ðŸ»",
+ "d": "rowboat tone 1",
+ "u": "8.0"
+ },
+ "rowboat_tone2": {
+ "c": "activity",
+ "e": "🚣ðŸ¼",
+ "d": "rowboat tone 2",
+ "u": "8.0"
+ },
+ "rowboat_tone3": {
+ "c": "activity",
+ "e": "🚣ðŸ½",
+ "d": "rowboat tone 3",
+ "u": "8.0"
+ },
+ "rowboat_tone4": {
+ "c": "activity",
+ "e": "🚣ðŸ¾",
+ "d": "rowboat tone 4",
+ "u": "8.0"
+ },
+ "rowboat_tone5": {
+ "c": "activity",
+ "e": "🚣ðŸ¿",
+ "d": "rowboat tone 5",
+ "u": "8.0"
+ },
+ "rugby_football": {
+ "c": "activity",
+ "e": "ðŸ‰",
+ "d": "rugby football",
+ "u": "6.0"
+ },
+ "runner": {
+ "c": "people",
+ "e": "ðŸƒ",
+ "d": "runner",
+ "u": "6.0"
+ },
+ "runner_tone1": {
+ "c": "people",
+ "e": "ðŸƒðŸ»",
+ "d": "runner tone 1",
+ "u": "8.0"
+ },
+ "runner_tone2": {
+ "c": "people",
+ "e": "ðŸƒðŸ¼",
+ "d": "runner tone 2",
+ "u": "8.0"
+ },
+ "runner_tone3": {
+ "c": "people",
+ "e": "ðŸƒðŸ½",
+ "d": "runner tone 3",
+ "u": "8.0"
+ },
+ "runner_tone4": {
+ "c": "people",
+ "e": "ðŸƒðŸ¾",
+ "d": "runner tone 4",
+ "u": "8.0"
+ },
+ "runner_tone5": {
+ "c": "people",
+ "e": "ðŸƒðŸ¿",
+ "d": "runner tone 5",
+ "u": "8.0"
+ },
+ "running_shirt_with_sash": {
+ "c": "activity",
+ "e": "🎽",
+ "d": "running shirt with sash",
+ "u": "6.0"
+ },
+ "sa": {
+ "c": "symbols",
+ "e": "🈂",
+ "d": "squared katakana sa",
+ "u": "6.0"
+ },
+ "sagittarius": {
+ "c": "symbols",
+ "e": "â™",
+ "d": "sagittarius",
+ "u": "1.1"
+ },
+ "sailboat": {
+ "c": "travel",
+ "e": "⛵",
+ "d": "sailboat",
+ "u": "5.2"
+ },
+ "sake": {
+ "c": "food",
+ "e": "ðŸ¶",
+ "d": "sake bottle and cup",
+ "u": "6.0"
+ },
+ "salad": {
+ "c": "food",
+ "e": "🥗",
+ "d": "green salad",
+ "u": "9.0"
+ },
+ "sandal": {
+ "c": "people",
+ "e": "👡",
+ "d": "womans sandal",
+ "u": "6.0"
+ },
+ "santa": {
+ "c": "people",
+ "e": "🎅",
+ "d": "father christmas",
+ "u": "6.0"
+ },
+ "santa_tone1": {
+ "c": "people",
+ "e": "🎅ðŸ»",
+ "d": "father christmas tone 1",
+ "u": "8.0"
+ },
+ "santa_tone2": {
+ "c": "people",
+ "e": "🎅ðŸ¼",
+ "d": "father christmas tone 2",
+ "u": "8.0"
+ },
+ "santa_tone3": {
+ "c": "people",
+ "e": "🎅ðŸ½",
+ "d": "father christmas tone 3",
+ "u": "8.0"
+ },
+ "santa_tone4": {
+ "c": "people",
+ "e": "🎅ðŸ¾",
+ "d": "father christmas tone 4",
+ "u": "8.0"
+ },
+ "santa_tone5": {
+ "c": "people",
+ "e": "🎅ðŸ¿",
+ "d": "father christmas tone 5",
+ "u": "8.0"
+ },
+ "satellite": {
+ "c": "objects",
+ "e": "📡",
+ "d": "satellite antenna",
+ "u": "6.0"
+ },
+ "satellite_orbital": {
+ "c": "travel",
+ "e": "🛰",
+ "d": "satellite",
+ "u": "7.0"
+ },
+ "saxophone": {
+ "c": "activity",
+ "e": "🎷",
+ "d": "saxophone",
+ "u": "6.0"
+ },
+ "scales": {
+ "c": "objects",
+ "e": "âš–",
+ "d": "scales",
+ "u": "4.1"
+ },
+ "school": {
+ "c": "travel",
+ "e": "ðŸ«",
+ "d": "school",
+ "u": "6.0"
+ },
+ "school_satchel": {
+ "c": "people",
+ "e": "🎒",
+ "d": "school satchel",
+ "u": "6.0"
+ },
+ "scissors": {
+ "c": "objects",
+ "e": "✂",
+ "d": "black scissors",
+ "u": "1.1"
+ },
+ "scooter": {
+ "c": "travel",
+ "e": "🛴",
+ "d": "scooter",
+ "u": "9.0"
+ },
+ "scorpion": {
+ "c": "nature",
+ "e": "🦂",
+ "d": "scorpion",
+ "u": "8.0"
+ },
+ "scorpius": {
+ "c": "symbols",
+ "e": "â™",
+ "d": "scorpius",
+ "u": "1.1"
+ },
+ "scream": {
+ "c": "people",
+ "e": "😱",
+ "d": "face screaming in fear",
+ "u": "6.0"
+ },
+ "scream_cat": {
+ "c": "people",
+ "e": "🙀",
+ "d": "weary cat face",
+ "u": "6.0"
+ },
+ "scroll": {
+ "c": "objects",
+ "e": "📜",
+ "d": "scroll",
+ "u": "6.0"
+ },
+ "seat": {
+ "c": "travel",
+ "e": "💺",
+ "d": "seat",
+ "u": "6.0"
+ },
+ "second_place": {
+ "c": "activity",
+ "e": "🥈",
+ "d": "second place medal",
+ "u": "9.0"
+ },
+ "secret": {
+ "c": "symbols",
+ "e": "㊙",
+ "d": "circled ideograph secret",
+ "u": "1.1"
+ },
+ "see_no_evil": {
+ "c": "nature",
+ "e": "🙈",
+ "d": "see-no-evil monkey",
+ "u": "6.0"
+ },
+ "seedling": {
+ "c": "nature",
+ "e": "🌱",
+ "d": "seedling",
+ "u": "6.0"
+ },
+ "selfie": {
+ "c": "people",
+ "e": "🤳",
+ "d": "selfie",
+ "u": "9.0"
+ },
+ "selfie_tone1": {
+ "c": "people",
+ "e": "🤳ðŸ»",
+ "d": "selfie tone 1",
+ "u": "9.0"
+ },
+ "selfie_tone2": {
+ "c": "people",
+ "e": "🤳ðŸ¼",
+ "d": "selfie tone 2",
+ "u": "9.0"
+ },
+ "selfie_tone3": {
+ "c": "people",
+ "e": "🤳ðŸ½",
+ "d": "selfie tone 3",
+ "u": "9.0"
+ },
+ "selfie_tone4": {
+ "c": "people",
+ "e": "🤳ðŸ¾",
+ "d": "selfie tone 4",
+ "u": "9.0"
+ },
+ "selfie_tone5": {
+ "c": "people",
+ "e": "🤳ðŸ¿",
+ "d": "selfie tone 5",
+ "u": "9.0"
+ },
+ "seven": {
+ "c": "symbols",
+ "e": "7ï¸âƒ£",
+ "d": "keycap digit seven",
+ "u": "3.0"
+ },
+ "shallow_pan_of_food": {
+ "c": "food",
+ "e": "🥘",
+ "d": "shallow pan of food",
+ "u": "9.0"
+ },
+ "shamrock": {
+ "c": "nature",
+ "e": "☘",
+ "d": "shamrock",
+ "u": "4.1"
+ },
+ "shark": {
+ "c": "nature",
+ "e": "🦈",
+ "d": "shark",
+ "u": "9.0"
+ },
+ "shaved_ice": {
+ "c": "food",
+ "e": "ðŸ§",
+ "d": "shaved ice",
+ "u": "6.0"
+ },
+ "sheep": {
+ "c": "nature",
+ "e": "ðŸ‘",
+ "d": "sheep",
+ "u": "6.0"
+ },
+ "shell": {
+ "c": "nature",
+ "e": "ðŸš",
+ "d": "spiral shell",
+ "u": "6.0"
+ },
+ "shield": {
+ "c": "objects",
+ "e": "🛡",
+ "d": "shield",
+ "u": "7.0"
+ },
+ "shinto_shrine": {
+ "c": "travel",
+ "e": "⛩",
+ "d": "shinto shrine",
+ "u": "5.2"
+ },
+ "ship": {
+ "c": "travel",
+ "e": "🚢",
+ "d": "ship",
+ "u": "6.0"
+ },
+ "shirt": {
+ "c": "people",
+ "e": "👕",
+ "d": "t-shirt",
+ "u": "6.0"
+ },
+ "shopping_bags": {
+ "c": "objects",
+ "e": "ðŸ›",
+ "d": "shopping bags",
+ "u": "7.0"
+ },
+ "shopping_cart": {
+ "c": "objects",
+ "e": "🛒",
+ "d": "shopping trolley",
+ "u": "9.0"
+ },
+ "shower": {
+ "c": "objects",
+ "e": "🚿",
+ "d": "shower",
+ "u": "6.0"
+ },
+ "shrimp": {
+ "c": "nature",
+ "e": "ðŸ¦",
+ "d": "shrimp",
+ "u": "9.0"
+ },
+ "shrug": {
+ "c": "people",
+ "e": "🤷",
+ "d": "shrug",
+ "u": "9.0"
+ },
+ "shrug_tone1": {
+ "c": "people",
+ "e": "🤷ðŸ»",
+ "d": "shrug tone 1",
+ "u": "9.0"
+ },
+ "shrug_tone2": {
+ "c": "people",
+ "e": "🤷ðŸ¼",
+ "d": "shrug tone 2",
+ "u": "9.0"
+ },
+ "shrug_tone3": {
+ "c": "people",
+ "e": "🤷ðŸ½",
+ "d": "shrug tone 3",
+ "u": "9.0"
+ },
+ "shrug_tone4": {
+ "c": "people",
+ "e": "🤷ðŸ¾",
+ "d": "shrug tone 4",
+ "u": "9.0"
+ },
+ "shrug_tone5": {
+ "c": "people",
+ "e": "🤷ðŸ¿",
+ "d": "shrug tone 5",
+ "u": "9.0"
+ },
+ "signal_strength": {
+ "c": "symbols",
+ "e": "📶",
+ "d": "antenna with bars",
+ "u": "6.0"
+ },
+ "six": {
+ "c": "symbols",
+ "e": "6ï¸âƒ£",
+ "d": "keycap digit six",
+ "u": "3.0"
+ },
+ "six_pointed_star": {
+ "c": "symbols",
+ "e": "🔯",
+ "d": "six pointed star with middle dot",
+ "u": "6.0"
+ },
+ "ski": {
+ "c": "activity",
+ "e": "🎿",
+ "d": "ski and ski boot",
+ "u": "6.0"
+ },
+ "skier": {
+ "c": "activity",
+ "e": "â›·",
+ "d": "skier",
+ "u": "5.2"
+ },
+ "skull": {
+ "c": "people",
+ "e": "💀",
+ "d": "skull",
+ "u": "6.0"
+ },
+ "skull_crossbones": {
+ "c": "objects",
+ "e": "☠",
+ "d": "skull and crossbones",
+ "u": "1.1"
+ },
+ "sleeping": {
+ "c": "people",
+ "e": "😴",
+ "d": "sleeping face",
+ "u": "6.1"
+ },
+ "sleeping_accommodation": {
+ "c": "objects",
+ "e": "🛌",
+ "d": "sleeping accommodation",
+ "u": "7.0"
+ },
+ "sleepy": {
+ "c": "people",
+ "e": "😪",
+ "d": "sleepy face",
+ "u": "6.0"
+ },
+ "slight_frown": {
+ "c": "people",
+ "e": "ðŸ™",
+ "d": "slightly frowning face",
+ "u": "7.0"
+ },
+ "slight_smile": {
+ "c": "people",
+ "e": "🙂",
+ "d": "slightly smiling face",
+ "u": "7.0"
+ },
+ "slot_machine": {
+ "c": "activity",
+ "e": "🎰",
+ "d": "slot machine",
+ "u": "6.0"
+ },
+ "small_blue_diamond": {
+ "c": "symbols",
+ "e": "🔹",
+ "d": "small blue diamond",
+ "u": "6.0"
+ },
+ "small_orange_diamond": {
+ "c": "symbols",
+ "e": "🔸",
+ "d": "small orange diamond",
+ "u": "6.0"
+ },
+ "small_red_triangle": {
+ "c": "symbols",
+ "e": "🔺",
+ "d": "up-pointing red triangle",
+ "u": "6.0"
+ },
+ "small_red_triangle_down": {
+ "c": "symbols",
+ "e": "🔻",
+ "d": "down-pointing red triangle",
+ "u": "6.0"
+ },
+ "smile": {
+ "c": "people",
+ "e": "😄",
+ "d": "smiling face with open mouth and smiling eyes",
+ "u": "6.0"
+ },
+ "smile_cat": {
+ "c": "people",
+ "e": "😸",
+ "d": "grinning cat face with smiling eyes",
+ "u": "6.0"
+ },
+ "smiley": {
+ "c": "people",
+ "e": "😃",
+ "d": "smiling face with open mouth",
+ "u": "6.0"
+ },
+ "smiley_cat": {
+ "c": "people",
+ "e": "😺",
+ "d": "smiling cat face with open mouth",
+ "u": "6.0"
+ },
+ "smiling_imp": {
+ "c": "people",
+ "e": "😈",
+ "d": "smiling face with horns",
+ "u": "6.0"
+ },
+ "smirk": {
+ "c": "people",
+ "e": "ðŸ˜",
+ "d": "smirking face",
+ "u": "6.0"
+ },
+ "smirk_cat": {
+ "c": "people",
+ "e": "😼",
+ "d": "cat face with wry smile",
+ "u": "6.0"
+ },
+ "smoking": {
+ "c": "objects",
+ "e": "🚬",
+ "d": "smoking symbol",
+ "u": "6.0"
+ },
+ "snail": {
+ "c": "nature",
+ "e": "ðŸŒ",
+ "d": "snail",
+ "u": "6.0"
+ },
+ "snake": {
+ "c": "nature",
+ "e": "ðŸ",
+ "d": "snake",
+ "u": "6.0"
+ },
+ "sneezing_face": {
+ "c": "people",
+ "e": "🤧",
+ "d": "sneezing face",
+ "u": "9.0"
+ },
+ "snowboarder": {
+ "c": "activity",
+ "e": "ðŸ‚",
+ "d": "snowboarder",
+ "u": "6.0"
+ },
+ "snowflake": {
+ "c": "nature",
+ "e": "â„",
+ "d": "snowflake",
+ "u": "1.1"
+ },
+ "snowman": {
+ "c": "nature",
+ "e": "⛄",
+ "d": "snowman without snow",
+ "u": "5.2"
+ },
+ "snowman2": {
+ "c": "nature",
+ "e": "☃",
+ "d": "snowman",
+ "u": "1.1"
+ },
+ "sob": {
+ "c": "people",
+ "e": "😭",
+ "d": "loudly crying face",
+ "u": "6.0"
+ },
+ "soccer": {
+ "c": "activity",
+ "e": "âš½",
+ "d": "soccer ball",
+ "u": "5.2"
+ },
+ "soon": {
+ "c": "symbols",
+ "e": "🔜",
+ "d": "soon with rightwards arrow above",
+ "u": "6.0"
+ },
+ "sos": {
+ "c": "symbols",
+ "e": "🆘",
+ "d": "squared sos",
+ "u": "6.0"
+ },
+ "sound": {
+ "c": "symbols",
+ "e": "🔉",
+ "d": "speaker with one sound wave",
+ "u": "6.0"
+ },
+ "space_invader": {
+ "c": "activity",
+ "e": "👾",
+ "d": "alien monster",
+ "u": "6.0"
+ },
+ "spades": {
+ "c": "symbols",
+ "e": "â™ ",
+ "d": "black spade suit",
+ "u": "1.1"
+ },
+ "spaghetti": {
+ "c": "food",
+ "e": "ðŸ",
+ "d": "spaghetti",
+ "u": "6.0"
+ },
+ "sparkle": {
+ "c": "symbols",
+ "e": "â‡",
+ "d": "sparkle",
+ "u": "1.1"
+ },
+ "sparkler": {
+ "c": "travel",
+ "e": "🎇",
+ "d": "firework sparkler",
+ "u": "6.0"
+ },
+ "sparkles": {
+ "c": "nature",
+ "e": "✨",
+ "d": "sparkles",
+ "u": "6.0"
+ },
+ "sparkling_heart": {
+ "c": "symbols",
+ "e": "💖",
+ "d": "sparkling heart",
+ "u": "6.0"
+ },
+ "speak_no_evil": {
+ "c": "nature",
+ "e": "🙊",
+ "d": "speak-no-evil monkey",
+ "u": "6.0"
+ },
+ "speaker": {
+ "c": "symbols",
+ "e": "🔈",
+ "d": "speaker",
+ "u": "6.0"
+ },
+ "speaking_head": {
+ "c": "people",
+ "e": "🗣",
+ "d": "speaking head in silhouette",
+ "u": "7.0"
+ },
+ "speech_balloon": {
+ "c": "symbols",
+ "e": "💬",
+ "d": "speech balloon",
+ "u": "6.0"
+ },
+ "speech_left": {
+ "c": "symbols",
+ "e": "🗨",
+ "d": "left speech bubble",
+ "u": "7.0"
+ },
+ "speedboat": {
+ "c": "travel",
+ "e": "🚤",
+ "d": "speedboat",
+ "u": "6.0"
+ },
+ "spider": {
+ "c": "nature",
+ "e": "🕷",
+ "d": "spider",
+ "u": "7.0"
+ },
+ "spider_web": {
+ "c": "nature",
+ "e": "🕸",
+ "d": "spider web",
+ "u": "7.0"
+ },
+ "spoon": {
+ "c": "food",
+ "e": "🥄",
+ "d": "spoon",
+ "u": "9.0"
+ },
+ "spy": {
+ "c": "people",
+ "e": "🕵",
+ "d": "sleuth or spy",
+ "u": "7.0"
+ },
+ "spy_tone1": {
+ "c": "people",
+ "e": "🕵ðŸ»",
+ "d": "sleuth or spy tone 1",
+ "u": "8.0"
+ },
+ "spy_tone2": {
+ "c": "people",
+ "e": "🕵ðŸ¼",
+ "d": "sleuth or spy tone 2",
+ "u": "8.0"
+ },
+ "spy_tone3": {
+ "c": "people",
+ "e": "🕵ðŸ½",
+ "d": "sleuth or spy tone 3",
+ "u": "8.0"
+ },
+ "spy_tone4": {
+ "c": "people",
+ "e": "🕵ðŸ¾",
+ "d": "sleuth or spy tone 4",
+ "u": "8.0"
+ },
+ "spy_tone5": {
+ "c": "people",
+ "e": "🕵ðŸ¿",
+ "d": "sleuth or spy tone 5",
+ "u": "8.0"
+ },
+ "squid": {
+ "c": "nature",
+ "e": "🦑",
+ "d": "squid",
+ "u": "9.0"
+ },
+ "stadium": {
+ "c": "travel",
+ "e": "ðŸŸ",
+ "d": "stadium",
+ "u": "7.0"
+ },
+ "star": {
+ "c": "nature",
+ "e": "â­",
+ "d": "white medium star",
+ "u": "5.1"
+ },
+ "star2": {
+ "c": "nature",
+ "e": "🌟",
+ "d": "glowing star",
+ "u": "6.0"
+ },
+ "star_and_crescent": {
+ "c": "symbols",
+ "e": "☪",
+ "d": "star and crescent",
+ "u": "1.1"
+ },
+ "star_of_david": {
+ "c": "symbols",
+ "e": "✡",
+ "d": "star of david",
+ "u": "1.1"
+ },
+ "stars": {
+ "c": "travel",
+ "e": "🌠",
+ "d": "shooting star",
+ "u": "6.0"
+ },
+ "station": {
+ "c": "travel",
+ "e": "🚉",
+ "d": "station",
+ "u": "6.0"
+ },
+ "statue_of_liberty": {
+ "c": "travel",
+ "e": "🗽",
+ "d": "statue of liberty",
+ "u": "6.0"
+ },
+ "steam_locomotive": {
+ "c": "travel",
+ "e": "🚂",
+ "d": "steam locomotive",
+ "u": "6.0"
+ },
+ "stew": {
+ "c": "food",
+ "e": "ðŸ²",
+ "d": "pot of food",
+ "u": "6.0"
+ },
+ "stop_button": {
+ "c": "symbols",
+ "e": "â¹",
+ "d": "black square for stop",
+ "u": "7.0"
+ },
+ "stopwatch": {
+ "c": "objects",
+ "e": "â±",
+ "d": "stopwatch",
+ "u": "6.0"
+ },
+ "straight_ruler": {
+ "c": "objects",
+ "e": "ðŸ“",
+ "d": "straight ruler",
+ "u": "6.0"
+ },
+ "strawberry": {
+ "c": "food",
+ "e": "ðŸ“",
+ "d": "strawberry",
+ "u": "6.0"
+ },
+ "stuck_out_tongue": {
+ "c": "people",
+ "e": "😛",
+ "d": "face with stuck-out tongue",
+ "u": "6.1"
+ },
+ "stuck_out_tongue_closed_eyes": {
+ "c": "people",
+ "e": "ðŸ˜",
+ "d": "face with stuck-out tongue and tightly-closed eyes",
+ "u": "6.0"
+ },
+ "stuck_out_tongue_winking_eye": {
+ "c": "people",
+ "e": "😜",
+ "d": "face with stuck-out tongue and winking eye",
+ "u": "6.0"
+ },
+ "stuffed_flatbread": {
+ "c": "food",
+ "e": "🥙",
+ "d": "stuffed flatbread",
+ "u": "9.0"
+ },
+ "sun_with_face": {
+ "c": "nature",
+ "e": "🌞",
+ "d": "sun with face",
+ "u": "6.0"
+ },
+ "sunflower": {
+ "c": "nature",
+ "e": "🌻",
+ "d": "sunflower",
+ "u": "6.0"
+ },
+ "sunglasses": {
+ "c": "people",
+ "e": "😎",
+ "d": "smiling face with sunglasses",
+ "u": "6.0"
+ },
+ "sunny": {
+ "c": "nature",
+ "e": "☀",
+ "d": "black sun with rays",
+ "u": "1.1"
+ },
+ "sunrise": {
+ "c": "travel",
+ "e": "🌅",
+ "d": "sunrise",
+ "u": "6.0"
+ },
+ "sunrise_over_mountains": {
+ "c": "travel",
+ "e": "🌄",
+ "d": "sunrise over mountains",
+ "u": "6.0"
+ },
+ "surfer": {
+ "c": "activity",
+ "e": "ðŸ„",
+ "d": "surfer",
+ "u": "6.0"
+ },
+ "surfer_tone1": {
+ "c": "activity",
+ "e": "ðŸ„ðŸ»",
+ "d": "surfer tone 1",
+ "u": "8.0"
+ },
+ "surfer_tone2": {
+ "c": "activity",
+ "e": "ðŸ„ðŸ¼",
+ "d": "surfer tone 2",
+ "u": "8.0"
+ },
+ "surfer_tone3": {
+ "c": "activity",
+ "e": "ðŸ„ðŸ½",
+ "d": "surfer tone 3",
+ "u": "8.0"
+ },
+ "surfer_tone4": {
+ "c": "activity",
+ "e": "ðŸ„ðŸ¾",
+ "d": "surfer tone 4",
+ "u": "8.0"
+ },
+ "surfer_tone5": {
+ "c": "activity",
+ "e": "ðŸ„ðŸ¿",
+ "d": "surfer tone 5",
+ "u": "8.0"
+ },
+ "sushi": {
+ "c": "food",
+ "e": "ðŸ£",
+ "d": "sushi",
+ "u": "6.0"
+ },
+ "suspension_railway": {
+ "c": "travel",
+ "e": "🚟",
+ "d": "suspension railway",
+ "u": "6.0"
+ },
+ "sweat": {
+ "c": "people",
+ "e": "😓",
+ "d": "face with cold sweat",
+ "u": "6.0"
+ },
+ "sweat_drops": {
+ "c": "nature",
+ "e": "💦",
+ "d": "splashing sweat symbol",
+ "u": "6.0"
+ },
+ "sweat_smile": {
+ "c": "people",
+ "e": "😅",
+ "d": "smiling face with open mouth and cold sweat",
+ "u": "6.0"
+ },
+ "sweet_potato": {
+ "c": "food",
+ "e": "ðŸ ",
+ "d": "roasted sweet potato",
+ "u": "6.0"
+ },
+ "swimmer": {
+ "c": "activity",
+ "e": "ðŸŠ",
+ "d": "swimmer",
+ "u": "6.0"
+ },
+ "swimmer_tone1": {
+ "c": "activity",
+ "e": "ðŸŠðŸ»",
+ "d": "swimmer tone 1",
+ "u": "8.0"
+ },
+ "swimmer_tone2": {
+ "c": "activity",
+ "e": "ðŸŠðŸ¼",
+ "d": "swimmer tone 2",
+ "u": "8.0"
+ },
+ "swimmer_tone3": {
+ "c": "activity",
+ "e": "ðŸŠðŸ½",
+ "d": "swimmer tone 3",
+ "u": "8.0"
+ },
+ "swimmer_tone4": {
+ "c": "activity",
+ "e": "ðŸŠðŸ¾",
+ "d": "swimmer tone 4",
+ "u": "8.0"
+ },
+ "swimmer_tone5": {
+ "c": "activity",
+ "e": "ðŸŠðŸ¿",
+ "d": "swimmer tone 5",
+ "u": "8.0"
+ },
+ "symbols": {
+ "c": "symbols",
+ "e": "🔣",
+ "d": "input symbol for symbols",
+ "u": "6.0"
+ },
+ "synagogue": {
+ "c": "travel",
+ "e": "ðŸ•",
+ "d": "synagogue",
+ "u": "8.0"
+ },
+ "syringe": {
+ "c": "objects",
+ "e": "💉",
+ "d": "syringe",
+ "u": "6.0"
+ },
+ "taco": {
+ "c": "food",
+ "e": "🌮",
+ "d": "taco",
+ "u": "8.0"
+ },
+ "tada": {
+ "c": "objects",
+ "e": "🎉",
+ "d": "party popper",
+ "u": "6.0"
+ },
+ "tanabata_tree": {
+ "c": "nature",
+ "e": "🎋",
+ "d": "tanabata tree",
+ "u": "6.0"
+ },
+ "tangerine": {
+ "c": "food",
+ "e": "ðŸŠ",
+ "d": "tangerine",
+ "u": "6.0"
+ },
+ "taurus": {
+ "c": "symbols",
+ "e": "♉",
+ "d": "taurus",
+ "u": "1.1"
+ },
+ "taxi": {
+ "c": "travel",
+ "e": "🚕",
+ "d": "taxi",
+ "u": "6.0"
+ },
+ "tea": {
+ "c": "food",
+ "e": "ðŸµ",
+ "d": "teacup without handle",
+ "u": "6.0"
+ },
+ "telephone": {
+ "c": "objects",
+ "e": "☎",
+ "d": "black telephone",
+ "u": "1.1"
+ },
+ "telephone_receiver": {
+ "c": "objects",
+ "e": "📞",
+ "d": "telephone receiver",
+ "u": "6.0"
+ },
+ "telescope": {
+ "c": "objects",
+ "e": "🔭",
+ "d": "telescope",
+ "u": "6.0"
+ },
+ "ten": {
+ "c": "symbols",
+ "e": "🔟",
+ "d": "keycap ten",
+ "u": "6.0"
+ },
+ "tennis": {
+ "c": "activity",
+ "e": "🎾",
+ "d": "tennis racquet and ball",
+ "u": "6.0"
+ },
+ "tent": {
+ "c": "travel",
+ "e": "⛺",
+ "d": "tent",
+ "u": "5.2"
+ },
+ "thermometer": {
+ "c": "objects",
+ "e": "🌡",
+ "d": "thermometer",
+ "u": "7.0"
+ },
+ "thermometer_face": {
+ "c": "people",
+ "e": "🤒",
+ "d": "face with thermometer",
+ "u": "8.0"
+ },
+ "thinking": {
+ "c": "people",
+ "e": "🤔",
+ "d": "thinking face",
+ "u": "8.0"
+ },
+ "third_place": {
+ "c": "activity",
+ "e": "🥉",
+ "d": "third place medal",
+ "u": "9.0"
+ },
+ "thought_balloon": {
+ "c": "symbols",
+ "e": "💭",
+ "d": "thought balloon",
+ "u": "6.0"
+ },
+ "three": {
+ "c": "symbols",
+ "e": "3ï¸âƒ£",
+ "d": "keycap digit three",
+ "u": "3.0"
+ },
+ "thumbsdown": {
+ "c": "people",
+ "e": "👎",
+ "d": "thumbs down sign",
+ "u": "6.0"
+ },
+ "thumbsdown_tone1": {
+ "c": "people",
+ "e": "👎ðŸ»",
+ "d": "thumbs down sign tone 1",
+ "u": "8.0"
+ },
+ "thumbsdown_tone2": {
+ "c": "people",
+ "e": "👎ðŸ¼",
+ "d": "thumbs down sign tone 2",
+ "u": "8.0"
+ },
+ "thumbsdown_tone3": {
+ "c": "people",
+ "e": "👎ðŸ½",
+ "d": "thumbs down sign tone 3",
+ "u": "8.0"
+ },
+ "thumbsdown_tone4": {
+ "c": "people",
+ "e": "👎ðŸ¾",
+ "d": "thumbs down sign tone 4",
+ "u": "8.0"
+ },
+ "thumbsdown_tone5": {
+ "c": "people",
+ "e": "👎ðŸ¿",
+ "d": "thumbs down sign tone 5",
+ "u": "8.0"
+ },
+ "thumbsup": {
+ "c": "people",
+ "e": "ðŸ‘",
+ "d": "thumbs up sign",
+ "u": "6.0"
+ },
+ "thumbsup_tone1": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ»",
+ "d": "thumbs up sign tone 1",
+ "u": "8.0"
+ },
+ "thumbsup_tone2": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¼",
+ "d": "thumbs up sign tone 2",
+ "u": "8.0"
+ },
+ "thumbsup_tone3": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ½",
+ "d": "thumbs up sign tone 3",
+ "u": "8.0"
+ },
+ "thumbsup_tone4": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¾",
+ "d": "thumbs up sign tone 4",
+ "u": "8.0"
+ },
+ "thumbsup_tone5": {
+ "c": "people",
+ "e": "ðŸ‘ðŸ¿",
+ "d": "thumbs up sign tone 5",
+ "u": "8.0"
+ },
+ "thunder_cloud_rain": {
+ "c": "nature",
+ "e": "⛈",
+ "d": "thunder cloud and rain",
+ "u": "5.2"
+ },
+ "ticket": {
+ "c": "activity",
+ "e": "🎫",
+ "d": "ticket",
+ "u": "6.0"
+ },
+ "tickets": {
+ "c": "activity",
+ "e": "🎟",
+ "d": "admission tickets",
+ "u": "7.0"
+ },
+ "tiger": {
+ "c": "nature",
+ "e": "ðŸ¯",
+ "d": "tiger face",
+ "u": "6.0"
+ },
+ "tiger2": {
+ "c": "nature",
+ "e": "ðŸ…",
+ "d": "tiger",
+ "u": "6.0"
+ },
+ "timer": {
+ "c": "objects",
+ "e": "â²",
+ "d": "timer clock",
+ "u": "6.0"
+ },
+ "tired_face": {
+ "c": "people",
+ "e": "😫",
+ "d": "tired face",
+ "u": "6.0"
+ },
+ "tm": {
+ "c": "symbols",
+ "e": "â„¢",
+ "d": "trade mark sign",
+ "u": "1.1"
+ },
+ "toilet": {
+ "c": "objects",
+ "e": "🚽",
+ "d": "toilet",
+ "u": "6.0"
+ },
+ "tokyo_tower": {
+ "c": "travel",
+ "e": "🗼",
+ "d": "tokyo tower",
+ "u": "6.0"
+ },
+ "tomato": {
+ "c": "food",
+ "e": "ðŸ…",
+ "d": "tomato",
+ "u": "6.0"
+ },
+ "tone1": {
+ "c": "modifier",
+ "e": "ðŸ»",
+ "d": "emoji modifier Fitzpatrick type-1-2",
+ "u": "8.0"
+ },
+ "tone2": {
+ "c": "modifier",
+ "e": "ðŸ¼",
+ "d": "emoji modifier Fitzpatrick type-3",
+ "u": "8.0"
+ },
+ "tone3": {
+ "c": "modifier",
+ "e": "ðŸ½",
+ "d": "emoji modifier Fitzpatrick type-4",
+ "u": "8.0"
+ },
+ "tone4": {
+ "c": "modifier",
+ "e": "ðŸ¾",
+ "d": "emoji modifier Fitzpatrick type-5",
+ "u": "8.0"
+ },
+ "tone5": {
+ "c": "modifier",
+ "e": "ðŸ¿",
+ "d": "emoji modifier Fitzpatrick type-6",
+ "u": "8.0"
+ },
+ "tongue": {
+ "c": "people",
+ "e": "👅",
+ "d": "tongue",
+ "u": "6.0"
+ },
+ "tools": {
+ "c": "objects",
+ "e": "🛠",
+ "d": "hammer and wrench",
+ "u": "7.0"
+ },
+ "top": {
+ "c": "symbols",
+ "e": "ðŸ”",
+ "d": "top with upwards arrow above",
+ "u": "6.0"
+ },
+ "tophat": {
+ "c": "people",
+ "e": "🎩",
+ "d": "top hat",
+ "u": "6.0"
+ },
+ "track_next": {
+ "c": "symbols",
+ "e": "â­",
+ "d": "black right-pointing double triangle with vertical bar",
+ "u": "6.0"
+ },
+ "track_previous": {
+ "c": "symbols",
+ "e": "â®",
+ "d": "black left-pointing double triangle with vertical bar",
+ "u": "6.0"
+ },
+ "trackball": {
+ "c": "objects",
+ "e": "🖲",
+ "d": "trackball",
+ "u": "7.0"
+ },
+ "tractor": {
+ "c": "travel",
+ "e": "🚜",
+ "d": "tractor",
+ "u": "6.0"
+ },
+ "traffic_light": {
+ "c": "travel",
+ "e": "🚥",
+ "d": "horizontal traffic light",
+ "u": "6.0"
+ },
+ "train": {
+ "c": "travel",
+ "e": "🚋",
+ "d": "Tram Car",
+ "u": "6.0"
+ },
+ "train2": {
+ "c": "travel",
+ "e": "🚆",
+ "d": "train",
+ "u": "6.0"
+ },
+ "tram": {
+ "c": "travel",
+ "e": "🚊",
+ "d": "tram",
+ "u": "6.0"
+ },
+ "triangular_flag_on_post": {
+ "c": "objects",
+ "e": "🚩",
+ "d": "triangular flag on post",
+ "u": "6.0"
+ },
+ "triangular_ruler": {
+ "c": "objects",
+ "e": "ðŸ“",
+ "d": "triangular ruler",
+ "u": "6.0"
+ },
+ "trident": {
+ "c": "symbols",
+ "e": "🔱",
+ "d": "trident emblem",
+ "u": "6.0"
+ },
+ "triumph": {
+ "c": "people",
+ "e": "😤",
+ "d": "face with look of triumph",
+ "u": "6.0"
+ },
+ "trolleybus": {
+ "c": "travel",
+ "e": "🚎",
+ "d": "trolleybus",
+ "u": "6.0"
+ },
+ "trophy": {
+ "c": "activity",
+ "e": "ðŸ†",
+ "d": "trophy",
+ "u": "6.0"
+ },
+ "tropical_drink": {
+ "c": "food",
+ "e": "ðŸ¹",
+ "d": "tropical drink",
+ "u": "6.0"
+ },
+ "tropical_fish": {
+ "c": "nature",
+ "e": "ðŸ ",
+ "d": "tropical fish",
+ "u": "6.0"
+ },
+ "truck": {
+ "c": "travel",
+ "e": "🚚",
+ "d": "delivery truck",
+ "u": "6.0"
+ },
+ "trumpet": {
+ "c": "activity",
+ "e": "🎺",
+ "d": "trumpet",
+ "u": "6.0"
+ },
+ "tulip": {
+ "c": "nature",
+ "e": "🌷",
+ "d": "tulip",
+ "u": "6.0"
+ },
+ "tumbler_glass": {
+ "c": "food",
+ "e": "🥃",
+ "d": "tumbler glass",
+ "u": "9.0"
+ },
+ "turkey": {
+ "c": "nature",
+ "e": "🦃",
+ "d": "turkey",
+ "u": "8.0"
+ },
+ "turtle": {
+ "c": "nature",
+ "e": "ðŸ¢",
+ "d": "turtle",
+ "u": "6.0"
+ },
+ "tv": {
+ "c": "objects",
+ "e": "📺",
+ "d": "television",
+ "u": "6.0"
+ },
+ "twisted_rightwards_arrows": {
+ "c": "symbols",
+ "e": "🔀",
+ "d": "twisted rightwards arrows",
+ "u": "6.0"
+ },
+ "two": {
+ "c": "symbols",
+ "e": "2ï¸âƒ£",
+ "d": "keycap digit two",
+ "u": "3.0"
+ },
+ "two_hearts": {
+ "c": "symbols",
+ "e": "💕",
+ "d": "two hearts",
+ "u": "6.0"
+ },
+ "two_men_holding_hands": {
+ "c": "people",
+ "e": "👬",
+ "d": "two men holding hands",
+ "u": "6.0"
+ },
+ "two_women_holding_hands": {
+ "c": "people",
+ "e": "👭",
+ "d": "two women holding hands",
+ "u": "6.0"
+ },
+ "u5272": {
+ "c": "symbols",
+ "e": "🈹",
+ "d": "squared cjk unified ideograph-5272",
+ "u": "6.0"
+ },
+ "u5408": {
+ "c": "symbols",
+ "e": "🈴",
+ "d": "squared cjk unified ideograph-5408",
+ "u": "6.0"
+ },
+ "u55b6": {
+ "c": "symbols",
+ "e": "🈺",
+ "d": "squared cjk unified ideograph-55b6",
+ "u": "6.0"
+ },
+ "u6307": {
+ "c": "symbols",
+ "e": "🈯",
+ "d": "squared cjk unified ideograph-6307",
+ "u": "5.2"
+ },
+ "u6708": {
+ "c": "symbols",
+ "e": "🈷",
+ "d": "squared cjk unified ideograph-6708",
+ "u": "6.0"
+ },
+ "u6709": {
+ "c": "symbols",
+ "e": "🈶",
+ "d": "squared cjk unified ideograph-6709",
+ "u": "6.0"
+ },
+ "u6e80": {
+ "c": "symbols",
+ "e": "🈵",
+ "d": "squared cjk unified ideograph-6e80",
+ "u": "6.0"
+ },
+ "u7121": {
+ "c": "symbols",
+ "e": "🈚",
+ "d": "squared cjk unified ideograph-7121",
+ "u": "5.2"
+ },
+ "u7533": {
+ "c": "symbols",
+ "e": "🈸",
+ "d": "squared cjk unified ideograph-7533",
+ "u": "6.0"
+ },
+ "u7981": {
+ "c": "symbols",
+ "e": "🈲",
+ "d": "squared cjk unified ideograph-7981",
+ "u": "6.0"
+ },
+ "u7a7a": {
+ "c": "symbols",
+ "e": "🈳",
+ "d": "squared cjk unified ideograph-7a7a",
+ "u": "6.0"
+ },
+ "umbrella": {
+ "c": "nature",
+ "e": "☔",
+ "d": "umbrella with rain drops",
+ "u": "4.0"
+ },
+ "umbrella2": {
+ "c": "nature",
+ "e": "☂",
+ "d": "umbrella",
+ "u": "1.1"
+ },
+ "unamused": {
+ "c": "people",
+ "e": "😒",
+ "d": "unamused face",
+ "u": "6.0"
+ },
+ "underage": {
+ "c": "symbols",
+ "e": "🔞",
+ "d": "no one under eighteen symbol",
+ "u": "6.0"
+ },
+ "unicorn": {
+ "c": "nature",
+ "e": "🦄",
+ "d": "unicorn face",
+ "u": "8.0"
+ },
+ "unlock": {
+ "c": "objects",
+ "e": "🔓",
+ "d": "open lock",
+ "u": "6.0"
+ },
+ "up": {
+ "c": "symbols",
+ "e": "🆙",
+ "d": "squared up with exclamation mark",
+ "u": "6.0"
+ },
+ "upside_down": {
+ "c": "people",
+ "e": "🙃",
+ "d": "upside-down face",
+ "u": "8.0"
+ },
+ "urn": {
+ "c": "objects",
+ "e": "âš±",
+ "d": "funeral urn",
+ "u": "4.1"
+ },
+ "v": {
+ "c": "people",
+ "e": "✌",
+ "d": "victory hand",
+ "u": "1.1"
+ },
+ "v_tone1": {
+ "c": "people",
+ "e": "✌ðŸ»",
+ "d": "victory hand tone 1",
+ "u": "8.0"
+ },
+ "v_tone2": {
+ "c": "people",
+ "e": "✌ðŸ¼",
+ "d": "victory hand tone 2",
+ "u": "8.0"
+ },
+ "v_tone3": {
+ "c": "people",
+ "e": "✌ðŸ½",
+ "d": "victory hand tone 3",
+ "u": "8.0"
+ },
+ "v_tone4": {
+ "c": "people",
+ "e": "✌ðŸ¾",
+ "d": "victory hand tone 4",
+ "u": "8.0"
+ },
+ "v_tone5": {
+ "c": "people",
+ "e": "✌ðŸ¿",
+ "d": "victory hand tone 5",
+ "u": "8.0"
+ },
+ "vertical_traffic_light": {
+ "c": "travel",
+ "e": "🚦",
+ "d": "vertical traffic light",
+ "u": "6.0"
+ },
+ "vhs": {
+ "c": "objects",
+ "e": "📼",
+ "d": "videocassette",
+ "u": "6.0"
+ },
+ "vibration_mode": {
+ "c": "symbols",
+ "e": "📳",
+ "d": "vibration mode",
+ "u": "6.0"
+ },
+ "video_camera": {
+ "c": "objects",
+ "e": "📹",
+ "d": "video camera",
+ "u": "6.0"
+ },
+ "video_game": {
+ "c": "activity",
+ "e": "🎮",
+ "d": "video game",
+ "u": "6.0"
+ },
+ "violin": {
+ "c": "activity",
+ "e": "🎻",
+ "d": "violin",
+ "u": "6.0"
+ },
+ "virgo": {
+ "c": "symbols",
+ "e": "â™",
+ "d": "virgo",
+ "u": "1.1"
+ },
+ "volcano": {
+ "c": "travel",
+ "e": "🌋",
+ "d": "volcano",
+ "u": "6.0"
+ },
+ "volleyball": {
+ "c": "activity",
+ "e": "ðŸ",
+ "d": "volleyball",
+ "u": "8.0"
+ },
+ "vs": {
+ "c": "symbols",
+ "e": "🆚",
+ "d": "squared vs",
+ "u": "6.0"
+ },
+ "vulcan": {
+ "c": "people",
+ "e": "🖖",
+ "d": "raised hand with part between middle and ring fingers",
+ "u": "7.0"
+ },
+ "vulcan_tone1": {
+ "c": "people",
+ "e": "🖖ðŸ»",
+ "d": "raised hand with part between middle and ring fingers tone 1",
+ "u": "8.0"
+ },
+ "vulcan_tone2": {
+ "c": "people",
+ "e": "🖖ðŸ¼",
+ "d": "raised hand with part between middle and ring fingers tone 2",
+ "u": "8.0"
+ },
+ "vulcan_tone3": {
+ "c": "people",
+ "e": "🖖ðŸ½",
+ "d": "raised hand with part between middle and ring fingers tone 3",
+ "u": "8.0"
+ },
+ "vulcan_tone4": {
+ "c": "people",
+ "e": "🖖ðŸ¾",
+ "d": "raised hand with part between middle and ring fingers tone 4",
+ "u": "8.0"
+ },
+ "vulcan_tone5": {
+ "c": "people",
+ "e": "🖖ðŸ¿",
+ "d": "raised hand with part between middle and ring fingers tone 5",
+ "u": "8.0"
+ },
+ "walking": {
+ "c": "people",
+ "e": "🚶",
+ "d": "pedestrian",
+ "u": "6.0"
+ },
+ "walking_tone1": {
+ "c": "people",
+ "e": "🚶ðŸ»",
+ "d": "pedestrian tone 1",
+ "u": "8.0"
+ },
+ "walking_tone2": {
+ "c": "people",
+ "e": "🚶ðŸ¼",
+ "d": "pedestrian tone 2",
+ "u": "8.0"
+ },
+ "walking_tone3": {
+ "c": "people",
+ "e": "🚶ðŸ½",
+ "d": "pedestrian tone 3",
+ "u": "8.0"
+ },
+ "walking_tone4": {
+ "c": "people",
+ "e": "🚶ðŸ¾",
+ "d": "pedestrian tone 4",
+ "u": "8.0"
+ },
+ "walking_tone5": {
+ "c": "people",
+ "e": "🚶ðŸ¿",
+ "d": "pedestrian tone 5",
+ "u": "8.0"
+ },
+ "waning_crescent_moon": {
+ "c": "nature",
+ "e": "🌘",
+ "d": "waning crescent moon symbol",
+ "u": "6.0"
+ },
+ "waning_gibbous_moon": {
+ "c": "nature",
+ "e": "🌖",
+ "d": "waning gibbous moon symbol",
+ "u": "6.0"
+ },
+ "warning": {
+ "c": "symbols",
+ "e": "âš ",
+ "d": "warning sign",
+ "u": "4.0"
+ },
+ "wastebasket": {
+ "c": "objects",
+ "e": "🗑",
+ "d": "wastebasket",
+ "u": "7.0"
+ },
+ "watch": {
+ "c": "objects",
+ "e": "⌚",
+ "d": "watch",
+ "u": "1.1"
+ },
+ "water_buffalo": {
+ "c": "nature",
+ "e": "ðŸƒ",
+ "d": "water buffalo",
+ "u": "6.0"
+ },
+ "water_polo": {
+ "c": "activity",
+ "e": "🤽",
+ "d": "water polo",
+ "u": "9.0"
+ },
+ "water_polo_tone1": {
+ "c": "activity",
+ "e": "🤽ðŸ»",
+ "d": "water polo tone 1",
+ "u": "9.0"
+ },
+ "water_polo_tone2": {
+ "c": "activity",
+ "e": "🤽ðŸ¼",
+ "d": "water polo tone 2",
+ "u": "9.0"
+ },
+ "water_polo_tone3": {
+ "c": "activity",
+ "e": "🤽ðŸ½",
+ "d": "water polo tone 3",
+ "u": "9.0"
+ },
+ "water_polo_tone4": {
+ "c": "activity",
+ "e": "🤽ðŸ¾",
+ "d": "water polo tone 4",
+ "u": "9.0"
+ },
+ "water_polo_tone5": {
+ "c": "activity",
+ "e": "🤽ðŸ¿",
+ "d": "water polo tone 5",
+ "u": "9.0"
+ },
+ "watermelon": {
+ "c": "food",
+ "e": "ðŸ‰",
+ "d": "watermelon",
+ "u": "6.0"
+ },
+ "wave": {
+ "c": "people",
+ "e": "👋",
+ "d": "waving hand sign",
+ "u": "6.0"
+ },
+ "wave_tone1": {
+ "c": "people",
+ "e": "👋ðŸ»",
+ "d": "waving hand sign tone 1",
+ "u": "8.0"
+ },
+ "wave_tone2": {
+ "c": "people",
+ "e": "👋ðŸ¼",
+ "d": "waving hand sign tone 2",
+ "u": "8.0"
+ },
+ "wave_tone3": {
+ "c": "people",
+ "e": "👋ðŸ½",
+ "d": "waving hand sign tone 3",
+ "u": "8.0"
+ },
+ "wave_tone4": {
+ "c": "people",
+ "e": "👋ðŸ¾",
+ "d": "waving hand sign tone 4",
+ "u": "8.0"
+ },
+ "wave_tone5": {
+ "c": "people",
+ "e": "👋ðŸ¿",
+ "d": "waving hand sign tone 5",
+ "u": "8.0"
+ },
+ "wavy_dash": {
+ "c": "symbols",
+ "e": "〰",
+ "d": "wavy dash",
+ "u": "1.1"
+ },
+ "waxing_crescent_moon": {
+ "c": "nature",
+ "e": "🌒",
+ "d": "waxing crescent moon symbol",
+ "u": "6.0"
+ },
+ "waxing_gibbous_moon": {
+ "c": "nature",
+ "e": "🌔",
+ "d": "waxing gibbous moon symbol",
+ "u": "6.0"
+ },
+ "wc": {
+ "c": "symbols",
+ "e": "🚾",
+ "d": "water closet",
+ "u": "6.0"
+ },
+ "weary": {
+ "c": "people",
+ "e": "😩",
+ "d": "weary face",
+ "u": "6.0"
+ },
+ "wedding": {
+ "c": "travel",
+ "e": "💒",
+ "d": "wedding",
+ "u": "6.0"
+ },
+ "whale": {
+ "c": "nature",
+ "e": "ðŸ³",
+ "d": "spouting whale",
+ "u": "6.0"
+ },
+ "whale2": {
+ "c": "nature",
+ "e": "ðŸ‹",
+ "d": "whale",
+ "u": "6.0"
+ },
+ "wheel_of_dharma": {
+ "c": "symbols",
+ "e": "☸",
+ "d": "wheel of dharma",
+ "u": "1.1"
+ },
+ "wheelchair": {
+ "c": "symbols",
+ "e": "♿",
+ "d": "wheelchair symbol",
+ "u": "4.1"
+ },
+ "white_check_mark": {
+ "c": "symbols",
+ "e": "✅",
+ "d": "white heavy check mark",
+ "u": "6.0"
+ },
+ "white_circle": {
+ "c": "symbols",
+ "e": "⚪",
+ "d": "medium white circle",
+ "u": "4.1"
+ },
+ "white_flower": {
+ "c": "symbols",
+ "e": "💮",
+ "d": "white flower",
+ "u": "6.0"
+ },
+ "white_large_square": {
+ "c": "symbols",
+ "e": "⬜",
+ "d": "white large square",
+ "u": "5.1"
+ },
+ "white_medium_small_square": {
+ "c": "symbols",
+ "e": "â—½",
+ "d": "white medium small square",
+ "u": "3.2"
+ },
+ "white_medium_square": {
+ "c": "symbols",
+ "e": "â—»",
+ "d": "white medium square",
+ "u": "3.2"
+ },
+ "white_small_square": {
+ "c": "symbols",
+ "e": "â–«",
+ "d": "white small square",
+ "u": "1.1"
+ },
+ "white_square_button": {
+ "c": "symbols",
+ "e": "🔳",
+ "d": "white square button",
+ "u": "6.0"
+ },
+ "white_sun_cloud": {
+ "c": "nature",
+ "e": "🌥",
+ "d": "white sun behind cloud",
+ "u": "7.0"
+ },
+ "white_sun_rain_cloud": {
+ "c": "nature",
+ "e": "🌦",
+ "d": "white sun behind cloud with rain",
+ "u": "7.0"
+ },
+ "white_sun_small_cloud": {
+ "c": "nature",
+ "e": "🌤",
+ "d": "white sun with small cloud",
+ "u": "7.0"
+ },
+ "wilted_rose": {
+ "c": "nature",
+ "e": "🥀",
+ "d": "wilted flower",
+ "u": "9.0"
+ },
+ "wind_blowing_face": {
+ "c": "nature",
+ "e": "🌬",
+ "d": "wind blowing face",
+ "u": "7.0"
+ },
+ "wind_chime": {
+ "c": "objects",
+ "e": "ðŸŽ",
+ "d": "wind chime",
+ "u": "6.0"
+ },
+ "wine_glass": {
+ "c": "food",
+ "e": "ðŸ·",
+ "d": "wine glass",
+ "u": "6.0"
+ },
+ "wink": {
+ "c": "people",
+ "e": "😉",
+ "d": "winking face",
+ "u": "6.0"
+ },
+ "wolf": {
+ "c": "nature",
+ "e": "ðŸº",
+ "d": "wolf face",
+ "u": "6.0"
+ },
+ "woman": {
+ "c": "people",
+ "e": "👩",
+ "d": "woman",
+ "u": "6.0"
+ },
+ "woman_tone1": {
+ "c": "people",
+ "e": "👩ðŸ»",
+ "d": "woman tone 1",
+ "u": "8.0"
+ },
+ "woman_tone2": {
+ "c": "people",
+ "e": "👩ðŸ¼",
+ "d": "woman tone 2",
+ "u": "8.0"
+ },
+ "woman_tone3": {
+ "c": "people",
+ "e": "👩ðŸ½",
+ "d": "woman tone 3",
+ "u": "8.0"
+ },
+ "woman_tone4": {
+ "c": "people",
+ "e": "👩ðŸ¾",
+ "d": "woman tone 4",
+ "u": "8.0"
+ },
+ "woman_tone5": {
+ "c": "people",
+ "e": "👩ðŸ¿",
+ "d": "woman tone 5",
+ "u": "8.0"
+ },
+ "womans_clothes": {
+ "c": "people",
+ "e": "👚",
+ "d": "womans clothes",
+ "u": "6.0"
+ },
+ "womans_hat": {
+ "c": "people",
+ "e": "👒",
+ "d": "womans hat",
+ "u": "6.0"
+ },
+ "womens": {
+ "c": "symbols",
+ "e": "🚺",
+ "d": "womens symbol",
+ "u": "6.0"
+ },
+ "worried": {
+ "c": "people",
+ "e": "😟",
+ "d": "worried face",
+ "u": "6.1"
+ },
+ "wrench": {
+ "c": "objects",
+ "e": "🔧",
+ "d": "wrench",
+ "u": "6.0"
+ },
+ "wrestlers": {
+ "c": "activity",
+ "e": "🤼",
+ "d": "wrestlers",
+ "u": "9.0"
+ },
+ "wrestlers_tone1": {
+ "c": "activity",
+ "e": "🤼ðŸ»",
+ "d": "wrestlers tone 1",
+ "u": "9.0"
+ },
+ "wrestlers_tone2": {
+ "c": "activity",
+ "e": "🤼ðŸ¼",
+ "d": "wrestlers tone 2",
+ "u": "9.0"
+ },
+ "wrestlers_tone3": {
+ "c": "activity",
+ "e": "🤼ðŸ½",
+ "d": "wrestlers tone 3",
+ "u": "9.0"
+ },
+ "wrestlers_tone4": {
+ "c": "activity",
+ "e": "🤼ðŸ¾",
+ "d": "wrestlers tone 4",
+ "u": "9.0"
+ },
+ "wrestlers_tone5": {
+ "c": "activity",
+ "e": "🤼ðŸ¿",
+ "d": "wrestlers tone 5",
+ "u": "9.0"
+ },
+ "writing_hand": {
+ "c": "people",
+ "e": "âœ",
+ "d": "writing hand",
+ "u": "1.1"
+ },
+ "writing_hand_tone1": {
+ "c": "people",
+ "e": "âœðŸ»",
+ "d": "writing hand tone 1",
+ "u": "8.0"
+ },
+ "writing_hand_tone2": {
+ "c": "people",
+ "e": "âœðŸ¼",
+ "d": "writing hand tone 2",
+ "u": "8.0"
+ },
+ "writing_hand_tone3": {
+ "c": "people",
+ "e": "âœðŸ½",
+ "d": "writing hand tone 3",
+ "u": "8.0"
+ },
+ "writing_hand_tone4": {
+ "c": "people",
+ "e": "âœðŸ¾",
+ "d": "writing hand tone 4",
+ "u": "8.0"
+ },
+ "writing_hand_tone5": {
+ "c": "people",
+ "e": "âœðŸ¿",
+ "d": "writing hand tone 5",
+ "u": "8.0"
+ },
+ "x": {
+ "c": "symbols",
+ "e": "âŒ",
+ "d": "cross mark",
+ "u": "6.0"
+ },
+ "yellow_heart": {
+ "c": "symbols",
+ "e": "💛",
+ "d": "yellow heart",
+ "u": "6.0"
+ },
+ "yen": {
+ "c": "objects",
+ "e": "💴",
+ "d": "banknote with yen sign",
+ "u": "6.0"
+ },
+ "yin_yang": {
+ "c": "symbols",
+ "e": "☯",
+ "d": "yin yang",
+ "u": "1.1"
+ },
+ "yum": {
+ "c": "people",
+ "e": "😋",
+ "d": "face savouring delicious food",
+ "u": "6.0"
+ },
+ "zap": {
+ "c": "nature",
+ "e": "âš¡",
+ "d": "high voltage sign",
+ "u": "4.0"
+ },
+ "zero": {
+ "c": "symbols",
+ "e": "0ï¸âƒ£",
+ "d": "keycap digit zero",
+ "u": "3.0"
+ },
+ "zipper_mouth": {
+ "c": "people",
+ "e": "ðŸ¤",
+ "d": "zipper-mouth face",
+ "u": "8.0"
+ },
+ "zzz": {
+ "c": "people",
+ "e": "💤",
+ "d": "sleeping symbol",
+ "u": "6.0"
+ }
+} \ No newline at end of file
diff --git a/app/assets/images/emoji/end.png b/public/-/emojis/1/end.png
index ef3ccd5f367..ef3ccd5f367 100644
--- a/app/assets/images/emoji/end.png
+++ b/public/-/emojis/1/end.png
Binary files differ
diff --git a/app/assets/images/emoji/envelope.png b/public/-/emojis/1/envelope.png
index ec77ac375a4..ec77ac375a4 100644
--- a/app/assets/images/emoji/envelope.png
+++ b/public/-/emojis/1/envelope.png
Binary files differ
diff --git a/app/assets/images/emoji/envelope_with_arrow.png b/public/-/emojis/1/envelope_with_arrow.png
index 7448a6b7673..7448a6b7673 100644
--- a/app/assets/images/emoji/envelope_with_arrow.png
+++ b/public/-/emojis/1/envelope_with_arrow.png
Binary files differ
diff --git a/app/assets/images/emoji/euro.png b/public/-/emojis/1/euro.png
index a49020820e1..a49020820e1 100644
--- a/app/assets/images/emoji/euro.png
+++ b/public/-/emojis/1/euro.png
Binary files differ
diff --git a/app/assets/images/emoji/european_castle.png b/public/-/emojis/1/european_castle.png
index 888d11332ce..888d11332ce 100644
--- a/app/assets/images/emoji/european_castle.png
+++ b/public/-/emojis/1/european_castle.png
Binary files differ
diff --git a/app/assets/images/emoji/european_post_office.png b/public/-/emojis/1/european_post_office.png
index 3745aff8dd2..3745aff8dd2 100644
--- a/app/assets/images/emoji/european_post_office.png
+++ b/public/-/emojis/1/european_post_office.png
Binary files differ
diff --git a/app/assets/images/emoji/evergreen_tree.png b/public/-/emojis/1/evergreen_tree.png
index f679d8dd772..f679d8dd772 100644
--- a/app/assets/images/emoji/evergreen_tree.png
+++ b/public/-/emojis/1/evergreen_tree.png
Binary files differ
diff --git a/app/assets/images/emoji/exclamation.png b/public/-/emojis/1/exclamation.png
index 2c14406422f..2c14406422f 100644
--- a/app/assets/images/emoji/exclamation.png
+++ b/public/-/emojis/1/exclamation.png
Binary files differ
diff --git a/app/assets/images/emoji/expressionless.png b/public/-/emojis/1/expressionless.png
index 2954017f6c2..2954017f6c2 100644
--- a/app/assets/images/emoji/expressionless.png
+++ b/public/-/emojis/1/expressionless.png
Binary files differ
diff --git a/app/assets/images/emoji/eye.png b/public/-/emojis/1/eye.png
index 9d989cdd375..9d989cdd375 100644
--- a/app/assets/images/emoji/eye.png
+++ b/public/-/emojis/1/eye.png
Binary files differ
diff --git a/app/assets/images/emoji/eye_in_speech_bubble.png b/public/-/emojis/1/eye_in_speech_bubble.png
index 21bd22bbcce..21bd22bbcce 100644
--- a/app/assets/images/emoji/eye_in_speech_bubble.png
+++ b/public/-/emojis/1/eye_in_speech_bubble.png
Binary files differ
diff --git a/app/assets/images/emoji/eyeglasses.png b/public/-/emojis/1/eyeglasses.png
index 865d8274acf..865d8274acf 100644
--- a/app/assets/images/emoji/eyeglasses.png
+++ b/public/-/emojis/1/eyeglasses.png
Binary files differ
diff --git a/app/assets/images/emoji/eyes.png b/public/-/emojis/1/eyes.png
index 2102ada7e09..2102ada7e09 100644
--- a/app/assets/images/emoji/eyes.png
+++ b/public/-/emojis/1/eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm.png b/public/-/emojis/1/face_palm.png
index defc796cf16..defc796cf16 100644
--- a/app/assets/images/emoji/face_palm.png
+++ b/public/-/emojis/1/face_palm.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm_tone1.png b/public/-/emojis/1/face_palm_tone1.png
index 2f4b010bb40..2f4b010bb40 100644
--- a/app/assets/images/emoji/face_palm_tone1.png
+++ b/public/-/emojis/1/face_palm_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm_tone2.png b/public/-/emojis/1/face_palm_tone2.png
index 97fb6831687..97fb6831687 100644
--- a/app/assets/images/emoji/face_palm_tone2.png
+++ b/public/-/emojis/1/face_palm_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm_tone3.png b/public/-/emojis/1/face_palm_tone3.png
index b5b5c1e5306..b5b5c1e5306 100644
--- a/app/assets/images/emoji/face_palm_tone3.png
+++ b/public/-/emojis/1/face_palm_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm_tone4.png b/public/-/emojis/1/face_palm_tone4.png
index 2840b113483..2840b113483 100644
--- a/app/assets/images/emoji/face_palm_tone4.png
+++ b/public/-/emojis/1/face_palm_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/face_palm_tone5.png b/public/-/emojis/1/face_palm_tone5.png
index 6f070db98be..6f070db98be 100644
--- a/app/assets/images/emoji/face_palm_tone5.png
+++ b/public/-/emojis/1/face_palm_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/factory.png b/public/-/emojis/1/factory.png
index e1d2ddf4a27..e1d2ddf4a27 100644
--- a/app/assets/images/emoji/factory.png
+++ b/public/-/emojis/1/factory.png
Binary files differ
diff --git a/app/assets/images/emoji/fallen_leaf.png b/public/-/emojis/1/fallen_leaf.png
index 0d60e7bdf2d..0d60e7bdf2d 100644
--- a/app/assets/images/emoji/fallen_leaf.png
+++ b/public/-/emojis/1/fallen_leaf.png
Binary files differ
diff --git a/app/assets/images/emoji/family.png b/public/-/emojis/1/family.png
index 26421965791..26421965791 100644
--- a/app/assets/images/emoji/family.png
+++ b/public/-/emojis/1/family.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mmb.png b/public/-/emojis/1/family_mmb.png
index 7a2e4e2c491..7a2e4e2c491 100644
--- a/app/assets/images/emoji/family_mmb.png
+++ b/public/-/emojis/1/family_mmb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mmbb.png b/public/-/emojis/1/family_mmbb.png
index 81e6c0fc0ee..81e6c0fc0ee 100644
--- a/app/assets/images/emoji/family_mmbb.png
+++ b/public/-/emojis/1/family_mmbb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mmg.png b/public/-/emojis/1/family_mmg.png
index 932a85e1fe5..932a85e1fe5 100644
--- a/app/assets/images/emoji/family_mmg.png
+++ b/public/-/emojis/1/family_mmg.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mmgb.png b/public/-/emojis/1/family_mmgb.png
index 41e35166670..41e35166670 100644
--- a/app/assets/images/emoji/family_mmgb.png
+++ b/public/-/emojis/1/family_mmgb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mmgg.png b/public/-/emojis/1/family_mmgg.png
index 8e8ccfe6c7f..8e8ccfe6c7f 100644
--- a/app/assets/images/emoji/family_mmgg.png
+++ b/public/-/emojis/1/family_mmgg.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mwbb.png b/public/-/emojis/1/family_mwbb.png
index b544fbe573f..b544fbe573f 100644
--- a/app/assets/images/emoji/family_mwbb.png
+++ b/public/-/emojis/1/family_mwbb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mwg.png b/public/-/emojis/1/family_mwg.png
index 71d2681c32a..71d2681c32a 100644
--- a/app/assets/images/emoji/family_mwg.png
+++ b/public/-/emojis/1/family_mwg.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mwgb.png b/public/-/emojis/1/family_mwgb.png
index 40dbf1f7a18..40dbf1f7a18 100644
--- a/app/assets/images/emoji/family_mwgb.png
+++ b/public/-/emojis/1/family_mwgb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_mwgg.png b/public/-/emojis/1/family_mwgg.png
index bfefa4879cb..bfefa4879cb 100644
--- a/app/assets/images/emoji/family_mwgg.png
+++ b/public/-/emojis/1/family_mwgg.png
Binary files differ
diff --git a/app/assets/images/emoji/family_wwb.png b/public/-/emojis/1/family_wwb.png
index 836feae7c78..836feae7c78 100644
--- a/app/assets/images/emoji/family_wwb.png
+++ b/public/-/emojis/1/family_wwb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_wwbb.png b/public/-/emojis/1/family_wwbb.png
index 6c6ba45e7bb..6c6ba45e7bb 100644
--- a/app/assets/images/emoji/family_wwbb.png
+++ b/public/-/emojis/1/family_wwbb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_wwg.png b/public/-/emojis/1/family_wwg.png
index 41225c6fa5a..41225c6fa5a 100644
--- a/app/assets/images/emoji/family_wwg.png
+++ b/public/-/emojis/1/family_wwg.png
Binary files differ
diff --git a/app/assets/images/emoji/family_wwgb.png b/public/-/emojis/1/family_wwgb.png
index 284d29ab5da..284d29ab5da 100644
--- a/app/assets/images/emoji/family_wwgb.png
+++ b/public/-/emojis/1/family_wwgb.png
Binary files differ
diff --git a/app/assets/images/emoji/family_wwgg.png b/public/-/emojis/1/family_wwgg.png
index d8d3f49b85f..d8d3f49b85f 100644
--- a/app/assets/images/emoji/family_wwgg.png
+++ b/public/-/emojis/1/family_wwgg.png
Binary files differ
diff --git a/app/assets/images/emoji/fast_forward.png b/public/-/emojis/1/fast_forward.png
index c406fedfdb1..c406fedfdb1 100644
--- a/app/assets/images/emoji/fast_forward.png
+++ b/public/-/emojis/1/fast_forward.png
Binary files differ
diff --git a/app/assets/images/emoji/fax.png b/public/-/emojis/1/fax.png
index 6f929e294c2..6f929e294c2 100644
--- a/app/assets/images/emoji/fax.png
+++ b/public/-/emojis/1/fax.png
Binary files differ
diff --git a/app/assets/images/emoji/fearful.png b/public/-/emojis/1/fearful.png
index eb8b347cef9..eb8b347cef9 100644
--- a/app/assets/images/emoji/fearful.png
+++ b/public/-/emojis/1/fearful.png
Binary files differ
diff --git a/app/assets/images/emoji/feet.png b/public/-/emojis/1/feet.png
index 5fe568cee93..5fe568cee93 100644
--- a/app/assets/images/emoji/feet.png
+++ b/public/-/emojis/1/feet.png
Binary files differ
diff --git a/app/assets/images/emoji/fencer.png b/public/-/emojis/1/fencer.png
index 5288c920eb9..5288c920eb9 100644
--- a/app/assets/images/emoji/fencer.png
+++ b/public/-/emojis/1/fencer.png
Binary files differ
diff --git a/app/assets/images/emoji/ferris_wheel.png b/public/-/emojis/1/ferris_wheel.png
index 55c8ff0475b..55c8ff0475b 100644
--- a/app/assets/images/emoji/ferris_wheel.png
+++ b/public/-/emojis/1/ferris_wheel.png
Binary files differ
diff --git a/app/assets/images/emoji/ferry.png b/public/-/emojis/1/ferry.png
index 41816b3ae34..41816b3ae34 100644
--- a/app/assets/images/emoji/ferry.png
+++ b/public/-/emojis/1/ferry.png
Binary files differ
diff --git a/app/assets/images/emoji/field_hockey.png b/public/-/emojis/1/field_hockey.png
index 839637716ee..839637716ee 100644
--- a/app/assets/images/emoji/field_hockey.png
+++ b/public/-/emojis/1/field_hockey.png
Binary files differ
diff --git a/app/assets/images/emoji/file_cabinet.png b/public/-/emojis/1/file_cabinet.png
index fddc65dde96..fddc65dde96 100644
--- a/app/assets/images/emoji/file_cabinet.png
+++ b/public/-/emojis/1/file_cabinet.png
Binary files differ
diff --git a/app/assets/images/emoji/file_folder.png b/public/-/emojis/1/file_folder.png
index addedaf0870..addedaf0870 100644
--- a/app/assets/images/emoji/file_folder.png
+++ b/public/-/emojis/1/file_folder.png
Binary files differ
diff --git a/app/assets/images/emoji/film_frames.png b/public/-/emojis/1/film_frames.png
index 30143aedbe6..30143aedbe6 100644
--- a/app/assets/images/emoji/film_frames.png
+++ b/public/-/emojis/1/film_frames.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed.png b/public/-/emojis/1/fingers_crossed.png
index 4cd18514ea3..4cd18514ea3 100644
--- a/app/assets/images/emoji/fingers_crossed.png
+++ b/public/-/emojis/1/fingers_crossed.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed_tone1.png b/public/-/emojis/1/fingers_crossed_tone1.png
index dd2384a6cd5..dd2384a6cd5 100644
--- a/app/assets/images/emoji/fingers_crossed_tone1.png
+++ b/public/-/emojis/1/fingers_crossed_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed_tone2.png b/public/-/emojis/1/fingers_crossed_tone2.png
index 6228401befe..6228401befe 100644
--- a/app/assets/images/emoji/fingers_crossed_tone2.png
+++ b/public/-/emojis/1/fingers_crossed_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed_tone3.png b/public/-/emojis/1/fingers_crossed_tone3.png
index b1074da15f5..b1074da15f5 100644
--- a/app/assets/images/emoji/fingers_crossed_tone3.png
+++ b/public/-/emojis/1/fingers_crossed_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed_tone4.png b/public/-/emojis/1/fingers_crossed_tone4.png
index 75e05e4d332..75e05e4d332 100644
--- a/app/assets/images/emoji/fingers_crossed_tone4.png
+++ b/public/-/emojis/1/fingers_crossed_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/fingers_crossed_tone5.png b/public/-/emojis/1/fingers_crossed_tone5.png
index 761aebdc30f..761aebdc30f 100644
--- a/app/assets/images/emoji/fingers_crossed_tone5.png
+++ b/public/-/emojis/1/fingers_crossed_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/fire.png b/public/-/emojis/1/fire.png
index bd3775a460b..bd3775a460b 100644
--- a/app/assets/images/emoji/fire.png
+++ b/public/-/emojis/1/fire.png
Binary files differ
diff --git a/app/assets/images/emoji/fire_engine.png b/public/-/emojis/1/fire_engine.png
index 2cd45b7cf7e..2cd45b7cf7e 100644
--- a/app/assets/images/emoji/fire_engine.png
+++ b/public/-/emojis/1/fire_engine.png
Binary files differ
diff --git a/app/assets/images/emoji/fireworks.png b/public/-/emojis/1/fireworks.png
index 176c8b58265..176c8b58265 100644
--- a/app/assets/images/emoji/fireworks.png
+++ b/public/-/emojis/1/fireworks.png
Binary files differ
diff --git a/app/assets/images/emoji/first_place.png b/public/-/emojis/1/first_place.png
index 15612b66492..15612b66492 100644
--- a/app/assets/images/emoji/first_place.png
+++ b/public/-/emojis/1/first_place.png
Binary files differ
diff --git a/app/assets/images/emoji/first_quarter_moon.png b/public/-/emojis/1/first_quarter_moon.png
index 5dccaf72a4f..5dccaf72a4f 100644
--- a/app/assets/images/emoji/first_quarter_moon.png
+++ b/public/-/emojis/1/first_quarter_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/first_quarter_moon_with_face.png b/public/-/emojis/1/first_quarter_moon_with_face.png
index cd8a3d7acd8..cd8a3d7acd8 100644
--- a/app/assets/images/emoji/first_quarter_moon_with_face.png
+++ b/public/-/emojis/1/first_quarter_moon_with_face.png
Binary files differ
diff --git a/app/assets/images/emoji/fish.png b/public/-/emojis/1/fish.png
index c2d2faaacd4..c2d2faaacd4 100644
--- a/app/assets/images/emoji/fish.png
+++ b/public/-/emojis/1/fish.png
Binary files differ
diff --git a/app/assets/images/emoji/fish_cake.png b/public/-/emojis/1/fish_cake.png
index 157bded65db..157bded65db 100644
--- a/app/assets/images/emoji/fish_cake.png
+++ b/public/-/emojis/1/fish_cake.png
Binary files differ
diff --git a/app/assets/images/emoji/fishing_pole_and_fish.png b/public/-/emojis/1/fishing_pole_and_fish.png
index dfcdf07eb50..dfcdf07eb50 100644
--- a/app/assets/images/emoji/fishing_pole_and_fish.png
+++ b/public/-/emojis/1/fishing_pole_and_fish.png
Binary files differ
diff --git a/app/assets/images/emoji/fist.png b/public/-/emojis/1/fist.png
index de33592bf98..de33592bf98 100644
--- a/app/assets/images/emoji/fist.png
+++ b/public/-/emojis/1/fist.png
Binary files differ
diff --git a/app/assets/images/emoji/fist_tone1.png b/public/-/emojis/1/fist_tone1.png
index 02809e2dd68..02809e2dd68 100644
--- a/app/assets/images/emoji/fist_tone1.png
+++ b/public/-/emojis/1/fist_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/fist_tone2.png b/public/-/emojis/1/fist_tone2.png
index 5de34810383..5de34810383 100644
--- a/app/assets/images/emoji/fist_tone2.png
+++ b/public/-/emojis/1/fist_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/fist_tone3.png b/public/-/emojis/1/fist_tone3.png
index 0d5240129b1..0d5240129b1 100644
--- a/app/assets/images/emoji/fist_tone3.png
+++ b/public/-/emojis/1/fist_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/fist_tone4.png b/public/-/emojis/1/fist_tone4.png
index a95c0dd634b..a95c0dd634b 100644
--- a/app/assets/images/emoji/fist_tone4.png
+++ b/public/-/emojis/1/fist_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/fist_tone5.png b/public/-/emojis/1/fist_tone5.png
index a2f092fd8c7..a2f092fd8c7 100644
--- a/app/assets/images/emoji/fist_tone5.png
+++ b/public/-/emojis/1/fist_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/five.png b/public/-/emojis/1/five.png
index d14371f3f27..d14371f3f27 100644
--- a/app/assets/images/emoji/five.png
+++ b/public/-/emojis/1/five.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ac.png b/public/-/emojis/1/flag_ac.png
index 286239920c7..286239920c7 100644
--- a/app/assets/images/emoji/flag_ac.png
+++ b/public/-/emojis/1/flag_ac.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ad.png b/public/-/emojis/1/flag_ad.png
index 20f4b14e8ad..20f4b14e8ad 100644
--- a/app/assets/images/emoji/flag_ad.png
+++ b/public/-/emojis/1/flag_ad.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ae.png b/public/-/emojis/1/flag_ae.png
index d16ffe4b862..d16ffe4b862 100644
--- a/app/assets/images/emoji/flag_ae.png
+++ b/public/-/emojis/1/flag_ae.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_af.png b/public/-/emojis/1/flag_af.png
index a51533b554d..a51533b554d 100644
--- a/app/assets/images/emoji/flag_af.png
+++ b/public/-/emojis/1/flag_af.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ag.png b/public/-/emojis/1/flag_ag.png
index 07f2ce397d0..07f2ce397d0 100644
--- a/app/assets/images/emoji/flag_ag.png
+++ b/public/-/emojis/1/flag_ag.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ai.png b/public/-/emojis/1/flag_ai.png
index 500b5ab09fb..500b5ab09fb 100644
--- a/app/assets/images/emoji/flag_ai.png
+++ b/public/-/emojis/1/flag_ai.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_al.png b/public/-/emojis/1/flag_al.png
index 03a20132cc6..03a20132cc6 100644
--- a/app/assets/images/emoji/flag_al.png
+++ b/public/-/emojis/1/flag_al.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_am.png b/public/-/emojis/1/flag_am.png
index 2ad60a273ec..2ad60a273ec 100644
--- a/app/assets/images/emoji/flag_am.png
+++ b/public/-/emojis/1/flag_am.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ao.png b/public/-/emojis/1/flag_ao.png
index cb46c31f862..cb46c31f862 100644
--- a/app/assets/images/emoji/flag_ao.png
+++ b/public/-/emojis/1/flag_ao.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_aq.png b/public/-/emojis/1/flag_aq.png
index b272021d375..b272021d375 100644
--- a/app/assets/images/emoji/flag_aq.png
+++ b/public/-/emojis/1/flag_aq.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ar.png b/public/-/emojis/1/flag_ar.png
index 73136caf3b7..73136caf3b7 100644
--- a/app/assets/images/emoji/flag_ar.png
+++ b/public/-/emojis/1/flag_ar.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_as.png b/public/-/emojis/1/flag_as.png
index 3db45a0d9f3..3db45a0d9f3 100644
--- a/app/assets/images/emoji/flag_as.png
+++ b/public/-/emojis/1/flag_as.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_at.png b/public/-/emojis/1/flag_at.png
index c43769dcb19..c43769dcb19 100644
--- a/app/assets/images/emoji/flag_at.png
+++ b/public/-/emojis/1/flag_at.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_au.png b/public/-/emojis/1/flag_au.png
index 7794309c78c..7794309c78c 100644
--- a/app/assets/images/emoji/flag_au.png
+++ b/public/-/emojis/1/flag_au.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_aw.png b/public/-/emojis/1/flag_aw.png
index 02c840d12c9..02c840d12c9 100644
--- a/app/assets/images/emoji/flag_aw.png
+++ b/public/-/emojis/1/flag_aw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ax.png b/public/-/emojis/1/flag_ax.png
index fc5466174bb..fc5466174bb 100644
--- a/app/assets/images/emoji/flag_ax.png
+++ b/public/-/emojis/1/flag_ax.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_az.png b/public/-/emojis/1/flag_az.png
index 89d3d15fd9f..89d3d15fd9f 100644
--- a/app/assets/images/emoji/flag_az.png
+++ b/public/-/emojis/1/flag_az.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ba.png b/public/-/emojis/1/flag_ba.png
index 25fe407e13c..25fe407e13c 100644
--- a/app/assets/images/emoji/flag_ba.png
+++ b/public/-/emojis/1/flag_ba.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bb.png b/public/-/emojis/1/flag_bb.png
index bccd8c5c9b0..bccd8c5c9b0 100644
--- a/app/assets/images/emoji/flag_bb.png
+++ b/public/-/emojis/1/flag_bb.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bd.png b/public/-/emojis/1/flag_bd.png
index b0597a3149b..b0597a3149b 100644
--- a/app/assets/images/emoji/flag_bd.png
+++ b/public/-/emojis/1/flag_bd.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_be.png b/public/-/emojis/1/flag_be.png
index 551f086e3c4..551f086e3c4 100644
--- a/app/assets/images/emoji/flag_be.png
+++ b/public/-/emojis/1/flag_be.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bf.png b/public/-/emojis/1/flag_bf.png
index 444d4829f94..444d4829f94 100644
--- a/app/assets/images/emoji/flag_bf.png
+++ b/public/-/emojis/1/flag_bf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bg.png b/public/-/emojis/1/flag_bg.png
index 821eee5e170..821eee5e170 100644
--- a/app/assets/images/emoji/flag_bg.png
+++ b/public/-/emojis/1/flag_bg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bh.png b/public/-/emojis/1/flag_bh.png
index f33724249f0..f33724249f0 100644
--- a/app/assets/images/emoji/flag_bh.png
+++ b/public/-/emojis/1/flag_bh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bi.png b/public/-/emojis/1/flag_bi.png
index ea20ac93211..ea20ac93211 100644
--- a/app/assets/images/emoji/flag_bi.png
+++ b/public/-/emojis/1/flag_bi.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bj.png b/public/-/emojis/1/flag_bj.png
index 7cca4f80457..7cca4f80457 100644
--- a/app/assets/images/emoji/flag_bj.png
+++ b/public/-/emojis/1/flag_bj.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bl.png b/public/-/emojis/1/flag_bl.png
index 1082e78999f..1082e78999f 100644
--- a/app/assets/images/emoji/flag_bl.png
+++ b/public/-/emojis/1/flag_bl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_black.png b/public/-/emojis/1/flag_black.png
index 0e28d05d5ac..0e28d05d5ac 100644
--- a/app/assets/images/emoji/flag_black.png
+++ b/public/-/emojis/1/flag_black.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bm.png b/public/-/emojis/1/flag_bm.png
index ab8cafdac63..ab8cafdac63 100644
--- a/app/assets/images/emoji/flag_bm.png
+++ b/public/-/emojis/1/flag_bm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bn.png b/public/-/emojis/1/flag_bn.png
index caa9329a896..caa9329a896 100644
--- a/app/assets/images/emoji/flag_bn.png
+++ b/public/-/emojis/1/flag_bn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bo.png b/public/-/emojis/1/flag_bo.png
index 98af62b3da7..98af62b3da7 100644
--- a/app/assets/images/emoji/flag_bo.png
+++ b/public/-/emojis/1/flag_bo.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bq.png b/public/-/emojis/1/flag_bq.png
index cb978ef9de9..cb978ef9de9 100644
--- a/app/assets/images/emoji/flag_bq.png
+++ b/public/-/emojis/1/flag_bq.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_br.png b/public/-/emojis/1/flag_br.png
index b139366a42b..b139366a42b 100644
--- a/app/assets/images/emoji/flag_br.png
+++ b/public/-/emojis/1/flag_br.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bs.png b/public/-/emojis/1/flag_bs.png
index d36bcd2fb52..d36bcd2fb52 100644
--- a/app/assets/images/emoji/flag_bs.png
+++ b/public/-/emojis/1/flag_bs.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bt.png b/public/-/emojis/1/flag_bt.png
index ed57aa0360e..ed57aa0360e 100644
--- a/app/assets/images/emoji/flag_bt.png
+++ b/public/-/emojis/1/flag_bt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bv.png b/public/-/emojis/1/flag_bv.png
index 5884e648228..5884e648228 100644
--- a/app/assets/images/emoji/flag_bv.png
+++ b/public/-/emojis/1/flag_bv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bw.png b/public/-/emojis/1/flag_bw.png
index cb12f34739d..cb12f34739d 100644
--- a/app/assets/images/emoji/flag_bw.png
+++ b/public/-/emojis/1/flag_bw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_by.png b/public/-/emojis/1/flag_by.png
index 859c05beb13..859c05beb13 100644
--- a/app/assets/images/emoji/flag_by.png
+++ b/public/-/emojis/1/flag_by.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_bz.png b/public/-/emojis/1/flag_bz.png
index 34761cd03d8..34761cd03d8 100644
--- a/app/assets/images/emoji/flag_bz.png
+++ b/public/-/emojis/1/flag_bz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ca.png b/public/-/emojis/1/flag_ca.png
index 7c5b390e85b..7c5b390e85b 100644
--- a/app/assets/images/emoji/flag_ca.png
+++ b/public/-/emojis/1/flag_ca.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cc.png b/public/-/emojis/1/flag_cc.png
index b6555a23d83..b6555a23d83 100644
--- a/app/assets/images/emoji/flag_cc.png
+++ b/public/-/emojis/1/flag_cc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cd.png b/public/-/emojis/1/flag_cd.png
index fa92009771d..fa92009771d 100644
--- a/app/assets/images/emoji/flag_cd.png
+++ b/public/-/emojis/1/flag_cd.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cf.png b/public/-/emojis/1/flag_cf.png
index b969ae29ea9..b969ae29ea9 100644
--- a/app/assets/images/emoji/flag_cf.png
+++ b/public/-/emojis/1/flag_cf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cg.png b/public/-/emojis/1/flag_cg.png
index 3a38a40a95e..3a38a40a95e 100644
--- a/app/assets/images/emoji/flag_cg.png
+++ b/public/-/emojis/1/flag_cg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ch.png b/public/-/emojis/1/flag_ch.png
index 5ff86b8a3b7..5ff86b8a3b7 100644
--- a/app/assets/images/emoji/flag_ch.png
+++ b/public/-/emojis/1/flag_ch.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ci.png b/public/-/emojis/1/flag_ci.png
index e3b4d15c7f1..e3b4d15c7f1 100644
--- a/app/assets/images/emoji/flag_ci.png
+++ b/public/-/emojis/1/flag_ci.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ck.png b/public/-/emojis/1/flag_ck.png
index b6b53dbc1c4..b6b53dbc1c4 100644
--- a/app/assets/images/emoji/flag_ck.png
+++ b/public/-/emojis/1/flag_ck.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cl.png b/public/-/emojis/1/flag_cl.png
index c9390da5499..c9390da5499 100644
--- a/app/assets/images/emoji/flag_cl.png
+++ b/public/-/emojis/1/flag_cl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cm.png b/public/-/emojis/1/flag_cm.png
index 2d3f6ec4518..2d3f6ec4518 100644
--- a/app/assets/images/emoji/flag_cm.png
+++ b/public/-/emojis/1/flag_cm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cn.png b/public/-/emojis/1/flag_cn.png
index 0a7f350a6d2..0a7f350a6d2 100644
--- a/app/assets/images/emoji/flag_cn.png
+++ b/public/-/emojis/1/flag_cn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_co.png b/public/-/emojis/1/flag_co.png
index 7e0f5e0dc3c..7e0f5e0dc3c 100644
--- a/app/assets/images/emoji/flag_co.png
+++ b/public/-/emojis/1/flag_co.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cp.png b/public/-/emojis/1/flag_cp.png
index 70c761036bd..70c761036bd 100644
--- a/app/assets/images/emoji/flag_cp.png
+++ b/public/-/emojis/1/flag_cp.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cr.png b/public/-/emojis/1/flag_cr.png
index a5fce126515..a5fce126515 100644
--- a/app/assets/images/emoji/flag_cr.png
+++ b/public/-/emojis/1/flag_cr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cu.png b/public/-/emojis/1/flag_cu.png
index 447328f7dfd..447328f7dfd 100644
--- a/app/assets/images/emoji/flag_cu.png
+++ b/public/-/emojis/1/flag_cu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cv.png b/public/-/emojis/1/flag_cv.png
index 43faf4d64d5..43faf4d64d5 100644
--- a/app/assets/images/emoji/flag_cv.png
+++ b/public/-/emojis/1/flag_cv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cw.png b/public/-/emojis/1/flag_cw.png
index eb39e8d0078..eb39e8d0078 100644
--- a/app/assets/images/emoji/flag_cw.png
+++ b/public/-/emojis/1/flag_cw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cx.png b/public/-/emojis/1/flag_cx.png
index 09d21359f3a..09d21359f3a 100644
--- a/app/assets/images/emoji/flag_cx.png
+++ b/public/-/emojis/1/flag_cx.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cy.png b/public/-/emojis/1/flag_cy.png
index 154a7aa3176..154a7aa3176 100644
--- a/app/assets/images/emoji/flag_cy.png
+++ b/public/-/emojis/1/flag_cy.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_cz.png b/public/-/emojis/1/flag_cz.png
index 9737ca223c7..9737ca223c7 100644
--- a/app/assets/images/emoji/flag_cz.png
+++ b/public/-/emojis/1/flag_cz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_de.png b/public/-/emojis/1/flag_de.png
index 98ed76b3bab..98ed76b3bab 100644
--- a/app/assets/images/emoji/flag_de.png
+++ b/public/-/emojis/1/flag_de.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_dg.png b/public/-/emojis/1/flag_dg.png
index aae927d14b8..aae927d14b8 100644
--- a/app/assets/images/emoji/flag_dg.png
+++ b/public/-/emojis/1/flag_dg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_dj.png b/public/-/emojis/1/flag_dj.png
index 73c2a2acbd9..73c2a2acbd9 100644
--- a/app/assets/images/emoji/flag_dj.png
+++ b/public/-/emojis/1/flag_dj.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_dk.png b/public/-/emojis/1/flag_dk.png
index e5a60b06256..e5a60b06256 100644
--- a/app/assets/images/emoji/flag_dk.png
+++ b/public/-/emojis/1/flag_dk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_dm.png b/public/-/emojis/1/flag_dm.png
index 50f8a53981d..50f8a53981d 100644
--- a/app/assets/images/emoji/flag_dm.png
+++ b/public/-/emojis/1/flag_dm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_do.png b/public/-/emojis/1/flag_do.png
index 037a45d7c26..037a45d7c26 100644
--- a/app/assets/images/emoji/flag_do.png
+++ b/public/-/emojis/1/flag_do.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_dz.png b/public/-/emojis/1/flag_dz.png
index 24945b10f2d..24945b10f2d 100644
--- a/app/assets/images/emoji/flag_dz.png
+++ b/public/-/emojis/1/flag_dz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ea.png b/public/-/emojis/1/flag_ea.png
index 356ff347838..356ff347838 100644
--- a/app/assets/images/emoji/flag_ea.png
+++ b/public/-/emojis/1/flag_ea.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ec.png b/public/-/emojis/1/flag_ec.png
index 13814594619..13814594619 100644
--- a/app/assets/images/emoji/flag_ec.png
+++ b/public/-/emojis/1/flag_ec.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ee.png b/public/-/emojis/1/flag_ee.png
index 84f317e7747..84f317e7747 100644
--- a/app/assets/images/emoji/flag_ee.png
+++ b/public/-/emojis/1/flag_ee.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_eg.png b/public/-/emojis/1/flag_eg.png
index 57786064a95..57786064a95 100644
--- a/app/assets/images/emoji/flag_eg.png
+++ b/public/-/emojis/1/flag_eg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_eh.png b/public/-/emojis/1/flag_eh.png
index 4d7a76687f6..4d7a76687f6 100644
--- a/app/assets/images/emoji/flag_eh.png
+++ b/public/-/emojis/1/flag_eh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_er.png b/public/-/emojis/1/flag_er.png
index 0c3c724c1fb..0c3c724c1fb 100644
--- a/app/assets/images/emoji/flag_er.png
+++ b/public/-/emojis/1/flag_er.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_es.png b/public/-/emojis/1/flag_es.png
index 3e73597a225..3e73597a225 100644
--- a/app/assets/images/emoji/flag_es.png
+++ b/public/-/emojis/1/flag_es.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_et.png b/public/-/emojis/1/flag_et.png
index 9560a134c97..9560a134c97 100644
--- a/app/assets/images/emoji/flag_et.png
+++ b/public/-/emojis/1/flag_et.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_eu.png b/public/-/emojis/1/flag_eu.png
index 0b456cf3330..0b456cf3330 100644
--- a/app/assets/images/emoji/flag_eu.png
+++ b/public/-/emojis/1/flag_eu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fi.png b/public/-/emojis/1/flag_fi.png
index ebcf58abfc5..ebcf58abfc5 100644
--- a/app/assets/images/emoji/flag_fi.png
+++ b/public/-/emojis/1/flag_fi.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fj.png b/public/-/emojis/1/flag_fj.png
index 9cc8c37fe37..9cc8c37fe37 100644
--- a/app/assets/images/emoji/flag_fj.png
+++ b/public/-/emojis/1/flag_fj.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fk.png b/public/-/emojis/1/flag_fk.png
index 61372fd2549..61372fd2549 100644
--- a/app/assets/images/emoji/flag_fk.png
+++ b/public/-/emojis/1/flag_fk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fm.png b/public/-/emojis/1/flag_fm.png
index 0889825c8e1..0889825c8e1 100644
--- a/app/assets/images/emoji/flag_fm.png
+++ b/public/-/emojis/1/flag_fm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fo.png b/public/-/emojis/1/flag_fo.png
index 9a4431b0831..9a4431b0831 100644
--- a/app/assets/images/emoji/flag_fo.png
+++ b/public/-/emojis/1/flag_fo.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_fr.png b/public/-/emojis/1/flag_fr.png
index 62ca19c3fcf..62ca19c3fcf 100644
--- a/app/assets/images/emoji/flag_fr.png
+++ b/public/-/emojis/1/flag_fr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ga.png b/public/-/emojis/1/flag_ga.png
index 2e68e527a3e..2e68e527a3e 100644
--- a/app/assets/images/emoji/flag_ga.png
+++ b/public/-/emojis/1/flag_ga.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gb.png b/public/-/emojis/1/flag_gb.png
index 3ed10f62347..3ed10f62347 100644
--- a/app/assets/images/emoji/flag_gb.png
+++ b/public/-/emojis/1/flag_gb.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gd.png b/public/-/emojis/1/flag_gd.png
index 527aad33807..527aad33807 100644
--- a/app/assets/images/emoji/flag_gd.png
+++ b/public/-/emojis/1/flag_gd.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ge.png b/public/-/emojis/1/flag_ge.png
index a75d142480d..a75d142480d 100644
--- a/app/assets/images/emoji/flag_ge.png
+++ b/public/-/emojis/1/flag_ge.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gf.png b/public/-/emojis/1/flag_gf.png
index 0cf96f327c0..0cf96f327c0 100644
--- a/app/assets/images/emoji/flag_gf.png
+++ b/public/-/emojis/1/flag_gf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gg.png b/public/-/emojis/1/flag_gg.png
index 970002c7f76..970002c7f76 100644
--- a/app/assets/images/emoji/flag_gg.png
+++ b/public/-/emojis/1/flag_gg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gh.png b/public/-/emojis/1/flag_gh.png
index f31b5eb7b45..f31b5eb7b45 100644
--- a/app/assets/images/emoji/flag_gh.png
+++ b/public/-/emojis/1/flag_gh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gi.png b/public/-/emojis/1/flag_gi.png
index e554a2a1d0c..e554a2a1d0c 100644
--- a/app/assets/images/emoji/flag_gi.png
+++ b/public/-/emojis/1/flag_gi.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gl.png b/public/-/emojis/1/flag_gl.png
index 2e795dd4e33..2e795dd4e33 100644
--- a/app/assets/images/emoji/flag_gl.png
+++ b/public/-/emojis/1/flag_gl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gm.png b/public/-/emojis/1/flag_gm.png
index bb69c0975a3..bb69c0975a3 100644
--- a/app/assets/images/emoji/flag_gm.png
+++ b/public/-/emojis/1/flag_gm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gn.png b/public/-/emojis/1/flag_gn.png
index 1981f61dbf5..1981f61dbf5 100644
--- a/app/assets/images/emoji/flag_gn.png
+++ b/public/-/emojis/1/flag_gn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gp.png b/public/-/emojis/1/flag_gp.png
index 10e42e672bd..10e42e672bd 100644
--- a/app/assets/images/emoji/flag_gp.png
+++ b/public/-/emojis/1/flag_gp.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gq.png b/public/-/emojis/1/flag_gq.png
index 11475e61eeb..11475e61eeb 100644
--- a/app/assets/images/emoji/flag_gq.png
+++ b/public/-/emojis/1/flag_gq.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gr.png b/public/-/emojis/1/flag_gr.png
index 0f6bb1b6b94..0f6bb1b6b94 100644
--- a/app/assets/images/emoji/flag_gr.png
+++ b/public/-/emojis/1/flag_gr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gs.png b/public/-/emojis/1/flag_gs.png
index 6fc92780453..6fc92780453 100644
--- a/app/assets/images/emoji/flag_gs.png
+++ b/public/-/emojis/1/flag_gs.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gt.png b/public/-/emojis/1/flag_gt.png
index 7213d4139ed..7213d4139ed 100644
--- a/app/assets/images/emoji/flag_gt.png
+++ b/public/-/emojis/1/flag_gt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gu.png b/public/-/emojis/1/flag_gu.png
index 4027549ca3c..4027549ca3c 100644
--- a/app/assets/images/emoji/flag_gu.png
+++ b/public/-/emojis/1/flag_gu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gw.png b/public/-/emojis/1/flag_gw.png
index 6357f6225f4..6357f6225f4 100644
--- a/app/assets/images/emoji/flag_gw.png
+++ b/public/-/emojis/1/flag_gw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_gy.png b/public/-/emojis/1/flag_gy.png
index 746e2fb7e44..746e2fb7e44 100644
--- a/app/assets/images/emoji/flag_gy.png
+++ b/public/-/emojis/1/flag_gy.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_hk.png b/public/-/emojis/1/flag_hk.png
index cf0c7151b56..cf0c7151b56 100644
--- a/app/assets/images/emoji/flag_hk.png
+++ b/public/-/emojis/1/flag_hk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_hm.png b/public/-/emojis/1/flag_hm.png
index b613509e466..b613509e466 100644
--- a/app/assets/images/emoji/flag_hm.png
+++ b/public/-/emojis/1/flag_hm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_hn.png b/public/-/emojis/1/flag_hn.png
index 402cdcefdf8..402cdcefdf8 100644
--- a/app/assets/images/emoji/flag_hn.png
+++ b/public/-/emojis/1/flag_hn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_hr.png b/public/-/emojis/1/flag_hr.png
index 46f4f06b4f2..46f4f06b4f2 100644
--- a/app/assets/images/emoji/flag_hr.png
+++ b/public/-/emojis/1/flag_hr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ht.png b/public/-/emojis/1/flag_ht.png
index d8d0c888498..d8d0c888498 100644
--- a/app/assets/images/emoji/flag_ht.png
+++ b/public/-/emojis/1/flag_ht.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_hu.png b/public/-/emojis/1/flag_hu.png
index a898de636a5..a898de636a5 100644
--- a/app/assets/images/emoji/flag_hu.png
+++ b/public/-/emojis/1/flag_hu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ic.png b/public/-/emojis/1/flag_ic.png
index 69fd990aa95..69fd990aa95 100644
--- a/app/assets/images/emoji/flag_ic.png
+++ b/public/-/emojis/1/flag_ic.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_id.png b/public/-/emojis/1/flag_id.png
index 85b4c063a45..85b4c063a45 100644
--- a/app/assets/images/emoji/flag_id.png
+++ b/public/-/emojis/1/flag_id.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ie.png b/public/-/emojis/1/flag_ie.png
index a28295838cc..a28295838cc 100644
--- a/app/assets/images/emoji/flag_ie.png
+++ b/public/-/emojis/1/flag_ie.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_il.png b/public/-/emojis/1/flag_il.png
index 85c410d45fb..85c410d45fb 100644
--- a/app/assets/images/emoji/flag_il.png
+++ b/public/-/emojis/1/flag_il.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_im.png b/public/-/emojis/1/flag_im.png
index 60a2458e38e..60a2458e38e 100644
--- a/app/assets/images/emoji/flag_im.png
+++ b/public/-/emojis/1/flag_im.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_in.png b/public/-/emojis/1/flag_in.png
index feccc8952ce..feccc8952ce 100644
--- a/app/assets/images/emoji/flag_in.png
+++ b/public/-/emojis/1/flag_in.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_io.png b/public/-/emojis/1/flag_io.png
index aae927d14b8..aae927d14b8 100644
--- a/app/assets/images/emoji/flag_io.png
+++ b/public/-/emojis/1/flag_io.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_iq.png b/public/-/emojis/1/flag_iq.png
index 41fd1db6f86..41fd1db6f86 100644
--- a/app/assets/images/emoji/flag_iq.png
+++ b/public/-/emojis/1/flag_iq.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ir.png b/public/-/emojis/1/flag_ir.png
index ff7aaf62ba6..ff7aaf62ba6 100644
--- a/app/assets/images/emoji/flag_ir.png
+++ b/public/-/emojis/1/flag_ir.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_is.png b/public/-/emojis/1/flag_is.png
index ad8d4131dd2..ad8d4131dd2 100644
--- a/app/assets/images/emoji/flag_is.png
+++ b/public/-/emojis/1/flag_is.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_it.png b/public/-/emojis/1/flag_it.png
index f21563ec533..f21563ec533 100644
--- a/app/assets/images/emoji/flag_it.png
+++ b/public/-/emojis/1/flag_it.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_je.png b/public/-/emojis/1/flag_je.png
index 198a918f6a4..198a918f6a4 100644
--- a/app/assets/images/emoji/flag_je.png
+++ b/public/-/emojis/1/flag_je.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_jm.png b/public/-/emojis/1/flag_jm.png
index f84e4f9e8db..f84e4f9e8db 100644
--- a/app/assets/images/emoji/flag_jm.png
+++ b/public/-/emojis/1/flag_jm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_jo.png b/public/-/emojis/1/flag_jo.png
index 20bfa147e3e..20bfa147e3e 100644
--- a/app/assets/images/emoji/flag_jo.png
+++ b/public/-/emojis/1/flag_jo.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_jp.png b/public/-/emojis/1/flag_jp.png
index 8d8838e4708..8d8838e4708 100644
--- a/app/assets/images/emoji/flag_jp.png
+++ b/public/-/emojis/1/flag_jp.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ke.png b/public/-/emojis/1/flag_ke.png
index 9e417ab3009..9e417ab3009 100644
--- a/app/assets/images/emoji/flag_ke.png
+++ b/public/-/emojis/1/flag_ke.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kg.png b/public/-/emojis/1/flag_kg.png
index 2f2d848fe58..2f2d848fe58 100644
--- a/app/assets/images/emoji/flag_kg.png
+++ b/public/-/emojis/1/flag_kg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kh.png b/public/-/emojis/1/flag_kh.png
index 9a2877dd620..9a2877dd620 100644
--- a/app/assets/images/emoji/flag_kh.png
+++ b/public/-/emojis/1/flag_kh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ki.png b/public/-/emojis/1/flag_ki.png
index 10e507e3245..10e507e3245 100644
--- a/app/assets/images/emoji/flag_ki.png
+++ b/public/-/emojis/1/flag_ki.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_km.png b/public/-/emojis/1/flag_km.png
index bd5a0588e03..bd5a0588e03 100644
--- a/app/assets/images/emoji/flag_km.png
+++ b/public/-/emojis/1/flag_km.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kn.png b/public/-/emojis/1/flag_kn.png
index 776207c9605..776207c9605 100644
--- a/app/assets/images/emoji/flag_kn.png
+++ b/public/-/emojis/1/flag_kn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kp.png b/public/-/emojis/1/flag_kp.png
index 6b3fd89eaaa..6b3fd89eaaa 100644
--- a/app/assets/images/emoji/flag_kp.png
+++ b/public/-/emojis/1/flag_kp.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kr.png b/public/-/emojis/1/flag_kr.png
index 833a88116e1..833a88116e1 100644
--- a/app/assets/images/emoji/flag_kr.png
+++ b/public/-/emojis/1/flag_kr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kw.png b/public/-/emojis/1/flag_kw.png
index 4d19bfa6ca7..4d19bfa6ca7 100644
--- a/app/assets/images/emoji/flag_kw.png
+++ b/public/-/emojis/1/flag_kw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ky.png b/public/-/emojis/1/flag_ky.png
index 40daa4da597..40daa4da597 100644
--- a/app/assets/images/emoji/flag_ky.png
+++ b/public/-/emojis/1/flag_ky.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_kz.png b/public/-/emojis/1/flag_kz.png
index 2f97a8fd3c6..2f97a8fd3c6 100644
--- a/app/assets/images/emoji/flag_kz.png
+++ b/public/-/emojis/1/flag_kz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_la.png b/public/-/emojis/1/flag_la.png
index 4d4179f34f6..4d4179f34f6 100644
--- a/app/assets/images/emoji/flag_la.png
+++ b/public/-/emojis/1/flag_la.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lb.png b/public/-/emojis/1/flag_lb.png
index 3d594467011..3d594467011 100644
--- a/app/assets/images/emoji/flag_lb.png
+++ b/public/-/emojis/1/flag_lb.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lc.png b/public/-/emojis/1/flag_lc.png
index 45547b1e439..45547b1e439 100644
--- a/app/assets/images/emoji/flag_lc.png
+++ b/public/-/emojis/1/flag_lc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_li.png b/public/-/emojis/1/flag_li.png
index 0eafa6a2215..0eafa6a2215 100644
--- a/app/assets/images/emoji/flag_li.png
+++ b/public/-/emojis/1/flag_li.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lk.png b/public/-/emojis/1/flag_lk.png
index ab4fe10c40c..ab4fe10c40c 100644
--- a/app/assets/images/emoji/flag_lk.png
+++ b/public/-/emojis/1/flag_lk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lr.png b/public/-/emojis/1/flag_lr.png
index f66f267fea2..f66f267fea2 100644
--- a/app/assets/images/emoji/flag_lr.png
+++ b/public/-/emojis/1/flag_lr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ls.png b/public/-/emojis/1/flag_ls.png
index 24745631e3c..24745631e3c 100644
--- a/app/assets/images/emoji/flag_ls.png
+++ b/public/-/emojis/1/flag_ls.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lt.png b/public/-/emojis/1/flag_lt.png
index d644b56d62a..d644b56d62a 100644
--- a/app/assets/images/emoji/flag_lt.png
+++ b/public/-/emojis/1/flag_lt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lu.png b/public/-/emojis/1/flag_lu.png
index a2df9c92994..a2df9c92994 100644
--- a/app/assets/images/emoji/flag_lu.png
+++ b/public/-/emojis/1/flag_lu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_lv.png b/public/-/emojis/1/flag_lv.png
index ae680d5f0e3..ae680d5f0e3 100644
--- a/app/assets/images/emoji/flag_lv.png
+++ b/public/-/emojis/1/flag_lv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ly.png b/public/-/emojis/1/flag_ly.png
index f6e77b0f3ba..f6e77b0f3ba 100644
--- a/app/assets/images/emoji/flag_ly.png
+++ b/public/-/emojis/1/flag_ly.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ma.png b/public/-/emojis/1/flag_ma.png
index c4a056722cd..c4a056722cd 100644
--- a/app/assets/images/emoji/flag_ma.png
+++ b/public/-/emojis/1/flag_ma.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mc.png b/public/-/emojis/1/flag_mc.png
index d479eab98cb..d479eab98cb 100644
--- a/app/assets/images/emoji/flag_mc.png
+++ b/public/-/emojis/1/flag_mc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_md.png b/public/-/emojis/1/flag_md.png
index a7a72539872..a7a72539872 100644
--- a/app/assets/images/emoji/flag_md.png
+++ b/public/-/emojis/1/flag_md.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_me.png b/public/-/emojis/1/flag_me.png
index 7c771e7e120..7c771e7e120 100644
--- a/app/assets/images/emoji/flag_me.png
+++ b/public/-/emojis/1/flag_me.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mf.png b/public/-/emojis/1/flag_mf.png
index 70c761036bd..70c761036bd 100644
--- a/app/assets/images/emoji/flag_mf.png
+++ b/public/-/emojis/1/flag_mf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mg.png b/public/-/emojis/1/flag_mg.png
index 2f3ccdda76f..2f3ccdda76f 100644
--- a/app/assets/images/emoji/flag_mg.png
+++ b/public/-/emojis/1/flag_mg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mh.png b/public/-/emojis/1/flag_mh.png
index 598016481c1..598016481c1 100644
--- a/app/assets/images/emoji/flag_mh.png
+++ b/public/-/emojis/1/flag_mh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mk.png b/public/-/emojis/1/flag_mk.png
index 7ba775ee75c..7ba775ee75c 100644
--- a/app/assets/images/emoji/flag_mk.png
+++ b/public/-/emojis/1/flag_mk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ml.png b/public/-/emojis/1/flag_ml.png
index 68343785468..68343785468 100644
--- a/app/assets/images/emoji/flag_ml.png
+++ b/public/-/emojis/1/flag_ml.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mm.png b/public/-/emojis/1/flag_mm.png
index 37dc7d71591..37dc7d71591 100644
--- a/app/assets/images/emoji/flag_mm.png
+++ b/public/-/emojis/1/flag_mm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mn.png b/public/-/emojis/1/flag_mn.png
index 1f146bbcd1a..1f146bbcd1a 100644
--- a/app/assets/images/emoji/flag_mn.png
+++ b/public/-/emojis/1/flag_mn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mo.png b/public/-/emojis/1/flag_mo.png
index 7edde31f64b..7edde31f64b 100644
--- a/app/assets/images/emoji/flag_mo.png
+++ b/public/-/emojis/1/flag_mo.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mp.png b/public/-/emojis/1/flag_mp.png
index 17ec1c441ed..17ec1c441ed 100644
--- a/app/assets/images/emoji/flag_mp.png
+++ b/public/-/emojis/1/flag_mp.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mq.png b/public/-/emojis/1/flag_mq.png
index 1e672dc9087..1e672dc9087 100644
--- a/app/assets/images/emoji/flag_mq.png
+++ b/public/-/emojis/1/flag_mq.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mr.png b/public/-/emojis/1/flag_mr.png
index f87de46effe..f87de46effe 100644
--- a/app/assets/images/emoji/flag_mr.png
+++ b/public/-/emojis/1/flag_mr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ms.png b/public/-/emojis/1/flag_ms.png
index 480b0d4ebda..480b0d4ebda 100644
--- a/app/assets/images/emoji/flag_ms.png
+++ b/public/-/emojis/1/flag_ms.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mt.png b/public/-/emojis/1/flag_mt.png
index c9e1dbdce82..c9e1dbdce82 100644
--- a/app/assets/images/emoji/flag_mt.png
+++ b/public/-/emojis/1/flag_mt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mu.png b/public/-/emojis/1/flag_mu.png
index 55b33cb7c33..55b33cb7c33 100644
--- a/app/assets/images/emoji/flag_mu.png
+++ b/public/-/emojis/1/flag_mu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mv.png b/public/-/emojis/1/flag_mv.png
index ce5867126ae..ce5867126ae 100644
--- a/app/assets/images/emoji/flag_mv.png
+++ b/public/-/emojis/1/flag_mv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mw.png b/public/-/emojis/1/flag_mw.png
index 003d8548401..003d8548401 100644
--- a/app/assets/images/emoji/flag_mw.png
+++ b/public/-/emojis/1/flag_mw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mx.png b/public/-/emojis/1/flag_mx.png
index 42572bcd0ba..42572bcd0ba 100644
--- a/app/assets/images/emoji/flag_mx.png
+++ b/public/-/emojis/1/flag_mx.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_my.png b/public/-/emojis/1/flag_my.png
index 17526c26742..17526c26742 100644
--- a/app/assets/images/emoji/flag_my.png
+++ b/public/-/emojis/1/flag_my.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_mz.png b/public/-/emojis/1/flag_mz.png
index 2352a78e786..2352a78e786 100644
--- a/app/assets/images/emoji/flag_mz.png
+++ b/public/-/emojis/1/flag_mz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_na.png b/public/-/emojis/1/flag_na.png
index ed31c3df04d..ed31c3df04d 100644
--- a/app/assets/images/emoji/flag_na.png
+++ b/public/-/emojis/1/flag_na.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nc.png b/public/-/emojis/1/flag_nc.png
index 90b3afebfa3..90b3afebfa3 100644
--- a/app/assets/images/emoji/flag_nc.png
+++ b/public/-/emojis/1/flag_nc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ne.png b/public/-/emojis/1/flag_ne.png
index f98a1173c2a..f98a1173c2a 100644
--- a/app/assets/images/emoji/flag_ne.png
+++ b/public/-/emojis/1/flag_ne.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nf.png b/public/-/emojis/1/flag_nf.png
index 9099e767420..9099e767420 100644
--- a/app/assets/images/emoji/flag_nf.png
+++ b/public/-/emojis/1/flag_nf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ng.png b/public/-/emojis/1/flag_ng.png
index ea0abeff1a1..ea0abeff1a1 100644
--- a/app/assets/images/emoji/flag_ng.png
+++ b/public/-/emojis/1/flag_ng.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ni.png b/public/-/emojis/1/flag_ni.png
index 772920dfa10..772920dfa10 100644
--- a/app/assets/images/emoji/flag_ni.png
+++ b/public/-/emojis/1/flag_ni.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nl.png b/public/-/emojis/1/flag_nl.png
index 83a0e817e41..83a0e817e41 100644
--- a/app/assets/images/emoji/flag_nl.png
+++ b/public/-/emojis/1/flag_nl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_no.png b/public/-/emojis/1/flag_no.png
index 99d3142eb7b..99d3142eb7b 100644
--- a/app/assets/images/emoji/flag_no.png
+++ b/public/-/emojis/1/flag_no.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_np.png b/public/-/emojis/1/flag_np.png
index 87425a8dfef..87425a8dfef 100644
--- a/app/assets/images/emoji/flag_np.png
+++ b/public/-/emojis/1/flag_np.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nr.png b/public/-/emojis/1/flag_nr.png
index b3e3a5d5621..b3e3a5d5621 100644
--- a/app/assets/images/emoji/flag_nr.png
+++ b/public/-/emojis/1/flag_nr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nu.png b/public/-/emojis/1/flag_nu.png
index f03614443ee..f03614443ee 100644
--- a/app/assets/images/emoji/flag_nu.png
+++ b/public/-/emojis/1/flag_nu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_nz.png b/public/-/emojis/1/flag_nz.png
index a4eeeab9cd9..a4eeeab9cd9 100644
--- a/app/assets/images/emoji/flag_nz.png
+++ b/public/-/emojis/1/flag_nz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_om.png b/public/-/emojis/1/flag_om.png
index ea824ba31e7..ea824ba31e7 100644
--- a/app/assets/images/emoji/flag_om.png
+++ b/public/-/emojis/1/flag_om.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pa.png b/public/-/emojis/1/flag_pa.png
index c3091d89889..c3091d89889 100644
--- a/app/assets/images/emoji/flag_pa.png
+++ b/public/-/emojis/1/flag_pa.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pe.png b/public/-/emojis/1/flag_pe.png
index 39223aa9dbb..39223aa9dbb 100644
--- a/app/assets/images/emoji/flag_pe.png
+++ b/public/-/emojis/1/flag_pe.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pf.png b/public/-/emojis/1/flag_pf.png
index 113445f8f6e..113445f8f6e 100644
--- a/app/assets/images/emoji/flag_pf.png
+++ b/public/-/emojis/1/flag_pf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pg.png b/public/-/emojis/1/flag_pg.png
index 825e9dcb762..825e9dcb762 100644
--- a/app/assets/images/emoji/flag_pg.png
+++ b/public/-/emojis/1/flag_pg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ph.png b/public/-/emojis/1/flag_ph.png
index 8260e15bd2c..8260e15bd2c 100644
--- a/app/assets/images/emoji/flag_ph.png
+++ b/public/-/emojis/1/flag_ph.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pk.png b/public/-/emojis/1/flag_pk.png
index a7b6a1c5074..a7b6a1c5074 100644
--- a/app/assets/images/emoji/flag_pk.png
+++ b/public/-/emojis/1/flag_pk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pl.png b/public/-/emojis/1/flag_pl.png
index 19de2edec11..19de2edec11 100644
--- a/app/assets/images/emoji/flag_pl.png
+++ b/public/-/emojis/1/flag_pl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pm.png b/public/-/emojis/1/flag_pm.png
index 2ca60554193..2ca60554193 100644
--- a/app/assets/images/emoji/flag_pm.png
+++ b/public/-/emojis/1/flag_pm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pn.png b/public/-/emojis/1/flag_pn.png
index f2263b154bc..f2263b154bc 100644
--- a/app/assets/images/emoji/flag_pn.png
+++ b/public/-/emojis/1/flag_pn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pr.png b/public/-/emojis/1/flag_pr.png
index d0209cddb79..d0209cddb79 100644
--- a/app/assets/images/emoji/flag_pr.png
+++ b/public/-/emojis/1/flag_pr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ps.png b/public/-/emojis/1/flag_ps.png
index 7ccab09778b..7ccab09778b 100644
--- a/app/assets/images/emoji/flag_ps.png
+++ b/public/-/emojis/1/flag_ps.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pt.png b/public/-/emojis/1/flag_pt.png
index cc93f27c64b..cc93f27c64b 100644
--- a/app/assets/images/emoji/flag_pt.png
+++ b/public/-/emojis/1/flag_pt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_pw.png b/public/-/emojis/1/flag_pw.png
index 154b2f12d3c..154b2f12d3c 100644
--- a/app/assets/images/emoji/flag_pw.png
+++ b/public/-/emojis/1/flag_pw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_py.png b/public/-/emojis/1/flag_py.png
index 662ad2f6ff1..662ad2f6ff1 100644
--- a/app/assets/images/emoji/flag_py.png
+++ b/public/-/emojis/1/flag_py.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_qa.png b/public/-/emojis/1/flag_qa.png
index a01d8b05cc7..a01d8b05cc7 100644
--- a/app/assets/images/emoji/flag_qa.png
+++ b/public/-/emojis/1/flag_qa.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_re.png b/public/-/emojis/1/flag_re.png
index 57f2bbe9df8..57f2bbe9df8 100644
--- a/app/assets/images/emoji/flag_re.png
+++ b/public/-/emojis/1/flag_re.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ro.png b/public/-/emojis/1/flag_ro.png
index 3e48c447706..3e48c447706 100644
--- a/app/assets/images/emoji/flag_ro.png
+++ b/public/-/emojis/1/flag_ro.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_rs.png b/public/-/emojis/1/flag_rs.png
index 9df6c9a5235..9df6c9a5235 100644
--- a/app/assets/images/emoji/flag_rs.png
+++ b/public/-/emojis/1/flag_rs.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ru.png b/public/-/emojis/1/flag_ru.png
index e50c9db90e7..e50c9db90e7 100644
--- a/app/assets/images/emoji/flag_ru.png
+++ b/public/-/emojis/1/flag_ru.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_rw.png b/public/-/emojis/1/flag_rw.png
index c238c874e1d..c238c874e1d 100644
--- a/app/assets/images/emoji/flag_rw.png
+++ b/public/-/emojis/1/flag_rw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sa.png b/public/-/emojis/1/flag_sa.png
index 4941be7d198..4941be7d198 100644
--- a/app/assets/images/emoji/flag_sa.png
+++ b/public/-/emojis/1/flag_sa.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sb.png b/public/-/emojis/1/flag_sb.png
index 7d8f1ac6130..7d8f1ac6130 100644
--- a/app/assets/images/emoji/flag_sb.png
+++ b/public/-/emojis/1/flag_sb.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sc.png b/public/-/emojis/1/flag_sc.png
index 6ae4d90765e..6ae4d90765e 100644
--- a/app/assets/images/emoji/flag_sc.png
+++ b/public/-/emojis/1/flag_sc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sd.png b/public/-/emojis/1/flag_sd.png
index 963be1b36fb..963be1b36fb 100644
--- a/app/assets/images/emoji/flag_sd.png
+++ b/public/-/emojis/1/flag_sd.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_se.png b/public/-/emojis/1/flag_se.png
index fc0d0e0ce89..fc0d0e0ce89 100644
--- a/app/assets/images/emoji/flag_se.png
+++ b/public/-/emojis/1/flag_se.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sg.png b/public/-/emojis/1/flag_sg.png
index de3c7737c42..de3c7737c42 100644
--- a/app/assets/images/emoji/flag_sg.png
+++ b/public/-/emojis/1/flag_sg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sh.png b/public/-/emojis/1/flag_sh.png
index 40cd9e44e96..40cd9e44e96 100644
--- a/app/assets/images/emoji/flag_sh.png
+++ b/public/-/emojis/1/flag_sh.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_si.png b/public/-/emojis/1/flag_si.png
index e308999dba2..e308999dba2 100644
--- a/app/assets/images/emoji/flag_si.png
+++ b/public/-/emojis/1/flag_si.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sj.png b/public/-/emojis/1/flag_sj.png
index 5884e648228..5884e648228 100644
--- a/app/assets/images/emoji/flag_sj.png
+++ b/public/-/emojis/1/flag_sj.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sk.png b/public/-/emojis/1/flag_sk.png
index 4259d0e1418..4259d0e1418 100644
--- a/app/assets/images/emoji/flag_sk.png
+++ b/public/-/emojis/1/flag_sk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sl.png b/public/-/emojis/1/flag_sl.png
index d2cc68830ab..d2cc68830ab 100644
--- a/app/assets/images/emoji/flag_sl.png
+++ b/public/-/emojis/1/flag_sl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sm.png b/public/-/emojis/1/flag_sm.png
index 03b8708754e..03b8708754e 100644
--- a/app/assets/images/emoji/flag_sm.png
+++ b/public/-/emojis/1/flag_sm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sn.png b/public/-/emojis/1/flag_sn.png
index 5368bbe93df..5368bbe93df 100644
--- a/app/assets/images/emoji/flag_sn.png
+++ b/public/-/emojis/1/flag_sn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_so.png b/public/-/emojis/1/flag_so.png
index 68a0597365a..68a0597365a 100644
--- a/app/assets/images/emoji/flag_so.png
+++ b/public/-/emojis/1/flag_so.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sr.png b/public/-/emojis/1/flag_sr.png
index d3251327035..d3251327035 100644
--- a/app/assets/images/emoji/flag_sr.png
+++ b/public/-/emojis/1/flag_sr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ss.png b/public/-/emojis/1/flag_ss.png
index 122977e798f..122977e798f 100644
--- a/app/assets/images/emoji/flag_ss.png
+++ b/public/-/emojis/1/flag_ss.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_st.png b/public/-/emojis/1/flag_st.png
index f83a863d612..f83a863d612 100644
--- a/app/assets/images/emoji/flag_st.png
+++ b/public/-/emojis/1/flag_st.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sv.png b/public/-/emojis/1/flag_sv.png
index efb83e2f253..efb83e2f253 100644
--- a/app/assets/images/emoji/flag_sv.png
+++ b/public/-/emojis/1/flag_sv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sx.png b/public/-/emojis/1/flag_sx.png
index 94b760fbedf..94b760fbedf 100644
--- a/app/assets/images/emoji/flag_sx.png
+++ b/public/-/emojis/1/flag_sx.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sy.png b/public/-/emojis/1/flag_sy.png
index 09a8ee8f78c..09a8ee8f78c 100644
--- a/app/assets/images/emoji/flag_sy.png
+++ b/public/-/emojis/1/flag_sy.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_sz.png b/public/-/emojis/1/flag_sz.png
index f74e82ea1fd..f74e82ea1fd 100644
--- a/app/assets/images/emoji/flag_sz.png
+++ b/public/-/emojis/1/flag_sz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ta.png b/public/-/emojis/1/flag_ta.png
index b44283e90e2..b44283e90e2 100644
--- a/app/assets/images/emoji/flag_ta.png
+++ b/public/-/emojis/1/flag_ta.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tc.png b/public/-/emojis/1/flag_tc.png
index 156b33d1ba6..156b33d1ba6 100644
--- a/app/assets/images/emoji/flag_tc.png
+++ b/public/-/emojis/1/flag_tc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_td.png b/public/-/emojis/1/flag_td.png
index ebe7f592828..ebe7f592828 100644
--- a/app/assets/images/emoji/flag_td.png
+++ b/public/-/emojis/1/flag_td.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tf.png b/public/-/emojis/1/flag_tf.png
index a1a3ad68ee2..a1a3ad68ee2 100644
--- a/app/assets/images/emoji/flag_tf.png
+++ b/public/-/emojis/1/flag_tf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tg.png b/public/-/emojis/1/flag_tg.png
index 826b73c9ac5..826b73c9ac5 100644
--- a/app/assets/images/emoji/flag_tg.png
+++ b/public/-/emojis/1/flag_tg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_th.png b/public/-/emojis/1/flag_th.png
index 93ff542c5a6..93ff542c5a6 100644
--- a/app/assets/images/emoji/flag_th.png
+++ b/public/-/emojis/1/flag_th.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tj.png b/public/-/emojis/1/flag_tj.png
index 7a8a0b6190a..7a8a0b6190a 100644
--- a/app/assets/images/emoji/flag_tj.png
+++ b/public/-/emojis/1/flag_tj.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tk.png b/public/-/emojis/1/flag_tk.png
index 2fa5a21b1bb..2fa5a21b1bb 100644
--- a/app/assets/images/emoji/flag_tk.png
+++ b/public/-/emojis/1/flag_tk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tl.png b/public/-/emojis/1/flag_tl.png
index 5b120eccc6f..5b120eccc6f 100644
--- a/app/assets/images/emoji/flag_tl.png
+++ b/public/-/emojis/1/flag_tl.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tm.png b/public/-/emojis/1/flag_tm.png
index c3c4f532302..c3c4f532302 100644
--- a/app/assets/images/emoji/flag_tm.png
+++ b/public/-/emojis/1/flag_tm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tn.png b/public/-/emojis/1/flag_tn.png
index 58ef161229f..58ef161229f 100644
--- a/app/assets/images/emoji/flag_tn.png
+++ b/public/-/emojis/1/flag_tn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_to.png b/public/-/emojis/1/flag_to.png
index 1ffa7bb9d19..1ffa7bb9d19 100644
--- a/app/assets/images/emoji/flag_to.png
+++ b/public/-/emojis/1/flag_to.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tr.png b/public/-/emojis/1/flag_tr.png
index 325251fae88..325251fae88 100644
--- a/app/assets/images/emoji/flag_tr.png
+++ b/public/-/emojis/1/flag_tr.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tt.png b/public/-/emojis/1/flag_tt.png
index ed3bb39a300..ed3bb39a300 100644
--- a/app/assets/images/emoji/flag_tt.png
+++ b/public/-/emojis/1/flag_tt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tv.png b/public/-/emojis/1/flag_tv.png
index e82c65c7bb9..e82c65c7bb9 100644
--- a/app/assets/images/emoji/flag_tv.png
+++ b/public/-/emojis/1/flag_tv.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tw.png b/public/-/emojis/1/flag_tw.png
index 3a8f00b5928..3a8f00b5928 100644
--- a/app/assets/images/emoji/flag_tw.png
+++ b/public/-/emojis/1/flag_tw.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_tz.png b/public/-/emojis/1/flag_tz.png
index 2a020853d4e..2a020853d4e 100644
--- a/app/assets/images/emoji/flag_tz.png
+++ b/public/-/emojis/1/flag_tz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ua.png b/public/-/emojis/1/flag_ua.png
index cd84d1bbd36..cd84d1bbd36 100644
--- a/app/assets/images/emoji/flag_ua.png
+++ b/public/-/emojis/1/flag_ua.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ug.png b/public/-/emojis/1/flag_ug.png
index dc97690eb55..dc97690eb55 100644
--- a/app/assets/images/emoji/flag_ug.png
+++ b/public/-/emojis/1/flag_ug.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_um.png b/public/-/emojis/1/flag_um.png
index 4a7ee3cdf13..4a7ee3cdf13 100644
--- a/app/assets/images/emoji/flag_um.png
+++ b/public/-/emojis/1/flag_um.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_us.png b/public/-/emojis/1/flag_us.png
index 9f730305860..9f730305860 100644
--- a/app/assets/images/emoji/flag_us.png
+++ b/public/-/emojis/1/flag_us.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_uy.png b/public/-/emojis/1/flag_uy.png
index b8002a697a6..b8002a697a6 100644
--- a/app/assets/images/emoji/flag_uy.png
+++ b/public/-/emojis/1/flag_uy.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_uz.png b/public/-/emojis/1/flag_uz.png
index d56ca9bc424..d56ca9bc424 100644
--- a/app/assets/images/emoji/flag_uz.png
+++ b/public/-/emojis/1/flag_uz.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_va.png b/public/-/emojis/1/flag_va.png
index ddaf5e3141b..ddaf5e3141b 100644
--- a/app/assets/images/emoji/flag_va.png
+++ b/public/-/emojis/1/flag_va.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_vc.png b/public/-/emojis/1/flag_vc.png
index 43703c62a71..43703c62a71 100644
--- a/app/assets/images/emoji/flag_vc.png
+++ b/public/-/emojis/1/flag_vc.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ve.png b/public/-/emojis/1/flag_ve.png
index 1b62796824e..1b62796824e 100644
--- a/app/assets/images/emoji/flag_ve.png
+++ b/public/-/emojis/1/flag_ve.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_vg.png b/public/-/emojis/1/flag_vg.png
index 536f780f1c0..536f780f1c0 100644
--- a/app/assets/images/emoji/flag_vg.png
+++ b/public/-/emojis/1/flag_vg.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_vi.png b/public/-/emojis/1/flag_vi.png
index 64102012cfe..64102012cfe 100644
--- a/app/assets/images/emoji/flag_vi.png
+++ b/public/-/emojis/1/flag_vi.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_vn.png b/public/-/emojis/1/flag_vn.png
index 427036046b6..427036046b6 100644
--- a/app/assets/images/emoji/flag_vn.png
+++ b/public/-/emojis/1/flag_vn.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_vu.png b/public/-/emojis/1/flag_vu.png
index 706eba44070..706eba44070 100644
--- a/app/assets/images/emoji/flag_vu.png
+++ b/public/-/emojis/1/flag_vu.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_wf.png b/public/-/emojis/1/flag_wf.png
index 70c761036bd..70c761036bd 100644
--- a/app/assets/images/emoji/flag_wf.png
+++ b/public/-/emojis/1/flag_wf.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_white.png b/public/-/emojis/1/flag_white.png
index 86d6e96d5e9..86d6e96d5e9 100644
--- a/app/assets/images/emoji/flag_white.png
+++ b/public/-/emojis/1/flag_white.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ws.png b/public/-/emojis/1/flag_ws.png
index a1ea0703141..a1ea0703141 100644
--- a/app/assets/images/emoji/flag_ws.png
+++ b/public/-/emojis/1/flag_ws.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_xk.png b/public/-/emojis/1/flag_xk.png
index e587a446632..e587a446632 100644
--- a/app/assets/images/emoji/flag_xk.png
+++ b/public/-/emojis/1/flag_xk.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_ye.png b/public/-/emojis/1/flag_ye.png
index eadfebd5f67..eadfebd5f67 100644
--- a/app/assets/images/emoji/flag_ye.png
+++ b/public/-/emojis/1/flag_ye.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_yt.png b/public/-/emojis/1/flag_yt.png
index c81fa6d886e..c81fa6d886e 100644
--- a/app/assets/images/emoji/flag_yt.png
+++ b/public/-/emojis/1/flag_yt.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_za.png b/public/-/emojis/1/flag_za.png
index f397ef5072f..f397ef5072f 100644
--- a/app/assets/images/emoji/flag_za.png
+++ b/public/-/emojis/1/flag_za.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_zm.png b/public/-/emojis/1/flag_zm.png
index 2494a31f662..2494a31f662 100644
--- a/app/assets/images/emoji/flag_zm.png
+++ b/public/-/emojis/1/flag_zm.png
Binary files differ
diff --git a/app/assets/images/emoji/flag_zw.png b/public/-/emojis/1/flag_zw.png
index e09b9652be6..e09b9652be6 100644
--- a/app/assets/images/emoji/flag_zw.png
+++ b/public/-/emojis/1/flag_zw.png
Binary files differ
diff --git a/app/assets/images/emoji/flags.png b/public/-/emojis/1/flags.png
index 3b451035a3a..3b451035a3a 100644
--- a/app/assets/images/emoji/flags.png
+++ b/public/-/emojis/1/flags.png
Binary files differ
diff --git a/app/assets/images/emoji/flashlight.png b/public/-/emojis/1/flashlight.png
index eee36c25067..eee36c25067 100644
--- a/app/assets/images/emoji/flashlight.png
+++ b/public/-/emojis/1/flashlight.png
Binary files differ
diff --git a/app/assets/images/emoji/fleur-de-lis.png b/public/-/emojis/1/fleur-de-lis.png
index c9250d27fa7..c9250d27fa7 100644
--- a/app/assets/images/emoji/fleur-de-lis.png
+++ b/public/-/emojis/1/fleur-de-lis.png
Binary files differ
diff --git a/app/assets/images/emoji/floppy_disk.png b/public/-/emojis/1/floppy_disk.png
index 072a76d3c13..072a76d3c13 100644
--- a/app/assets/images/emoji/floppy_disk.png
+++ b/public/-/emojis/1/floppy_disk.png
Binary files differ
diff --git a/app/assets/images/emoji/flower_playing_cards.png b/public/-/emojis/1/flower_playing_cards.png
index 6766b044d95..6766b044d95 100644
--- a/app/assets/images/emoji/flower_playing_cards.png
+++ b/public/-/emojis/1/flower_playing_cards.png
Binary files differ
diff --git a/app/assets/images/emoji/flushed.png b/public/-/emojis/1/flushed.png
index 829220bc470..829220bc470 100644
--- a/app/assets/images/emoji/flushed.png
+++ b/public/-/emojis/1/flushed.png
Binary files differ
diff --git a/app/assets/images/emoji/fog.png b/public/-/emojis/1/fog.png
index 4e73c2de272..4e73c2de272 100644
--- a/app/assets/images/emoji/fog.png
+++ b/public/-/emojis/1/fog.png
Binary files differ
diff --git a/app/assets/images/emoji/foggy.png b/public/-/emojis/1/foggy.png
index 57702d8d3ac..57702d8d3ac 100644
--- a/app/assets/images/emoji/foggy.png
+++ b/public/-/emojis/1/foggy.png
Binary files differ
diff --git a/app/assets/images/emoji/football.png b/public/-/emojis/1/football.png
index 10366f41fce..10366f41fce 100644
--- a/app/assets/images/emoji/football.png
+++ b/public/-/emojis/1/football.png
Binary files differ
diff --git a/app/assets/images/emoji/footprints.png b/public/-/emojis/1/footprints.png
index b2673c5a1a8..b2673c5a1a8 100644
--- a/app/assets/images/emoji/footprints.png
+++ b/public/-/emojis/1/footprints.png
Binary files differ
diff --git a/app/assets/images/emoji/fork_and_knife.png b/public/-/emojis/1/fork_and_knife.png
index 09f1feaea1c..09f1feaea1c 100644
--- a/app/assets/images/emoji/fork_and_knife.png
+++ b/public/-/emojis/1/fork_and_knife.png
Binary files differ
diff --git a/app/assets/images/emoji/fork_knife_plate.png b/public/-/emojis/1/fork_knife_plate.png
index 7411755f708..7411755f708 100644
--- a/app/assets/images/emoji/fork_knife_plate.png
+++ b/public/-/emojis/1/fork_knife_plate.png
Binary files differ
diff --git a/app/assets/images/emoji/fountain.png b/public/-/emojis/1/fountain.png
index 293f5d91c0f..293f5d91c0f 100644
--- a/app/assets/images/emoji/fountain.png
+++ b/public/-/emojis/1/fountain.png
Binary files differ
diff --git a/app/assets/images/emoji/four.png b/public/-/emojis/1/four.png
index b0e914aac45..b0e914aac45 100644
--- a/app/assets/images/emoji/four.png
+++ b/public/-/emojis/1/four.png
Binary files differ
diff --git a/app/assets/images/emoji/four_leaf_clover.png b/public/-/emojis/1/four_leaf_clover.png
index fdedfcc2b4e..fdedfcc2b4e 100644
--- a/app/assets/images/emoji/four_leaf_clover.png
+++ b/public/-/emojis/1/four_leaf_clover.png
Binary files differ
diff --git a/app/assets/images/emoji/fox.png b/public/-/emojis/1/fox.png
index 1ab339bf054..1ab339bf054 100644
--- a/app/assets/images/emoji/fox.png
+++ b/public/-/emojis/1/fox.png
Binary files differ
diff --git a/app/assets/images/emoji/frame_photo.png b/public/-/emojis/1/frame_photo.png
index 9fe84607bfd..9fe84607bfd 100644
--- a/app/assets/images/emoji/frame_photo.png
+++ b/public/-/emojis/1/frame_photo.png
Binary files differ
diff --git a/app/assets/images/emoji/free.png b/public/-/emojis/1/free.png
index b71956eb48a..b71956eb48a 100644
--- a/app/assets/images/emoji/free.png
+++ b/public/-/emojis/1/free.png
Binary files differ
diff --git a/app/assets/images/emoji/french_bread.png b/public/-/emojis/1/french_bread.png
index 4c2c5639822..4c2c5639822 100644
--- a/app/assets/images/emoji/french_bread.png
+++ b/public/-/emojis/1/french_bread.png
Binary files differ
diff --git a/app/assets/images/emoji/fried_shrimp.png b/public/-/emojis/1/fried_shrimp.png
index 752ba7f1398..752ba7f1398 100644
--- a/app/assets/images/emoji/fried_shrimp.png
+++ b/public/-/emojis/1/fried_shrimp.png
Binary files differ
diff --git a/app/assets/images/emoji/fries.png b/public/-/emojis/1/fries.png
index 4e2a4caacef..4e2a4caacef 100644
--- a/app/assets/images/emoji/fries.png
+++ b/public/-/emojis/1/fries.png
Binary files differ
diff --git a/app/assets/images/emoji/frog.png b/public/-/emojis/1/frog.png
index 8825d1ad577..8825d1ad577 100644
--- a/app/assets/images/emoji/frog.png
+++ b/public/-/emojis/1/frog.png
Binary files differ
diff --git a/app/assets/images/emoji/frowning.png b/public/-/emojis/1/frowning.png
index 43ab6b0a1c1..43ab6b0a1c1 100644
--- a/app/assets/images/emoji/frowning.png
+++ b/public/-/emojis/1/frowning.png
Binary files differ
diff --git a/app/assets/images/emoji/frowning2.png b/public/-/emojis/1/frowning2.png
index 6ae71f233b9..6ae71f233b9 100644
--- a/app/assets/images/emoji/frowning2.png
+++ b/public/-/emojis/1/frowning2.png
Binary files differ
diff --git a/app/assets/images/emoji/fuelpump.png b/public/-/emojis/1/fuelpump.png
index 05b18794474..05b18794474 100644
--- a/app/assets/images/emoji/fuelpump.png
+++ b/public/-/emojis/1/fuelpump.png
Binary files differ
diff --git a/app/assets/images/emoji/full_moon.png b/public/-/emojis/1/full_moon.png
index c9a2d6aa7c9..c9a2d6aa7c9 100644
--- a/app/assets/images/emoji/full_moon.png
+++ b/public/-/emojis/1/full_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/full_moon_with_face.png b/public/-/emojis/1/full_moon_with_face.png
index a5c25bbaf64..a5c25bbaf64 100644
--- a/app/assets/images/emoji/full_moon_with_face.png
+++ b/public/-/emojis/1/full_moon_with_face.png
Binary files differ
diff --git a/app/assets/images/emoji/game_die.png b/public/-/emojis/1/game_die.png
index ad3626fe5e5..ad3626fe5e5 100644
--- a/app/assets/images/emoji/game_die.png
+++ b/public/-/emojis/1/game_die.png
Binary files differ
diff --git a/app/assets/images/emoji/gay_pride_flag.png b/public/-/emojis/1/gay_pride_flag.png
index 1bec5f2ffd7..1bec5f2ffd7 100644
--- a/app/assets/images/emoji/gay_pride_flag.png
+++ b/public/-/emojis/1/gay_pride_flag.png
Binary files differ
diff --git a/app/assets/images/emoji/gear.png b/public/-/emojis/1/gear.png
index 2a1cc2c0ff4..2a1cc2c0ff4 100644
--- a/app/assets/images/emoji/gear.png
+++ b/public/-/emojis/1/gear.png
Binary files differ
diff --git a/app/assets/images/emoji/gem.png b/public/-/emojis/1/gem.png
index db122d26a19..db122d26a19 100644
--- a/app/assets/images/emoji/gem.png
+++ b/public/-/emojis/1/gem.png
Binary files differ
diff --git a/app/assets/images/emoji/gemini.png b/public/-/emojis/1/gemini.png
index 1a09698cf00..1a09698cf00 100644
--- a/app/assets/images/emoji/gemini.png
+++ b/public/-/emojis/1/gemini.png
Binary files differ
diff --git a/app/assets/images/emoji/ghost.png b/public/-/emojis/1/ghost.png
index 5650bc0ed18..5650bc0ed18 100644
--- a/app/assets/images/emoji/ghost.png
+++ b/public/-/emojis/1/ghost.png
Binary files differ
diff --git a/app/assets/images/emoji/gift.png b/public/-/emojis/1/gift.png
index 844e2164560..844e2164560 100644
--- a/app/assets/images/emoji/gift.png
+++ b/public/-/emojis/1/gift.png
Binary files differ
diff --git a/app/assets/images/emoji/gift_heart.png b/public/-/emojis/1/gift_heart.png
index 902ceafe4d1..902ceafe4d1 100644
--- a/app/assets/images/emoji/gift_heart.png
+++ b/public/-/emojis/1/gift_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/girl.png b/public/-/emojis/1/girl.png
index dc1d4d08b39..dc1d4d08b39 100644
--- a/app/assets/images/emoji/girl.png
+++ b/public/-/emojis/1/girl.png
Binary files differ
diff --git a/app/assets/images/emoji/girl_tone1.png b/public/-/emojis/1/girl_tone1.png
index bb667e88651..bb667e88651 100644
--- a/app/assets/images/emoji/girl_tone1.png
+++ b/public/-/emojis/1/girl_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/girl_tone2.png b/public/-/emojis/1/girl_tone2.png
index a59ed4a3f0d..a59ed4a3f0d 100644
--- a/app/assets/images/emoji/girl_tone2.png
+++ b/public/-/emojis/1/girl_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/girl_tone3.png b/public/-/emojis/1/girl_tone3.png
index 517e7f2a7b0..517e7f2a7b0 100644
--- a/app/assets/images/emoji/girl_tone3.png
+++ b/public/-/emojis/1/girl_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/girl_tone4.png b/public/-/emojis/1/girl_tone4.png
index 542d96c8487..542d96c8487 100644
--- a/app/assets/images/emoji/girl_tone4.png
+++ b/public/-/emojis/1/girl_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/girl_tone5.png b/public/-/emojis/1/girl_tone5.png
index 66b7c28c2df..66b7c28c2df 100644
--- a/app/assets/images/emoji/girl_tone5.png
+++ b/public/-/emojis/1/girl_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/globe_with_meridians.png b/public/-/emojis/1/globe_with_meridians.png
index 82450c1a4ba..82450c1a4ba 100644
--- a/app/assets/images/emoji/globe_with_meridians.png
+++ b/public/-/emojis/1/globe_with_meridians.png
Binary files differ
diff --git a/app/assets/images/emoji/goal.png b/public/-/emojis/1/goal.png
index df3a53da0fb..df3a53da0fb 100644
--- a/app/assets/images/emoji/goal.png
+++ b/public/-/emojis/1/goal.png
Binary files differ
diff --git a/app/assets/images/emoji/goat.png b/public/-/emojis/1/goat.png
index f9d9e38a128..f9d9e38a128 100644
--- a/app/assets/images/emoji/goat.png
+++ b/public/-/emojis/1/goat.png
Binary files differ
diff --git a/app/assets/images/emoji/golf.png b/public/-/emojis/1/golf.png
index f65a21d8a46..f65a21d8a46 100644
--- a/app/assets/images/emoji/golf.png
+++ b/public/-/emojis/1/golf.png
Binary files differ
diff --git a/app/assets/images/emoji/golfer.png b/public/-/emojis/1/golfer.png
index 39c552de86d..39c552de86d 100644
--- a/app/assets/images/emoji/golfer.png
+++ b/public/-/emojis/1/golfer.png
Binary files differ
diff --git a/app/assets/images/emoji/gorilla.png b/public/-/emojis/1/gorilla.png
index acc51e13622..acc51e13622 100644
--- a/app/assets/images/emoji/gorilla.png
+++ b/public/-/emojis/1/gorilla.png
Binary files differ
diff --git a/app/assets/images/emoji/grapes.png b/public/-/emojis/1/grapes.png
index 30d22218896..30d22218896 100644
--- a/app/assets/images/emoji/grapes.png
+++ b/public/-/emojis/1/grapes.png
Binary files differ
diff --git a/app/assets/images/emoji/green_apple.png b/public/-/emojis/1/green_apple.png
index 5fd51bd3915..5fd51bd3915 100644
--- a/app/assets/images/emoji/green_apple.png
+++ b/public/-/emojis/1/green_apple.png
Binary files differ
diff --git a/app/assets/images/emoji/green_book.png b/public/-/emojis/1/green_book.png
index e5e411cf3b5..e5e411cf3b5 100644
--- a/app/assets/images/emoji/green_book.png
+++ b/public/-/emojis/1/green_book.png
Binary files differ
diff --git a/app/assets/images/emoji/green_heart.png b/public/-/emojis/1/green_heart.png
index c52d60a58be..c52d60a58be 100644
--- a/app/assets/images/emoji/green_heart.png
+++ b/public/-/emojis/1/green_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/grey_exclamation.png b/public/-/emojis/1/grey_exclamation.png
index 9b64da8bf7f..9b64da8bf7f 100644
--- a/app/assets/images/emoji/grey_exclamation.png
+++ b/public/-/emojis/1/grey_exclamation.png
Binary files differ
diff --git a/app/assets/images/emoji/grey_question.png b/public/-/emojis/1/grey_question.png
index 6e7824c75f6..6e7824c75f6 100644
--- a/app/assets/images/emoji/grey_question.png
+++ b/public/-/emojis/1/grey_question.png
Binary files differ
diff --git a/app/assets/images/emoji/grimacing.png b/public/-/emojis/1/grimacing.png
index 871b2f071c9..871b2f071c9 100644
--- a/app/assets/images/emoji/grimacing.png
+++ b/public/-/emojis/1/grimacing.png
Binary files differ
diff --git a/app/assets/images/emoji/grin.png b/public/-/emojis/1/grin.png
index 418d94c811b..418d94c811b 100644
--- a/app/assets/images/emoji/grin.png
+++ b/public/-/emojis/1/grin.png
Binary files differ
diff --git a/app/assets/images/emoji/grinning.png b/public/-/emojis/1/grinning.png
index 3e8e0dab78c..3e8e0dab78c 100644
--- a/app/assets/images/emoji/grinning.png
+++ b/public/-/emojis/1/grinning.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman.png b/public/-/emojis/1/guardsman.png
index 8d7ab3c473c..8d7ab3c473c 100644
--- a/app/assets/images/emoji/guardsman.png
+++ b/public/-/emojis/1/guardsman.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman_tone1.png b/public/-/emojis/1/guardsman_tone1.png
index cea9ba27468..cea9ba27468 100644
--- a/app/assets/images/emoji/guardsman_tone1.png
+++ b/public/-/emojis/1/guardsman_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman_tone2.png b/public/-/emojis/1/guardsman_tone2.png
index 037464e4028..037464e4028 100644
--- a/app/assets/images/emoji/guardsman_tone2.png
+++ b/public/-/emojis/1/guardsman_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman_tone3.png b/public/-/emojis/1/guardsman_tone3.png
index 0f6726fbe87..0f6726fbe87 100644
--- a/app/assets/images/emoji/guardsman_tone3.png
+++ b/public/-/emojis/1/guardsman_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman_tone4.png b/public/-/emojis/1/guardsman_tone4.png
index 85fcf9a3b97..85fcf9a3b97 100644
--- a/app/assets/images/emoji/guardsman_tone4.png
+++ b/public/-/emojis/1/guardsman_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/guardsman_tone5.png b/public/-/emojis/1/guardsman_tone5.png
index e5f9ca7d5a2..e5f9ca7d5a2 100644
--- a/app/assets/images/emoji/guardsman_tone5.png
+++ b/public/-/emojis/1/guardsman_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/guitar.png b/public/-/emojis/1/guitar.png
index 43d752f1e3d..43d752f1e3d 100644
--- a/app/assets/images/emoji/guitar.png
+++ b/public/-/emojis/1/guitar.png
Binary files differ
diff --git a/app/assets/images/emoji/gun.png b/public/-/emojis/1/gun.png
index 89c5c244c7b..89c5c244c7b 100644
--- a/app/assets/images/emoji/gun.png
+++ b/public/-/emojis/1/gun.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut.png b/public/-/emojis/1/haircut.png
index 91266b12930..91266b12930 100644
--- a/app/assets/images/emoji/haircut.png
+++ b/public/-/emojis/1/haircut.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut_tone1.png b/public/-/emojis/1/haircut_tone1.png
index c743b74abeb..c743b74abeb 100644
--- a/app/assets/images/emoji/haircut_tone1.png
+++ b/public/-/emojis/1/haircut_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut_tone2.png b/public/-/emojis/1/haircut_tone2.png
index f144f8e55ce..f144f8e55ce 100644
--- a/app/assets/images/emoji/haircut_tone2.png
+++ b/public/-/emojis/1/haircut_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut_tone3.png b/public/-/emojis/1/haircut_tone3.png
index d5ad19563ac..d5ad19563ac 100644
--- a/app/assets/images/emoji/haircut_tone3.png
+++ b/public/-/emojis/1/haircut_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut_tone4.png b/public/-/emojis/1/haircut_tone4.png
index 244fd3af008..244fd3af008 100644
--- a/app/assets/images/emoji/haircut_tone4.png
+++ b/public/-/emojis/1/haircut_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/haircut_tone5.png b/public/-/emojis/1/haircut_tone5.png
index 20a94a88623..20a94a88623 100644
--- a/app/assets/images/emoji/haircut_tone5.png
+++ b/public/-/emojis/1/haircut_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/hamburger.png b/public/-/emojis/1/hamburger.png
index 3573b28a1fd..3573b28a1fd 100644
--- a/app/assets/images/emoji/hamburger.png
+++ b/public/-/emojis/1/hamburger.png
Binary files differ
diff --git a/app/assets/images/emoji/hammer.png b/public/-/emojis/1/hammer.png
index 00736cce47d..00736cce47d 100644
--- a/app/assets/images/emoji/hammer.png
+++ b/public/-/emojis/1/hammer.png
Binary files differ
diff --git a/app/assets/images/emoji/hammer_pick.png b/public/-/emojis/1/hammer_pick.png
index 3bee30ec588..3bee30ec588 100644
--- a/app/assets/images/emoji/hammer_pick.png
+++ b/public/-/emojis/1/hammer_pick.png
Binary files differ
diff --git a/app/assets/images/emoji/hamster.png b/public/-/emojis/1/hamster.png
index 9a04388e4e7..9a04388e4e7 100644
--- a/app/assets/images/emoji/hamster.png
+++ b/public/-/emojis/1/hamster.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed.png b/public/-/emojis/1/hand_splayed.png
index fb5ae8ebb5a..fb5ae8ebb5a 100644
--- a/app/assets/images/emoji/hand_splayed.png
+++ b/public/-/emojis/1/hand_splayed.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed_tone1.png b/public/-/emojis/1/hand_splayed_tone1.png
index a7888e6bd23..a7888e6bd23 100644
--- a/app/assets/images/emoji/hand_splayed_tone1.png
+++ b/public/-/emojis/1/hand_splayed_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed_tone2.png b/public/-/emojis/1/hand_splayed_tone2.png
index cc10fbc272d..cc10fbc272d 100644
--- a/app/assets/images/emoji/hand_splayed_tone2.png
+++ b/public/-/emojis/1/hand_splayed_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed_tone3.png b/public/-/emojis/1/hand_splayed_tone3.png
index 707236ae8a4..707236ae8a4 100644
--- a/app/assets/images/emoji/hand_splayed_tone3.png
+++ b/public/-/emojis/1/hand_splayed_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed_tone4.png b/public/-/emojis/1/hand_splayed_tone4.png
index 1430df9c61f..1430df9c61f 100644
--- a/app/assets/images/emoji/hand_splayed_tone4.png
+++ b/public/-/emojis/1/hand_splayed_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/hand_splayed_tone5.png b/public/-/emojis/1/hand_splayed_tone5.png
index 80bec971b6b..80bec971b6b 100644
--- a/app/assets/images/emoji/hand_splayed_tone5.png
+++ b/public/-/emojis/1/hand_splayed_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/handbag.png b/public/-/emojis/1/handbag.png
index cbf75c5d25e..cbf75c5d25e 100644
--- a/app/assets/images/emoji/handbag.png
+++ b/public/-/emojis/1/handbag.png
Binary files differ
diff --git a/app/assets/images/emoji/handball.png b/public/-/emojis/1/handball.png
index 1152f1344c7..1152f1344c7 100644
--- a/app/assets/images/emoji/handball.png
+++ b/public/-/emojis/1/handball.png
Binary files differ
diff --git a/app/assets/images/emoji/handball_tone1.png b/public/-/emojis/1/handball_tone1.png
index c26cac2df98..c26cac2df98 100644
--- a/app/assets/images/emoji/handball_tone1.png
+++ b/public/-/emojis/1/handball_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/handball_tone2.png b/public/-/emojis/1/handball_tone2.png
index 7baaf95a9a2..7baaf95a9a2 100644
--- a/app/assets/images/emoji/handball_tone2.png
+++ b/public/-/emojis/1/handball_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/handball_tone3.png b/public/-/emojis/1/handball_tone3.png
index 0e3a37c3d40..0e3a37c3d40 100644
--- a/app/assets/images/emoji/handball_tone3.png
+++ b/public/-/emojis/1/handball_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/handball_tone4.png b/public/-/emojis/1/handball_tone4.png
index e1233f38266..e1233f38266 100644
--- a/app/assets/images/emoji/handball_tone4.png
+++ b/public/-/emojis/1/handball_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/handball_tone5.png b/public/-/emojis/1/handball_tone5.png
index 6b1eb9b64b0..6b1eb9b64b0 100644
--- a/app/assets/images/emoji/handball_tone5.png
+++ b/public/-/emojis/1/handball_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake.png b/public/-/emojis/1/handshake.png
index c5d35fd8138..c5d35fd8138 100644
--- a/app/assets/images/emoji/handshake.png
+++ b/public/-/emojis/1/handshake.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake_tone1.png b/public/-/emojis/1/handshake_tone1.png
index 8f8fbb9bdca..8f8fbb9bdca 100644
--- a/app/assets/images/emoji/handshake_tone1.png
+++ b/public/-/emojis/1/handshake_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake_tone2.png b/public/-/emojis/1/handshake_tone2.png
index 336a77a6d78..336a77a6d78 100644
--- a/app/assets/images/emoji/handshake_tone2.png
+++ b/public/-/emojis/1/handshake_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake_tone3.png b/public/-/emojis/1/handshake_tone3.png
index 95f62d4fecd..95f62d4fecd 100644
--- a/app/assets/images/emoji/handshake_tone3.png
+++ b/public/-/emojis/1/handshake_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake_tone4.png b/public/-/emojis/1/handshake_tone4.png
index 2b0a6433886..2b0a6433886 100644
--- a/app/assets/images/emoji/handshake_tone4.png
+++ b/public/-/emojis/1/handshake_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/handshake_tone5.png b/public/-/emojis/1/handshake_tone5.png
index 40189ee68e4..40189ee68e4 100644
--- a/app/assets/images/emoji/handshake_tone5.png
+++ b/public/-/emojis/1/handshake_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/hash.png b/public/-/emojis/1/hash.png
index 6e26f0070b0..6e26f0070b0 100644
--- a/app/assets/images/emoji/hash.png
+++ b/public/-/emojis/1/hash.png
Binary files differ
diff --git a/app/assets/images/emoji/hatched_chick.png b/public/-/emojis/1/hatched_chick.png
index 31dfb511e0e..31dfb511e0e 100644
--- a/app/assets/images/emoji/hatched_chick.png
+++ b/public/-/emojis/1/hatched_chick.png
Binary files differ
diff --git a/app/assets/images/emoji/hatching_chick.png b/public/-/emojis/1/hatching_chick.png
index c5b0e8f3bcc..c5b0e8f3bcc 100644
--- a/app/assets/images/emoji/hatching_chick.png
+++ b/public/-/emojis/1/hatching_chick.png
Binary files differ
diff --git a/app/assets/images/emoji/head_bandage.png b/public/-/emojis/1/head_bandage.png
index 0be723085e0..0be723085e0 100644
--- a/app/assets/images/emoji/head_bandage.png
+++ b/public/-/emojis/1/head_bandage.png
Binary files differ
diff --git a/app/assets/images/emoji/headphones.png b/public/-/emojis/1/headphones.png
index e9fd34041d8..e9fd34041d8 100644
--- a/app/assets/images/emoji/headphones.png
+++ b/public/-/emojis/1/headphones.png
Binary files differ
diff --git a/app/assets/images/emoji/hear_no_evil.png b/public/-/emojis/1/hear_no_evil.png
index 74b6be0c6c5..74b6be0c6c5 100644
--- a/app/assets/images/emoji/hear_no_evil.png
+++ b/public/-/emojis/1/hear_no_evil.png
Binary files differ
diff --git a/app/assets/images/emoji/heart.png b/public/-/emojis/1/heart.png
index 638cb72dc4e..638cb72dc4e 100644
--- a/app/assets/images/emoji/heart.png
+++ b/public/-/emojis/1/heart.png
Binary files differ
diff --git a/app/assets/images/emoji/heart_decoration.png b/public/-/emojis/1/heart_decoration.png
index 5443f60bc63..5443f60bc63 100644
--- a/app/assets/images/emoji/heart_decoration.png
+++ b/public/-/emojis/1/heart_decoration.png
Binary files differ
diff --git a/app/assets/images/emoji/heart_exclamation.png b/public/-/emojis/1/heart_exclamation.png
index 91b520be40b..91b520be40b 100644
--- a/app/assets/images/emoji/heart_exclamation.png
+++ b/public/-/emojis/1/heart_exclamation.png
Binary files differ
diff --git a/app/assets/images/emoji/heart_eyes.png b/public/-/emojis/1/heart_eyes.png
index 73fbee29d4e..73fbee29d4e 100644
--- a/app/assets/images/emoji/heart_eyes.png
+++ b/public/-/emojis/1/heart_eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/heart_eyes_cat.png b/public/-/emojis/1/heart_eyes_cat.png
index bc5a833f9a1..bc5a833f9a1 100644
--- a/app/assets/images/emoji/heart_eyes_cat.png
+++ b/public/-/emojis/1/heart_eyes_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/heartbeat.png b/public/-/emojis/1/heartbeat.png
index 0bcf2d1d567..0bcf2d1d567 100644
--- a/app/assets/images/emoji/heartbeat.png
+++ b/public/-/emojis/1/heartbeat.png
Binary files differ
diff --git a/app/assets/images/emoji/heartpulse.png b/public/-/emojis/1/heartpulse.png
index d6e694e972f..d6e694e972f 100644
--- a/app/assets/images/emoji/heartpulse.png
+++ b/public/-/emojis/1/heartpulse.png
Binary files differ
diff --git a/app/assets/images/emoji/hearts.png b/public/-/emojis/1/hearts.png
index 393c3ed5267..393c3ed5267 100644
--- a/app/assets/images/emoji/hearts.png
+++ b/public/-/emojis/1/hearts.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_check_mark.png b/public/-/emojis/1/heavy_check_mark.png
index 03bd695377e..03bd695377e 100644
--- a/app/assets/images/emoji/heavy_check_mark.png
+++ b/public/-/emojis/1/heavy_check_mark.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_division_sign.png b/public/-/emojis/1/heavy_division_sign.png
index df32ab21bea..df32ab21bea 100644
--- a/app/assets/images/emoji/heavy_division_sign.png
+++ b/public/-/emojis/1/heavy_division_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_dollar_sign.png b/public/-/emojis/1/heavy_dollar_sign.png
index ef2c2e20590..ef2c2e20590 100644
--- a/app/assets/images/emoji/heavy_dollar_sign.png
+++ b/public/-/emojis/1/heavy_dollar_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_minus_sign.png b/public/-/emojis/1/heavy_minus_sign.png
index 054211caf12..054211caf12 100644
--- a/app/assets/images/emoji/heavy_minus_sign.png
+++ b/public/-/emojis/1/heavy_minus_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_multiplication_x.png b/public/-/emojis/1/heavy_multiplication_x.png
index e47cc1b685d..e47cc1b685d 100644
--- a/app/assets/images/emoji/heavy_multiplication_x.png
+++ b/public/-/emojis/1/heavy_multiplication_x.png
Binary files differ
diff --git a/app/assets/images/emoji/heavy_plus_sign.png b/public/-/emojis/1/heavy_plus_sign.png
index 40799798aaf..40799798aaf 100644
--- a/app/assets/images/emoji/heavy_plus_sign.png
+++ b/public/-/emojis/1/heavy_plus_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/helicopter.png b/public/-/emojis/1/helicopter.png
index 7ec5f39a51a..7ec5f39a51a 100644
--- a/app/assets/images/emoji/helicopter.png
+++ b/public/-/emojis/1/helicopter.png
Binary files differ
diff --git a/app/assets/images/emoji/helmet_with_cross.png b/public/-/emojis/1/helmet_with_cross.png
index 7140a676038..7140a676038 100644
--- a/app/assets/images/emoji/helmet_with_cross.png
+++ b/public/-/emojis/1/helmet_with_cross.png
Binary files differ
diff --git a/app/assets/images/emoji/herb.png b/public/-/emojis/1/herb.png
index d984d1562bb..d984d1562bb 100644
--- a/app/assets/images/emoji/herb.png
+++ b/public/-/emojis/1/herb.png
Binary files differ
diff --git a/app/assets/images/emoji/hibiscus.png b/public/-/emojis/1/hibiscus.png
index 39dd3524233..39dd3524233 100644
--- a/app/assets/images/emoji/hibiscus.png
+++ b/public/-/emojis/1/hibiscus.png
Binary files differ
diff --git a/app/assets/images/emoji/high_brightness.png b/public/-/emojis/1/high_brightness.png
index c41f2d5fd50..c41f2d5fd50 100644
--- a/app/assets/images/emoji/high_brightness.png
+++ b/public/-/emojis/1/high_brightness.png
Binary files differ
diff --git a/app/assets/images/emoji/high_heel.png b/public/-/emojis/1/high_heel.png
index b331cbccc9d..b331cbccc9d 100644
--- a/app/assets/images/emoji/high_heel.png
+++ b/public/-/emojis/1/high_heel.png
Binary files differ
diff --git a/app/assets/images/emoji/hockey.png b/public/-/emojis/1/hockey.png
index be94e9cbf73..be94e9cbf73 100644
--- a/app/assets/images/emoji/hockey.png
+++ b/public/-/emojis/1/hockey.png
Binary files differ
diff --git a/app/assets/images/emoji/hole.png b/public/-/emojis/1/hole.png
index 517d2ae0deb..517d2ae0deb 100644
--- a/app/assets/images/emoji/hole.png
+++ b/public/-/emojis/1/hole.png
Binary files differ
diff --git a/app/assets/images/emoji/homes.png b/public/-/emojis/1/homes.png
index 6ab4a2a2651..6ab4a2a2651 100644
--- a/app/assets/images/emoji/homes.png
+++ b/public/-/emojis/1/homes.png
Binary files differ
diff --git a/app/assets/images/emoji/honey_pot.png b/public/-/emojis/1/honey_pot.png
index 9d8f592955e..9d8f592955e 100644
--- a/app/assets/images/emoji/honey_pot.png
+++ b/public/-/emojis/1/honey_pot.png
Binary files differ
diff --git a/app/assets/images/emoji/horse.png b/public/-/emojis/1/horse.png
index 7cb1172f4e4..7cb1172f4e4 100644
--- a/app/assets/images/emoji/horse.png
+++ b/public/-/emojis/1/horse.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing.png b/public/-/emojis/1/horse_racing.png
index addf9edac56..addf9edac56 100644
--- a/app/assets/images/emoji/horse_racing.png
+++ b/public/-/emojis/1/horse_racing.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing_tone1.png b/public/-/emojis/1/horse_racing_tone1.png
index e9bf4092e98..e9bf4092e98 100644
--- a/app/assets/images/emoji/horse_racing_tone1.png
+++ b/public/-/emojis/1/horse_racing_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing_tone2.png b/public/-/emojis/1/horse_racing_tone2.png
index 031bbc3d867..031bbc3d867 100644
--- a/app/assets/images/emoji/horse_racing_tone2.png
+++ b/public/-/emojis/1/horse_racing_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing_tone3.png b/public/-/emojis/1/horse_racing_tone3.png
index b40ef891f9b..b40ef891f9b 100644
--- a/app/assets/images/emoji/horse_racing_tone3.png
+++ b/public/-/emojis/1/horse_racing_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing_tone4.png b/public/-/emojis/1/horse_racing_tone4.png
index e286cb85065..e286cb85065 100644
--- a/app/assets/images/emoji/horse_racing_tone4.png
+++ b/public/-/emojis/1/horse_racing_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/horse_racing_tone5.png b/public/-/emojis/1/horse_racing_tone5.png
index 453c51c6007..453c51c6007 100644
--- a/app/assets/images/emoji/horse_racing_tone5.png
+++ b/public/-/emojis/1/horse_racing_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/hospital.png b/public/-/emojis/1/hospital.png
index 1cbce4ae767..1cbce4ae767 100644
--- a/app/assets/images/emoji/hospital.png
+++ b/public/-/emojis/1/hospital.png
Binary files differ
diff --git a/app/assets/images/emoji/hot_pepper.png b/public/-/emojis/1/hot_pepper.png
index 266675bd577..266675bd577 100644
--- a/app/assets/images/emoji/hot_pepper.png
+++ b/public/-/emojis/1/hot_pepper.png
Binary files differ
diff --git a/app/assets/images/emoji/hotdog.png b/public/-/emojis/1/hotdog.png
index 3c3354d94cb..3c3354d94cb 100644
--- a/app/assets/images/emoji/hotdog.png
+++ b/public/-/emojis/1/hotdog.png
Binary files differ
diff --git a/app/assets/images/emoji/hotel.png b/public/-/emojis/1/hotel.png
index ea8f4c4979a..ea8f4c4979a 100644
--- a/app/assets/images/emoji/hotel.png
+++ b/public/-/emojis/1/hotel.png
Binary files differ
diff --git a/app/assets/images/emoji/hotsprings.png b/public/-/emojis/1/hotsprings.png
index 3d9df2d9475..3d9df2d9475 100644
--- a/app/assets/images/emoji/hotsprings.png
+++ b/public/-/emojis/1/hotsprings.png
Binary files differ
diff --git a/app/assets/images/emoji/hourglass.png b/public/-/emojis/1/hourglass.png
index a5db2d1d3f4..a5db2d1d3f4 100644
--- a/app/assets/images/emoji/hourglass.png
+++ b/public/-/emojis/1/hourglass.png
Binary files differ
diff --git a/app/assets/images/emoji/hourglass_flowing_sand.png b/public/-/emojis/1/hourglass_flowing_sand.png
index b93b15ed6d8..b93b15ed6d8 100644
--- a/app/assets/images/emoji/hourglass_flowing_sand.png
+++ b/public/-/emojis/1/hourglass_flowing_sand.png
Binary files differ
diff --git a/app/assets/images/emoji/house.png b/public/-/emojis/1/house.png
index 01c98a0ba92..01c98a0ba92 100644
--- a/app/assets/images/emoji/house.png
+++ b/public/-/emojis/1/house.png
Binary files differ
diff --git a/app/assets/images/emoji/house_abandoned.png b/public/-/emojis/1/house_abandoned.png
index c55e81de990..c55e81de990 100644
--- a/app/assets/images/emoji/house_abandoned.png
+++ b/public/-/emojis/1/house_abandoned.png
Binary files differ
diff --git a/app/assets/images/emoji/house_with_garden.png b/public/-/emojis/1/house_with_garden.png
index 0aae41598ef..0aae41598ef 100644
--- a/app/assets/images/emoji/house_with_garden.png
+++ b/public/-/emojis/1/house_with_garden.png
Binary files differ
diff --git a/app/assets/images/emoji/hugging.png b/public/-/emojis/1/hugging.png
index 5bba6dc6d51..5bba6dc6d51 100644
--- a/app/assets/images/emoji/hugging.png
+++ b/public/-/emojis/1/hugging.png
Binary files differ
diff --git a/app/assets/images/emoji/hushed.png b/public/-/emojis/1/hushed.png
index cad0e23132e..cad0e23132e 100644
--- a/app/assets/images/emoji/hushed.png
+++ b/public/-/emojis/1/hushed.png
Binary files differ
diff --git a/app/assets/images/emoji/ice_cream.png b/public/-/emojis/1/ice_cream.png
index 94267b9c434..94267b9c434 100644
--- a/app/assets/images/emoji/ice_cream.png
+++ b/public/-/emojis/1/ice_cream.png
Binary files differ
diff --git a/app/assets/images/emoji/ice_skate.png b/public/-/emojis/1/ice_skate.png
index 8c449b0c039..8c449b0c039 100644
--- a/app/assets/images/emoji/ice_skate.png
+++ b/public/-/emojis/1/ice_skate.png
Binary files differ
diff --git a/app/assets/images/emoji/icecream.png b/public/-/emojis/1/icecream.png
index 8f6546e31a5..8f6546e31a5 100644
--- a/app/assets/images/emoji/icecream.png
+++ b/public/-/emojis/1/icecream.png
Binary files differ
diff --git a/app/assets/images/emoji/id.png b/public/-/emojis/1/id.png
index 5bf69bf7ba8..5bf69bf7ba8 100644
--- a/app/assets/images/emoji/id.png
+++ b/public/-/emojis/1/id.png
Binary files differ
diff --git a/app/assets/images/emoji/ideograph_advantage.png b/public/-/emojis/1/ideograph_advantage.png
index 0c0d589caf0..0c0d589caf0 100644
--- a/app/assets/images/emoji/ideograph_advantage.png
+++ b/public/-/emojis/1/ideograph_advantage.png
Binary files differ
diff --git a/app/assets/images/emoji/imp.png b/public/-/emojis/1/imp.png
index 9f9a9605539..9f9a9605539 100644
--- a/app/assets/images/emoji/imp.png
+++ b/public/-/emojis/1/imp.png
Binary files differ
diff --git a/app/assets/images/emoji/inbox_tray.png b/public/-/emojis/1/inbox_tray.png
index 41a6be2b0ee..41a6be2b0ee 100644
--- a/app/assets/images/emoji/inbox_tray.png
+++ b/public/-/emojis/1/inbox_tray.png
Binary files differ
diff --git a/app/assets/images/emoji/incoming_envelope.png b/public/-/emojis/1/incoming_envelope.png
index fd22e88182e..fd22e88182e 100644
--- a/app/assets/images/emoji/incoming_envelope.png
+++ b/public/-/emojis/1/incoming_envelope.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person.png b/public/-/emojis/1/information_desk_person.png
index 55fc6294d25..55fc6294d25 100644
--- a/app/assets/images/emoji/information_desk_person.png
+++ b/public/-/emojis/1/information_desk_person.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person_tone1.png b/public/-/emojis/1/information_desk_person_tone1.png
index 3d9e2247940..3d9e2247940 100644
--- a/app/assets/images/emoji/information_desk_person_tone1.png
+++ b/public/-/emojis/1/information_desk_person_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person_tone2.png b/public/-/emojis/1/information_desk_person_tone2.png
index 879e8b7966d..879e8b7966d 100644
--- a/app/assets/images/emoji/information_desk_person_tone2.png
+++ b/public/-/emojis/1/information_desk_person_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person_tone3.png b/public/-/emojis/1/information_desk_person_tone3.png
index 307514eab67..307514eab67 100644
--- a/app/assets/images/emoji/information_desk_person_tone3.png
+++ b/public/-/emojis/1/information_desk_person_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person_tone4.png b/public/-/emojis/1/information_desk_person_tone4.png
index 297395dcb3f..297395dcb3f 100644
--- a/app/assets/images/emoji/information_desk_person_tone4.png
+++ b/public/-/emojis/1/information_desk_person_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/information_desk_person_tone5.png b/public/-/emojis/1/information_desk_person_tone5.png
index 26f8f22b28b..26f8f22b28b 100644
--- a/app/assets/images/emoji/information_desk_person_tone5.png
+++ b/public/-/emojis/1/information_desk_person_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/information_source.png b/public/-/emojis/1/information_source.png
index 871f2db9314..871f2db9314 100644
--- a/app/assets/images/emoji/information_source.png
+++ b/public/-/emojis/1/information_source.png
Binary files differ
diff --git a/app/assets/images/emoji/innocent.png b/public/-/emojis/1/innocent.png
index 57f5151124f..57f5151124f 100644
--- a/app/assets/images/emoji/innocent.png
+++ b/public/-/emojis/1/innocent.png
Binary files differ
diff --git a/app/assets/images/emoji/interrobang.png b/public/-/emojis/1/interrobang.png
index 509813e9bb2..509813e9bb2 100644
--- a/app/assets/images/emoji/interrobang.png
+++ b/public/-/emojis/1/interrobang.png
Binary files differ
diff --git a/app/assets/images/emoji/iphone.png b/public/-/emojis/1/iphone.png
index fd377acf872..fd377acf872 100644
--- a/app/assets/images/emoji/iphone.png
+++ b/public/-/emojis/1/iphone.png
Binary files differ
diff --git a/app/assets/images/emoji/island.png b/public/-/emojis/1/island.png
index 7fd834389b7..7fd834389b7 100644
--- a/app/assets/images/emoji/island.png
+++ b/public/-/emojis/1/island.png
Binary files differ
diff --git a/app/assets/images/emoji/izakaya_lantern.png b/public/-/emojis/1/izakaya_lantern.png
index dfd933f6f36..dfd933f6f36 100644
--- a/app/assets/images/emoji/izakaya_lantern.png
+++ b/public/-/emojis/1/izakaya_lantern.png
Binary files differ
diff --git a/app/assets/images/emoji/jack_o_lantern.png b/public/-/emojis/1/jack_o_lantern.png
index 44c3fc0aec9..44c3fc0aec9 100644
--- a/app/assets/images/emoji/jack_o_lantern.png
+++ b/public/-/emojis/1/jack_o_lantern.png
Binary files differ
diff --git a/app/assets/images/emoji/japan.png b/public/-/emojis/1/japan.png
index d86d0a59e12..d86d0a59e12 100644
--- a/app/assets/images/emoji/japan.png
+++ b/public/-/emojis/1/japan.png
Binary files differ
diff --git a/app/assets/images/emoji/japanese_castle.png b/public/-/emojis/1/japanese_castle.png
index 64b4e33a1ae..64b4e33a1ae 100644
--- a/app/assets/images/emoji/japanese_castle.png
+++ b/public/-/emojis/1/japanese_castle.png
Binary files differ
diff --git a/app/assets/images/emoji/japanese_goblin.png b/public/-/emojis/1/japanese_goblin.png
index 515c6a2250e..515c6a2250e 100644
--- a/app/assets/images/emoji/japanese_goblin.png
+++ b/public/-/emojis/1/japanese_goblin.png
Binary files differ
diff --git a/app/assets/images/emoji/japanese_ogre.png b/public/-/emojis/1/japanese_ogre.png
index fe8670fdaf1..fe8670fdaf1 100644
--- a/app/assets/images/emoji/japanese_ogre.png
+++ b/public/-/emojis/1/japanese_ogre.png
Binary files differ
diff --git a/app/assets/images/emoji/jeans.png b/public/-/emojis/1/jeans.png
index 2a6869d674c..2a6869d674c 100644
--- a/app/assets/images/emoji/jeans.png
+++ b/public/-/emojis/1/jeans.png
Binary files differ
diff --git a/app/assets/images/emoji/joy.png b/public/-/emojis/1/joy.png
index 0ba3b1859d8..0ba3b1859d8 100644
--- a/app/assets/images/emoji/joy.png
+++ b/public/-/emojis/1/joy.png
Binary files differ
diff --git a/app/assets/images/emoji/joy_cat.png b/public/-/emojis/1/joy_cat.png
index aac353179aa..aac353179aa 100644
--- a/app/assets/images/emoji/joy_cat.png
+++ b/public/-/emojis/1/joy_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/joystick.png b/public/-/emojis/1/joystick.png
index 1ee1905434e..1ee1905434e 100644
--- a/app/assets/images/emoji/joystick.png
+++ b/public/-/emojis/1/joystick.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling.png b/public/-/emojis/1/juggling.png
index a37f6224a42..a37f6224a42 100644
--- a/app/assets/images/emoji/juggling.png
+++ b/public/-/emojis/1/juggling.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling_tone1.png b/public/-/emojis/1/juggling_tone1.png
index c18eda40031..c18eda40031 100644
--- a/app/assets/images/emoji/juggling_tone1.png
+++ b/public/-/emojis/1/juggling_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling_tone2.png b/public/-/emojis/1/juggling_tone2.png
index de3b7a555b6..de3b7a555b6 100644
--- a/app/assets/images/emoji/juggling_tone2.png
+++ b/public/-/emojis/1/juggling_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling_tone3.png b/public/-/emojis/1/juggling_tone3.png
index 74ab6d85458..74ab6d85458 100644
--- a/app/assets/images/emoji/juggling_tone3.png
+++ b/public/-/emojis/1/juggling_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling_tone4.png b/public/-/emojis/1/juggling_tone4.png
index 1c57823203f..1c57823203f 100644
--- a/app/assets/images/emoji/juggling_tone4.png
+++ b/public/-/emojis/1/juggling_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/juggling_tone5.png b/public/-/emojis/1/juggling_tone5.png
index c343d6ee98a..c343d6ee98a 100644
--- a/app/assets/images/emoji/juggling_tone5.png
+++ b/public/-/emojis/1/juggling_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/kaaba.png b/public/-/emojis/1/kaaba.png
index 1778c1138e4..1778c1138e4 100644
--- a/app/assets/images/emoji/kaaba.png
+++ b/public/-/emojis/1/kaaba.png
Binary files differ
diff --git a/app/assets/images/emoji/key.png b/public/-/emojis/1/key.png
index 319cd1b884c..319cd1b884c 100644
--- a/app/assets/images/emoji/key.png
+++ b/public/-/emojis/1/key.png
Binary files differ
diff --git a/app/assets/images/emoji/key2.png b/public/-/emojis/1/key2.png
index e11d706c6c8..e11d706c6c8 100644
--- a/app/assets/images/emoji/key2.png
+++ b/public/-/emojis/1/key2.png
Binary files differ
diff --git a/app/assets/images/emoji/keyboard.png b/public/-/emojis/1/keyboard.png
index 75027cb9af7..75027cb9af7 100644
--- a/app/assets/images/emoji/keyboard.png
+++ b/public/-/emojis/1/keyboard.png
Binary files differ
diff --git a/app/assets/images/emoji/kimono.png b/public/-/emojis/1/kimono.png
index abe851115d1..abe851115d1 100644
--- a/app/assets/images/emoji/kimono.png
+++ b/public/-/emojis/1/kimono.png
Binary files differ
diff --git a/app/assets/images/emoji/kiss.png b/public/-/emojis/1/kiss.png
index 85e6dcfc4e8..85e6dcfc4e8 100644
--- a/app/assets/images/emoji/kiss.png
+++ b/public/-/emojis/1/kiss.png
Binary files differ
diff --git a/app/assets/images/emoji/kiss_mm.png b/public/-/emojis/1/kiss_mm.png
index a9a0edae17c..a9a0edae17c 100644
--- a/app/assets/images/emoji/kiss_mm.png
+++ b/public/-/emojis/1/kiss_mm.png
Binary files differ
diff --git a/app/assets/images/emoji/kiss_ww.png b/public/-/emojis/1/kiss_ww.png
index fdac73cbb1d..fdac73cbb1d 100644
--- a/app/assets/images/emoji/kiss_ww.png
+++ b/public/-/emojis/1/kiss_ww.png
Binary files differ
diff --git a/app/assets/images/emoji/kissing.png b/public/-/emojis/1/kissing.png
index 39d325fd8e3..39d325fd8e3 100644
--- a/app/assets/images/emoji/kissing.png
+++ b/public/-/emojis/1/kissing.png
Binary files differ
diff --git a/app/assets/images/emoji/kissing_cat.png b/public/-/emojis/1/kissing_cat.png
index 6e0bcc77540..6e0bcc77540 100644
--- a/app/assets/images/emoji/kissing_cat.png
+++ b/public/-/emojis/1/kissing_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/kissing_closed_eyes.png b/public/-/emojis/1/kissing_closed_eyes.png
index b684d7d4d6c..b684d7d4d6c 100644
--- a/app/assets/images/emoji/kissing_closed_eyes.png
+++ b/public/-/emojis/1/kissing_closed_eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/kissing_heart.png b/public/-/emojis/1/kissing_heart.png
index 0ff808fd614..0ff808fd614 100644
--- a/app/assets/images/emoji/kissing_heart.png
+++ b/public/-/emojis/1/kissing_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/kissing_smiling_eyes.png b/public/-/emojis/1/kissing_smiling_eyes.png
index e181f17099d..e181f17099d 100644
--- a/app/assets/images/emoji/kissing_smiling_eyes.png
+++ b/public/-/emojis/1/kissing_smiling_eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/kiwi.png b/public/-/emojis/1/kiwi.png
index dfbd8258074..dfbd8258074 100644
--- a/app/assets/images/emoji/kiwi.png
+++ b/public/-/emojis/1/kiwi.png
Binary files differ
diff --git a/app/assets/images/emoji/knife.png b/public/-/emojis/1/knife.png
index 1acb9f3077b..1acb9f3077b 100644
--- a/app/assets/images/emoji/knife.png
+++ b/public/-/emojis/1/knife.png
Binary files differ
diff --git a/app/assets/images/emoji/koala.png b/public/-/emojis/1/koala.png
index a0aa437a98c..a0aa437a98c 100644
--- a/app/assets/images/emoji/koala.png
+++ b/public/-/emojis/1/koala.png
Binary files differ
diff --git a/app/assets/images/emoji/koko.png b/public/-/emojis/1/koko.png
index 6450eb44d90..6450eb44d90 100644
--- a/app/assets/images/emoji/koko.png
+++ b/public/-/emojis/1/koko.png
Binary files differ
diff --git a/app/assets/images/emoji/label.png b/public/-/emojis/1/label.png
index d41c9b4f1e1..d41c9b4f1e1 100644
--- a/app/assets/images/emoji/label.png
+++ b/public/-/emojis/1/label.png
Binary files differ
diff --git a/app/assets/images/emoji/large_blue_circle.png b/public/-/emojis/1/large_blue_circle.png
index 84078ef3127..84078ef3127 100644
--- a/app/assets/images/emoji/large_blue_circle.png
+++ b/public/-/emojis/1/large_blue_circle.png
Binary files differ
diff --git a/app/assets/images/emoji/large_blue_diamond.png b/public/-/emojis/1/large_blue_diamond.png
index 416a58bd5a8..416a58bd5a8 100644
--- a/app/assets/images/emoji/large_blue_diamond.png
+++ b/public/-/emojis/1/large_blue_diamond.png
Binary files differ
diff --git a/app/assets/images/emoji/large_orange_diamond.png b/public/-/emojis/1/large_orange_diamond.png
index 73ff0ac36c8..73ff0ac36c8 100644
--- a/app/assets/images/emoji/large_orange_diamond.png
+++ b/public/-/emojis/1/large_orange_diamond.png
Binary files differ
diff --git a/app/assets/images/emoji/last_quarter_moon.png b/public/-/emojis/1/last_quarter_moon.png
index 0842a0dd408..0842a0dd408 100644
--- a/app/assets/images/emoji/last_quarter_moon.png
+++ b/public/-/emojis/1/last_quarter_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/last_quarter_moon_with_face.png b/public/-/emojis/1/last_quarter_moon_with_face.png
index 94099343c5d..94099343c5d 100644
--- a/app/assets/images/emoji/last_quarter_moon_with_face.png
+++ b/public/-/emojis/1/last_quarter_moon_with_face.png
Binary files differ
diff --git a/app/assets/images/emoji/laughing.png b/public/-/emojis/1/laughing.png
index d94e9505ba1..d94e9505ba1 100644
--- a/app/assets/images/emoji/laughing.png
+++ b/public/-/emojis/1/laughing.png
Binary files differ
diff --git a/app/assets/images/emoji/leaves.png b/public/-/emojis/1/leaves.png
index 1e43e1af820..1e43e1af820 100644
--- a/app/assets/images/emoji/leaves.png
+++ b/public/-/emojis/1/leaves.png
Binary files differ
diff --git a/app/assets/images/emoji/ledger.png b/public/-/emojis/1/ledger.png
index 13e7561a4bd..13e7561a4bd 100644
--- a/app/assets/images/emoji/ledger.png
+++ b/public/-/emojis/1/ledger.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist.png b/public/-/emojis/1/left_facing_fist.png
index a9d9fd8d59c..a9d9fd8d59c 100644
--- a/app/assets/images/emoji/left_facing_fist.png
+++ b/public/-/emojis/1/left_facing_fist.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist_tone1.png b/public/-/emojis/1/left_facing_fist_tone1.png
index 1262a6b4b69..1262a6b4b69 100644
--- a/app/assets/images/emoji/left_facing_fist_tone1.png
+++ b/public/-/emojis/1/left_facing_fist_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist_tone2.png b/public/-/emojis/1/left_facing_fist_tone2.png
index 40bf70b82b2..40bf70b82b2 100644
--- a/app/assets/images/emoji/left_facing_fist_tone2.png
+++ b/public/-/emojis/1/left_facing_fist_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist_tone3.png b/public/-/emojis/1/left_facing_fist_tone3.png
index 93f58145111..93f58145111 100644
--- a/app/assets/images/emoji/left_facing_fist_tone3.png
+++ b/public/-/emojis/1/left_facing_fist_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist_tone4.png b/public/-/emojis/1/left_facing_fist_tone4.png
index d82b5ec91f0..d82b5ec91f0 100644
--- a/app/assets/images/emoji/left_facing_fist_tone4.png
+++ b/public/-/emojis/1/left_facing_fist_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/left_facing_fist_tone5.png b/public/-/emojis/1/left_facing_fist_tone5.png
index 09ae4cd492b..09ae4cd492b 100644
--- a/app/assets/images/emoji/left_facing_fist_tone5.png
+++ b/public/-/emojis/1/left_facing_fist_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/left_luggage.png b/public/-/emojis/1/left_luggage.png
index 887b23f3f25..887b23f3f25 100644
--- a/app/assets/images/emoji/left_luggage.png
+++ b/public/-/emojis/1/left_luggage.png
Binary files differ
diff --git a/app/assets/images/emoji/left_right_arrow.png b/public/-/emojis/1/left_right_arrow.png
index 7937f24f2ac..7937f24f2ac 100644
--- a/app/assets/images/emoji/left_right_arrow.png
+++ b/public/-/emojis/1/left_right_arrow.png
Binary files differ
diff --git a/app/assets/images/emoji/leftwards_arrow_with_hook.png b/public/-/emojis/1/leftwards_arrow_with_hook.png
index ba45c2ad9e9..ba45c2ad9e9 100644
--- a/app/assets/images/emoji/leftwards_arrow_with_hook.png
+++ b/public/-/emojis/1/leftwards_arrow_with_hook.png
Binary files differ
diff --git a/app/assets/images/emoji/lemon.png b/public/-/emojis/1/lemon.png
index 9a7d95ca220..9a7d95ca220 100644
--- a/app/assets/images/emoji/lemon.png
+++ b/public/-/emojis/1/lemon.png
Binary files differ
diff --git a/app/assets/images/emoji/leo.png b/public/-/emojis/1/leo.png
index 30158d34de9..30158d34de9 100644
--- a/app/assets/images/emoji/leo.png
+++ b/public/-/emojis/1/leo.png
Binary files differ
diff --git a/app/assets/images/emoji/leopard.png b/public/-/emojis/1/leopard.png
index 8aac3d49448..8aac3d49448 100644
--- a/app/assets/images/emoji/leopard.png
+++ b/public/-/emojis/1/leopard.png
Binary files differ
diff --git a/app/assets/images/emoji/level_slider.png b/public/-/emojis/1/level_slider.png
index 720a3b34119..720a3b34119 100644
--- a/app/assets/images/emoji/level_slider.png
+++ b/public/-/emojis/1/level_slider.png
Binary files differ
diff --git a/app/assets/images/emoji/levitate.png b/public/-/emojis/1/levitate.png
index 3dc315a3d91..3dc315a3d91 100644
--- a/app/assets/images/emoji/levitate.png
+++ b/public/-/emojis/1/levitate.png
Binary files differ
diff --git a/app/assets/images/emoji/libra.png b/public/-/emojis/1/libra.png
index 8fd133a357c..8fd133a357c 100644
--- a/app/assets/images/emoji/libra.png
+++ b/public/-/emojis/1/libra.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter.png b/public/-/emojis/1/lifter.png
index afdeaa476af..afdeaa476af 100644
--- a/app/assets/images/emoji/lifter.png
+++ b/public/-/emojis/1/lifter.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter_tone1.png b/public/-/emojis/1/lifter_tone1.png
index febaad123ec..febaad123ec 100644
--- a/app/assets/images/emoji/lifter_tone1.png
+++ b/public/-/emojis/1/lifter_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter_tone2.png b/public/-/emojis/1/lifter_tone2.png
index 27ae794a18e..27ae794a18e 100644
--- a/app/assets/images/emoji/lifter_tone2.png
+++ b/public/-/emojis/1/lifter_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter_tone3.png b/public/-/emojis/1/lifter_tone3.png
index 45c4c22c709..45c4c22c709 100644
--- a/app/assets/images/emoji/lifter_tone3.png
+++ b/public/-/emojis/1/lifter_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter_tone4.png b/public/-/emojis/1/lifter_tone4.png
index 67dd21d2464..67dd21d2464 100644
--- a/app/assets/images/emoji/lifter_tone4.png
+++ b/public/-/emojis/1/lifter_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/lifter_tone5.png b/public/-/emojis/1/lifter_tone5.png
index fa0152038b6..fa0152038b6 100644
--- a/app/assets/images/emoji/lifter_tone5.png
+++ b/public/-/emojis/1/lifter_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/light_rail.png b/public/-/emojis/1/light_rail.png
index a64829f5078..a64829f5078 100644
--- a/app/assets/images/emoji/light_rail.png
+++ b/public/-/emojis/1/light_rail.png
Binary files differ
diff --git a/app/assets/images/emoji/link.png b/public/-/emojis/1/link.png
index ae20f0f8eec..ae20f0f8eec 100644
--- a/app/assets/images/emoji/link.png
+++ b/public/-/emojis/1/link.png
Binary files differ
diff --git a/app/assets/images/emoji/lion_face.png b/public/-/emojis/1/lion_face.png
index 5062ab47ecf..5062ab47ecf 100644
--- a/app/assets/images/emoji/lion_face.png
+++ b/public/-/emojis/1/lion_face.png
Binary files differ
diff --git a/app/assets/images/emoji/lips.png b/public/-/emojis/1/lips.png
index 35f3cc2006f..35f3cc2006f 100644
--- a/app/assets/images/emoji/lips.png
+++ b/public/-/emojis/1/lips.png
Binary files differ
diff --git a/app/assets/images/emoji/lipstick.png b/public/-/emojis/1/lipstick.png
index 61a0c084c99..61a0c084c99 100644
--- a/app/assets/images/emoji/lipstick.png
+++ b/public/-/emojis/1/lipstick.png
Binary files differ
diff --git a/app/assets/images/emoji/lizard.png b/public/-/emojis/1/lizard.png
index 8363876050e..8363876050e 100644
--- a/app/assets/images/emoji/lizard.png
+++ b/public/-/emojis/1/lizard.png
Binary files differ
diff --git a/app/assets/images/emoji/lock.png b/public/-/emojis/1/lock.png
index 5a739c46644..5a739c46644 100644
--- a/app/assets/images/emoji/lock.png
+++ b/public/-/emojis/1/lock.png
Binary files differ
diff --git a/app/assets/images/emoji/lock_with_ink_pen.png b/public/-/emojis/1/lock_with_ink_pen.png
index 19a07d162fb..19a07d162fb 100644
--- a/app/assets/images/emoji/lock_with_ink_pen.png
+++ b/public/-/emojis/1/lock_with_ink_pen.png
Binary files differ
diff --git a/app/assets/images/emoji/lollipop.png b/public/-/emojis/1/lollipop.png
index ad76d7bf916..ad76d7bf916 100644
--- a/app/assets/images/emoji/lollipop.png
+++ b/public/-/emojis/1/lollipop.png
Binary files differ
diff --git a/app/assets/images/emoji/loop.png b/public/-/emojis/1/loop.png
index 0b82c8fe315..0b82c8fe315 100644
--- a/app/assets/images/emoji/loop.png
+++ b/public/-/emojis/1/loop.png
Binary files differ
diff --git a/app/assets/images/emoji/loud_sound.png b/public/-/emojis/1/loud_sound.png
index 8370033a539..8370033a539 100644
--- a/app/assets/images/emoji/loud_sound.png
+++ b/public/-/emojis/1/loud_sound.png
Binary files differ
diff --git a/app/assets/images/emoji/loudspeaker.png b/public/-/emojis/1/loudspeaker.png
index 5fd76a95b82..5fd76a95b82 100644
--- a/app/assets/images/emoji/loudspeaker.png
+++ b/public/-/emojis/1/loudspeaker.png
Binary files differ
diff --git a/app/assets/images/emoji/love_hotel.png b/public/-/emojis/1/love_hotel.png
index 5e136be6f8b..5e136be6f8b 100644
--- a/app/assets/images/emoji/love_hotel.png
+++ b/public/-/emojis/1/love_hotel.png
Binary files differ
diff --git a/app/assets/images/emoji/love_letter.png b/public/-/emojis/1/love_letter.png
index 3c3c767e784..3c3c767e784 100644
--- a/app/assets/images/emoji/love_letter.png
+++ b/public/-/emojis/1/love_letter.png
Binary files differ
diff --git a/app/assets/images/emoji/low_brightness.png b/public/-/emojis/1/low_brightness.png
index 543011d3961..543011d3961 100644
--- a/app/assets/images/emoji/low_brightness.png
+++ b/public/-/emojis/1/low_brightness.png
Binary files differ
diff --git a/app/assets/images/emoji/lying_face.png b/public/-/emojis/1/lying_face.png
index 02827e2628b..02827e2628b 100644
--- a/app/assets/images/emoji/lying_face.png
+++ b/public/-/emojis/1/lying_face.png
Binary files differ
diff --git a/app/assets/images/emoji/m.png b/public/-/emojis/1/m.png
index 8a3506fc1d7..8a3506fc1d7 100644
--- a/app/assets/images/emoji/m.png
+++ b/public/-/emojis/1/m.png
Binary files differ
diff --git a/app/assets/images/emoji/mag.png b/public/-/emojis/1/mag.png
index 55487156ac6..55487156ac6 100644
--- a/app/assets/images/emoji/mag.png
+++ b/public/-/emojis/1/mag.png
Binary files differ
diff --git a/app/assets/images/emoji/mag_right.png b/public/-/emojis/1/mag_right.png
index 0f4b1bca876..0f4b1bca876 100644
--- a/app/assets/images/emoji/mag_right.png
+++ b/public/-/emojis/1/mag_right.png
Binary files differ
diff --git a/app/assets/images/emoji/mahjong.png b/public/-/emojis/1/mahjong.png
index 66fd32025b2..66fd32025b2 100644
--- a/app/assets/images/emoji/mahjong.png
+++ b/public/-/emojis/1/mahjong.png
Binary files differ
diff --git a/app/assets/images/emoji/mailbox.png b/public/-/emojis/1/mailbox.png
index ef5174e40dd..ef5174e40dd 100644
--- a/app/assets/images/emoji/mailbox.png
+++ b/public/-/emojis/1/mailbox.png
Binary files differ
diff --git a/app/assets/images/emoji/mailbox_closed.png b/public/-/emojis/1/mailbox_closed.png
index ddc705db0d8..ddc705db0d8 100644
--- a/app/assets/images/emoji/mailbox_closed.png
+++ b/public/-/emojis/1/mailbox_closed.png
Binary files differ
diff --git a/app/assets/images/emoji/mailbox_with_mail.png b/public/-/emojis/1/mailbox_with_mail.png
index 5460616a5b1..5460616a5b1 100644
--- a/app/assets/images/emoji/mailbox_with_mail.png
+++ b/public/-/emojis/1/mailbox_with_mail.png
Binary files differ
diff --git a/app/assets/images/emoji/mailbox_with_no_mail.png b/public/-/emojis/1/mailbox_with_no_mail.png
index f9aeee6b15a..f9aeee6b15a 100644
--- a/app/assets/images/emoji/mailbox_with_no_mail.png
+++ b/public/-/emojis/1/mailbox_with_no_mail.png
Binary files differ
diff --git a/app/assets/images/emoji/man.png b/public/-/emojis/1/man.png
index 857a02e5146..857a02e5146 100644
--- a/app/assets/images/emoji/man.png
+++ b/public/-/emojis/1/man.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing.png b/public/-/emojis/1/man_dancing.png
index ccff3bede5a..ccff3bede5a 100644
--- a/app/assets/images/emoji/man_dancing.png
+++ b/public/-/emojis/1/man_dancing.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing_tone1.png b/public/-/emojis/1/man_dancing_tone1.png
index e0b9f82d905..e0b9f82d905 100644
--- a/app/assets/images/emoji/man_dancing_tone1.png
+++ b/public/-/emojis/1/man_dancing_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing_tone2.png b/public/-/emojis/1/man_dancing_tone2.png
index a5beed56e2e..a5beed56e2e 100644
--- a/app/assets/images/emoji/man_dancing_tone2.png
+++ b/public/-/emojis/1/man_dancing_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing_tone3.png b/public/-/emojis/1/man_dancing_tone3.png
index 2fa20180a6e..2fa20180a6e 100644
--- a/app/assets/images/emoji/man_dancing_tone3.png
+++ b/public/-/emojis/1/man_dancing_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing_tone4.png b/public/-/emojis/1/man_dancing_tone4.png
index bd3528c83ba..bd3528c83ba 100644
--- a/app/assets/images/emoji/man_dancing_tone4.png
+++ b/public/-/emojis/1/man_dancing_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/man_dancing_tone5.png b/public/-/emojis/1/man_dancing_tone5.png
index 41fd4f880c9..41fd4f880c9 100644
--- a/app/assets/images/emoji/man_dancing_tone5.png
+++ b/public/-/emojis/1/man_dancing_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo.png b/public/-/emojis/1/man_in_tuxedo.png
index 5f7e9303f89..5f7e9303f89 100644
--- a/app/assets/images/emoji/man_in_tuxedo.png
+++ b/public/-/emojis/1/man_in_tuxedo.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo_tone1.png b/public/-/emojis/1/man_in_tuxedo_tone1.png
index 7b6b3acd99b..7b6b3acd99b 100644
--- a/app/assets/images/emoji/man_in_tuxedo_tone1.png
+++ b/public/-/emojis/1/man_in_tuxedo_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo_tone2.png b/public/-/emojis/1/man_in_tuxedo_tone2.png
index 7975191b360..7975191b360 100644
--- a/app/assets/images/emoji/man_in_tuxedo_tone2.png
+++ b/public/-/emojis/1/man_in_tuxedo_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo_tone3.png b/public/-/emojis/1/man_in_tuxedo_tone3.png
index a2816f600ae..a2816f600ae 100644
--- a/app/assets/images/emoji/man_in_tuxedo_tone3.png
+++ b/public/-/emojis/1/man_in_tuxedo_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo_tone4.png b/public/-/emojis/1/man_in_tuxedo_tone4.png
index ea8291760f9..ea8291760f9 100644
--- a/app/assets/images/emoji/man_in_tuxedo_tone4.png
+++ b/public/-/emojis/1/man_in_tuxedo_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/man_in_tuxedo_tone5.png b/public/-/emojis/1/man_in_tuxedo_tone5.png
index c743e05fc5e..c743e05fc5e 100644
--- a/app/assets/images/emoji/man_in_tuxedo_tone5.png
+++ b/public/-/emojis/1/man_in_tuxedo_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/man_tone1.png b/public/-/emojis/1/man_tone1.png
index bb86e963a80..bb86e963a80 100644
--- a/app/assets/images/emoji/man_tone1.png
+++ b/public/-/emojis/1/man_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/man_tone2.png b/public/-/emojis/1/man_tone2.png
index fdeeaff46f5..fdeeaff46f5 100644
--- a/app/assets/images/emoji/man_tone2.png
+++ b/public/-/emojis/1/man_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/man_tone3.png b/public/-/emojis/1/man_tone3.png
index 7ae0b5df9cf..7ae0b5df9cf 100644
--- a/app/assets/images/emoji/man_tone3.png
+++ b/public/-/emojis/1/man_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/man_tone4.png b/public/-/emojis/1/man_tone4.png
index db14cde99b8..db14cde99b8 100644
--- a/app/assets/images/emoji/man_tone4.png
+++ b/public/-/emojis/1/man_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/man_tone5.png b/public/-/emojis/1/man_tone5.png
index 7c67a70529c..7c67a70529c 100644
--- a/app/assets/images/emoji/man_tone5.png
+++ b/public/-/emojis/1/man_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao.png b/public/-/emojis/1/man_with_gua_pi_mao.png
index 7841e13608d..7841e13608d 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao_tone1.png b/public/-/emojis/1/man_with_gua_pi_mao_tone1.png
index 5b7b3def19c..5b7b3def19c 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao_tone1.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao_tone2.png b/public/-/emojis/1/man_with_gua_pi_mao_tone2.png
index c8b9cf87f4b..c8b9cf87f4b 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao_tone2.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao_tone3.png b/public/-/emojis/1/man_with_gua_pi_mao_tone3.png
index effdd0c4c84..effdd0c4c84 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao_tone3.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao_tone4.png b/public/-/emojis/1/man_with_gua_pi_mao_tone4.png
index f885ff46fa1..f885ff46fa1 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao_tone4.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_gua_pi_mao_tone5.png b/public/-/emojis/1/man_with_gua_pi_mao_tone5.png
index a6d55ca1380..a6d55ca1380 100644
--- a/app/assets/images/emoji/man_with_gua_pi_mao_tone5.png
+++ b/public/-/emojis/1/man_with_gua_pi_mao_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban.png b/public/-/emojis/1/man_with_turban.png
index 51cf047f966..51cf047f966 100644
--- a/app/assets/images/emoji/man_with_turban.png
+++ b/public/-/emojis/1/man_with_turban.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban_tone1.png b/public/-/emojis/1/man_with_turban_tone1.png
index 1e12ee4b231..1e12ee4b231 100644
--- a/app/assets/images/emoji/man_with_turban_tone1.png
+++ b/public/-/emojis/1/man_with_turban_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban_tone2.png b/public/-/emojis/1/man_with_turban_tone2.png
index 37de4cceb23..37de4cceb23 100644
--- a/app/assets/images/emoji/man_with_turban_tone2.png
+++ b/public/-/emojis/1/man_with_turban_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban_tone3.png b/public/-/emojis/1/man_with_turban_tone3.png
index f607afd3450..f607afd3450 100644
--- a/app/assets/images/emoji/man_with_turban_tone3.png
+++ b/public/-/emojis/1/man_with_turban_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban_tone4.png b/public/-/emojis/1/man_with_turban_tone4.png
index c05695888af..c05695888af 100644
--- a/app/assets/images/emoji/man_with_turban_tone4.png
+++ b/public/-/emojis/1/man_with_turban_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/man_with_turban_tone5.png b/public/-/emojis/1/man_with_turban_tone5.png
index 4b4ff64720b..4b4ff64720b 100644
--- a/app/assets/images/emoji/man_with_turban_tone5.png
+++ b/public/-/emojis/1/man_with_turban_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/mans_shoe.png b/public/-/emojis/1/mans_shoe.png
index 4bf7541032c..4bf7541032c 100644
--- a/app/assets/images/emoji/mans_shoe.png
+++ b/public/-/emojis/1/mans_shoe.png
Binary files differ
diff --git a/app/assets/images/emoji/map.png b/public/-/emojis/1/map.png
index 15efe32c798..15efe32c798 100644
--- a/app/assets/images/emoji/map.png
+++ b/public/-/emojis/1/map.png
Binary files differ
diff --git a/app/assets/images/emoji/maple_leaf.png b/public/-/emojis/1/maple_leaf.png
index c49acea67f7..c49acea67f7 100644
--- a/app/assets/images/emoji/maple_leaf.png
+++ b/public/-/emojis/1/maple_leaf.png
Binary files differ
diff --git a/app/assets/images/emoji/martial_arts_uniform.png b/public/-/emojis/1/martial_arts_uniform.png
index 8d6114761f6..8d6114761f6 100644
--- a/app/assets/images/emoji/martial_arts_uniform.png
+++ b/public/-/emojis/1/martial_arts_uniform.png
Binary files differ
diff --git a/app/assets/images/emoji/mask.png b/public/-/emojis/1/mask.png
index 1e800acd1c0..1e800acd1c0 100644
--- a/app/assets/images/emoji/mask.png
+++ b/public/-/emojis/1/mask.png
Binary files differ
diff --git a/app/assets/images/emoji/massage.png b/public/-/emojis/1/massage.png
index b91d845e374..b91d845e374 100644
--- a/app/assets/images/emoji/massage.png
+++ b/public/-/emojis/1/massage.png
Binary files differ
diff --git a/app/assets/images/emoji/massage_tone1.png b/public/-/emojis/1/massage_tone1.png
index e0f415d3186..e0f415d3186 100644
--- a/app/assets/images/emoji/massage_tone1.png
+++ b/public/-/emojis/1/massage_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/massage_tone2.png b/public/-/emojis/1/massage_tone2.png
index 0bb244a270b..0bb244a270b 100644
--- a/app/assets/images/emoji/massage_tone2.png
+++ b/public/-/emojis/1/massage_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/massage_tone3.png b/public/-/emojis/1/massage_tone3.png
index a117ee81a22..a117ee81a22 100644
--- a/app/assets/images/emoji/massage_tone3.png
+++ b/public/-/emojis/1/massage_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/massage_tone4.png b/public/-/emojis/1/massage_tone4.png
index 6f42ab017f4..6f42ab017f4 100644
--- a/app/assets/images/emoji/massage_tone4.png
+++ b/public/-/emojis/1/massage_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/massage_tone5.png b/public/-/emojis/1/massage_tone5.png
index 6a388c0d0b5..6a388c0d0b5 100644
--- a/app/assets/images/emoji/massage_tone5.png
+++ b/public/-/emojis/1/massage_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/meat_on_bone.png b/public/-/emojis/1/meat_on_bone.png
index b20a59d1690..b20a59d1690 100644
--- a/app/assets/images/emoji/meat_on_bone.png
+++ b/public/-/emojis/1/meat_on_bone.png
Binary files differ
diff --git a/app/assets/images/emoji/medal.png b/public/-/emojis/1/medal.png
index b85896b14da..b85896b14da 100644
--- a/app/assets/images/emoji/medal.png
+++ b/public/-/emojis/1/medal.png
Binary files differ
diff --git a/app/assets/images/emoji/mega.png b/public/-/emojis/1/mega.png
index 4e6735188e3..4e6735188e3 100644
--- a/app/assets/images/emoji/mega.png
+++ b/public/-/emojis/1/mega.png
Binary files differ
diff --git a/app/assets/images/emoji/melon.png b/public/-/emojis/1/melon.png
index c01232d419d..c01232d419d 100644
--- a/app/assets/images/emoji/melon.png
+++ b/public/-/emojis/1/melon.png
Binary files differ
diff --git a/app/assets/images/emoji/menorah.png b/public/-/emojis/1/menorah.png
index b4297362869..b4297362869 100644
--- a/app/assets/images/emoji/menorah.png
+++ b/public/-/emojis/1/menorah.png
Binary files differ
diff --git a/app/assets/images/emoji/mens.png b/public/-/emojis/1/mens.png
index f5a1e1ba0cd..f5a1e1ba0cd 100644
--- a/app/assets/images/emoji/mens.png
+++ b/public/-/emojis/1/mens.png
Binary files differ
diff --git a/app/assets/images/emoji/metal.png b/public/-/emojis/1/metal.png
index 4aa6e7e0a44..4aa6e7e0a44 100644
--- a/app/assets/images/emoji/metal.png
+++ b/public/-/emojis/1/metal.png
Binary files differ
diff --git a/app/assets/images/emoji/metal_tone1.png b/public/-/emojis/1/metal_tone1.png
index c080d2addbd..c080d2addbd 100644
--- a/app/assets/images/emoji/metal_tone1.png
+++ b/public/-/emojis/1/metal_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/metal_tone2.png b/public/-/emojis/1/metal_tone2.png
index 12313529bcf..12313529bcf 100644
--- a/app/assets/images/emoji/metal_tone2.png
+++ b/public/-/emojis/1/metal_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/metal_tone3.png b/public/-/emojis/1/metal_tone3.png
index ca9be6ae67b..ca9be6ae67b 100644
--- a/app/assets/images/emoji/metal_tone3.png
+++ b/public/-/emojis/1/metal_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/metal_tone4.png b/public/-/emojis/1/metal_tone4.png
index abe28cbf890..abe28cbf890 100644
--- a/app/assets/images/emoji/metal_tone4.png
+++ b/public/-/emojis/1/metal_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/metal_tone5.png b/public/-/emojis/1/metal_tone5.png
index 0c6b5dd34ed..0c6b5dd34ed 100644
--- a/app/assets/images/emoji/metal_tone5.png
+++ b/public/-/emojis/1/metal_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/metro.png b/public/-/emojis/1/metro.png
index 1de8f0551f3..1de8f0551f3 100644
--- a/app/assets/images/emoji/metro.png
+++ b/public/-/emojis/1/metro.png
Binary files differ
diff --git a/app/assets/images/emoji/microphone.png b/public/-/emojis/1/microphone.png
index d4e6b0def25..d4e6b0def25 100644
--- a/app/assets/images/emoji/microphone.png
+++ b/public/-/emojis/1/microphone.png
Binary files differ
diff --git a/app/assets/images/emoji/microphone2.png b/public/-/emojis/1/microphone2.png
index cd9167654ff..cd9167654ff 100644
--- a/app/assets/images/emoji/microphone2.png
+++ b/public/-/emojis/1/microphone2.png
Binary files differ
diff --git a/app/assets/images/emoji/microscope.png b/public/-/emojis/1/microscope.png
index 90f5acf6a78..90f5acf6a78 100644
--- a/app/assets/images/emoji/microscope.png
+++ b/public/-/emojis/1/microscope.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger.png b/public/-/emojis/1/middle_finger.png
index 697f7a25eb2..697f7a25eb2 100644
--- a/app/assets/images/emoji/middle_finger.png
+++ b/public/-/emojis/1/middle_finger.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger_tone1.png b/public/-/emojis/1/middle_finger_tone1.png
index 61ef12a1548..61ef12a1548 100644
--- a/app/assets/images/emoji/middle_finger_tone1.png
+++ b/public/-/emojis/1/middle_finger_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger_tone2.png b/public/-/emojis/1/middle_finger_tone2.png
index c31a69be9af..c31a69be9af 100644
--- a/app/assets/images/emoji/middle_finger_tone2.png
+++ b/public/-/emojis/1/middle_finger_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger_tone3.png b/public/-/emojis/1/middle_finger_tone3.png
index 73ac216ce63..73ac216ce63 100644
--- a/app/assets/images/emoji/middle_finger_tone3.png
+++ b/public/-/emojis/1/middle_finger_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger_tone4.png b/public/-/emojis/1/middle_finger_tone4.png
index 80b8ab7706d..80b8ab7706d 100644
--- a/app/assets/images/emoji/middle_finger_tone4.png
+++ b/public/-/emojis/1/middle_finger_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/middle_finger_tone5.png b/public/-/emojis/1/middle_finger_tone5.png
index a8826b196e8..a8826b196e8 100644
--- a/app/assets/images/emoji/middle_finger_tone5.png
+++ b/public/-/emojis/1/middle_finger_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/military_medal.png b/public/-/emojis/1/military_medal.png
index ecd3fb03584..ecd3fb03584 100644
--- a/app/assets/images/emoji/military_medal.png
+++ b/public/-/emojis/1/military_medal.png
Binary files differ
diff --git a/app/assets/images/emoji/milk.png b/public/-/emojis/1/milk.png
index e4fcf2e64f3..e4fcf2e64f3 100644
--- a/app/assets/images/emoji/milk.png
+++ b/public/-/emojis/1/milk.png
Binary files differ
diff --git a/app/assets/images/emoji/milky_way.png b/public/-/emojis/1/milky_way.png
index b2b8ac59c5e..b2b8ac59c5e 100644
--- a/app/assets/images/emoji/milky_way.png
+++ b/public/-/emojis/1/milky_way.png
Binary files differ
diff --git a/app/assets/images/emoji/minibus.png b/public/-/emojis/1/minibus.png
index c60dd8f47ab..c60dd8f47ab 100644
--- a/app/assets/images/emoji/minibus.png
+++ b/public/-/emojis/1/minibus.png
Binary files differ
diff --git a/app/assets/images/emoji/minidisc.png b/public/-/emojis/1/minidisc.png
index 9fa94cfbe74..9fa94cfbe74 100644
--- a/app/assets/images/emoji/minidisc.png
+++ b/public/-/emojis/1/minidisc.png
Binary files differ
diff --git a/app/assets/images/emoji/mobile_phone_off.png b/public/-/emojis/1/mobile_phone_off.png
index 8b661ec1c94..8b661ec1c94 100644
--- a/app/assets/images/emoji/mobile_phone_off.png
+++ b/public/-/emojis/1/mobile_phone_off.png
Binary files differ
diff --git a/app/assets/images/emoji/money_mouth.png b/public/-/emojis/1/money_mouth.png
index 75fd1e90cb0..75fd1e90cb0 100644
--- a/app/assets/images/emoji/money_mouth.png
+++ b/public/-/emojis/1/money_mouth.png
Binary files differ
diff --git a/app/assets/images/emoji/money_with_wings.png b/public/-/emojis/1/money_with_wings.png
index f022b04b3c2..f022b04b3c2 100644
--- a/app/assets/images/emoji/money_with_wings.png
+++ b/public/-/emojis/1/money_with_wings.png
Binary files differ
diff --git a/app/assets/images/emoji/moneybag.png b/public/-/emojis/1/moneybag.png
index b9296be0902..b9296be0902 100644
--- a/app/assets/images/emoji/moneybag.png
+++ b/public/-/emojis/1/moneybag.png
Binary files differ
diff --git a/app/assets/images/emoji/monkey.png b/public/-/emojis/1/monkey.png
index 9fae29448e3..9fae29448e3 100644
--- a/app/assets/images/emoji/monkey.png
+++ b/public/-/emojis/1/monkey.png
Binary files differ
diff --git a/app/assets/images/emoji/monkey_face.png b/public/-/emojis/1/monkey_face.png
index 7cab9b91a82..7cab9b91a82 100644
--- a/app/assets/images/emoji/monkey_face.png
+++ b/public/-/emojis/1/monkey_face.png
Binary files differ
diff --git a/app/assets/images/emoji/monorail.png b/public/-/emojis/1/monorail.png
index 11eb1f574bf..11eb1f574bf 100644
--- a/app/assets/images/emoji/monorail.png
+++ b/public/-/emojis/1/monorail.png
Binary files differ
diff --git a/app/assets/images/emoji/mortar_board.png b/public/-/emojis/1/mortar_board.png
index 8b17ddd9d00..8b17ddd9d00 100644
--- a/app/assets/images/emoji/mortar_board.png
+++ b/public/-/emojis/1/mortar_board.png
Binary files differ
diff --git a/app/assets/images/emoji/mosque.png b/public/-/emojis/1/mosque.png
index ef770b26d96..ef770b26d96 100644
--- a/app/assets/images/emoji/mosque.png
+++ b/public/-/emojis/1/mosque.png
Binary files differ
diff --git a/app/assets/images/emoji/motor_scooter.png b/public/-/emojis/1/motor_scooter.png
index c5afa72d807..c5afa72d807 100644
--- a/app/assets/images/emoji/motor_scooter.png
+++ b/public/-/emojis/1/motor_scooter.png
Binary files differ
diff --git a/app/assets/images/emoji/motorboat.png b/public/-/emojis/1/motorboat.png
index 0506db1a40f..0506db1a40f 100644
--- a/app/assets/images/emoji/motorboat.png
+++ b/public/-/emojis/1/motorboat.png
Binary files differ
diff --git a/app/assets/images/emoji/motorcycle.png b/public/-/emojis/1/motorcycle.png
index 3d1d567e8ec..3d1d567e8ec 100644
--- a/app/assets/images/emoji/motorcycle.png
+++ b/public/-/emojis/1/motorcycle.png
Binary files differ
diff --git a/app/assets/images/emoji/motorway.png b/public/-/emojis/1/motorway.png
index 8c3d3d03e3f..8c3d3d03e3f 100644
--- a/app/assets/images/emoji/motorway.png
+++ b/public/-/emojis/1/motorway.png
Binary files differ
diff --git a/app/assets/images/emoji/mount_fuji.png b/public/-/emojis/1/mount_fuji.png
index 88a54752458..88a54752458 100644
--- a/app/assets/images/emoji/mount_fuji.png
+++ b/public/-/emojis/1/mount_fuji.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain.png b/public/-/emojis/1/mountain.png
index 6722ebdd294..6722ebdd294 100644
--- a/app/assets/images/emoji/mountain.png
+++ b/public/-/emojis/1/mountain.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist.png b/public/-/emojis/1/mountain_bicyclist.png
index 41d3dc3ac6f..41d3dc3ac6f 100644
--- a/app/assets/images/emoji/mountain_bicyclist.png
+++ b/public/-/emojis/1/mountain_bicyclist.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist_tone1.png b/public/-/emojis/1/mountain_bicyclist_tone1.png
index e9f1daf5e40..e9f1daf5e40 100644
--- a/app/assets/images/emoji/mountain_bicyclist_tone1.png
+++ b/public/-/emojis/1/mountain_bicyclist_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist_tone2.png b/public/-/emojis/1/mountain_bicyclist_tone2.png
index 555b9e29d4d..555b9e29d4d 100644
--- a/app/assets/images/emoji/mountain_bicyclist_tone2.png
+++ b/public/-/emojis/1/mountain_bicyclist_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist_tone3.png b/public/-/emojis/1/mountain_bicyclist_tone3.png
index 7df5508ec8c..7df5508ec8c 100644
--- a/app/assets/images/emoji/mountain_bicyclist_tone3.png
+++ b/public/-/emojis/1/mountain_bicyclist_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist_tone4.png b/public/-/emojis/1/mountain_bicyclist_tone4.png
index f94b3450697..f94b3450697 100644
--- a/app/assets/images/emoji/mountain_bicyclist_tone4.png
+++ b/public/-/emojis/1/mountain_bicyclist_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_bicyclist_tone5.png b/public/-/emojis/1/mountain_bicyclist_tone5.png
index 16a45861e1f..16a45861e1f 100644
--- a/app/assets/images/emoji/mountain_bicyclist_tone5.png
+++ b/public/-/emojis/1/mountain_bicyclist_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_cableway.png b/public/-/emojis/1/mountain_cableway.png
index 1dea73ca53b..1dea73ca53b 100644
--- a/app/assets/images/emoji/mountain_cableway.png
+++ b/public/-/emojis/1/mountain_cableway.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_railway.png b/public/-/emojis/1/mountain_railway.png
index ade2218e469..ade2218e469 100644
--- a/app/assets/images/emoji/mountain_railway.png
+++ b/public/-/emojis/1/mountain_railway.png
Binary files differ
diff --git a/app/assets/images/emoji/mountain_snow.png b/public/-/emojis/1/mountain_snow.png
index 76e1cfd8313..76e1cfd8313 100644
--- a/app/assets/images/emoji/mountain_snow.png
+++ b/public/-/emojis/1/mountain_snow.png
Binary files differ
diff --git a/app/assets/images/emoji/mouse.png b/public/-/emojis/1/mouse.png
index 50afcd3262e..50afcd3262e 100644
--- a/app/assets/images/emoji/mouse.png
+++ b/public/-/emojis/1/mouse.png
Binary files differ
diff --git a/app/assets/images/emoji/mouse2.png b/public/-/emojis/1/mouse2.png
index 20fb041f09f..20fb041f09f 100644
--- a/app/assets/images/emoji/mouse2.png
+++ b/public/-/emojis/1/mouse2.png
Binary files differ
diff --git a/app/assets/images/emoji/mouse_three_button.png b/public/-/emojis/1/mouse_three_button.png
index e84e96ff6e8..e84e96ff6e8 100644
--- a/app/assets/images/emoji/mouse_three_button.png
+++ b/public/-/emojis/1/mouse_three_button.png
Binary files differ
diff --git a/app/assets/images/emoji/movie_camera.png b/public/-/emojis/1/movie_camera.png
index 4e73b130155..4e73b130155 100644
--- a/app/assets/images/emoji/movie_camera.png
+++ b/public/-/emojis/1/movie_camera.png
Binary files differ
diff --git a/app/assets/images/emoji/moyai.png b/public/-/emojis/1/moyai.png
index e6a7779c45b..e6a7779c45b 100644
--- a/app/assets/images/emoji/moyai.png
+++ b/public/-/emojis/1/moyai.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus.png b/public/-/emojis/1/mrs_claus.png
index 9cf2458df1a..9cf2458df1a 100644
--- a/app/assets/images/emoji/mrs_claus.png
+++ b/public/-/emojis/1/mrs_claus.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus_tone1.png b/public/-/emojis/1/mrs_claus_tone1.png
index d8a695d7035..d8a695d7035 100644
--- a/app/assets/images/emoji/mrs_claus_tone1.png
+++ b/public/-/emojis/1/mrs_claus_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus_tone2.png b/public/-/emojis/1/mrs_claus_tone2.png
index 0e17e8c51f3..0e17e8c51f3 100644
--- a/app/assets/images/emoji/mrs_claus_tone2.png
+++ b/public/-/emojis/1/mrs_claus_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus_tone3.png b/public/-/emojis/1/mrs_claus_tone3.png
index c3ee4d1dfae..c3ee4d1dfae 100644
--- a/app/assets/images/emoji/mrs_claus_tone3.png
+++ b/public/-/emojis/1/mrs_claus_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus_tone4.png b/public/-/emojis/1/mrs_claus_tone4.png
index 68a556da2fe..68a556da2fe 100644
--- a/app/assets/images/emoji/mrs_claus_tone4.png
+++ b/public/-/emojis/1/mrs_claus_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/mrs_claus_tone5.png b/public/-/emojis/1/mrs_claus_tone5.png
index ccab3c40ff2..ccab3c40ff2 100644
--- a/app/assets/images/emoji/mrs_claus_tone5.png
+++ b/public/-/emojis/1/mrs_claus_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle.png b/public/-/emojis/1/muscle.png
index 7e67c1880f7..7e67c1880f7 100644
--- a/app/assets/images/emoji/muscle.png
+++ b/public/-/emojis/1/muscle.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle_tone1.png b/public/-/emojis/1/muscle_tone1.png
index 1522942ce51..1522942ce51 100644
--- a/app/assets/images/emoji/muscle_tone1.png
+++ b/public/-/emojis/1/muscle_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle_tone2.png b/public/-/emojis/1/muscle_tone2.png
index 569c6e832ca..569c6e832ca 100644
--- a/app/assets/images/emoji/muscle_tone2.png
+++ b/public/-/emojis/1/muscle_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle_tone3.png b/public/-/emojis/1/muscle_tone3.png
index 0a76b00fa89..0a76b00fa89 100644
--- a/app/assets/images/emoji/muscle_tone3.png
+++ b/public/-/emojis/1/muscle_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle_tone4.png b/public/-/emojis/1/muscle_tone4.png
index f0cf31328e0..f0cf31328e0 100644
--- a/app/assets/images/emoji/muscle_tone4.png
+++ b/public/-/emojis/1/muscle_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/muscle_tone5.png b/public/-/emojis/1/muscle_tone5.png
index 4fda92460e8..4fda92460e8 100644
--- a/app/assets/images/emoji/muscle_tone5.png
+++ b/public/-/emojis/1/muscle_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/mushroom.png b/public/-/emojis/1/mushroom.png
index dd85742ba2c..dd85742ba2c 100644
--- a/app/assets/images/emoji/mushroom.png
+++ b/public/-/emojis/1/mushroom.png
Binary files differ
diff --git a/app/assets/images/emoji/musical_keyboard.png b/public/-/emojis/1/musical_keyboard.png
index 442b7456842..442b7456842 100644
--- a/app/assets/images/emoji/musical_keyboard.png
+++ b/public/-/emojis/1/musical_keyboard.png
Binary files differ
diff --git a/app/assets/images/emoji/musical_note.png b/public/-/emojis/1/musical_note.png
index 06691ef61bb..06691ef61bb 100644
--- a/app/assets/images/emoji/musical_note.png
+++ b/public/-/emojis/1/musical_note.png
Binary files differ
diff --git a/app/assets/images/emoji/musical_score.png b/public/-/emojis/1/musical_score.png
index 47dc05a8ef5..47dc05a8ef5 100644
--- a/app/assets/images/emoji/musical_score.png
+++ b/public/-/emojis/1/musical_score.png
Binary files differ
diff --git a/app/assets/images/emoji/mute.png b/public/-/emojis/1/mute.png
index 7c1788e5075..7c1788e5075 100644
--- a/app/assets/images/emoji/mute.png
+++ b/public/-/emojis/1/mute.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care.png b/public/-/emojis/1/nail_care.png
index aa52af7050d..aa52af7050d 100644
--- a/app/assets/images/emoji/nail_care.png
+++ b/public/-/emojis/1/nail_care.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care_tone1.png b/public/-/emojis/1/nail_care_tone1.png
index 26e883dd244..26e883dd244 100644
--- a/app/assets/images/emoji/nail_care_tone1.png
+++ b/public/-/emojis/1/nail_care_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care_tone2.png b/public/-/emojis/1/nail_care_tone2.png
index 61257b47ea3..61257b47ea3 100644
--- a/app/assets/images/emoji/nail_care_tone2.png
+++ b/public/-/emojis/1/nail_care_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care_tone3.png b/public/-/emojis/1/nail_care_tone3.png
index 29871b05f62..29871b05f62 100644
--- a/app/assets/images/emoji/nail_care_tone3.png
+++ b/public/-/emojis/1/nail_care_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care_tone4.png b/public/-/emojis/1/nail_care_tone4.png
index 2881de0b17d..2881de0b17d 100644
--- a/app/assets/images/emoji/nail_care_tone4.png
+++ b/public/-/emojis/1/nail_care_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/nail_care_tone5.png b/public/-/emojis/1/nail_care_tone5.png
index a0b7c0a45a6..a0b7c0a45a6 100644
--- a/app/assets/images/emoji/nail_care_tone5.png
+++ b/public/-/emojis/1/nail_care_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/name_badge.png b/public/-/emojis/1/name_badge.png
index ec5ee213e20..ec5ee213e20 100644
--- a/app/assets/images/emoji/name_badge.png
+++ b/public/-/emojis/1/name_badge.png
Binary files differ
diff --git a/app/assets/images/emoji/nauseated_face.png b/public/-/emojis/1/nauseated_face.png
index a566c109c28..a566c109c28 100644
--- a/app/assets/images/emoji/nauseated_face.png
+++ b/public/-/emojis/1/nauseated_face.png
Binary files differ
diff --git a/app/assets/images/emoji/necktie.png b/public/-/emojis/1/necktie.png
index 1804e7f3ff3..1804e7f3ff3 100644
--- a/app/assets/images/emoji/necktie.png
+++ b/public/-/emojis/1/necktie.png
Binary files differ
diff --git a/app/assets/images/emoji/negative_squared_cross_mark.png b/public/-/emojis/1/negative_squared_cross_mark.png
index dae487f1f98..dae487f1f98 100644
--- a/app/assets/images/emoji/negative_squared_cross_mark.png
+++ b/public/-/emojis/1/negative_squared_cross_mark.png
Binary files differ
diff --git a/app/assets/images/emoji/nerd.png b/public/-/emojis/1/nerd.png
index 7820bd581dc..7820bd581dc 100644
--- a/app/assets/images/emoji/nerd.png
+++ b/public/-/emojis/1/nerd.png
Binary files differ
diff --git a/app/assets/images/emoji/neutral_face.png b/public/-/emojis/1/neutral_face.png
index 065d193afe4..065d193afe4 100644
--- a/app/assets/images/emoji/neutral_face.png
+++ b/public/-/emojis/1/neutral_face.png
Binary files differ
diff --git a/app/assets/images/emoji/new.png b/public/-/emojis/1/new.png
index b4f85488d1a..b4f85488d1a 100644
--- a/app/assets/images/emoji/new.png
+++ b/public/-/emojis/1/new.png
Binary files differ
diff --git a/app/assets/images/emoji/new_moon.png b/public/-/emojis/1/new_moon.png
index ecff72caa42..ecff72caa42 100644
--- a/app/assets/images/emoji/new_moon.png
+++ b/public/-/emojis/1/new_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/new_moon_with_face.png b/public/-/emojis/1/new_moon_with_face.png
index 150dd12400c..150dd12400c 100644
--- a/app/assets/images/emoji/new_moon_with_face.png
+++ b/public/-/emojis/1/new_moon_with_face.png
Binary files differ
diff --git a/app/assets/images/emoji/newspaper.png b/public/-/emojis/1/newspaper.png
index 2aa8f060bde..2aa8f060bde 100644
--- a/app/assets/images/emoji/newspaper.png
+++ b/public/-/emojis/1/newspaper.png
Binary files differ
diff --git a/app/assets/images/emoji/newspaper2.png b/public/-/emojis/1/newspaper2.png
index f64748df2b2..f64748df2b2 100644
--- a/app/assets/images/emoji/newspaper2.png
+++ b/public/-/emojis/1/newspaper2.png
Binary files differ
diff --git a/app/assets/images/emoji/ng.png b/public/-/emojis/1/ng.png
index ee8d20f5ebc..ee8d20f5ebc 100644
--- a/app/assets/images/emoji/ng.png
+++ b/public/-/emojis/1/ng.png
Binary files differ
diff --git a/app/assets/images/emoji/night_with_stars.png b/public/-/emojis/1/night_with_stars.png
index ca2018f456d..ca2018f456d 100644
--- a/app/assets/images/emoji/night_with_stars.png
+++ b/public/-/emojis/1/night_with_stars.png
Binary files differ
diff --git a/app/assets/images/emoji/nine.png b/public/-/emojis/1/nine.png
index 9fce3d1eca9..9fce3d1eca9 100644
--- a/app/assets/images/emoji/nine.png
+++ b/public/-/emojis/1/nine.png
Binary files differ
diff --git a/app/assets/images/emoji/no_bell.png b/public/-/emojis/1/no_bell.png
index 15cb38dd1e7..15cb38dd1e7 100644
--- a/app/assets/images/emoji/no_bell.png
+++ b/public/-/emojis/1/no_bell.png
Binary files differ
diff --git a/app/assets/images/emoji/no_bicycles.png b/public/-/emojis/1/no_bicycles.png
index 19c85421ce9..19c85421ce9 100644
--- a/app/assets/images/emoji/no_bicycles.png
+++ b/public/-/emojis/1/no_bicycles.png
Binary files differ
diff --git a/app/assets/images/emoji/no_entry.png b/public/-/emojis/1/no_entry.png
index 476800fc5c6..476800fc5c6 100644
--- a/app/assets/images/emoji/no_entry.png
+++ b/public/-/emojis/1/no_entry.png
Binary files differ
diff --git a/app/assets/images/emoji/no_entry_sign.png b/public/-/emojis/1/no_entry_sign.png
index d2efd65e74b..d2efd65e74b 100644
--- a/app/assets/images/emoji/no_entry_sign.png
+++ b/public/-/emojis/1/no_entry_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good.png b/public/-/emojis/1/no_good.png
index ed577100322..ed577100322 100644
--- a/app/assets/images/emoji/no_good.png
+++ b/public/-/emojis/1/no_good.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good_tone1.png b/public/-/emojis/1/no_good_tone1.png
index 5c1a3cbb884..5c1a3cbb884 100644
--- a/app/assets/images/emoji/no_good_tone1.png
+++ b/public/-/emojis/1/no_good_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good_tone2.png b/public/-/emojis/1/no_good_tone2.png
index 80d8021f8fe..80d8021f8fe 100644
--- a/app/assets/images/emoji/no_good_tone2.png
+++ b/public/-/emojis/1/no_good_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good_tone3.png b/public/-/emojis/1/no_good_tone3.png
index 635e6a00815..635e6a00815 100644
--- a/app/assets/images/emoji/no_good_tone3.png
+++ b/public/-/emojis/1/no_good_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good_tone4.png b/public/-/emojis/1/no_good_tone4.png
index b96e412a374..b96e412a374 100644
--- a/app/assets/images/emoji/no_good_tone4.png
+++ b/public/-/emojis/1/no_good_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/no_good_tone5.png b/public/-/emojis/1/no_good_tone5.png
index 9a7084afa0a..9a7084afa0a 100644
--- a/app/assets/images/emoji/no_good_tone5.png
+++ b/public/-/emojis/1/no_good_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/no_mobile_phones.png b/public/-/emojis/1/no_mobile_phones.png
index 7b1ae6ea579..7b1ae6ea579 100644
--- a/app/assets/images/emoji/no_mobile_phones.png
+++ b/public/-/emojis/1/no_mobile_phones.png
Binary files differ
diff --git a/app/assets/images/emoji/no_mouth.png b/public/-/emojis/1/no_mouth.png
index b642f6c1172..b642f6c1172 100644
--- a/app/assets/images/emoji/no_mouth.png
+++ b/public/-/emojis/1/no_mouth.png
Binary files differ
diff --git a/app/assets/images/emoji/no_pedestrians.png b/public/-/emojis/1/no_pedestrians.png
index 286aa577a23..286aa577a23 100644
--- a/app/assets/images/emoji/no_pedestrians.png
+++ b/public/-/emojis/1/no_pedestrians.png
Binary files differ
diff --git a/app/assets/images/emoji/no_smoking.png b/public/-/emojis/1/no_smoking.png
index 586b8d29d05..586b8d29d05 100644
--- a/app/assets/images/emoji/no_smoking.png
+++ b/public/-/emojis/1/no_smoking.png
Binary files differ
diff --git a/app/assets/images/emoji/non-potable_water.png b/public/-/emojis/1/non-potable_water.png
index 827d4193f4e..827d4193f4e 100644
--- a/app/assets/images/emoji/non-potable_water.png
+++ b/public/-/emojis/1/non-potable_water.png
Binary files differ
diff --git a/app/assets/images/emoji/nose.png b/public/-/emojis/1/nose.png
index 2f04ac5f98f..2f04ac5f98f 100644
--- a/app/assets/images/emoji/nose.png
+++ b/public/-/emojis/1/nose.png
Binary files differ
diff --git a/app/assets/images/emoji/nose_tone1.png b/public/-/emojis/1/nose_tone1.png
index 8008d17506e..8008d17506e 100644
--- a/app/assets/images/emoji/nose_tone1.png
+++ b/public/-/emojis/1/nose_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/nose_tone2.png b/public/-/emojis/1/nose_tone2.png
index ac17f26e827..ac17f26e827 100644
--- a/app/assets/images/emoji/nose_tone2.png
+++ b/public/-/emojis/1/nose_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/nose_tone3.png b/public/-/emojis/1/nose_tone3.png
index d8b6cbe0f8e..d8b6cbe0f8e 100644
--- a/app/assets/images/emoji/nose_tone3.png
+++ b/public/-/emojis/1/nose_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/nose_tone4.png b/public/-/emojis/1/nose_tone4.png
index 004b2631e2e..004b2631e2e 100644
--- a/app/assets/images/emoji/nose_tone4.png
+++ b/public/-/emojis/1/nose_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/nose_tone5.png b/public/-/emojis/1/nose_tone5.png
index 7b33821f6c9..7b33821f6c9 100644
--- a/app/assets/images/emoji/nose_tone5.png
+++ b/public/-/emojis/1/nose_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/notebook.png b/public/-/emojis/1/notebook.png
index f6c28b4915d..f6c28b4915d 100644
--- a/app/assets/images/emoji/notebook.png
+++ b/public/-/emojis/1/notebook.png
Binary files differ
diff --git a/app/assets/images/emoji/notebook_with_decorative_cover.png b/public/-/emojis/1/notebook_with_decorative_cover.png
index 03f566b6d2c..03f566b6d2c 100644
--- a/app/assets/images/emoji/notebook_with_decorative_cover.png
+++ b/public/-/emojis/1/notebook_with_decorative_cover.png
Binary files differ
diff --git a/app/assets/images/emoji/notepad_spiral.png b/public/-/emojis/1/notepad_spiral.png
index 85faa10d8ea..85faa10d8ea 100644
--- a/app/assets/images/emoji/notepad_spiral.png
+++ b/public/-/emojis/1/notepad_spiral.png
Binary files differ
diff --git a/app/assets/images/emoji/notes.png b/public/-/emojis/1/notes.png
index 57d499aa181..57d499aa181 100644
--- a/app/assets/images/emoji/notes.png
+++ b/public/-/emojis/1/notes.png
Binary files differ
diff --git a/app/assets/images/emoji/nut_and_bolt.png b/public/-/emojis/1/nut_and_bolt.png
index 4b9ae155319..4b9ae155319 100644
--- a/app/assets/images/emoji/nut_and_bolt.png
+++ b/public/-/emojis/1/nut_and_bolt.png
Binary files differ
diff --git a/app/assets/images/emoji/o.png b/public/-/emojis/1/o.png
index 3fe75ce4675..3fe75ce4675 100644
--- a/app/assets/images/emoji/o.png
+++ b/public/-/emojis/1/o.png
Binary files differ
diff --git a/app/assets/images/emoji/o2.png b/public/-/emojis/1/o2.png
index 73278ba194a..73278ba194a 100644
--- a/app/assets/images/emoji/o2.png
+++ b/public/-/emojis/1/o2.png
Binary files differ
diff --git a/app/assets/images/emoji/ocean.png b/public/-/emojis/1/ocean.png
index 45ff1e87703..45ff1e87703 100644
--- a/app/assets/images/emoji/ocean.png
+++ b/public/-/emojis/1/ocean.png
Binary files differ
diff --git a/app/assets/images/emoji/octagonal_sign.png b/public/-/emojis/1/octagonal_sign.png
index 5ed61004045..5ed61004045 100644
--- a/app/assets/images/emoji/octagonal_sign.png
+++ b/public/-/emojis/1/octagonal_sign.png
Binary files differ
diff --git a/app/assets/images/emoji/octopus.png b/public/-/emojis/1/octopus.png
index 72c84074aac..72c84074aac 100644
--- a/app/assets/images/emoji/octopus.png
+++ b/public/-/emojis/1/octopus.png
Binary files differ
diff --git a/app/assets/images/emoji/oden.png b/public/-/emojis/1/oden.png
index d38a849fece..d38a849fece 100644
--- a/app/assets/images/emoji/oden.png
+++ b/public/-/emojis/1/oden.png
Binary files differ
diff --git a/app/assets/images/emoji/office.png b/public/-/emojis/1/office.png
index 7eee927d1b0..7eee927d1b0 100644
--- a/app/assets/images/emoji/office.png
+++ b/public/-/emojis/1/office.png
Binary files differ
diff --git a/app/assets/images/emoji/oil.png b/public/-/emojis/1/oil.png
index c4c4d42da8b..c4c4d42da8b 100644
--- a/app/assets/images/emoji/oil.png
+++ b/public/-/emojis/1/oil.png
Binary files differ
diff --git a/app/assets/images/emoji/ok.png b/public/-/emojis/1/ok.png
index d0d775532ff..d0d775532ff 100644
--- a/app/assets/images/emoji/ok.png
+++ b/public/-/emojis/1/ok.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand.png b/public/-/emojis/1/ok_hand.png
index 028d69b0de3..028d69b0de3 100644
--- a/app/assets/images/emoji/ok_hand.png
+++ b/public/-/emojis/1/ok_hand.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand_tone1.png b/public/-/emojis/1/ok_hand_tone1.png
index cecf7b2ab5a..cecf7b2ab5a 100644
--- a/app/assets/images/emoji/ok_hand_tone1.png
+++ b/public/-/emojis/1/ok_hand_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand_tone2.png b/public/-/emojis/1/ok_hand_tone2.png
index c19239bcd3d..c19239bcd3d 100644
--- a/app/assets/images/emoji/ok_hand_tone2.png
+++ b/public/-/emojis/1/ok_hand_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand_tone3.png b/public/-/emojis/1/ok_hand_tone3.png
index 94b65b03ecd..94b65b03ecd 100644
--- a/app/assets/images/emoji/ok_hand_tone3.png
+++ b/public/-/emojis/1/ok_hand_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand_tone4.png b/public/-/emojis/1/ok_hand_tone4.png
index 03d26f08e6a..03d26f08e6a 100644
--- a/app/assets/images/emoji/ok_hand_tone4.png
+++ b/public/-/emojis/1/ok_hand_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_hand_tone5.png b/public/-/emojis/1/ok_hand_tone5.png
index d4b24086364..d4b24086364 100644
--- a/app/assets/images/emoji/ok_hand_tone5.png
+++ b/public/-/emojis/1/ok_hand_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman.png b/public/-/emojis/1/ok_woman.png
index 90a2c7469c4..90a2c7469c4 100644
--- a/app/assets/images/emoji/ok_woman.png
+++ b/public/-/emojis/1/ok_woman.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman_tone1.png b/public/-/emojis/1/ok_woman_tone1.png
index c99543e785b..c99543e785b 100644
--- a/app/assets/images/emoji/ok_woman_tone1.png
+++ b/public/-/emojis/1/ok_woman_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman_tone2.png b/public/-/emojis/1/ok_woman_tone2.png
index ad5fae813db..ad5fae813db 100644
--- a/app/assets/images/emoji/ok_woman_tone2.png
+++ b/public/-/emojis/1/ok_woman_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman_tone3.png b/public/-/emojis/1/ok_woman_tone3.png
index 51bf4fab406..51bf4fab406 100644
--- a/app/assets/images/emoji/ok_woman_tone3.png
+++ b/public/-/emojis/1/ok_woman_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman_tone4.png b/public/-/emojis/1/ok_woman_tone4.png
index ee3f9dc640a..ee3f9dc640a 100644
--- a/app/assets/images/emoji/ok_woman_tone4.png
+++ b/public/-/emojis/1/ok_woman_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/ok_woman_tone5.png b/public/-/emojis/1/ok_woman_tone5.png
index 62a9d9237f7..62a9d9237f7 100644
--- a/app/assets/images/emoji/ok_woman_tone5.png
+++ b/public/-/emojis/1/ok_woman_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man.png b/public/-/emojis/1/older_man.png
index 4ace4e6f308..4ace4e6f308 100644
--- a/app/assets/images/emoji/older_man.png
+++ b/public/-/emojis/1/older_man.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man_tone1.png b/public/-/emojis/1/older_man_tone1.png
index ab459baace8..ab459baace8 100644
--- a/app/assets/images/emoji/older_man_tone1.png
+++ b/public/-/emojis/1/older_man_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man_tone2.png b/public/-/emojis/1/older_man_tone2.png
index f4dfc7694ea..f4dfc7694ea 100644
--- a/app/assets/images/emoji/older_man_tone2.png
+++ b/public/-/emojis/1/older_man_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man_tone3.png b/public/-/emojis/1/older_man_tone3.png
index 5ffd11792f4..5ffd11792f4 100644
--- a/app/assets/images/emoji/older_man_tone3.png
+++ b/public/-/emojis/1/older_man_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man_tone4.png b/public/-/emojis/1/older_man_tone4.png
index b350a764bfd..b350a764bfd 100644
--- a/app/assets/images/emoji/older_man_tone4.png
+++ b/public/-/emojis/1/older_man_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/older_man_tone5.png b/public/-/emojis/1/older_man_tone5.png
index 05fe24a1708..05fe24a1708 100644
--- a/app/assets/images/emoji/older_man_tone5.png
+++ b/public/-/emojis/1/older_man_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman.png b/public/-/emojis/1/older_woman.png
index 52dc4987143..52dc4987143 100644
--- a/app/assets/images/emoji/older_woman.png
+++ b/public/-/emojis/1/older_woman.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman_tone1.png b/public/-/emojis/1/older_woman_tone1.png
index b49e821402c..b49e821402c 100644
--- a/app/assets/images/emoji/older_woman_tone1.png
+++ b/public/-/emojis/1/older_woman_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman_tone2.png b/public/-/emojis/1/older_woman_tone2.png
index e86bf5ab3b7..e86bf5ab3b7 100644
--- a/app/assets/images/emoji/older_woman_tone2.png
+++ b/public/-/emojis/1/older_woman_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman_tone3.png b/public/-/emojis/1/older_woman_tone3.png
index 83fc14b0874..83fc14b0874 100644
--- a/app/assets/images/emoji/older_woman_tone3.png
+++ b/public/-/emojis/1/older_woman_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman_tone4.png b/public/-/emojis/1/older_woman_tone4.png
index e4aa8a424d4..e4aa8a424d4 100644
--- a/app/assets/images/emoji/older_woman_tone4.png
+++ b/public/-/emojis/1/older_woman_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/older_woman_tone5.png b/public/-/emojis/1/older_woman_tone5.png
index 4009012bb0a..4009012bb0a 100644
--- a/app/assets/images/emoji/older_woman_tone5.png
+++ b/public/-/emojis/1/older_woman_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/om_symbol.png b/public/-/emojis/1/om_symbol.png
index a35c63c459c..a35c63c459c 100644
--- a/app/assets/images/emoji/om_symbol.png
+++ b/public/-/emojis/1/om_symbol.png
Binary files differ
diff --git a/app/assets/images/emoji/on.png b/public/-/emojis/1/on.png
index a0c371ae21e..a0c371ae21e 100644
--- a/app/assets/images/emoji/on.png
+++ b/public/-/emojis/1/on.png
Binary files differ
diff --git a/app/assets/images/emoji/oncoming_automobile.png b/public/-/emojis/1/oncoming_automobile.png
index 3c7e1d52e63..3c7e1d52e63 100644
--- a/app/assets/images/emoji/oncoming_automobile.png
+++ b/public/-/emojis/1/oncoming_automobile.png
Binary files differ
diff --git a/app/assets/images/emoji/oncoming_bus.png b/public/-/emojis/1/oncoming_bus.png
index ad91e256c7f..ad91e256c7f 100644
--- a/app/assets/images/emoji/oncoming_bus.png
+++ b/public/-/emojis/1/oncoming_bus.png
Binary files differ
diff --git a/app/assets/images/emoji/oncoming_police_car.png b/public/-/emojis/1/oncoming_police_car.png
index c9109c85b5d..c9109c85b5d 100644
--- a/app/assets/images/emoji/oncoming_police_car.png
+++ b/public/-/emojis/1/oncoming_police_car.png
Binary files differ
diff --git a/app/assets/images/emoji/oncoming_taxi.png b/public/-/emojis/1/oncoming_taxi.png
index fea14e45846..fea14e45846 100644
--- a/app/assets/images/emoji/oncoming_taxi.png
+++ b/public/-/emojis/1/oncoming_taxi.png
Binary files differ
diff --git a/app/assets/images/emoji/one.png b/public/-/emojis/1/one.png
index e6d84b80128..e6d84b80128 100644
--- a/app/assets/images/emoji/one.png
+++ b/public/-/emojis/1/one.png
Binary files differ
diff --git a/app/assets/images/emoji/open_file_folder.png b/public/-/emojis/1/open_file_folder.png
index 3993b09222f..3993b09222f 100644
--- a/app/assets/images/emoji/open_file_folder.png
+++ b/public/-/emojis/1/open_file_folder.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands.png b/public/-/emojis/1/open_hands.png
index 1cf75c9101e..1cf75c9101e 100644
--- a/app/assets/images/emoji/open_hands.png
+++ b/public/-/emojis/1/open_hands.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands_tone1.png b/public/-/emojis/1/open_hands_tone1.png
index 352d2614f11..352d2614f11 100644
--- a/app/assets/images/emoji/open_hands_tone1.png
+++ b/public/-/emojis/1/open_hands_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands_tone2.png b/public/-/emojis/1/open_hands_tone2.png
index 70824a50c73..70824a50c73 100644
--- a/app/assets/images/emoji/open_hands_tone2.png
+++ b/public/-/emojis/1/open_hands_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands_tone3.png b/public/-/emojis/1/open_hands_tone3.png
index d7d136bd3db..d7d136bd3db 100644
--- a/app/assets/images/emoji/open_hands_tone3.png
+++ b/public/-/emojis/1/open_hands_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands_tone4.png b/public/-/emojis/1/open_hands_tone4.png
index df4eaa711e7..df4eaa711e7 100644
--- a/app/assets/images/emoji/open_hands_tone4.png
+++ b/public/-/emojis/1/open_hands_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/open_hands_tone5.png b/public/-/emojis/1/open_hands_tone5.png
index 7dc04eaebd8..7dc04eaebd8 100644
--- a/app/assets/images/emoji/open_hands_tone5.png
+++ b/public/-/emojis/1/open_hands_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/open_mouth.png b/public/-/emojis/1/open_mouth.png
index a62cd27e148..a62cd27e148 100644
--- a/app/assets/images/emoji/open_mouth.png
+++ b/public/-/emojis/1/open_mouth.png
Binary files differ
diff --git a/app/assets/images/emoji/ophiuchus.png b/public/-/emojis/1/ophiuchus.png
index 0a780a700da..0a780a700da 100644
--- a/app/assets/images/emoji/ophiuchus.png
+++ b/public/-/emojis/1/ophiuchus.png
Binary files differ
diff --git a/app/assets/images/emoji/orange_book.png b/public/-/emojis/1/orange_book.png
index ab40e6ae6a2..ab40e6ae6a2 100644
--- a/app/assets/images/emoji/orange_book.png
+++ b/public/-/emojis/1/orange_book.png
Binary files differ
diff --git a/app/assets/images/emoji/orthodox_cross.png b/public/-/emojis/1/orthodox_cross.png
index 0530e33a4d4..0530e33a4d4 100644
--- a/app/assets/images/emoji/orthodox_cross.png
+++ b/public/-/emojis/1/orthodox_cross.png
Binary files differ
diff --git a/app/assets/images/emoji/outbox_tray.png b/public/-/emojis/1/outbox_tray.png
index 46493ed5b2c..46493ed5b2c 100644
--- a/app/assets/images/emoji/outbox_tray.png
+++ b/public/-/emojis/1/outbox_tray.png
Binary files differ
diff --git a/app/assets/images/emoji/owl.png b/public/-/emojis/1/owl.png
index fa6815480c3..fa6815480c3 100644
--- a/app/assets/images/emoji/owl.png
+++ b/public/-/emojis/1/owl.png
Binary files differ
diff --git a/app/assets/images/emoji/ox.png b/public/-/emojis/1/ox.png
index badf5708f2f..badf5708f2f 100644
--- a/app/assets/images/emoji/ox.png
+++ b/public/-/emojis/1/ox.png
Binary files differ
diff --git a/app/assets/images/emoji/package.png b/public/-/emojis/1/package.png
index 85431756ad8..85431756ad8 100644
--- a/app/assets/images/emoji/package.png
+++ b/public/-/emojis/1/package.png
Binary files differ
diff --git a/app/assets/images/emoji/page_facing_up.png b/public/-/emojis/1/page_facing_up.png
index ba4ed757e01..ba4ed757e01 100644
--- a/app/assets/images/emoji/page_facing_up.png
+++ b/public/-/emojis/1/page_facing_up.png
Binary files differ
diff --git a/app/assets/images/emoji/page_with_curl.png b/public/-/emojis/1/page_with_curl.png
index 06355319c74..06355319c74 100644
--- a/app/assets/images/emoji/page_with_curl.png
+++ b/public/-/emojis/1/page_with_curl.png
Binary files differ
diff --git a/app/assets/images/emoji/pager.png b/public/-/emojis/1/pager.png
index b24b99306a2..b24b99306a2 100644
--- a/app/assets/images/emoji/pager.png
+++ b/public/-/emojis/1/pager.png
Binary files differ
diff --git a/app/assets/images/emoji/paintbrush.png b/public/-/emojis/1/paintbrush.png
index 28bffbaa3c9..28bffbaa3c9 100644
--- a/app/assets/images/emoji/paintbrush.png
+++ b/public/-/emojis/1/paintbrush.png
Binary files differ
diff --git a/app/assets/images/emoji/palm_tree.png b/public/-/emojis/1/palm_tree.png
index 4bbb10f4f19..4bbb10f4f19 100644
--- a/app/assets/images/emoji/palm_tree.png
+++ b/public/-/emojis/1/palm_tree.png
Binary files differ
diff --git a/app/assets/images/emoji/pancakes.png b/public/-/emojis/1/pancakes.png
index 6223d1a28e9..6223d1a28e9 100644
--- a/app/assets/images/emoji/pancakes.png
+++ b/public/-/emojis/1/pancakes.png
Binary files differ
diff --git a/app/assets/images/emoji/panda_face.png b/public/-/emojis/1/panda_face.png
index 978382775ce..978382775ce 100644
--- a/app/assets/images/emoji/panda_face.png
+++ b/public/-/emojis/1/panda_face.png
Binary files differ
diff --git a/app/assets/images/emoji/paperclip.png b/public/-/emojis/1/paperclip.png
index 8cd8d4f8750..8cd8d4f8750 100644
--- a/app/assets/images/emoji/paperclip.png
+++ b/public/-/emojis/1/paperclip.png
Binary files differ
diff --git a/app/assets/images/emoji/paperclips.png b/public/-/emojis/1/paperclips.png
index 76021e8c705..76021e8c705 100644
--- a/app/assets/images/emoji/paperclips.png
+++ b/public/-/emojis/1/paperclips.png
Binary files differ
diff --git a/app/assets/images/emoji/park.png b/public/-/emojis/1/park.png
index 63ec7016301..63ec7016301 100644
--- a/app/assets/images/emoji/park.png
+++ b/public/-/emojis/1/park.png
Binary files differ
diff --git a/app/assets/images/emoji/parking.png b/public/-/emojis/1/parking.png
index 7be7dac27e8..7be7dac27e8 100644
--- a/app/assets/images/emoji/parking.png
+++ b/public/-/emojis/1/parking.png
Binary files differ
diff --git a/app/assets/images/emoji/part_alternation_mark.png b/public/-/emojis/1/part_alternation_mark.png
index 70453d41528..70453d41528 100644
--- a/app/assets/images/emoji/part_alternation_mark.png
+++ b/public/-/emojis/1/part_alternation_mark.png
Binary files differ
diff --git a/app/assets/images/emoji/partly_sunny.png b/public/-/emojis/1/partly_sunny.png
index a55e59c344c..a55e59c344c 100644
--- a/app/assets/images/emoji/partly_sunny.png
+++ b/public/-/emojis/1/partly_sunny.png
Binary files differ
diff --git a/app/assets/images/emoji/passport_control.png b/public/-/emojis/1/passport_control.png
index 079e34ee4d4..079e34ee4d4 100644
--- a/app/assets/images/emoji/passport_control.png
+++ b/public/-/emojis/1/passport_control.png
Binary files differ
diff --git a/app/assets/images/emoji/pause_button.png b/public/-/emojis/1/pause_button.png
index 4f07e7ebfd7..4f07e7ebfd7 100644
--- a/app/assets/images/emoji/pause_button.png
+++ b/public/-/emojis/1/pause_button.png
Binary files differ
diff --git a/app/assets/images/emoji/peace.png b/public/-/emojis/1/peace.png
index 86033faf477..86033faf477 100644
--- a/app/assets/images/emoji/peace.png
+++ b/public/-/emojis/1/peace.png
Binary files differ
diff --git a/app/assets/images/emoji/peach.png b/public/-/emojis/1/peach.png
index 9ab57cbb758..9ab57cbb758 100644
--- a/app/assets/images/emoji/peach.png
+++ b/public/-/emojis/1/peach.png
Binary files differ
diff --git a/app/assets/images/emoji/peanuts.png b/public/-/emojis/1/peanuts.png
index b64fadad010..b64fadad010 100644
--- a/app/assets/images/emoji/peanuts.png
+++ b/public/-/emojis/1/peanuts.png
Binary files differ
diff --git a/app/assets/images/emoji/pear.png b/public/-/emojis/1/pear.png
index 3869f718bcf..3869f718bcf 100644
--- a/app/assets/images/emoji/pear.png
+++ b/public/-/emojis/1/pear.png
Binary files differ
diff --git a/app/assets/images/emoji/pen_ballpoint.png b/public/-/emojis/1/pen_ballpoint.png
index 6ef7a342433..6ef7a342433 100644
--- a/app/assets/images/emoji/pen_ballpoint.png
+++ b/public/-/emojis/1/pen_ballpoint.png
Binary files differ
diff --git a/app/assets/images/emoji/pen_fountain.png b/public/-/emojis/1/pen_fountain.png
index 3ca4bd2c231..3ca4bd2c231 100644
--- a/app/assets/images/emoji/pen_fountain.png
+++ b/public/-/emojis/1/pen_fountain.png
Binary files differ
diff --git a/app/assets/images/emoji/pencil.png b/public/-/emojis/1/pencil.png
index edc6155e168..edc6155e168 100644
--- a/app/assets/images/emoji/pencil.png
+++ b/public/-/emojis/1/pencil.png
Binary files differ
diff --git a/app/assets/images/emoji/pencil2.png b/public/-/emojis/1/pencil2.png
index 3833d590fa2..3833d590fa2 100644
--- a/app/assets/images/emoji/pencil2.png
+++ b/public/-/emojis/1/pencil2.png
Binary files differ
diff --git a/app/assets/images/emoji/penguin.png b/public/-/emojis/1/penguin.png
index c0064fb9734..c0064fb9734 100644
--- a/app/assets/images/emoji/penguin.png
+++ b/public/-/emojis/1/penguin.png
Binary files differ
diff --git a/app/assets/images/emoji/pensive.png b/public/-/emojis/1/pensive.png
index 490fb566954..490fb566954 100644
--- a/app/assets/images/emoji/pensive.png
+++ b/public/-/emojis/1/pensive.png
Binary files differ
diff --git a/app/assets/images/emoji/performing_arts.png b/public/-/emojis/1/performing_arts.png
index 685441fdaa1..685441fdaa1 100644
--- a/app/assets/images/emoji/performing_arts.png
+++ b/public/-/emojis/1/performing_arts.png
Binary files differ
diff --git a/app/assets/images/emoji/persevere.png b/public/-/emojis/1/persevere.png
index 646a05fe908..646a05fe908 100644
--- a/app/assets/images/emoji/persevere.png
+++ b/public/-/emojis/1/persevere.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning.png b/public/-/emojis/1/person_frowning.png
index 579324959a1..579324959a1 100644
--- a/app/assets/images/emoji/person_frowning.png
+++ b/public/-/emojis/1/person_frowning.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning_tone1.png b/public/-/emojis/1/person_frowning_tone1.png
index 21d3bb43923..21d3bb43923 100644
--- a/app/assets/images/emoji/person_frowning_tone1.png
+++ b/public/-/emojis/1/person_frowning_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning_tone2.png b/public/-/emojis/1/person_frowning_tone2.png
index 973f5fc8382..973f5fc8382 100644
--- a/app/assets/images/emoji/person_frowning_tone2.png
+++ b/public/-/emojis/1/person_frowning_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning_tone3.png b/public/-/emojis/1/person_frowning_tone3.png
index 41fbcc78816..41fbcc78816 100644
--- a/app/assets/images/emoji/person_frowning_tone3.png
+++ b/public/-/emojis/1/person_frowning_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning_tone4.png b/public/-/emojis/1/person_frowning_tone4.png
index 5a37c741030..5a37c741030 100644
--- a/app/assets/images/emoji/person_frowning_tone4.png
+++ b/public/-/emojis/1/person_frowning_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/person_frowning_tone5.png b/public/-/emojis/1/person_frowning_tone5.png
index e08141f3efe..e08141f3efe 100644
--- a/app/assets/images/emoji/person_frowning_tone5.png
+++ b/public/-/emojis/1/person_frowning_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair.png b/public/-/emojis/1/person_with_blond_hair.png
index ad6f01a7dda..ad6f01a7dda 100644
--- a/app/assets/images/emoji/person_with_blond_hair.png
+++ b/public/-/emojis/1/person_with_blond_hair.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair_tone1.png b/public/-/emojis/1/person_with_blond_hair_tone1.png
index 7d18ef24445..7d18ef24445 100644
--- a/app/assets/images/emoji/person_with_blond_hair_tone1.png
+++ b/public/-/emojis/1/person_with_blond_hair_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair_tone2.png b/public/-/emojis/1/person_with_blond_hair_tone2.png
index dae1307315c..dae1307315c 100644
--- a/app/assets/images/emoji/person_with_blond_hair_tone2.png
+++ b/public/-/emojis/1/person_with_blond_hair_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair_tone3.png b/public/-/emojis/1/person_with_blond_hair_tone3.png
index 684677e8e5a..684677e8e5a 100644
--- a/app/assets/images/emoji/person_with_blond_hair_tone3.png
+++ b/public/-/emojis/1/person_with_blond_hair_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair_tone4.png b/public/-/emojis/1/person_with_blond_hair_tone4.png
index 012be0b51f8..012be0b51f8 100644
--- a/app/assets/images/emoji/person_with_blond_hair_tone4.png
+++ b/public/-/emojis/1/person_with_blond_hair_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_blond_hair_tone5.png b/public/-/emojis/1/person_with_blond_hair_tone5.png
index d4ecc4cf44b..d4ecc4cf44b 100644
--- a/app/assets/images/emoji/person_with_blond_hair_tone5.png
+++ b/public/-/emojis/1/person_with_blond_hair_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face.png b/public/-/emojis/1/person_with_pouting_face.png
index 10eb0571078..10eb0571078 100644
--- a/app/assets/images/emoji/person_with_pouting_face.png
+++ b/public/-/emojis/1/person_with_pouting_face.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face_tone1.png b/public/-/emojis/1/person_with_pouting_face_tone1.png
index 57e826b75a4..57e826b75a4 100644
--- a/app/assets/images/emoji/person_with_pouting_face_tone1.png
+++ b/public/-/emojis/1/person_with_pouting_face_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face_tone2.png b/public/-/emojis/1/person_with_pouting_face_tone2.png
index 3f317c0c25f..3f317c0c25f 100644
--- a/app/assets/images/emoji/person_with_pouting_face_tone2.png
+++ b/public/-/emojis/1/person_with_pouting_face_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face_tone3.png b/public/-/emojis/1/person_with_pouting_face_tone3.png
index d2fbb6c20bf..d2fbb6c20bf 100644
--- a/app/assets/images/emoji/person_with_pouting_face_tone3.png
+++ b/public/-/emojis/1/person_with_pouting_face_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face_tone4.png b/public/-/emojis/1/person_with_pouting_face_tone4.png
index 643ceb4a5c5..643ceb4a5c5 100644
--- a/app/assets/images/emoji/person_with_pouting_face_tone4.png
+++ b/public/-/emojis/1/person_with_pouting_face_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/person_with_pouting_face_tone5.png b/public/-/emojis/1/person_with_pouting_face_tone5.png
index b2eb6859c32..b2eb6859c32 100644
--- a/app/assets/images/emoji/person_with_pouting_face_tone5.png
+++ b/public/-/emojis/1/person_with_pouting_face_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/pick.png b/public/-/emojis/1/pick.png
index 6370fe6d791..6370fe6d791 100644
--- a/app/assets/images/emoji/pick.png
+++ b/public/-/emojis/1/pick.png
Binary files differ
diff --git a/app/assets/images/emoji/pig.png b/public/-/emojis/1/pig.png
index afe05ca1676..afe05ca1676 100644
--- a/app/assets/images/emoji/pig.png
+++ b/public/-/emojis/1/pig.png
Binary files differ
diff --git a/app/assets/images/emoji/pig2.png b/public/-/emojis/1/pig2.png
index 5f31c1a2d75..5f31c1a2d75 100644
--- a/app/assets/images/emoji/pig2.png
+++ b/public/-/emojis/1/pig2.png
Binary files differ
diff --git a/app/assets/images/emoji/pig_nose.png b/public/-/emojis/1/pig_nose.png
index 3610ae4a910..3610ae4a910 100644
--- a/app/assets/images/emoji/pig_nose.png
+++ b/public/-/emojis/1/pig_nose.png
Binary files differ
diff --git a/app/assets/images/emoji/pill.png b/public/-/emojis/1/pill.png
index 1d4530e77a3..1d4530e77a3 100644
--- a/app/assets/images/emoji/pill.png
+++ b/public/-/emojis/1/pill.png
Binary files differ
diff --git a/app/assets/images/emoji/pineapple.png b/public/-/emojis/1/pineapple.png
index c89a1606462..c89a1606462 100644
--- a/app/assets/images/emoji/pineapple.png
+++ b/public/-/emojis/1/pineapple.png
Binary files differ
diff --git a/app/assets/images/emoji/ping_pong.png b/public/-/emojis/1/ping_pong.png
index ff3c51727d1..ff3c51727d1 100644
--- a/app/assets/images/emoji/ping_pong.png
+++ b/public/-/emojis/1/ping_pong.png
Binary files differ
diff --git a/app/assets/images/emoji/pisces.png b/public/-/emojis/1/pisces.png
index 7f6f646a95c..7f6f646a95c 100644
--- a/app/assets/images/emoji/pisces.png
+++ b/public/-/emojis/1/pisces.png
Binary files differ
diff --git a/app/assets/images/emoji/pizza.png b/public/-/emojis/1/pizza.png
index e07365cb398..e07365cb398 100644
--- a/app/assets/images/emoji/pizza.png
+++ b/public/-/emojis/1/pizza.png
Binary files differ
diff --git a/app/assets/images/emoji/place_of_worship.png b/public/-/emojis/1/place_of_worship.png
index 207d59cce85..207d59cce85 100644
--- a/app/assets/images/emoji/place_of_worship.png
+++ b/public/-/emojis/1/place_of_worship.png
Binary files differ
diff --git a/app/assets/images/emoji/play_pause.png b/public/-/emojis/1/play_pause.png
index a9f857139ac..a9f857139ac 100644
--- a/app/assets/images/emoji/play_pause.png
+++ b/public/-/emojis/1/play_pause.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down.png b/public/-/emojis/1/point_down.png
index 00d3d13ab5c..00d3d13ab5c 100644
--- a/app/assets/images/emoji/point_down.png
+++ b/public/-/emojis/1/point_down.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down_tone1.png b/public/-/emojis/1/point_down_tone1.png
index 140f157d8c7..140f157d8c7 100644
--- a/app/assets/images/emoji/point_down_tone1.png
+++ b/public/-/emojis/1/point_down_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down_tone2.png b/public/-/emojis/1/point_down_tone2.png
index d518544f7fa..d518544f7fa 100644
--- a/app/assets/images/emoji/point_down_tone2.png
+++ b/public/-/emojis/1/point_down_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down_tone3.png b/public/-/emojis/1/point_down_tone3.png
index 018b688b8b7..018b688b8b7 100644
--- a/app/assets/images/emoji/point_down_tone3.png
+++ b/public/-/emojis/1/point_down_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down_tone4.png b/public/-/emojis/1/point_down_tone4.png
index 98845bf6f72..98845bf6f72 100644
--- a/app/assets/images/emoji/point_down_tone4.png
+++ b/public/-/emojis/1/point_down_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/point_down_tone5.png b/public/-/emojis/1/point_down_tone5.png
index 9a9b039a9fc..9a9b039a9fc 100644
--- a/app/assets/images/emoji/point_down_tone5.png
+++ b/public/-/emojis/1/point_down_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left.png b/public/-/emojis/1/point_left.png
index 599fa2e3cf1..599fa2e3cf1 100644
--- a/app/assets/images/emoji/point_left.png
+++ b/public/-/emojis/1/point_left.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left_tone1.png b/public/-/emojis/1/point_left_tone1.png
index 88e2c306076..88e2c306076 100644
--- a/app/assets/images/emoji/point_left_tone1.png
+++ b/public/-/emojis/1/point_left_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left_tone2.png b/public/-/emojis/1/point_left_tone2.png
index d3c89d87c5f..d3c89d87c5f 100644
--- a/app/assets/images/emoji/point_left_tone2.png
+++ b/public/-/emojis/1/point_left_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left_tone3.png b/public/-/emojis/1/point_left_tone3.png
index b23b9167358..b23b9167358 100644
--- a/app/assets/images/emoji/point_left_tone3.png
+++ b/public/-/emojis/1/point_left_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left_tone4.png b/public/-/emojis/1/point_left_tone4.png
index 3093f325c27..3093f325c27 100644
--- a/app/assets/images/emoji/point_left_tone4.png
+++ b/public/-/emojis/1/point_left_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/point_left_tone5.png b/public/-/emojis/1/point_left_tone5.png
index 2b4cbfa120c..2b4cbfa120c 100644
--- a/app/assets/images/emoji/point_left_tone5.png
+++ b/public/-/emojis/1/point_left_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right.png b/public/-/emojis/1/point_right.png
index 93a3cd34aa5..93a3cd34aa5 100644
--- a/app/assets/images/emoji/point_right.png
+++ b/public/-/emojis/1/point_right.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right_tone1.png b/public/-/emojis/1/point_right_tone1.png
index 4a28c6bbc89..4a28c6bbc89 100644
--- a/app/assets/images/emoji/point_right_tone1.png
+++ b/public/-/emojis/1/point_right_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right_tone2.png b/public/-/emojis/1/point_right_tone2.png
index 7cb13231733..7cb13231733 100644
--- a/app/assets/images/emoji/point_right_tone2.png
+++ b/public/-/emojis/1/point_right_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right_tone3.png b/public/-/emojis/1/point_right_tone3.png
index 5514807d71a..5514807d71a 100644
--- a/app/assets/images/emoji/point_right_tone3.png
+++ b/public/-/emojis/1/point_right_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right_tone4.png b/public/-/emojis/1/point_right_tone4.png
index b8541d6440d..b8541d6440d 100644
--- a/app/assets/images/emoji/point_right_tone4.png
+++ b/public/-/emojis/1/point_right_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/point_right_tone5.png b/public/-/emojis/1/point_right_tone5.png
index 1b7aab07bb1..1b7aab07bb1 100644
--- a/app/assets/images/emoji/point_right_tone5.png
+++ b/public/-/emojis/1/point_right_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up.png b/public/-/emojis/1/point_up.png
index f4978ff0f00..f4978ff0f00 100644
--- a/app/assets/images/emoji/point_up.png
+++ b/public/-/emojis/1/point_up.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2.png b/public/-/emojis/1/point_up_2.png
index bc496dfeae4..bc496dfeae4 100644
--- a/app/assets/images/emoji/point_up_2.png
+++ b/public/-/emojis/1/point_up_2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2_tone1.png b/public/-/emojis/1/point_up_2_tone1.png
index a12a7e78430..a12a7e78430 100644
--- a/app/assets/images/emoji/point_up_2_tone1.png
+++ b/public/-/emojis/1/point_up_2_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2_tone2.png b/public/-/emojis/1/point_up_2_tone2.png
index cdff40ceab0..cdff40ceab0 100644
--- a/app/assets/images/emoji/point_up_2_tone2.png
+++ b/public/-/emojis/1/point_up_2_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2_tone3.png b/public/-/emojis/1/point_up_2_tone3.png
index a07ce9e5ae8..a07ce9e5ae8 100644
--- a/app/assets/images/emoji/point_up_2_tone3.png
+++ b/public/-/emojis/1/point_up_2_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2_tone4.png b/public/-/emojis/1/point_up_2_tone4.png
index 4f86c88ba42..4f86c88ba42 100644
--- a/app/assets/images/emoji/point_up_2_tone4.png
+++ b/public/-/emojis/1/point_up_2_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_2_tone5.png b/public/-/emojis/1/point_up_2_tone5.png
index ed1b26c35d3..ed1b26c35d3 100644
--- a/app/assets/images/emoji/point_up_2_tone5.png
+++ b/public/-/emojis/1/point_up_2_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_tone1.png b/public/-/emojis/1/point_up_tone1.png
index 6a9db21d64c..6a9db21d64c 100644
--- a/app/assets/images/emoji/point_up_tone1.png
+++ b/public/-/emojis/1/point_up_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_tone2.png b/public/-/emojis/1/point_up_tone2.png
index 15aa9ea0e05..15aa9ea0e05 100644
--- a/app/assets/images/emoji/point_up_tone2.png
+++ b/public/-/emojis/1/point_up_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_tone3.png b/public/-/emojis/1/point_up_tone3.png
index 652b73a9c5d..652b73a9c5d 100644
--- a/app/assets/images/emoji/point_up_tone3.png
+++ b/public/-/emojis/1/point_up_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_tone4.png b/public/-/emojis/1/point_up_tone4.png
index 692bad926e9..692bad926e9 100644
--- a/app/assets/images/emoji/point_up_tone4.png
+++ b/public/-/emojis/1/point_up_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/point_up_tone5.png b/public/-/emojis/1/point_up_tone5.png
index 1e1b10fb71c..1e1b10fb71c 100644
--- a/app/assets/images/emoji/point_up_tone5.png
+++ b/public/-/emojis/1/point_up_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/police_car.png b/public/-/emojis/1/police_car.png
index 3da4253de7e..3da4253de7e 100644
--- a/app/assets/images/emoji/police_car.png
+++ b/public/-/emojis/1/police_car.png
Binary files differ
diff --git a/app/assets/images/emoji/poodle.png b/public/-/emojis/1/poodle.png
index 8ec39e396af..8ec39e396af 100644
--- a/app/assets/images/emoji/poodle.png
+++ b/public/-/emojis/1/poodle.png
Binary files differ
diff --git a/app/assets/images/emoji/poop.png b/public/-/emojis/1/poop.png
index 10b15e72d56..10b15e72d56 100644
--- a/app/assets/images/emoji/poop.png
+++ b/public/-/emojis/1/poop.png
Binary files differ
diff --git a/app/assets/images/emoji/popcorn.png b/public/-/emojis/1/popcorn.png
index 36853e381d4..36853e381d4 100644
--- a/app/assets/images/emoji/popcorn.png
+++ b/public/-/emojis/1/popcorn.png
Binary files differ
diff --git a/app/assets/images/emoji/post_office.png b/public/-/emojis/1/post_office.png
index a23848f9aa0..a23848f9aa0 100644
--- a/app/assets/images/emoji/post_office.png
+++ b/public/-/emojis/1/post_office.png
Binary files differ
diff --git a/app/assets/images/emoji/postal_horn.png b/public/-/emojis/1/postal_horn.png
index c173b8dbd67..c173b8dbd67 100644
--- a/app/assets/images/emoji/postal_horn.png
+++ b/public/-/emojis/1/postal_horn.png
Binary files differ
diff --git a/app/assets/images/emoji/postbox.png b/public/-/emojis/1/postbox.png
index 07c9c4ab3d6..07c9c4ab3d6 100644
--- a/app/assets/images/emoji/postbox.png
+++ b/public/-/emojis/1/postbox.png
Binary files differ
diff --git a/app/assets/images/emoji/potable_water.png b/public/-/emojis/1/potable_water.png
index 2c610049459..2c610049459 100644
--- a/app/assets/images/emoji/potable_water.png
+++ b/public/-/emojis/1/potable_water.png
Binary files differ
diff --git a/app/assets/images/emoji/potato.png b/public/-/emojis/1/potato.png
index 70350ca2c0a..70350ca2c0a 100644
--- a/app/assets/images/emoji/potato.png
+++ b/public/-/emojis/1/potato.png
Binary files differ
diff --git a/app/assets/images/emoji/pouch.png b/public/-/emojis/1/pouch.png
index 8795c6c66ff..8795c6c66ff 100644
--- a/app/assets/images/emoji/pouch.png
+++ b/public/-/emojis/1/pouch.png
Binary files differ
diff --git a/app/assets/images/emoji/poultry_leg.png b/public/-/emojis/1/poultry_leg.png
index eea4a53a2f9..eea4a53a2f9 100644
--- a/app/assets/images/emoji/poultry_leg.png
+++ b/public/-/emojis/1/poultry_leg.png
Binary files differ
diff --git a/app/assets/images/emoji/pound.png b/public/-/emojis/1/pound.png
index a0d4c4099e9..a0d4c4099e9 100644
--- a/app/assets/images/emoji/pound.png
+++ b/public/-/emojis/1/pound.png
Binary files differ
diff --git a/app/assets/images/emoji/pouting_cat.png b/public/-/emojis/1/pouting_cat.png
index 41ddfeab42b..41ddfeab42b 100644
--- a/app/assets/images/emoji/pouting_cat.png
+++ b/public/-/emojis/1/pouting_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/pray.png b/public/-/emojis/1/pray.png
index 8347f2435be..8347f2435be 100644
--- a/app/assets/images/emoji/pray.png
+++ b/public/-/emojis/1/pray.png
Binary files differ
diff --git a/app/assets/images/emoji/pray_tone1.png b/public/-/emojis/1/pray_tone1.png
index 060ef257172..060ef257172 100644
--- a/app/assets/images/emoji/pray_tone1.png
+++ b/public/-/emojis/1/pray_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/pray_tone2.png b/public/-/emojis/1/pray_tone2.png
index 56dc607c07a..56dc607c07a 100644
--- a/app/assets/images/emoji/pray_tone2.png
+++ b/public/-/emojis/1/pray_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/pray_tone3.png b/public/-/emojis/1/pray_tone3.png
index 0f33b862008..0f33b862008 100644
--- a/app/assets/images/emoji/pray_tone3.png
+++ b/public/-/emojis/1/pray_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/pray_tone4.png b/public/-/emojis/1/pray_tone4.png
index 2ea8dc11657..2ea8dc11657 100644
--- a/app/assets/images/emoji/pray_tone4.png
+++ b/public/-/emojis/1/pray_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/pray_tone5.png b/public/-/emojis/1/pray_tone5.png
index 2128a6c4703..2128a6c4703 100644
--- a/app/assets/images/emoji/pray_tone5.png
+++ b/public/-/emojis/1/pray_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/prayer_beads.png b/public/-/emojis/1/prayer_beads.png
index a4b6dfcc62e..a4b6dfcc62e 100644
--- a/app/assets/images/emoji/prayer_beads.png
+++ b/public/-/emojis/1/prayer_beads.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman.png b/public/-/emojis/1/pregnant_woman.png
index 084e83a414a..084e83a414a 100644
--- a/app/assets/images/emoji/pregnant_woman.png
+++ b/public/-/emojis/1/pregnant_woman.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman_tone1.png b/public/-/emojis/1/pregnant_woman_tone1.png
index a78703b33aa..a78703b33aa 100644
--- a/app/assets/images/emoji/pregnant_woman_tone1.png
+++ b/public/-/emojis/1/pregnant_woman_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman_tone2.png b/public/-/emojis/1/pregnant_woman_tone2.png
index 0068c6c4a77..0068c6c4a77 100644
--- a/app/assets/images/emoji/pregnant_woman_tone2.png
+++ b/public/-/emojis/1/pregnant_woman_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman_tone3.png b/public/-/emojis/1/pregnant_woman_tone3.png
index 3206296b684..3206296b684 100644
--- a/app/assets/images/emoji/pregnant_woman_tone3.png
+++ b/public/-/emojis/1/pregnant_woman_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman_tone4.png b/public/-/emojis/1/pregnant_woman_tone4.png
index 120fda5cd8c..120fda5cd8c 100644
--- a/app/assets/images/emoji/pregnant_woman_tone4.png
+++ b/public/-/emojis/1/pregnant_woman_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/pregnant_woman_tone5.png b/public/-/emojis/1/pregnant_woman_tone5.png
index 569bfdf05ce..569bfdf05ce 100644
--- a/app/assets/images/emoji/pregnant_woman_tone5.png
+++ b/public/-/emojis/1/pregnant_woman_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/prince.png b/public/-/emojis/1/prince.png
index 38d69344c84..38d69344c84 100644
--- a/app/assets/images/emoji/prince.png
+++ b/public/-/emojis/1/prince.png
Binary files differ
diff --git a/app/assets/images/emoji/prince_tone1.png b/public/-/emojis/1/prince_tone1.png
index 849930c8887..849930c8887 100644
--- a/app/assets/images/emoji/prince_tone1.png
+++ b/public/-/emojis/1/prince_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/prince_tone2.png b/public/-/emojis/1/prince_tone2.png
index 23d8b3b1285..23d8b3b1285 100644
--- a/app/assets/images/emoji/prince_tone2.png
+++ b/public/-/emojis/1/prince_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/prince_tone3.png b/public/-/emojis/1/prince_tone3.png
index db6dfff0647..db6dfff0647 100644
--- a/app/assets/images/emoji/prince_tone3.png
+++ b/public/-/emojis/1/prince_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/prince_tone4.png b/public/-/emojis/1/prince_tone4.png
index 8e10f8be6a8..8e10f8be6a8 100644
--- a/app/assets/images/emoji/prince_tone4.png
+++ b/public/-/emojis/1/prince_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/prince_tone5.png b/public/-/emojis/1/prince_tone5.png
index 138d4ea7048..138d4ea7048 100644
--- a/app/assets/images/emoji/prince_tone5.png
+++ b/public/-/emojis/1/prince_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/princess.png b/public/-/emojis/1/princess.png
index 879e9fa8c5d..879e9fa8c5d 100644
--- a/app/assets/images/emoji/princess.png
+++ b/public/-/emojis/1/princess.png
Binary files differ
diff --git a/app/assets/images/emoji/princess_tone1.png b/public/-/emojis/1/princess_tone1.png
index c28078cdc36..c28078cdc36 100644
--- a/app/assets/images/emoji/princess_tone1.png
+++ b/public/-/emojis/1/princess_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/princess_tone2.png b/public/-/emojis/1/princess_tone2.png
index dcd20e6ecd4..dcd20e6ecd4 100644
--- a/app/assets/images/emoji/princess_tone2.png
+++ b/public/-/emojis/1/princess_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/princess_tone3.png b/public/-/emojis/1/princess_tone3.png
index cde6f315c56..cde6f315c56 100644
--- a/app/assets/images/emoji/princess_tone3.png
+++ b/public/-/emojis/1/princess_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/princess_tone4.png b/public/-/emojis/1/princess_tone4.png
index c71e69caaef..c71e69caaef 100644
--- a/app/assets/images/emoji/princess_tone4.png
+++ b/public/-/emojis/1/princess_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/princess_tone5.png b/public/-/emojis/1/princess_tone5.png
index 063e2645910..063e2645910 100644
--- a/app/assets/images/emoji/princess_tone5.png
+++ b/public/-/emojis/1/princess_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/printer.png b/public/-/emojis/1/printer.png
index 027c830f0fe..027c830f0fe 100644
--- a/app/assets/images/emoji/printer.png
+++ b/public/-/emojis/1/printer.png
Binary files differ
diff --git a/app/assets/images/emoji/projector.png b/public/-/emojis/1/projector.png
index ce9ab0daa28..ce9ab0daa28 100644
--- a/app/assets/images/emoji/projector.png
+++ b/public/-/emojis/1/projector.png
Binary files differ
diff --git a/app/assets/images/emoji/punch.png b/public/-/emojis/1/punch.png
index b14ca5f5211..b14ca5f5211 100644
--- a/app/assets/images/emoji/punch.png
+++ b/public/-/emojis/1/punch.png
Binary files differ
diff --git a/app/assets/images/emoji/punch_tone1.png b/public/-/emojis/1/punch_tone1.png
index 93c7d17fb47..93c7d17fb47 100644
--- a/app/assets/images/emoji/punch_tone1.png
+++ b/public/-/emojis/1/punch_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/punch_tone2.png b/public/-/emojis/1/punch_tone2.png
index c0a1af6e10a..c0a1af6e10a 100644
--- a/app/assets/images/emoji/punch_tone2.png
+++ b/public/-/emojis/1/punch_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/punch_tone3.png b/public/-/emojis/1/punch_tone3.png
index 1458b021201..1458b021201 100644
--- a/app/assets/images/emoji/punch_tone3.png
+++ b/public/-/emojis/1/punch_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/punch_tone4.png b/public/-/emojis/1/punch_tone4.png
index c1466bfcdef..c1466bfcdef 100644
--- a/app/assets/images/emoji/punch_tone4.png
+++ b/public/-/emojis/1/punch_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/punch_tone5.png b/public/-/emojis/1/punch_tone5.png
index 00b4ddb8953..00b4ddb8953 100644
--- a/app/assets/images/emoji/punch_tone5.png
+++ b/public/-/emojis/1/punch_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/purple_heart.png b/public/-/emojis/1/purple_heart.png
index 95c53a9ade6..95c53a9ade6 100644
--- a/app/assets/images/emoji/purple_heart.png
+++ b/public/-/emojis/1/purple_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/purse.png b/public/-/emojis/1/purse.png
index 981346193c5..981346193c5 100644
--- a/app/assets/images/emoji/purse.png
+++ b/public/-/emojis/1/purse.png
Binary files differ
diff --git a/app/assets/images/emoji/pushpin.png b/public/-/emojis/1/pushpin.png
index 57e07d7f4cc..57e07d7f4cc 100644
--- a/app/assets/images/emoji/pushpin.png
+++ b/public/-/emojis/1/pushpin.png
Binary files differ
diff --git a/app/assets/images/emoji/put_litter_in_its_place.png b/public/-/emojis/1/put_litter_in_its_place.png
index 82a84f9a375..82a84f9a375 100644
--- a/app/assets/images/emoji/put_litter_in_its_place.png
+++ b/public/-/emojis/1/put_litter_in_its_place.png
Binary files differ
diff --git a/app/assets/images/emoji/question.png b/public/-/emojis/1/question.png
index 5a58f3458aa..5a58f3458aa 100644
--- a/app/assets/images/emoji/question.png
+++ b/public/-/emojis/1/question.png
Binary files differ
diff --git a/app/assets/images/emoji/rabbit.png b/public/-/emojis/1/rabbit.png
index ea75ab0426e..ea75ab0426e 100644
--- a/app/assets/images/emoji/rabbit.png
+++ b/public/-/emojis/1/rabbit.png
Binary files differ
diff --git a/app/assets/images/emoji/rabbit2.png b/public/-/emojis/1/rabbit2.png
index 2c8a29c642f..2c8a29c642f 100644
--- a/app/assets/images/emoji/rabbit2.png
+++ b/public/-/emojis/1/rabbit2.png
Binary files differ
diff --git a/app/assets/images/emoji/race_car.png b/public/-/emojis/1/race_car.png
index fe3f045f446..fe3f045f446 100644
--- a/app/assets/images/emoji/race_car.png
+++ b/public/-/emojis/1/race_car.png
Binary files differ
diff --git a/app/assets/images/emoji/racehorse.png b/public/-/emojis/1/racehorse.png
index b3e73cc8903..b3e73cc8903 100644
--- a/app/assets/images/emoji/racehorse.png
+++ b/public/-/emojis/1/racehorse.png
Binary files differ
diff --git a/app/assets/images/emoji/radio.png b/public/-/emojis/1/radio.png
index dec381fa242..dec381fa242 100644
--- a/app/assets/images/emoji/radio.png
+++ b/public/-/emojis/1/radio.png
Binary files differ
diff --git a/app/assets/images/emoji/radio_button.png b/public/-/emojis/1/radio_button.png
index 3a23449d917..3a23449d917 100644
--- a/app/assets/images/emoji/radio_button.png
+++ b/public/-/emojis/1/radio_button.png
Binary files differ
diff --git a/app/assets/images/emoji/radioactive.png b/public/-/emojis/1/radioactive.png
index 3b46199fe37..3b46199fe37 100644
--- a/app/assets/images/emoji/radioactive.png
+++ b/public/-/emojis/1/radioactive.png
Binary files differ
diff --git a/app/assets/images/emoji/rage.png b/public/-/emojis/1/rage.png
index 9d739bd40ad..9d739bd40ad 100644
--- a/app/assets/images/emoji/rage.png
+++ b/public/-/emojis/1/rage.png
Binary files differ
diff --git a/app/assets/images/emoji/railway_car.png b/public/-/emojis/1/railway_car.png
index a9acbf13008..a9acbf13008 100644
--- a/app/assets/images/emoji/railway_car.png
+++ b/public/-/emojis/1/railway_car.png
Binary files differ
diff --git a/app/assets/images/emoji/railway_track.png b/public/-/emojis/1/railway_track.png
index e1a7a0d1430..e1a7a0d1430 100644
--- a/app/assets/images/emoji/railway_track.png
+++ b/public/-/emojis/1/railway_track.png
Binary files differ
diff --git a/app/assets/images/emoji/rainbow.png b/public/-/emojis/1/rainbow.png
index 154735d7147..154735d7147 100644
--- a/app/assets/images/emoji/rainbow.png
+++ b/public/-/emojis/1/rainbow.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand.png b/public/-/emojis/1/raised_back_of_hand.png
index 479234294b4..479234294b4 100644
--- a/app/assets/images/emoji/raised_back_of_hand.png
+++ b/public/-/emojis/1/raised_back_of_hand.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand_tone1.png b/public/-/emojis/1/raised_back_of_hand_tone1.png
index 813d28499b5..813d28499b5 100644
--- a/app/assets/images/emoji/raised_back_of_hand_tone1.png
+++ b/public/-/emojis/1/raised_back_of_hand_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand_tone2.png b/public/-/emojis/1/raised_back_of_hand_tone2.png
index 192ff795e37..192ff795e37 100644
--- a/app/assets/images/emoji/raised_back_of_hand_tone2.png
+++ b/public/-/emojis/1/raised_back_of_hand_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand_tone3.png b/public/-/emojis/1/raised_back_of_hand_tone3.png
index 61a727abe6b..61a727abe6b 100644
--- a/app/assets/images/emoji/raised_back_of_hand_tone3.png
+++ b/public/-/emojis/1/raised_back_of_hand_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand_tone4.png b/public/-/emojis/1/raised_back_of_hand_tone4.png
index 2e83da511f5..2e83da511f5 100644
--- a/app/assets/images/emoji/raised_back_of_hand_tone4.png
+++ b/public/-/emojis/1/raised_back_of_hand_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_back_of_hand_tone5.png b/public/-/emojis/1/raised_back_of_hand_tone5.png
index d7a5b95a02c..d7a5b95a02c 100644
--- a/app/assets/images/emoji/raised_back_of_hand_tone5.png
+++ b/public/-/emojis/1/raised_back_of_hand_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand.png b/public/-/emojis/1/raised_hand.png
index 6b2954315d1..6b2954315d1 100644
--- a/app/assets/images/emoji/raised_hand.png
+++ b/public/-/emojis/1/raised_hand.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand_tone1.png b/public/-/emojis/1/raised_hand_tone1.png
index 3b752902c07..3b752902c07 100644
--- a/app/assets/images/emoji/raised_hand_tone1.png
+++ b/public/-/emojis/1/raised_hand_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand_tone2.png b/public/-/emojis/1/raised_hand_tone2.png
index 44e2a514c60..44e2a514c60 100644
--- a/app/assets/images/emoji/raised_hand_tone2.png
+++ b/public/-/emojis/1/raised_hand_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand_tone3.png b/public/-/emojis/1/raised_hand_tone3.png
index 5bb62a7528a..5bb62a7528a 100644
--- a/app/assets/images/emoji/raised_hand_tone3.png
+++ b/public/-/emojis/1/raised_hand_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand_tone4.png b/public/-/emojis/1/raised_hand_tone4.png
index c7f8c9ec270..c7f8c9ec270 100644
--- a/app/assets/images/emoji/raised_hand_tone4.png
+++ b/public/-/emojis/1/raised_hand_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hand_tone5.png b/public/-/emojis/1/raised_hand_tone5.png
index c601b58a73e..c601b58a73e 100644
--- a/app/assets/images/emoji/raised_hand_tone5.png
+++ b/public/-/emojis/1/raised_hand_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands.png b/public/-/emojis/1/raised_hands.png
index c0155f728e7..c0155f728e7 100644
--- a/app/assets/images/emoji/raised_hands.png
+++ b/public/-/emojis/1/raised_hands.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands_tone1.png b/public/-/emojis/1/raised_hands_tone1.png
index 1168b8236b6..1168b8236b6 100644
--- a/app/assets/images/emoji/raised_hands_tone1.png
+++ b/public/-/emojis/1/raised_hands_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands_tone2.png b/public/-/emojis/1/raised_hands_tone2.png
index 322de622903..322de622903 100644
--- a/app/assets/images/emoji/raised_hands_tone2.png
+++ b/public/-/emojis/1/raised_hands_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands_tone3.png b/public/-/emojis/1/raised_hands_tone3.png
index 2aa24e05ae1..2aa24e05ae1 100644
--- a/app/assets/images/emoji/raised_hands_tone3.png
+++ b/public/-/emojis/1/raised_hands_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands_tone4.png b/public/-/emojis/1/raised_hands_tone4.png
index f31bf0db992..f31bf0db992 100644
--- a/app/assets/images/emoji/raised_hands_tone4.png
+++ b/public/-/emojis/1/raised_hands_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/raised_hands_tone5.png b/public/-/emojis/1/raised_hands_tone5.png
index 5e95067f98b..5e95067f98b 100644
--- a/app/assets/images/emoji/raised_hands_tone5.png
+++ b/public/-/emojis/1/raised_hands_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand.png b/public/-/emojis/1/raising_hand.png
index 2880708c0cc..2880708c0cc 100644
--- a/app/assets/images/emoji/raising_hand.png
+++ b/public/-/emojis/1/raising_hand.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand_tone1.png b/public/-/emojis/1/raising_hand_tone1.png
index 1c90e3e2689..1c90e3e2689 100644
--- a/app/assets/images/emoji/raising_hand_tone1.png
+++ b/public/-/emojis/1/raising_hand_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand_tone2.png b/public/-/emojis/1/raising_hand_tone2.png
index 82c3ef2bfc5..82c3ef2bfc5 100644
--- a/app/assets/images/emoji/raising_hand_tone2.png
+++ b/public/-/emojis/1/raising_hand_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand_tone3.png b/public/-/emojis/1/raising_hand_tone3.png
index 1b1da2aa0ca..1b1da2aa0ca 100644
--- a/app/assets/images/emoji/raising_hand_tone3.png
+++ b/public/-/emojis/1/raising_hand_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand_tone4.png b/public/-/emojis/1/raising_hand_tone4.png
index e453855c01f..e453855c01f 100644
--- a/app/assets/images/emoji/raising_hand_tone4.png
+++ b/public/-/emojis/1/raising_hand_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/raising_hand_tone5.png b/public/-/emojis/1/raising_hand_tone5.png
index b86200fd844..b86200fd844 100644
--- a/app/assets/images/emoji/raising_hand_tone5.png
+++ b/public/-/emojis/1/raising_hand_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/ram.png b/public/-/emojis/1/ram.png
index 52a44464c9b..52a44464c9b 100644
--- a/app/assets/images/emoji/ram.png
+++ b/public/-/emojis/1/ram.png
Binary files differ
diff --git a/app/assets/images/emoji/ramen.png b/public/-/emojis/1/ramen.png
index c1cb7cd7384..c1cb7cd7384 100644
--- a/app/assets/images/emoji/ramen.png
+++ b/public/-/emojis/1/ramen.png
Binary files differ
diff --git a/app/assets/images/emoji/rat.png b/public/-/emojis/1/rat.png
index 86219144f10..86219144f10 100644
--- a/app/assets/images/emoji/rat.png
+++ b/public/-/emojis/1/rat.png
Binary files differ
diff --git a/app/assets/images/emoji/record_button.png b/public/-/emojis/1/record_button.png
index ada52830fce..ada52830fce 100644
--- a/app/assets/images/emoji/record_button.png
+++ b/public/-/emojis/1/record_button.png
Binary files differ
diff --git a/app/assets/images/emoji/recycle.png b/public/-/emojis/1/recycle.png
index 9221f095c37..9221f095c37 100644
--- a/app/assets/images/emoji/recycle.png
+++ b/public/-/emojis/1/recycle.png
Binary files differ
diff --git a/app/assets/images/emoji/red_car.png b/public/-/emojis/1/red_car.png
index b3e6a774dea..b3e6a774dea 100644
--- a/app/assets/images/emoji/red_car.png
+++ b/public/-/emojis/1/red_car.png
Binary files differ
diff --git a/app/assets/images/emoji/red_circle.png b/public/-/emojis/1/red_circle.png
index 4bef930d92f..4bef930d92f 100644
--- a/app/assets/images/emoji/red_circle.png
+++ b/public/-/emojis/1/red_circle.png
Binary files differ
diff --git a/app/assets/images/emoji/registered.png b/public/-/emojis/1/registered.png
index 53ef9f2d4e6..53ef9f2d4e6 100644
--- a/app/assets/images/emoji/registered.png
+++ b/public/-/emojis/1/registered.png
Binary files differ
diff --git a/app/assets/images/emoji/relaxed.png b/public/-/emojis/1/relaxed.png
index e9e53c03d45..e9e53c03d45 100644
--- a/app/assets/images/emoji/relaxed.png
+++ b/public/-/emojis/1/relaxed.png
Binary files differ
diff --git a/app/assets/images/emoji/relieved.png b/public/-/emojis/1/relieved.png
index 715ad0bf53f..715ad0bf53f 100644
--- a/app/assets/images/emoji/relieved.png
+++ b/public/-/emojis/1/relieved.png
Binary files differ
diff --git a/app/assets/images/emoji/reminder_ribbon.png b/public/-/emojis/1/reminder_ribbon.png
index 3988bbd094c..3988bbd094c 100644
--- a/app/assets/images/emoji/reminder_ribbon.png
+++ b/public/-/emojis/1/reminder_ribbon.png
Binary files differ
diff --git a/app/assets/images/emoji/repeat.png b/public/-/emojis/1/repeat.png
index 540ce4e0fba..540ce4e0fba 100644
--- a/app/assets/images/emoji/repeat.png
+++ b/public/-/emojis/1/repeat.png
Binary files differ
diff --git a/app/assets/images/emoji/repeat_one.png b/public/-/emojis/1/repeat_one.png
index 9567e83337f..9567e83337f 100644
--- a/app/assets/images/emoji/repeat_one.png
+++ b/public/-/emojis/1/repeat_one.png
Binary files differ
diff --git a/app/assets/images/emoji/restroom.png b/public/-/emojis/1/restroom.png
index 9588e0f0ef7..9588e0f0ef7 100644
--- a/app/assets/images/emoji/restroom.png
+++ b/public/-/emojis/1/restroom.png
Binary files differ
diff --git a/app/assets/images/emoji/revolving_hearts.png b/public/-/emojis/1/revolving_hearts.png
index 7b9d1948f73..7b9d1948f73 100644
--- a/app/assets/images/emoji/revolving_hearts.png
+++ b/public/-/emojis/1/revolving_hearts.png
Binary files differ
diff --git a/app/assets/images/emoji/rewind.png b/public/-/emojis/1/rewind.png
index e22e2bd3da5..e22e2bd3da5 100644
--- a/app/assets/images/emoji/rewind.png
+++ b/public/-/emojis/1/rewind.png
Binary files differ
diff --git a/app/assets/images/emoji/rhino.png b/public/-/emojis/1/rhino.png
index 12f4e0d9d9b..12f4e0d9d9b 100644
--- a/app/assets/images/emoji/rhino.png
+++ b/public/-/emojis/1/rhino.png
Binary files differ
diff --git a/app/assets/images/emoji/ribbon.png b/public/-/emojis/1/ribbon.png
index 0f253c3d8c8..0f253c3d8c8 100644
--- a/app/assets/images/emoji/ribbon.png
+++ b/public/-/emojis/1/ribbon.png
Binary files differ
diff --git a/app/assets/images/emoji/rice.png b/public/-/emojis/1/rice.png
index 6e3ac7956b1..6e3ac7956b1 100644
--- a/app/assets/images/emoji/rice.png
+++ b/public/-/emojis/1/rice.png
Binary files differ
diff --git a/app/assets/images/emoji/rice_ball.png b/public/-/emojis/1/rice_ball.png
index d3d8ee25cb8..d3d8ee25cb8 100644
--- a/app/assets/images/emoji/rice_ball.png
+++ b/public/-/emojis/1/rice_ball.png
Binary files differ
diff --git a/app/assets/images/emoji/rice_cracker.png b/public/-/emojis/1/rice_cracker.png
index 7fbd08e4ff9..7fbd08e4ff9 100644
--- a/app/assets/images/emoji/rice_cracker.png
+++ b/public/-/emojis/1/rice_cracker.png
Binary files differ
diff --git a/app/assets/images/emoji/rice_scene.png b/public/-/emojis/1/rice_scene.png
index 1a28426592a..1a28426592a 100644
--- a/app/assets/images/emoji/rice_scene.png
+++ b/public/-/emojis/1/rice_scene.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist.png b/public/-/emojis/1/right_facing_fist.png
index 754ed066d2c..754ed066d2c 100644
--- a/app/assets/images/emoji/right_facing_fist.png
+++ b/public/-/emojis/1/right_facing_fist.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist_tone1.png b/public/-/emojis/1/right_facing_fist_tone1.png
index 33ded2f61a6..33ded2f61a6 100644
--- a/app/assets/images/emoji/right_facing_fist_tone1.png
+++ b/public/-/emojis/1/right_facing_fist_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist_tone2.png b/public/-/emojis/1/right_facing_fist_tone2.png
index 88054e335c7..88054e335c7 100644
--- a/app/assets/images/emoji/right_facing_fist_tone2.png
+++ b/public/-/emojis/1/right_facing_fist_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist_tone3.png b/public/-/emojis/1/right_facing_fist_tone3.png
index 84b9f5da7f7..84b9f5da7f7 100644
--- a/app/assets/images/emoji/right_facing_fist_tone3.png
+++ b/public/-/emojis/1/right_facing_fist_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist_tone4.png b/public/-/emojis/1/right_facing_fist_tone4.png
index e741cfea68b..e741cfea68b 100644
--- a/app/assets/images/emoji/right_facing_fist_tone4.png
+++ b/public/-/emojis/1/right_facing_fist_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/right_facing_fist_tone5.png b/public/-/emojis/1/right_facing_fist_tone5.png
index cf66d760c1f..cf66d760c1f 100644
--- a/app/assets/images/emoji/right_facing_fist_tone5.png
+++ b/public/-/emojis/1/right_facing_fist_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/ring.png b/public/-/emojis/1/ring.png
index 87d227adb74..87d227adb74 100644
--- a/app/assets/images/emoji/ring.png
+++ b/public/-/emojis/1/ring.png
Binary files differ
diff --git a/app/assets/images/emoji/robot.png b/public/-/emojis/1/robot.png
index 7cc62612c6a..7cc62612c6a 100644
--- a/app/assets/images/emoji/robot.png
+++ b/public/-/emojis/1/robot.png
Binary files differ
diff --git a/app/assets/images/emoji/rocket.png b/public/-/emojis/1/rocket.png
index 0d8da089a37..0d8da089a37 100644
--- a/app/assets/images/emoji/rocket.png
+++ b/public/-/emojis/1/rocket.png
Binary files differ
diff --git a/app/assets/images/emoji/rofl.png b/public/-/emojis/1/rofl.png
index b1736fedfeb..b1736fedfeb 100644
--- a/app/assets/images/emoji/rofl.png
+++ b/public/-/emojis/1/rofl.png
Binary files differ
diff --git a/app/assets/images/emoji/roller_coaster.png b/public/-/emojis/1/roller_coaster.png
index 5b849e071e8..5b849e071e8 100644
--- a/app/assets/images/emoji/roller_coaster.png
+++ b/public/-/emojis/1/roller_coaster.png
Binary files differ
diff --git a/app/assets/images/emoji/rolling_eyes.png b/public/-/emojis/1/rolling_eyes.png
index 2f77b9fc3b9..2f77b9fc3b9 100644
--- a/app/assets/images/emoji/rolling_eyes.png
+++ b/public/-/emojis/1/rolling_eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/rooster.png b/public/-/emojis/1/rooster.png
index bbf2bbff97a..bbf2bbff97a 100644
--- a/app/assets/images/emoji/rooster.png
+++ b/public/-/emojis/1/rooster.png
Binary files differ
diff --git a/app/assets/images/emoji/rose.png b/public/-/emojis/1/rose.png
index 52c286d31ce..52c286d31ce 100644
--- a/app/assets/images/emoji/rose.png
+++ b/public/-/emojis/1/rose.png
Binary files differ
diff --git a/app/assets/images/emoji/rosette.png b/public/-/emojis/1/rosette.png
index 8030e494bcf..8030e494bcf 100644
--- a/app/assets/images/emoji/rosette.png
+++ b/public/-/emojis/1/rosette.png
Binary files differ
diff --git a/app/assets/images/emoji/rotating_light.png b/public/-/emojis/1/rotating_light.png
index cad66b0afef..cad66b0afef 100644
--- a/app/assets/images/emoji/rotating_light.png
+++ b/public/-/emojis/1/rotating_light.png
Binary files differ
diff --git a/app/assets/images/emoji/round_pushpin.png b/public/-/emojis/1/round_pushpin.png
index 28b9d72866e..28b9d72866e 100644
--- a/app/assets/images/emoji/round_pushpin.png
+++ b/public/-/emojis/1/round_pushpin.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat.png b/public/-/emojis/1/rowboat.png
index dd4dfc095d9..dd4dfc095d9 100644
--- a/app/assets/images/emoji/rowboat.png
+++ b/public/-/emojis/1/rowboat.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat_tone1.png b/public/-/emojis/1/rowboat_tone1.png
index 5e5d18548cb..5e5d18548cb 100644
--- a/app/assets/images/emoji/rowboat_tone1.png
+++ b/public/-/emojis/1/rowboat_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat_tone2.png b/public/-/emojis/1/rowboat_tone2.png
index 9b123ef8871..9b123ef8871 100644
--- a/app/assets/images/emoji/rowboat_tone2.png
+++ b/public/-/emojis/1/rowboat_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat_tone3.png b/public/-/emojis/1/rowboat_tone3.png
index 8ebd89a55f5..8ebd89a55f5 100644
--- a/app/assets/images/emoji/rowboat_tone3.png
+++ b/public/-/emojis/1/rowboat_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat_tone4.png b/public/-/emojis/1/rowboat_tone4.png
index 2b0d04f8725..2b0d04f8725 100644
--- a/app/assets/images/emoji/rowboat_tone4.png
+++ b/public/-/emojis/1/rowboat_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/rowboat_tone5.png b/public/-/emojis/1/rowboat_tone5.png
index b346f2dfc84..b346f2dfc84 100644
--- a/app/assets/images/emoji/rowboat_tone5.png
+++ b/public/-/emojis/1/rowboat_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/rugby_football.png b/public/-/emojis/1/rugby_football.png
index b1872273436..b1872273436 100644
--- a/app/assets/images/emoji/rugby_football.png
+++ b/public/-/emojis/1/rugby_football.png
Binary files differ
diff --git a/app/assets/images/emoji/runner.png b/public/-/emojis/1/runner.png
index e914915976a..e914915976a 100644
--- a/app/assets/images/emoji/runner.png
+++ b/public/-/emojis/1/runner.png
Binary files differ
diff --git a/app/assets/images/emoji/runner_tone1.png b/public/-/emojis/1/runner_tone1.png
index 9355239a52d..9355239a52d 100644
--- a/app/assets/images/emoji/runner_tone1.png
+++ b/public/-/emojis/1/runner_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/runner_tone2.png b/public/-/emojis/1/runner_tone2.png
index 6112fd5c376..6112fd5c376 100644
--- a/app/assets/images/emoji/runner_tone2.png
+++ b/public/-/emojis/1/runner_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/runner_tone3.png b/public/-/emojis/1/runner_tone3.png
index 625ec708f48..625ec708f48 100644
--- a/app/assets/images/emoji/runner_tone3.png
+++ b/public/-/emojis/1/runner_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/runner_tone4.png b/public/-/emojis/1/runner_tone4.png
index 242f1b56337..242f1b56337 100644
--- a/app/assets/images/emoji/runner_tone4.png
+++ b/public/-/emojis/1/runner_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/runner_tone5.png b/public/-/emojis/1/runner_tone5.png
index 2976c6f019f..2976c6f019f 100644
--- a/app/assets/images/emoji/runner_tone5.png
+++ b/public/-/emojis/1/runner_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/running_shirt_with_sash.png b/public/-/emojis/1/running_shirt_with_sash.png
index 6d83c06b803..6d83c06b803 100644
--- a/app/assets/images/emoji/running_shirt_with_sash.png
+++ b/public/-/emojis/1/running_shirt_with_sash.png
Binary files differ
diff --git a/app/assets/images/emoji/sa.png b/public/-/emojis/1/sa.png
index 900f9633247..900f9633247 100644
--- a/app/assets/images/emoji/sa.png
+++ b/public/-/emojis/1/sa.png
Binary files differ
diff --git a/app/assets/images/emoji/sagittarius.png b/public/-/emojis/1/sagittarius.png
index f8d94ff2923..f8d94ff2923 100644
--- a/app/assets/images/emoji/sagittarius.png
+++ b/public/-/emojis/1/sagittarius.png
Binary files differ
diff --git a/app/assets/images/emoji/sailboat.png b/public/-/emojis/1/sailboat.png
index 772ef11da5d..772ef11da5d 100644
--- a/app/assets/images/emoji/sailboat.png
+++ b/public/-/emojis/1/sailboat.png
Binary files differ
diff --git a/app/assets/images/emoji/sake.png b/public/-/emojis/1/sake.png
index 2933f5672c4..2933f5672c4 100644
--- a/app/assets/images/emoji/sake.png
+++ b/public/-/emojis/1/sake.png
Binary files differ
diff --git a/app/assets/images/emoji/salad.png b/public/-/emojis/1/salad.png
index c89f9341158..c89f9341158 100644
--- a/app/assets/images/emoji/salad.png
+++ b/public/-/emojis/1/salad.png
Binary files differ
diff --git a/app/assets/images/emoji/sandal.png b/public/-/emojis/1/sandal.png
index 9d9f5122b7a..9d9f5122b7a 100644
--- a/app/assets/images/emoji/sandal.png
+++ b/public/-/emojis/1/sandal.png
Binary files differ
diff --git a/app/assets/images/emoji/santa.png b/public/-/emojis/1/santa.png
index bc83ab80d52..bc83ab80d52 100644
--- a/app/assets/images/emoji/santa.png
+++ b/public/-/emojis/1/santa.png
Binary files differ
diff --git a/app/assets/images/emoji/santa_tone1.png b/public/-/emojis/1/santa_tone1.png
index 5233ffb7174..5233ffb7174 100644
--- a/app/assets/images/emoji/santa_tone1.png
+++ b/public/-/emojis/1/santa_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/santa_tone2.png b/public/-/emojis/1/santa_tone2.png
index 4e845438197..4e845438197 100644
--- a/app/assets/images/emoji/santa_tone2.png
+++ b/public/-/emojis/1/santa_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/santa_tone3.png b/public/-/emojis/1/santa_tone3.png
index 7fc4f33b60f..7fc4f33b60f 100644
--- a/app/assets/images/emoji/santa_tone3.png
+++ b/public/-/emojis/1/santa_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/santa_tone4.png b/public/-/emojis/1/santa_tone4.png
index d1d5a15132d..d1d5a15132d 100644
--- a/app/assets/images/emoji/santa_tone4.png
+++ b/public/-/emojis/1/santa_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/santa_tone5.png b/public/-/emojis/1/santa_tone5.png
index 4d697a01f24..4d697a01f24 100644
--- a/app/assets/images/emoji/santa_tone5.png
+++ b/public/-/emojis/1/santa_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/satellite.png b/public/-/emojis/1/satellite.png
index db0372795f4..db0372795f4 100644
--- a/app/assets/images/emoji/satellite.png
+++ b/public/-/emojis/1/satellite.png
Binary files differ
diff --git a/app/assets/images/emoji/satellite_orbital.png b/public/-/emojis/1/satellite_orbital.png
index 4ba55d6e297..4ba55d6e297 100644
--- a/app/assets/images/emoji/satellite_orbital.png
+++ b/public/-/emojis/1/satellite_orbital.png
Binary files differ
diff --git a/app/assets/images/emoji/saxophone.png b/public/-/emojis/1/saxophone.png
index a392faec291..a392faec291 100644
--- a/app/assets/images/emoji/saxophone.png
+++ b/public/-/emojis/1/saxophone.png
Binary files differ
diff --git a/app/assets/images/emoji/scales.png b/public/-/emojis/1/scales.png
index 0757eda1684..0757eda1684 100644
--- a/app/assets/images/emoji/scales.png
+++ b/public/-/emojis/1/scales.png
Binary files differ
diff --git a/app/assets/images/emoji/school.png b/public/-/emojis/1/school.png
index 269759534f0..269759534f0 100644
--- a/app/assets/images/emoji/school.png
+++ b/public/-/emojis/1/school.png
Binary files differ
diff --git a/app/assets/images/emoji/school_satchel.png b/public/-/emojis/1/school_satchel.png
index 9997c86e7dc..9997c86e7dc 100644
--- a/app/assets/images/emoji/school_satchel.png
+++ b/public/-/emojis/1/school_satchel.png
Binary files differ
diff --git a/app/assets/images/emoji/scissors.png b/public/-/emojis/1/scissors.png
index 270571c8cdd..270571c8cdd 100644
--- a/app/assets/images/emoji/scissors.png
+++ b/public/-/emojis/1/scissors.png
Binary files differ
diff --git a/app/assets/images/emoji/scooter.png b/public/-/emojis/1/scooter.png
index 4ab7ef59cd2..4ab7ef59cd2 100644
--- a/app/assets/images/emoji/scooter.png
+++ b/public/-/emojis/1/scooter.png
Binary files differ
diff --git a/app/assets/images/emoji/scorpion.png b/public/-/emojis/1/scorpion.png
index 449a6b281c9..449a6b281c9 100644
--- a/app/assets/images/emoji/scorpion.png
+++ b/public/-/emojis/1/scorpion.png
Binary files differ
diff --git a/app/assets/images/emoji/scorpius.png b/public/-/emojis/1/scorpius.png
index c31a9920455..c31a9920455 100644
--- a/app/assets/images/emoji/scorpius.png
+++ b/public/-/emojis/1/scorpius.png
Binary files differ
diff --git a/app/assets/images/emoji/scream.png b/public/-/emojis/1/scream.png
index c3bea9f2510..c3bea9f2510 100644
--- a/app/assets/images/emoji/scream.png
+++ b/public/-/emojis/1/scream.png
Binary files differ
diff --git a/app/assets/images/emoji/scream_cat.png b/public/-/emojis/1/scream_cat.png
index 15803ad8e6e..15803ad8e6e 100644
--- a/app/assets/images/emoji/scream_cat.png
+++ b/public/-/emojis/1/scream_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/scroll.png b/public/-/emojis/1/scroll.png
index 50ee5dcd4b9..50ee5dcd4b9 100644
--- a/app/assets/images/emoji/scroll.png
+++ b/public/-/emojis/1/scroll.png
Binary files differ
diff --git a/app/assets/images/emoji/seat.png b/public/-/emojis/1/seat.png
index a6d72d95adb..a6d72d95adb 100644
--- a/app/assets/images/emoji/seat.png
+++ b/public/-/emojis/1/seat.png
Binary files differ
diff --git a/app/assets/images/emoji/second_place.png b/public/-/emojis/1/second_place.png
index 17b011268b6..17b011268b6 100644
--- a/app/assets/images/emoji/second_place.png
+++ b/public/-/emojis/1/second_place.png
Binary files differ
diff --git a/app/assets/images/emoji/secret.png b/public/-/emojis/1/secret.png
index 5fd72608e60..5fd72608e60 100644
--- a/app/assets/images/emoji/secret.png
+++ b/public/-/emojis/1/secret.png
Binary files differ
diff --git a/app/assets/images/emoji/see_no_evil.png b/public/-/emojis/1/see_no_evil.png
index 5187e474531..5187e474531 100644
--- a/app/assets/images/emoji/see_no_evil.png
+++ b/public/-/emojis/1/see_no_evil.png
Binary files differ
diff --git a/app/assets/images/emoji/seedling.png b/public/-/emojis/1/seedling.png
index ae0948bcfd6..ae0948bcfd6 100644
--- a/app/assets/images/emoji/seedling.png
+++ b/public/-/emojis/1/seedling.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie.png b/public/-/emojis/1/selfie.png
index 6a1ba75c7e3..6a1ba75c7e3 100644
--- a/app/assets/images/emoji/selfie.png
+++ b/public/-/emojis/1/selfie.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie_tone1.png b/public/-/emojis/1/selfie_tone1.png
index 290e075b56f..290e075b56f 100644
--- a/app/assets/images/emoji/selfie_tone1.png
+++ b/public/-/emojis/1/selfie_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie_tone2.png b/public/-/emojis/1/selfie_tone2.png
index fcd9595b643..fcd9595b643 100644
--- a/app/assets/images/emoji/selfie_tone2.png
+++ b/public/-/emojis/1/selfie_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie_tone3.png b/public/-/emojis/1/selfie_tone3.png
index f3a22fdf435..f3a22fdf435 100644
--- a/app/assets/images/emoji/selfie_tone3.png
+++ b/public/-/emojis/1/selfie_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie_tone4.png b/public/-/emojis/1/selfie_tone4.png
index cdecf6d9f4e..cdecf6d9f4e 100644
--- a/app/assets/images/emoji/selfie_tone4.png
+++ b/public/-/emojis/1/selfie_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/selfie_tone5.png b/public/-/emojis/1/selfie_tone5.png
index 86acbb6c202..86acbb6c202 100644
--- a/app/assets/images/emoji/selfie_tone5.png
+++ b/public/-/emojis/1/selfie_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/seven.png b/public/-/emojis/1/seven.png
index 9b3476ae7c7..9b3476ae7c7 100644
--- a/app/assets/images/emoji/seven.png
+++ b/public/-/emojis/1/seven.png
Binary files differ
diff --git a/app/assets/images/emoji/shallow_pan_of_food.png b/public/-/emojis/1/shallow_pan_of_food.png
index 663a1006acd..663a1006acd 100644
--- a/app/assets/images/emoji/shallow_pan_of_food.png
+++ b/public/-/emojis/1/shallow_pan_of_food.png
Binary files differ
diff --git a/app/assets/images/emoji/shamrock.png b/public/-/emojis/1/shamrock.png
index f202aecfe6f..f202aecfe6f 100644
--- a/app/assets/images/emoji/shamrock.png
+++ b/public/-/emojis/1/shamrock.png
Binary files differ
diff --git a/app/assets/images/emoji/shark.png b/public/-/emojis/1/shark.png
index c75076d57d8..c75076d57d8 100644
--- a/app/assets/images/emoji/shark.png
+++ b/public/-/emojis/1/shark.png
Binary files differ
diff --git a/app/assets/images/emoji/shaved_ice.png b/public/-/emojis/1/shaved_ice.png
index 36dfb53ca93..36dfb53ca93 100644
--- a/app/assets/images/emoji/shaved_ice.png
+++ b/public/-/emojis/1/shaved_ice.png
Binary files differ
diff --git a/app/assets/images/emoji/sheep.png b/public/-/emojis/1/sheep.png
index 102b8a52b28..102b8a52b28 100644
--- a/app/assets/images/emoji/sheep.png
+++ b/public/-/emojis/1/sheep.png
Binary files differ
diff --git a/app/assets/images/emoji/shell.png b/public/-/emojis/1/shell.png
index 55721629f62..55721629f62 100644
--- a/app/assets/images/emoji/shell.png
+++ b/public/-/emojis/1/shell.png
Binary files differ
diff --git a/app/assets/images/emoji/shield.png b/public/-/emojis/1/shield.png
index 610bf033ce0..610bf033ce0 100644
--- a/app/assets/images/emoji/shield.png
+++ b/public/-/emojis/1/shield.png
Binary files differ
diff --git a/app/assets/images/emoji/shinto_shrine.png b/public/-/emojis/1/shinto_shrine.png
index 5a344975bf3..5a344975bf3 100644
--- a/app/assets/images/emoji/shinto_shrine.png
+++ b/public/-/emojis/1/shinto_shrine.png
Binary files differ
diff --git a/app/assets/images/emoji/ship.png b/public/-/emojis/1/ship.png
index 62d54f7d6c9..62d54f7d6c9 100644
--- a/app/assets/images/emoji/ship.png
+++ b/public/-/emojis/1/ship.png
Binary files differ
diff --git a/app/assets/images/emoji/shirt.png b/public/-/emojis/1/shirt.png
index af08dec8b59..af08dec8b59 100644
--- a/app/assets/images/emoji/shirt.png
+++ b/public/-/emojis/1/shirt.png
Binary files differ
diff --git a/app/assets/images/emoji/shopping_bags.png b/public/-/emojis/1/shopping_bags.png
index 99f2a2b13ac..99f2a2b13ac 100644
--- a/app/assets/images/emoji/shopping_bags.png
+++ b/public/-/emojis/1/shopping_bags.png
Binary files differ
diff --git a/app/assets/images/emoji/shopping_cart.png b/public/-/emojis/1/shopping_cart.png
index 1086fe6e456..1086fe6e456 100644
--- a/app/assets/images/emoji/shopping_cart.png
+++ b/public/-/emojis/1/shopping_cart.png
Binary files differ
diff --git a/app/assets/images/emoji/shower.png b/public/-/emojis/1/shower.png
index 156776a2e52..156776a2e52 100644
--- a/app/assets/images/emoji/shower.png
+++ b/public/-/emojis/1/shower.png
Binary files differ
diff --git a/app/assets/images/emoji/shrimp.png b/public/-/emojis/1/shrimp.png
index 49eff28a71e..49eff28a71e 100644
--- a/app/assets/images/emoji/shrimp.png
+++ b/public/-/emojis/1/shrimp.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug.png b/public/-/emojis/1/shrug.png
index 76e63bfac77..76e63bfac77 100644
--- a/app/assets/images/emoji/shrug.png
+++ b/public/-/emojis/1/shrug.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug_tone1.png b/public/-/emojis/1/shrug_tone1.png
index 1c895e64468..1c895e64468 100644
--- a/app/assets/images/emoji/shrug_tone1.png
+++ b/public/-/emojis/1/shrug_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug_tone2.png b/public/-/emojis/1/shrug_tone2.png
index 4e3ca8f8bac..4e3ca8f8bac 100644
--- a/app/assets/images/emoji/shrug_tone2.png
+++ b/public/-/emojis/1/shrug_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug_tone3.png b/public/-/emojis/1/shrug_tone3.png
index d1b16a19bb5..d1b16a19bb5 100644
--- a/app/assets/images/emoji/shrug_tone3.png
+++ b/public/-/emojis/1/shrug_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug_tone4.png b/public/-/emojis/1/shrug_tone4.png
index 5fbef3f2255..5fbef3f2255 100644
--- a/app/assets/images/emoji/shrug_tone4.png
+++ b/public/-/emojis/1/shrug_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/shrug_tone5.png b/public/-/emojis/1/shrug_tone5.png
index 4af2e28bc5c..4af2e28bc5c 100644
--- a/app/assets/images/emoji/shrug_tone5.png
+++ b/public/-/emojis/1/shrug_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/signal_strength.png b/public/-/emojis/1/signal_strength.png
index ee2b5a4b519..ee2b5a4b519 100644
--- a/app/assets/images/emoji/signal_strength.png
+++ b/public/-/emojis/1/signal_strength.png
Binary files differ
diff --git a/app/assets/images/emoji/six.png b/public/-/emojis/1/six.png
index 371b3acef2c..371b3acef2c 100644
--- a/app/assets/images/emoji/six.png
+++ b/public/-/emojis/1/six.png
Binary files differ
diff --git a/app/assets/images/emoji/six_pointed_star.png b/public/-/emojis/1/six_pointed_star.png
index 2eb1707458b..2eb1707458b 100644
--- a/app/assets/images/emoji/six_pointed_star.png
+++ b/public/-/emojis/1/six_pointed_star.png
Binary files differ
diff --git a/app/assets/images/emoji/ski.png b/public/-/emojis/1/ski.png
index 4a2d2c12306..4a2d2c12306 100644
--- a/app/assets/images/emoji/ski.png
+++ b/public/-/emojis/1/ski.png
Binary files differ
diff --git a/app/assets/images/emoji/skier.png b/public/-/emojis/1/skier.png
index 2eb3bdce2af..2eb3bdce2af 100644
--- a/app/assets/images/emoji/skier.png
+++ b/public/-/emojis/1/skier.png
Binary files differ
diff --git a/app/assets/images/emoji/skull.png b/public/-/emojis/1/skull.png
index 26abb17296a..26abb17296a 100644
--- a/app/assets/images/emoji/skull.png
+++ b/public/-/emojis/1/skull.png
Binary files differ
diff --git a/app/assets/images/emoji/skull_crossbones.png b/public/-/emojis/1/skull_crossbones.png
index b459df9227a..b459df9227a 100644
--- a/app/assets/images/emoji/skull_crossbones.png
+++ b/public/-/emojis/1/skull_crossbones.png
Binary files differ
diff --git a/app/assets/images/emoji/sleeping.png b/public/-/emojis/1/sleeping.png
index 9ecf600d6d8..9ecf600d6d8 100644
--- a/app/assets/images/emoji/sleeping.png
+++ b/public/-/emojis/1/sleeping.png
Binary files differ
diff --git a/app/assets/images/emoji/sleeping_accommodation.png b/public/-/emojis/1/sleeping_accommodation.png
index c739e7fb69b..c739e7fb69b 100644
--- a/app/assets/images/emoji/sleeping_accommodation.png
+++ b/public/-/emojis/1/sleeping_accommodation.png
Binary files differ
diff --git a/app/assets/images/emoji/sleepy.png b/public/-/emojis/1/sleepy.png
index 836b4107717..836b4107717 100644
--- a/app/assets/images/emoji/sleepy.png
+++ b/public/-/emojis/1/sleepy.png
Binary files differ
diff --git a/app/assets/images/emoji/slight_frown.png b/public/-/emojis/1/slight_frown.png
index b2f1d983d36..b2f1d983d36 100644
--- a/app/assets/images/emoji/slight_frown.png
+++ b/public/-/emojis/1/slight_frown.png
Binary files differ
diff --git a/app/assets/images/emoji/slight_smile.png b/public/-/emojis/1/slight_smile.png
index ddd7d65dd3d..ddd7d65dd3d 100644
--- a/app/assets/images/emoji/slight_smile.png
+++ b/public/-/emojis/1/slight_smile.png
Binary files differ
diff --git a/app/assets/images/emoji/slot_machine.png b/public/-/emojis/1/slot_machine.png
index ee71b6c268c..ee71b6c268c 100644
--- a/app/assets/images/emoji/slot_machine.png
+++ b/public/-/emojis/1/slot_machine.png
Binary files differ
diff --git a/app/assets/images/emoji/small_blue_diamond.png b/public/-/emojis/1/small_blue_diamond.png
index b86b5bc4db3..b86b5bc4db3 100644
--- a/app/assets/images/emoji/small_blue_diamond.png
+++ b/public/-/emojis/1/small_blue_diamond.png
Binary files differ
diff --git a/app/assets/images/emoji/small_orange_diamond.png b/public/-/emojis/1/small_orange_diamond.png
index e1c6ed9b2f8..e1c6ed9b2f8 100644
--- a/app/assets/images/emoji/small_orange_diamond.png
+++ b/public/-/emojis/1/small_orange_diamond.png
Binary files differ
diff --git a/app/assets/images/emoji/small_red_triangle.png b/public/-/emojis/1/small_red_triangle.png
index 785887c195a..785887c195a 100644
--- a/app/assets/images/emoji/small_red_triangle.png
+++ b/public/-/emojis/1/small_red_triangle.png
Binary files differ
diff --git a/app/assets/images/emoji/small_red_triangle_down.png b/public/-/emojis/1/small_red_triangle_down.png
index a83beff1914..a83beff1914 100644
--- a/app/assets/images/emoji/small_red_triangle_down.png
+++ b/public/-/emojis/1/small_red_triangle_down.png
Binary files differ
diff --git a/app/assets/images/emoji/smile.png b/public/-/emojis/1/smile.png
index aa47ffe978c..aa47ffe978c 100644
--- a/app/assets/images/emoji/smile.png
+++ b/public/-/emojis/1/smile.png
Binary files differ
diff --git a/app/assets/images/emoji/smile_cat.png b/public/-/emojis/1/smile_cat.png
index 6f25f11dd3a..6f25f11dd3a 100644
--- a/app/assets/images/emoji/smile_cat.png
+++ b/public/-/emojis/1/smile_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/smiley.png b/public/-/emojis/1/smiley.png
index 30957a65968..30957a65968 100644
--- a/app/assets/images/emoji/smiley.png
+++ b/public/-/emojis/1/smiley.png
Binary files differ
diff --git a/app/assets/images/emoji/smiley_cat.png b/public/-/emojis/1/smiley_cat.png
index 163b57a3427..163b57a3427 100644
--- a/app/assets/images/emoji/smiley_cat.png
+++ b/public/-/emojis/1/smiley_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/smiling_imp.png b/public/-/emojis/1/smiling_imp.png
index cc2c5f1ec72..cc2c5f1ec72 100644
--- a/app/assets/images/emoji/smiling_imp.png
+++ b/public/-/emojis/1/smiling_imp.png
Binary files differ
diff --git a/app/assets/images/emoji/smirk.png b/public/-/emojis/1/smirk.png
index 87852109988..87852109988 100644
--- a/app/assets/images/emoji/smirk.png
+++ b/public/-/emojis/1/smirk.png
Binary files differ
diff --git a/app/assets/images/emoji/smirk_cat.png b/public/-/emojis/1/smirk_cat.png
index 9ac5954c199..9ac5954c199 100644
--- a/app/assets/images/emoji/smirk_cat.png
+++ b/public/-/emojis/1/smirk_cat.png
Binary files differ
diff --git a/app/assets/images/emoji/smoking.png b/public/-/emojis/1/smoking.png
index 910f648c8f9..910f648c8f9 100644
--- a/app/assets/images/emoji/smoking.png
+++ b/public/-/emojis/1/smoking.png
Binary files differ
diff --git a/app/assets/images/emoji/snail.png b/public/-/emojis/1/snail.png
index f4ea071e2d3..f4ea071e2d3 100644
--- a/app/assets/images/emoji/snail.png
+++ b/public/-/emojis/1/snail.png
Binary files differ
diff --git a/app/assets/images/emoji/snake.png b/public/-/emojis/1/snake.png
index d0278a28d8c..d0278a28d8c 100644
--- a/app/assets/images/emoji/snake.png
+++ b/public/-/emojis/1/snake.png
Binary files differ
diff --git a/app/assets/images/emoji/sneezing_face.png b/public/-/emojis/1/sneezing_face.png
index ccf07d4b64d..ccf07d4b64d 100644
--- a/app/assets/images/emoji/sneezing_face.png
+++ b/public/-/emojis/1/sneezing_face.png
Binary files differ
diff --git a/app/assets/images/emoji/snowboarder.png b/public/-/emojis/1/snowboarder.png
index 6361c0f2c9d..6361c0f2c9d 100644
--- a/app/assets/images/emoji/snowboarder.png
+++ b/public/-/emojis/1/snowboarder.png
Binary files differ
diff --git a/app/assets/images/emoji/snowflake.png b/public/-/emojis/1/snowflake.png
index db319a77ec6..db319a77ec6 100644
--- a/app/assets/images/emoji/snowflake.png
+++ b/public/-/emojis/1/snowflake.png
Binary files differ
diff --git a/app/assets/images/emoji/snowman.png b/public/-/emojis/1/snowman.png
index 20c177c2aff..20c177c2aff 100644
--- a/app/assets/images/emoji/snowman.png
+++ b/public/-/emojis/1/snowman.png
Binary files differ
diff --git a/app/assets/images/emoji/snowman2.png b/public/-/emojis/1/snowman2.png
index 896f28502af..896f28502af 100644
--- a/app/assets/images/emoji/snowman2.png
+++ b/public/-/emojis/1/snowman2.png
Binary files differ
diff --git a/app/assets/images/emoji/sob.png b/public/-/emojis/1/sob.png
index 52e3517a1ee..52e3517a1ee 100644
--- a/app/assets/images/emoji/sob.png
+++ b/public/-/emojis/1/sob.png
Binary files differ
diff --git a/app/assets/images/emoji/soccer.png b/public/-/emojis/1/soccer.png
index 28cfa218d6d..28cfa218d6d 100644
--- a/app/assets/images/emoji/soccer.png
+++ b/public/-/emojis/1/soccer.png
Binary files differ
diff --git a/app/assets/images/emoji/soon.png b/public/-/emojis/1/soon.png
index 8cdfd86690d..8cdfd86690d 100644
--- a/app/assets/images/emoji/soon.png
+++ b/public/-/emojis/1/soon.png
Binary files differ
diff --git a/app/assets/images/emoji/sos.png b/public/-/emojis/1/sos.png
index d7d8c9953e4..d7d8c9953e4 100644
--- a/app/assets/images/emoji/sos.png
+++ b/public/-/emojis/1/sos.png
Binary files differ
diff --git a/app/assets/images/emoji/sound.png b/public/-/emojis/1/sound.png
index e75ddca53ba..e75ddca53ba 100644
--- a/app/assets/images/emoji/sound.png
+++ b/public/-/emojis/1/sound.png
Binary files differ
diff --git a/app/assets/images/emoji/space_invader.png b/public/-/emojis/1/space_invader.png
index 2e73f5f32e5..2e73f5f32e5 100644
--- a/app/assets/images/emoji/space_invader.png
+++ b/public/-/emojis/1/space_invader.png
Binary files differ
diff --git a/app/assets/images/emoji/spades.png b/public/-/emojis/1/spades.png
index f822f184cb0..f822f184cb0 100644
--- a/app/assets/images/emoji/spades.png
+++ b/public/-/emojis/1/spades.png
Binary files differ
diff --git a/app/assets/images/emoji/spaghetti.png b/public/-/emojis/1/spaghetti.png
index 89c24a321f1..89c24a321f1 100644
--- a/app/assets/images/emoji/spaghetti.png
+++ b/public/-/emojis/1/spaghetti.png
Binary files differ
diff --git a/app/assets/images/emoji/sparkle.png b/public/-/emojis/1/sparkle.png
index 6aa7b6ec9cf..6aa7b6ec9cf 100644
--- a/app/assets/images/emoji/sparkle.png
+++ b/public/-/emojis/1/sparkle.png
Binary files differ
diff --git a/app/assets/images/emoji/sparkler.png b/public/-/emojis/1/sparkler.png
index 30339cd6e09..30339cd6e09 100644
--- a/app/assets/images/emoji/sparkler.png
+++ b/public/-/emojis/1/sparkler.png
Binary files differ
diff --git a/app/assets/images/emoji/sparkles.png b/public/-/emojis/1/sparkles.png
index 169bc10b023..169bc10b023 100644
--- a/app/assets/images/emoji/sparkles.png
+++ b/public/-/emojis/1/sparkles.png
Binary files differ
diff --git a/app/assets/images/emoji/sparkling_heart.png b/public/-/emojis/1/sparkling_heart.png
index 6709269454e..6709269454e 100644
--- a/app/assets/images/emoji/sparkling_heart.png
+++ b/public/-/emojis/1/sparkling_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/speak_no_evil.png b/public/-/emojis/1/speak_no_evil.png
index 9d9e07c974b..9d9e07c974b 100644
--- a/app/assets/images/emoji/speak_no_evil.png
+++ b/public/-/emojis/1/speak_no_evil.png
Binary files differ
diff --git a/app/assets/images/emoji/speaker.png b/public/-/emojis/1/speaker.png
index 7bcffb8fc43..7bcffb8fc43 100644
--- a/app/assets/images/emoji/speaker.png
+++ b/public/-/emojis/1/speaker.png
Binary files differ
diff --git a/app/assets/images/emoji/speaking_head.png b/public/-/emojis/1/speaking_head.png
index 2df93aaae09..2df93aaae09 100644
--- a/app/assets/images/emoji/speaking_head.png
+++ b/public/-/emojis/1/speaking_head.png
Binary files differ
diff --git a/app/assets/images/emoji/speech_balloon.png b/public/-/emojis/1/speech_balloon.png
index a34ef741733..a34ef741733 100644
--- a/app/assets/images/emoji/speech_balloon.png
+++ b/public/-/emojis/1/speech_balloon.png
Binary files differ
diff --git a/app/assets/images/emoji/speech_left.png b/public/-/emojis/1/speech_left.png
index 00c05959bcd..00c05959bcd 100644
--- a/app/assets/images/emoji/speech_left.png
+++ b/public/-/emojis/1/speech_left.png
Binary files differ
diff --git a/app/assets/images/emoji/speedboat.png b/public/-/emojis/1/speedboat.png
index 74059d12de1..74059d12de1 100644
--- a/app/assets/images/emoji/speedboat.png
+++ b/public/-/emojis/1/speedboat.png
Binary files differ
diff --git a/app/assets/images/emoji/spider.png b/public/-/emojis/1/spider.png
index 3849fa90b94..3849fa90b94 100644
--- a/app/assets/images/emoji/spider.png
+++ b/public/-/emojis/1/spider.png
Binary files differ
diff --git a/app/assets/images/emoji/spider_web.png b/public/-/emojis/1/spider_web.png
index ba448ee7fba..ba448ee7fba 100644
--- a/app/assets/images/emoji/spider_web.png
+++ b/public/-/emojis/1/spider_web.png
Binary files differ
diff --git a/app/assets/images/emoji/spoon.png b/public/-/emojis/1/spoon.png
index 3c4da766aee..3c4da766aee 100644
--- a/app/assets/images/emoji/spoon.png
+++ b/public/-/emojis/1/spoon.png
Binary files differ
diff --git a/app/assets/images/emoji/spy.png b/public/-/emojis/1/spy.png
index a729e9584d6..a729e9584d6 100644
--- a/app/assets/images/emoji/spy.png
+++ b/public/-/emojis/1/spy.png
Binary files differ
diff --git a/app/assets/images/emoji/spy_tone1.png b/public/-/emojis/1/spy_tone1.png
index 2d1c022caee..2d1c022caee 100644
--- a/app/assets/images/emoji/spy_tone1.png
+++ b/public/-/emojis/1/spy_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/spy_tone2.png b/public/-/emojis/1/spy_tone2.png
index 548b9c26f5d..548b9c26f5d 100644
--- a/app/assets/images/emoji/spy_tone2.png
+++ b/public/-/emojis/1/spy_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/spy_tone3.png b/public/-/emojis/1/spy_tone3.png
index b023f4b18e1..b023f4b18e1 100644
--- a/app/assets/images/emoji/spy_tone3.png
+++ b/public/-/emojis/1/spy_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/spy_tone4.png b/public/-/emojis/1/spy_tone4.png
index d8300af492d..d8300af492d 100644
--- a/app/assets/images/emoji/spy_tone4.png
+++ b/public/-/emojis/1/spy_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/spy_tone5.png b/public/-/emojis/1/spy_tone5.png
index ca1462595fa..ca1462595fa 100644
--- a/app/assets/images/emoji/spy_tone5.png
+++ b/public/-/emojis/1/spy_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/squid.png b/public/-/emojis/1/squid.png
index d2af223f0cb..d2af223f0cb 100644
--- a/app/assets/images/emoji/squid.png
+++ b/public/-/emojis/1/squid.png
Binary files differ
diff --git a/app/assets/images/emoji/stadium.png b/public/-/emojis/1/stadium.png
index 00cd6db5e29..00cd6db5e29 100644
--- a/app/assets/images/emoji/stadium.png
+++ b/public/-/emojis/1/stadium.png
Binary files differ
diff --git a/app/assets/images/emoji/star.png b/public/-/emojis/1/star.png
index c930947076e..c930947076e 100644
--- a/app/assets/images/emoji/star.png
+++ b/public/-/emojis/1/star.png
Binary files differ
diff --git a/app/assets/images/emoji/star2.png b/public/-/emojis/1/star2.png
index 2f5cba592db..2f5cba592db 100644
--- a/app/assets/images/emoji/star2.png
+++ b/public/-/emojis/1/star2.png
Binary files differ
diff --git a/app/assets/images/emoji/star_and_crescent.png b/public/-/emojis/1/star_and_crescent.png
index e182636457d..e182636457d 100644
--- a/app/assets/images/emoji/star_and_crescent.png
+++ b/public/-/emojis/1/star_and_crescent.png
Binary files differ
diff --git a/app/assets/images/emoji/star_of_david.png b/public/-/emojis/1/star_of_david.png
index fc59d0dde24..fc59d0dde24 100644
--- a/app/assets/images/emoji/star_of_david.png
+++ b/public/-/emojis/1/star_of_david.png
Binary files differ
diff --git a/app/assets/images/emoji/stars.png b/public/-/emojis/1/stars.png
index aa45384d1c6..aa45384d1c6 100644
--- a/app/assets/images/emoji/stars.png
+++ b/public/-/emojis/1/stars.png
Binary files differ
diff --git a/app/assets/images/emoji/station.png b/public/-/emojis/1/station.png
index 5c26fee529c..5c26fee529c 100644
--- a/app/assets/images/emoji/station.png
+++ b/public/-/emojis/1/station.png
Binary files differ
diff --git a/app/assets/images/emoji/statue_of_liberty.png b/public/-/emojis/1/statue_of_liberty.png
index 05df8289b59..05df8289b59 100644
--- a/app/assets/images/emoji/statue_of_liberty.png
+++ b/public/-/emojis/1/statue_of_liberty.png
Binary files differ
diff --git a/app/assets/images/emoji/steam_locomotive.png b/public/-/emojis/1/steam_locomotive.png
index 9ac0d999c4c..9ac0d999c4c 100644
--- a/app/assets/images/emoji/steam_locomotive.png
+++ b/public/-/emojis/1/steam_locomotive.png
Binary files differ
diff --git a/app/assets/images/emoji/stew.png b/public/-/emojis/1/stew.png
index 6b3f010c17a..6b3f010c17a 100644
--- a/app/assets/images/emoji/stew.png
+++ b/public/-/emojis/1/stew.png
Binary files differ
diff --git a/app/assets/images/emoji/stop_button.png b/public/-/emojis/1/stop_button.png
index cfa99988ac2..cfa99988ac2 100644
--- a/app/assets/images/emoji/stop_button.png
+++ b/public/-/emojis/1/stop_button.png
Binary files differ
diff --git a/app/assets/images/emoji/stopwatch.png b/public/-/emojis/1/stopwatch.png
index 8fae1c9a898..8fae1c9a898 100644
--- a/app/assets/images/emoji/stopwatch.png
+++ b/public/-/emojis/1/stopwatch.png
Binary files differ
diff --git a/app/assets/images/emoji/straight_ruler.png b/public/-/emojis/1/straight_ruler.png
index 1017b7433a1..1017b7433a1 100644
--- a/app/assets/images/emoji/straight_ruler.png
+++ b/public/-/emojis/1/straight_ruler.png
Binary files differ
diff --git a/app/assets/images/emoji/strawberry.png b/public/-/emojis/1/strawberry.png
index 7bb86f0b29c..7bb86f0b29c 100644
--- a/app/assets/images/emoji/strawberry.png
+++ b/public/-/emojis/1/strawberry.png
Binary files differ
diff --git a/app/assets/images/emoji/stuck_out_tongue.png b/public/-/emojis/1/stuck_out_tongue.png
index 25757341f96..25757341f96 100644
--- a/app/assets/images/emoji/stuck_out_tongue.png
+++ b/public/-/emojis/1/stuck_out_tongue.png
Binary files differ
diff --git a/app/assets/images/emoji/stuck_out_tongue_closed_eyes.png b/public/-/emojis/1/stuck_out_tongue_closed_eyes.png
index 5c0401e9b1d..5c0401e9b1d 100644
--- a/app/assets/images/emoji/stuck_out_tongue_closed_eyes.png
+++ b/public/-/emojis/1/stuck_out_tongue_closed_eyes.png
Binary files differ
diff --git a/app/assets/images/emoji/stuck_out_tongue_winking_eye.png b/public/-/emojis/1/stuck_out_tongue_winking_eye.png
index 4817eaa3dc6..4817eaa3dc6 100644
--- a/app/assets/images/emoji/stuck_out_tongue_winking_eye.png
+++ b/public/-/emojis/1/stuck_out_tongue_winking_eye.png
Binary files differ
diff --git a/app/assets/images/emoji/stuffed_flatbread.png b/public/-/emojis/1/stuffed_flatbread.png
index a2e10df40a5..a2e10df40a5 100644
--- a/app/assets/images/emoji/stuffed_flatbread.png
+++ b/public/-/emojis/1/stuffed_flatbread.png
Binary files differ
diff --git a/app/assets/images/emoji/sun_with_face.png b/public/-/emojis/1/sun_with_face.png
index 14a4ea971db..14a4ea971db 100644
--- a/app/assets/images/emoji/sun_with_face.png
+++ b/public/-/emojis/1/sun_with_face.png
Binary files differ
diff --git a/app/assets/images/emoji/sunflower.png b/public/-/emojis/1/sunflower.png
index 08cc07761ea..08cc07761ea 100644
--- a/app/assets/images/emoji/sunflower.png
+++ b/public/-/emojis/1/sunflower.png
Binary files differ
diff --git a/app/assets/images/emoji/sunglasses.png b/public/-/emojis/1/sunglasses.png
index 20011735110..20011735110 100644
--- a/app/assets/images/emoji/sunglasses.png
+++ b/public/-/emojis/1/sunglasses.png
Binary files differ
diff --git a/app/assets/images/emoji/sunny.png b/public/-/emojis/1/sunny.png
index fd521ae31a7..fd521ae31a7 100644
--- a/app/assets/images/emoji/sunny.png
+++ b/public/-/emojis/1/sunny.png
Binary files differ
diff --git a/app/assets/images/emoji/sunrise.png b/public/-/emojis/1/sunrise.png
index 4ad36003c20..4ad36003c20 100644
--- a/app/assets/images/emoji/sunrise.png
+++ b/public/-/emojis/1/sunrise.png
Binary files differ
diff --git a/app/assets/images/emoji/sunrise_over_mountains.png b/public/-/emojis/1/sunrise_over_mountains.png
index 2b99307344d..2b99307344d 100644
--- a/app/assets/images/emoji/sunrise_over_mountains.png
+++ b/public/-/emojis/1/sunrise_over_mountains.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer.png b/public/-/emojis/1/surfer.png
index 3ab017adf4b..3ab017adf4b 100644
--- a/app/assets/images/emoji/surfer.png
+++ b/public/-/emojis/1/surfer.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer_tone1.png b/public/-/emojis/1/surfer_tone1.png
index b5faaa524cc..b5faaa524cc 100644
--- a/app/assets/images/emoji/surfer_tone1.png
+++ b/public/-/emojis/1/surfer_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer_tone2.png b/public/-/emojis/1/surfer_tone2.png
index 6d92e412ff1..6d92e412ff1 100644
--- a/app/assets/images/emoji/surfer_tone2.png
+++ b/public/-/emojis/1/surfer_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer_tone3.png b/public/-/emojis/1/surfer_tone3.png
index f05ef59496e..f05ef59496e 100644
--- a/app/assets/images/emoji/surfer_tone3.png
+++ b/public/-/emojis/1/surfer_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer_tone4.png b/public/-/emojis/1/surfer_tone4.png
index 35e143d19dc..35e143d19dc 100644
--- a/app/assets/images/emoji/surfer_tone4.png
+++ b/public/-/emojis/1/surfer_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/surfer_tone5.png b/public/-/emojis/1/surfer_tone5.png
index 38917658eac..38917658eac 100644
--- a/app/assets/images/emoji/surfer_tone5.png
+++ b/public/-/emojis/1/surfer_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/sushi.png b/public/-/emojis/1/sushi.png
index f171fd2f7a1..f171fd2f7a1 100644
--- a/app/assets/images/emoji/sushi.png
+++ b/public/-/emojis/1/sushi.png
Binary files differ
diff --git a/app/assets/images/emoji/suspension_railway.png b/public/-/emojis/1/suspension_railway.png
index a59d5f48c24..a59d5f48c24 100644
--- a/app/assets/images/emoji/suspension_railway.png
+++ b/public/-/emojis/1/suspension_railway.png
Binary files differ
diff --git a/app/assets/images/emoji/sweat.png b/public/-/emojis/1/sweat.png
index f0dae7b7893..f0dae7b7893 100644
--- a/app/assets/images/emoji/sweat.png
+++ b/public/-/emojis/1/sweat.png
Binary files differ
diff --git a/app/assets/images/emoji/sweat_drops.png b/public/-/emojis/1/sweat_drops.png
index 4106117ebc8..4106117ebc8 100644
--- a/app/assets/images/emoji/sweat_drops.png
+++ b/public/-/emojis/1/sweat_drops.png
Binary files differ
diff --git a/app/assets/images/emoji/sweat_smile.png b/public/-/emojis/1/sweat_smile.png
index cb18d9c899b..cb18d9c899b 100644
--- a/app/assets/images/emoji/sweat_smile.png
+++ b/public/-/emojis/1/sweat_smile.png
Binary files differ
diff --git a/app/assets/images/emoji/sweet_potato.png b/public/-/emojis/1/sweet_potato.png
index 92a425f2e20..92a425f2e20 100644
--- a/app/assets/images/emoji/sweet_potato.png
+++ b/public/-/emojis/1/sweet_potato.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer.png b/public/-/emojis/1/swimmer.png
index 55b4d72f9a7..55b4d72f9a7 100644
--- a/app/assets/images/emoji/swimmer.png
+++ b/public/-/emojis/1/swimmer.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer_tone1.png b/public/-/emojis/1/swimmer_tone1.png
index 38441c9ca9a..38441c9ca9a 100644
--- a/app/assets/images/emoji/swimmer_tone1.png
+++ b/public/-/emojis/1/swimmer_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer_tone2.png b/public/-/emojis/1/swimmer_tone2.png
index b0d43112444..b0d43112444 100644
--- a/app/assets/images/emoji/swimmer_tone2.png
+++ b/public/-/emojis/1/swimmer_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer_tone3.png b/public/-/emojis/1/swimmer_tone3.png
index 211e77e2aa0..211e77e2aa0 100644
--- a/app/assets/images/emoji/swimmer_tone3.png
+++ b/public/-/emojis/1/swimmer_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer_tone4.png b/public/-/emojis/1/swimmer_tone4.png
index f34c34db9d2..f34c34db9d2 100644
--- a/app/assets/images/emoji/swimmer_tone4.png
+++ b/public/-/emojis/1/swimmer_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/swimmer_tone5.png b/public/-/emojis/1/swimmer_tone5.png
index 3e9231ff868..3e9231ff868 100644
--- a/app/assets/images/emoji/swimmer_tone5.png
+++ b/public/-/emojis/1/swimmer_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/symbols.png b/public/-/emojis/1/symbols.png
index ac2fc1f358f..ac2fc1f358f 100644
--- a/app/assets/images/emoji/symbols.png
+++ b/public/-/emojis/1/symbols.png
Binary files differ
diff --git a/app/assets/images/emoji/synagogue.png b/public/-/emojis/1/synagogue.png
index ee347904c80..ee347904c80 100644
--- a/app/assets/images/emoji/synagogue.png
+++ b/public/-/emojis/1/synagogue.png
Binary files differ
diff --git a/app/assets/images/emoji/syringe.png b/public/-/emojis/1/syringe.png
index 71c1a9528d5..71c1a9528d5 100644
--- a/app/assets/images/emoji/syringe.png
+++ b/public/-/emojis/1/syringe.png
Binary files differ
diff --git a/app/assets/images/emoji/taco.png b/public/-/emojis/1/taco.png
index 10e847a4619..10e847a4619 100644
--- a/app/assets/images/emoji/taco.png
+++ b/public/-/emojis/1/taco.png
Binary files differ
diff --git a/app/assets/images/emoji/tada.png b/public/-/emojis/1/tada.png
index 0244d60f269..0244d60f269 100644
--- a/app/assets/images/emoji/tada.png
+++ b/public/-/emojis/1/tada.png
Binary files differ
diff --git a/app/assets/images/emoji/tanabata_tree.png b/public/-/emojis/1/tanabata_tree.png
index 46fcb3a1aac..46fcb3a1aac 100644
--- a/app/assets/images/emoji/tanabata_tree.png
+++ b/public/-/emojis/1/tanabata_tree.png
Binary files differ
diff --git a/app/assets/images/emoji/tangerine.png b/public/-/emojis/1/tangerine.png
index ab14e5378db..ab14e5378db 100644
--- a/app/assets/images/emoji/tangerine.png
+++ b/public/-/emojis/1/tangerine.png
Binary files differ
diff --git a/app/assets/images/emoji/taurus.png b/public/-/emojis/1/taurus.png
index b2a370df42b..b2a370df42b 100644
--- a/app/assets/images/emoji/taurus.png
+++ b/public/-/emojis/1/taurus.png
Binary files differ
diff --git a/app/assets/images/emoji/taxi.png b/public/-/emojis/1/taxi.png
index 55f4cc84797..55f4cc84797 100644
--- a/app/assets/images/emoji/taxi.png
+++ b/public/-/emojis/1/taxi.png
Binary files differ
diff --git a/app/assets/images/emoji/tea.png b/public/-/emojis/1/tea.png
index b53b98f0c45..b53b98f0c45 100644
--- a/app/assets/images/emoji/tea.png
+++ b/public/-/emojis/1/tea.png
Binary files differ
diff --git a/app/assets/images/emoji/telephone.png b/public/-/emojis/1/telephone.png
index a1e69f566bc..a1e69f566bc 100644
--- a/app/assets/images/emoji/telephone.png
+++ b/public/-/emojis/1/telephone.png
Binary files differ
diff --git a/app/assets/images/emoji/telephone_receiver.png b/public/-/emojis/1/telephone_receiver.png
index 69388316c35..69388316c35 100644
--- a/app/assets/images/emoji/telephone_receiver.png
+++ b/public/-/emojis/1/telephone_receiver.png
Binary files differ
diff --git a/app/assets/images/emoji/telescope.png b/public/-/emojis/1/telescope.png
index d63154614b5..d63154614b5 100644
--- a/app/assets/images/emoji/telescope.png
+++ b/public/-/emojis/1/telescope.png
Binary files differ
diff --git a/app/assets/images/emoji/ten.png b/public/-/emojis/1/ten.png
index 782d4004962..782d4004962 100644
--- a/app/assets/images/emoji/ten.png
+++ b/public/-/emojis/1/ten.png
Binary files differ
diff --git a/app/assets/images/emoji/tennis.png b/public/-/emojis/1/tennis.png
index 7e68ba8f301..7e68ba8f301 100644
--- a/app/assets/images/emoji/tennis.png
+++ b/public/-/emojis/1/tennis.png
Binary files differ
diff --git a/app/assets/images/emoji/tent.png b/public/-/emojis/1/tent.png
index 3fddcfc56eb..3fddcfc56eb 100644
--- a/app/assets/images/emoji/tent.png
+++ b/public/-/emojis/1/tent.png
Binary files differ
diff --git a/app/assets/images/emoji/thermometer.png b/public/-/emojis/1/thermometer.png
index b1147392426..b1147392426 100644
--- a/app/assets/images/emoji/thermometer.png
+++ b/public/-/emojis/1/thermometer.png
Binary files differ
diff --git a/app/assets/images/emoji/thermometer_face.png b/public/-/emojis/1/thermometer_face.png
index 8fc57387563..8fc57387563 100644
--- a/app/assets/images/emoji/thermometer_face.png
+++ b/public/-/emojis/1/thermometer_face.png
Binary files differ
diff --git a/app/assets/images/emoji/thinking.png b/public/-/emojis/1/thinking.png
index c18f6fd14ad..c18f6fd14ad 100644
--- a/app/assets/images/emoji/thinking.png
+++ b/public/-/emojis/1/thinking.png
Binary files differ
diff --git a/app/assets/images/emoji/third_place.png b/public/-/emojis/1/third_place.png
index 636e04a5950..636e04a5950 100644
--- a/app/assets/images/emoji/third_place.png
+++ b/public/-/emojis/1/third_place.png
Binary files differ
diff --git a/app/assets/images/emoji/thought_balloon.png b/public/-/emojis/1/thought_balloon.png
index 72fe8fa7022..72fe8fa7022 100644
--- a/app/assets/images/emoji/thought_balloon.png
+++ b/public/-/emojis/1/thought_balloon.png
Binary files differ
diff --git a/app/assets/images/emoji/three.png b/public/-/emojis/1/three.png
index dbaa6183e72..dbaa6183e72 100644
--- a/app/assets/images/emoji/three.png
+++ b/public/-/emojis/1/three.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown.png b/public/-/emojis/1/thumbsdown.png
index b63da2f20a8..b63da2f20a8 100644
--- a/app/assets/images/emoji/thumbsdown.png
+++ b/public/-/emojis/1/thumbsdown.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown_tone1.png b/public/-/emojis/1/thumbsdown_tone1.png
index a1631af8e92..a1631af8e92 100644
--- a/app/assets/images/emoji/thumbsdown_tone1.png
+++ b/public/-/emojis/1/thumbsdown_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown_tone2.png b/public/-/emojis/1/thumbsdown_tone2.png
index 85fff82d595..85fff82d595 100644
--- a/app/assets/images/emoji/thumbsdown_tone2.png
+++ b/public/-/emojis/1/thumbsdown_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown_tone3.png b/public/-/emojis/1/thumbsdown_tone3.png
index eeba3be80fd..eeba3be80fd 100644
--- a/app/assets/images/emoji/thumbsdown_tone3.png
+++ b/public/-/emojis/1/thumbsdown_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown_tone4.png b/public/-/emojis/1/thumbsdown_tone4.png
index 1addafdaed0..1addafdaed0 100644
--- a/app/assets/images/emoji/thumbsdown_tone4.png
+++ b/public/-/emojis/1/thumbsdown_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsdown_tone5.png b/public/-/emojis/1/thumbsdown_tone5.png
index 37ec07b5721..37ec07b5721 100644
--- a/app/assets/images/emoji/thumbsdown_tone5.png
+++ b/public/-/emojis/1/thumbsdown_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup.png b/public/-/emojis/1/thumbsup.png
index f9e6f13a34f..f9e6f13a34f 100644
--- a/app/assets/images/emoji/thumbsup.png
+++ b/public/-/emojis/1/thumbsup.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup_tone1.png b/public/-/emojis/1/thumbsup_tone1.png
index 39684cd5cc7..39684cd5cc7 100644
--- a/app/assets/images/emoji/thumbsup_tone1.png
+++ b/public/-/emojis/1/thumbsup_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup_tone2.png b/public/-/emojis/1/thumbsup_tone2.png
index a9b59723573..a9b59723573 100644
--- a/app/assets/images/emoji/thumbsup_tone2.png
+++ b/public/-/emojis/1/thumbsup_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup_tone3.png b/public/-/emojis/1/thumbsup_tone3.png
index c5e29167015..c5e29167015 100644
--- a/app/assets/images/emoji/thumbsup_tone3.png
+++ b/public/-/emojis/1/thumbsup_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup_tone4.png b/public/-/emojis/1/thumbsup_tone4.png
index 5bf4857a884..5bf4857a884 100644
--- a/app/assets/images/emoji/thumbsup_tone4.png
+++ b/public/-/emojis/1/thumbsup_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/thumbsup_tone5.png b/public/-/emojis/1/thumbsup_tone5.png
index d829f787c61..d829f787c61 100644
--- a/app/assets/images/emoji/thumbsup_tone5.png
+++ b/public/-/emojis/1/thumbsup_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/thunder_cloud_rain.png b/public/-/emojis/1/thunder_cloud_rain.png
index 31a26a1b6ee..31a26a1b6ee 100644
--- a/app/assets/images/emoji/thunder_cloud_rain.png
+++ b/public/-/emojis/1/thunder_cloud_rain.png
Binary files differ
diff --git a/app/assets/images/emoji/ticket.png b/public/-/emojis/1/ticket.png
index 605936bb6b3..605936bb6b3 100644
--- a/app/assets/images/emoji/ticket.png
+++ b/public/-/emojis/1/ticket.png
Binary files differ
diff --git a/app/assets/images/emoji/tickets.png b/public/-/emojis/1/tickets.png
index e510f4a7a50..e510f4a7a50 100644
--- a/app/assets/images/emoji/tickets.png
+++ b/public/-/emojis/1/tickets.png
Binary files differ
diff --git a/app/assets/images/emoji/tiger.png b/public/-/emojis/1/tiger.png
index a4d3ef086d4..a4d3ef086d4 100644
--- a/app/assets/images/emoji/tiger.png
+++ b/public/-/emojis/1/tiger.png
Binary files differ
diff --git a/app/assets/images/emoji/tiger2.png b/public/-/emojis/1/tiger2.png
index 871a8b74d56..871a8b74d56 100644
--- a/app/assets/images/emoji/tiger2.png
+++ b/public/-/emojis/1/tiger2.png
Binary files differ
diff --git a/app/assets/images/emoji/timer.png b/public/-/emojis/1/timer.png
index 8a3be574c24..8a3be574c24 100644
--- a/app/assets/images/emoji/timer.png
+++ b/public/-/emojis/1/timer.png
Binary files differ
diff --git a/app/assets/images/emoji/tired_face.png b/public/-/emojis/1/tired_face.png
index 4e01eff5b23..4e01eff5b23 100644
--- a/app/assets/images/emoji/tired_face.png
+++ b/public/-/emojis/1/tired_face.png
Binary files differ
diff --git a/app/assets/images/emoji/tm.png b/public/-/emojis/1/tm.png
index 7a0c44a2c2b..7a0c44a2c2b 100644
--- a/app/assets/images/emoji/tm.png
+++ b/public/-/emojis/1/tm.png
Binary files differ
diff --git a/app/assets/images/emoji/toilet.png b/public/-/emojis/1/toilet.png
index 1392f761835..1392f761835 100644
--- a/app/assets/images/emoji/toilet.png
+++ b/public/-/emojis/1/toilet.png
Binary files differ
diff --git a/app/assets/images/emoji/tokyo_tower.png b/public/-/emojis/1/tokyo_tower.png
index 37df7fc65b1..37df7fc65b1 100644
--- a/app/assets/images/emoji/tokyo_tower.png
+++ b/public/-/emojis/1/tokyo_tower.png
Binary files differ
diff --git a/app/assets/images/emoji/tomato.png b/public/-/emojis/1/tomato.png
index 497da8f6b22..497da8f6b22 100644
--- a/app/assets/images/emoji/tomato.png
+++ b/public/-/emojis/1/tomato.png
Binary files differ
diff --git a/app/assets/images/emoji/tone1.png b/public/-/emojis/1/tone1.png
index c395f3d0d68..c395f3d0d68 100644
--- a/app/assets/images/emoji/tone1.png
+++ b/public/-/emojis/1/tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/tone2.png b/public/-/emojis/1/tone2.png
index 080847431c1..080847431c1 100644
--- a/app/assets/images/emoji/tone2.png
+++ b/public/-/emojis/1/tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/tone3.png b/public/-/emojis/1/tone3.png
index 482dd403475..482dd403475 100644
--- a/app/assets/images/emoji/tone3.png
+++ b/public/-/emojis/1/tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/tone4.png b/public/-/emojis/1/tone4.png
index 5cae8bb20b0..5cae8bb20b0 100644
--- a/app/assets/images/emoji/tone4.png
+++ b/public/-/emojis/1/tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/tone5.png b/public/-/emojis/1/tone5.png
index 49d1a8c3a64..49d1a8c3a64 100644
--- a/app/assets/images/emoji/tone5.png
+++ b/public/-/emojis/1/tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/tongue.png b/public/-/emojis/1/tongue.png
index 70ce9c1225f..70ce9c1225f 100644
--- a/app/assets/images/emoji/tongue.png
+++ b/public/-/emojis/1/tongue.png
Binary files differ
diff --git a/app/assets/images/emoji/tools.png b/public/-/emojis/1/tools.png
index 3c6049273a9..3c6049273a9 100644
--- a/app/assets/images/emoji/tools.png
+++ b/public/-/emojis/1/tools.png
Binary files differ
diff --git a/app/assets/images/emoji/top.png b/public/-/emojis/1/top.png
index 49dea8c08b5..49dea8c08b5 100644
--- a/app/assets/images/emoji/top.png
+++ b/public/-/emojis/1/top.png
Binary files differ
diff --git a/app/assets/images/emoji/tophat.png b/public/-/emojis/1/tophat.png
index 131b657b109..131b657b109 100644
--- a/app/assets/images/emoji/tophat.png
+++ b/public/-/emojis/1/tophat.png
Binary files differ
diff --git a/app/assets/images/emoji/track_next.png b/public/-/emojis/1/track_next.png
index f8880d33bab..f8880d33bab 100644
--- a/app/assets/images/emoji/track_next.png
+++ b/public/-/emojis/1/track_next.png
Binary files differ
diff --git a/app/assets/images/emoji/track_previous.png b/public/-/emojis/1/track_previous.png
index 1ffd0566cfc..1ffd0566cfc 100644
--- a/app/assets/images/emoji/track_previous.png
+++ b/public/-/emojis/1/track_previous.png
Binary files differ
diff --git a/app/assets/images/emoji/trackball.png b/public/-/emojis/1/trackball.png
index 3bea84ad7ce..3bea84ad7ce 100644
--- a/app/assets/images/emoji/trackball.png
+++ b/public/-/emojis/1/trackball.png
Binary files differ
diff --git a/app/assets/images/emoji/tractor.png b/public/-/emojis/1/tractor.png
index c1bf8cae44f..c1bf8cae44f 100644
--- a/app/assets/images/emoji/tractor.png
+++ b/public/-/emojis/1/tractor.png
Binary files differ
diff --git a/app/assets/images/emoji/traffic_light.png b/public/-/emojis/1/traffic_light.png
index 6b312285b00..6b312285b00 100644
--- a/app/assets/images/emoji/traffic_light.png
+++ b/public/-/emojis/1/traffic_light.png
Binary files differ
diff --git a/app/assets/images/emoji/train.png b/public/-/emojis/1/train.png
index 3c80321f7e8..3c80321f7e8 100644
--- a/app/assets/images/emoji/train.png
+++ b/public/-/emojis/1/train.png
Binary files differ
diff --git a/app/assets/images/emoji/train2.png b/public/-/emojis/1/train2.png
index 367c7bc5d39..367c7bc5d39 100644
--- a/app/assets/images/emoji/train2.png
+++ b/public/-/emojis/1/train2.png
Binary files differ
diff --git a/app/assets/images/emoji/tram.png b/public/-/emojis/1/tram.png
index b6f0e69038f..b6f0e69038f 100644
--- a/app/assets/images/emoji/tram.png
+++ b/public/-/emojis/1/tram.png
Binary files differ
diff --git a/app/assets/images/emoji/triangular_flag_on_post.png b/public/-/emojis/1/triangular_flag_on_post.png
index c12d8b06886..c12d8b06886 100644
--- a/app/assets/images/emoji/triangular_flag_on_post.png
+++ b/public/-/emojis/1/triangular_flag_on_post.png
Binary files differ
diff --git a/app/assets/images/emoji/triangular_ruler.png b/public/-/emojis/1/triangular_ruler.png
index 77dee9ee843..77dee9ee843 100644
--- a/app/assets/images/emoji/triangular_ruler.png
+++ b/public/-/emojis/1/triangular_ruler.png
Binary files differ
diff --git a/app/assets/images/emoji/trident.png b/public/-/emojis/1/trident.png
index 777a1dad121..777a1dad121 100644
--- a/app/assets/images/emoji/trident.png
+++ b/public/-/emojis/1/trident.png
Binary files differ
diff --git a/app/assets/images/emoji/triumph.png b/public/-/emojis/1/triumph.png
index 0be7a501969..0be7a501969 100644
--- a/app/assets/images/emoji/triumph.png
+++ b/public/-/emojis/1/triumph.png
Binary files differ
diff --git a/app/assets/images/emoji/trolleybus.png b/public/-/emojis/1/trolleybus.png
index 139a9931b52..139a9931b52 100644
--- a/app/assets/images/emoji/trolleybus.png
+++ b/public/-/emojis/1/trolleybus.png
Binary files differ
diff --git a/app/assets/images/emoji/trophy.png b/public/-/emojis/1/trophy.png
index ac2895c1896..ac2895c1896 100644
--- a/app/assets/images/emoji/trophy.png
+++ b/public/-/emojis/1/trophy.png
Binary files differ
diff --git a/app/assets/images/emoji/tropical_drink.png b/public/-/emojis/1/tropical_drink.png
index cd714f81b36..cd714f81b36 100644
--- a/app/assets/images/emoji/tropical_drink.png
+++ b/public/-/emojis/1/tropical_drink.png
Binary files differ
diff --git a/app/assets/images/emoji/tropical_fish.png b/public/-/emojis/1/tropical_fish.png
index 252105235a6..252105235a6 100644
--- a/app/assets/images/emoji/tropical_fish.png
+++ b/public/-/emojis/1/tropical_fish.png
Binary files differ
diff --git a/app/assets/images/emoji/truck.png b/public/-/emojis/1/truck.png
index 130de047f8b..130de047f8b 100644
--- a/app/assets/images/emoji/truck.png
+++ b/public/-/emojis/1/truck.png
Binary files differ
diff --git a/app/assets/images/emoji/trumpet.png b/public/-/emojis/1/trumpet.png
index 864ccbcd04a..864ccbcd04a 100644
--- a/app/assets/images/emoji/trumpet.png
+++ b/public/-/emojis/1/trumpet.png
Binary files differ
diff --git a/app/assets/images/emoji/tulip.png b/public/-/emojis/1/tulip.png
index f799d75c182..f799d75c182 100644
--- a/app/assets/images/emoji/tulip.png
+++ b/public/-/emojis/1/tulip.png
Binary files differ
diff --git a/app/assets/images/emoji/tumbler_glass.png b/public/-/emojis/1/tumbler_glass.png
index 7bf09229879..7bf09229879 100644
--- a/app/assets/images/emoji/tumbler_glass.png
+++ b/public/-/emojis/1/tumbler_glass.png
Binary files differ
diff --git a/app/assets/images/emoji/turkey.png b/public/-/emojis/1/turkey.png
index 344af94c9ec..344af94c9ec 100644
--- a/app/assets/images/emoji/turkey.png
+++ b/public/-/emojis/1/turkey.png
Binary files differ
diff --git a/app/assets/images/emoji/turtle.png b/public/-/emojis/1/turtle.png
index c22f7519fe8..c22f7519fe8 100644
--- a/app/assets/images/emoji/turtle.png
+++ b/public/-/emojis/1/turtle.png
Binary files differ
diff --git a/app/assets/images/emoji/tv.png b/public/-/emojis/1/tv.png
index 999f1fb5c6d..999f1fb5c6d 100644
--- a/app/assets/images/emoji/tv.png
+++ b/public/-/emojis/1/tv.png
Binary files differ
diff --git a/app/assets/images/emoji/twisted_rightwards_arrows.png b/public/-/emojis/1/twisted_rightwards_arrows.png
index 5904badde65..5904badde65 100644
--- a/app/assets/images/emoji/twisted_rightwards_arrows.png
+++ b/public/-/emojis/1/twisted_rightwards_arrows.png
Binary files differ
diff --git a/app/assets/images/emoji/two.png b/public/-/emojis/1/two.png
index 927339c9bff..927339c9bff 100644
--- a/app/assets/images/emoji/two.png
+++ b/public/-/emojis/1/two.png
Binary files differ
diff --git a/app/assets/images/emoji/two_hearts.png b/public/-/emojis/1/two_hearts.png
index 4d8c3386042..4d8c3386042 100644
--- a/app/assets/images/emoji/two_hearts.png
+++ b/public/-/emojis/1/two_hearts.png
Binary files differ
diff --git a/app/assets/images/emoji/two_men_holding_hands.png b/public/-/emojis/1/two_men_holding_hands.png
index a511fda822a..a511fda822a 100644
--- a/app/assets/images/emoji/two_men_holding_hands.png
+++ b/public/-/emojis/1/two_men_holding_hands.png
Binary files differ
diff --git a/app/assets/images/emoji/two_women_holding_hands.png b/public/-/emojis/1/two_women_holding_hands.png
index b077cd3e40f..b077cd3e40f 100644
--- a/app/assets/images/emoji/two_women_holding_hands.png
+++ b/public/-/emojis/1/two_women_holding_hands.png
Binary files differ
diff --git a/app/assets/images/emoji/u5272.png b/public/-/emojis/1/u5272.png
index c4f837fe684..c4f837fe684 100644
--- a/app/assets/images/emoji/u5272.png
+++ b/public/-/emojis/1/u5272.png
Binary files differ
diff --git a/app/assets/images/emoji/u5408.png b/public/-/emojis/1/u5408.png
index 8375ad9d9af..8375ad9d9af 100644
--- a/app/assets/images/emoji/u5408.png
+++ b/public/-/emojis/1/u5408.png
Binary files differ
diff --git a/app/assets/images/emoji/u55b6.png b/public/-/emojis/1/u55b6.png
index d21cb30eaf3..d21cb30eaf3 100644
--- a/app/assets/images/emoji/u55b6.png
+++ b/public/-/emojis/1/u55b6.png
Binary files differ
diff --git a/app/assets/images/emoji/u6307.png b/public/-/emojis/1/u6307.png
index 078e23e4ff3..078e23e4ff3 100644
--- a/app/assets/images/emoji/u6307.png
+++ b/public/-/emojis/1/u6307.png
Binary files differ
diff --git a/app/assets/images/emoji/u6708.png b/public/-/emojis/1/u6708.png
index c41bd36a26a..c41bd36a26a 100644
--- a/app/assets/images/emoji/u6708.png
+++ b/public/-/emojis/1/u6708.png
Binary files differ
diff --git a/app/assets/images/emoji/u6709.png b/public/-/emojis/1/u6709.png
index a4510de41c0..a4510de41c0 100644
--- a/app/assets/images/emoji/u6709.png
+++ b/public/-/emojis/1/u6709.png
Binary files differ
diff --git a/app/assets/images/emoji/u6e80.png b/public/-/emojis/1/u6e80.png
index f9dea8b8833..f9dea8b8833 100644
--- a/app/assets/images/emoji/u6e80.png
+++ b/public/-/emojis/1/u6e80.png
Binary files differ
diff --git a/app/assets/images/emoji/u7121.png b/public/-/emojis/1/u7121.png
index d3a19b420de..d3a19b420de 100644
--- a/app/assets/images/emoji/u7121.png
+++ b/public/-/emojis/1/u7121.png
Binary files differ
diff --git a/app/assets/images/emoji/u7533.png b/public/-/emojis/1/u7533.png
index 6b7af0ee222..6b7af0ee222 100644
--- a/app/assets/images/emoji/u7533.png
+++ b/public/-/emojis/1/u7533.png
Binary files differ
diff --git a/app/assets/images/emoji/u7981.png b/public/-/emojis/1/u7981.png
index 4c704e03433..4c704e03433 100644
--- a/app/assets/images/emoji/u7981.png
+++ b/public/-/emojis/1/u7981.png
Binary files differ
diff --git a/app/assets/images/emoji/u7a7a.png b/public/-/emojis/1/u7a7a.png
index 47966c1ea93..47966c1ea93 100644
--- a/app/assets/images/emoji/u7a7a.png
+++ b/public/-/emojis/1/u7a7a.png
Binary files differ
diff --git a/app/assets/images/emoji/umbrella.png b/public/-/emojis/1/umbrella.png
index 5b35b7ff6a4..5b35b7ff6a4 100644
--- a/app/assets/images/emoji/umbrella.png
+++ b/public/-/emojis/1/umbrella.png
Binary files differ
diff --git a/app/assets/images/emoji/umbrella2.png b/public/-/emojis/1/umbrella2.png
index 97fe859e74f..97fe859e74f 100644
--- a/app/assets/images/emoji/umbrella2.png
+++ b/public/-/emojis/1/umbrella2.png
Binary files differ
diff --git a/app/assets/images/emoji/unamused.png b/public/-/emojis/1/unamused.png
index 25e3677f2eb..25e3677f2eb 100644
--- a/app/assets/images/emoji/unamused.png
+++ b/public/-/emojis/1/unamused.png
Binary files differ
diff --git a/app/assets/images/emoji/underage.png b/public/-/emojis/1/underage.png
index 6dfe6da51e2..6dfe6da51e2 100644
--- a/app/assets/images/emoji/underage.png
+++ b/public/-/emojis/1/underage.png
Binary files differ
diff --git a/app/assets/images/emoji/unicorn.png b/public/-/emojis/1/unicorn.png
index 05a97969f7e..05a97969f7e 100644
--- a/app/assets/images/emoji/unicorn.png
+++ b/public/-/emojis/1/unicorn.png
Binary files differ
diff --git a/app/assets/images/emoji/unlock.png b/public/-/emojis/1/unlock.png
index 4a74a693911..4a74a693911 100644
--- a/app/assets/images/emoji/unlock.png
+++ b/public/-/emojis/1/unlock.png
Binary files differ
diff --git a/app/assets/images/emoji/up.png b/public/-/emojis/1/up.png
index 0d42142ba04..0d42142ba04 100644
--- a/app/assets/images/emoji/up.png
+++ b/public/-/emojis/1/up.png
Binary files differ
diff --git a/app/assets/images/emoji/upside_down.png b/public/-/emojis/1/upside_down.png
index 128f31c9828..128f31c9828 100644
--- a/app/assets/images/emoji/upside_down.png
+++ b/public/-/emojis/1/upside_down.png
Binary files differ
diff --git a/app/assets/images/emoji/urn.png b/public/-/emojis/1/urn.png
index 6b5b3503438..6b5b3503438 100644
--- a/app/assets/images/emoji/urn.png
+++ b/public/-/emojis/1/urn.png
Binary files differ
diff --git a/app/assets/images/emoji/v.png b/public/-/emojis/1/v.png
index 70c5516ffee..70c5516ffee 100644
--- a/app/assets/images/emoji/v.png
+++ b/public/-/emojis/1/v.png
Binary files differ
diff --git a/app/assets/images/emoji/v_tone1.png b/public/-/emojis/1/v_tone1.png
index 6ac54a745f4..6ac54a745f4 100644
--- a/app/assets/images/emoji/v_tone1.png
+++ b/public/-/emojis/1/v_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/v_tone2.png b/public/-/emojis/1/v_tone2.png
index 6dd9669866d..6dd9669866d 100644
--- a/app/assets/images/emoji/v_tone2.png
+++ b/public/-/emojis/1/v_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/v_tone3.png b/public/-/emojis/1/v_tone3.png
index a615e53f02f..a615e53f02f 100644
--- a/app/assets/images/emoji/v_tone3.png
+++ b/public/-/emojis/1/v_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/v_tone4.png b/public/-/emojis/1/v_tone4.png
index 33a34bd5a78..33a34bd5a78 100644
--- a/app/assets/images/emoji/v_tone4.png
+++ b/public/-/emojis/1/v_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/v_tone5.png b/public/-/emojis/1/v_tone5.png
index 45ad14b6c9c..45ad14b6c9c 100644
--- a/app/assets/images/emoji/v_tone5.png
+++ b/public/-/emojis/1/v_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/vertical_traffic_light.png b/public/-/emojis/1/vertical_traffic_light.png
index 8085973eecf..8085973eecf 100644
--- a/app/assets/images/emoji/vertical_traffic_light.png
+++ b/public/-/emojis/1/vertical_traffic_light.png
Binary files differ
diff --git a/app/assets/images/emoji/vhs.png b/public/-/emojis/1/vhs.png
index b9eb78ecd92..b9eb78ecd92 100644
--- a/app/assets/images/emoji/vhs.png
+++ b/public/-/emojis/1/vhs.png
Binary files differ
diff --git a/app/assets/images/emoji/vibration_mode.png b/public/-/emojis/1/vibration_mode.png
index cc46510e48e..cc46510e48e 100644
--- a/app/assets/images/emoji/vibration_mode.png
+++ b/public/-/emojis/1/vibration_mode.png
Binary files differ
diff --git a/app/assets/images/emoji/video_camera.png b/public/-/emojis/1/video_camera.png
index 85b300d425c..85b300d425c 100644
--- a/app/assets/images/emoji/video_camera.png
+++ b/public/-/emojis/1/video_camera.png
Binary files differ
diff --git a/app/assets/images/emoji/video_game.png b/public/-/emojis/1/video_game.png
index 316a9106a55..316a9106a55 100644
--- a/app/assets/images/emoji/video_game.png
+++ b/public/-/emojis/1/video_game.png
Binary files differ
diff --git a/app/assets/images/emoji/violin.png b/public/-/emojis/1/violin.png
index e1e76cce242..e1e76cce242 100644
--- a/app/assets/images/emoji/violin.png
+++ b/public/-/emojis/1/violin.png
Binary files differ
diff --git a/app/assets/images/emoji/virgo.png b/public/-/emojis/1/virgo.png
index a6b56c2cb5e..a6b56c2cb5e 100644
--- a/app/assets/images/emoji/virgo.png
+++ b/public/-/emojis/1/virgo.png
Binary files differ
diff --git a/app/assets/images/emoji/volcano.png b/public/-/emojis/1/volcano.png
index 931d569294c..931d569294c 100644
--- a/app/assets/images/emoji/volcano.png
+++ b/public/-/emojis/1/volcano.png
Binary files differ
diff --git a/app/assets/images/emoji/volleyball.png b/public/-/emojis/1/volleyball.png
index 7a0e49d4b07..7a0e49d4b07 100644
--- a/app/assets/images/emoji/volleyball.png
+++ b/public/-/emojis/1/volleyball.png
Binary files differ
diff --git a/app/assets/images/emoji/vs.png b/public/-/emojis/1/vs.png
index e1180f4a464..e1180f4a464 100644
--- a/app/assets/images/emoji/vs.png
+++ b/public/-/emojis/1/vs.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan.png b/public/-/emojis/1/vulcan.png
index 54728bcaf5c..54728bcaf5c 100644
--- a/app/assets/images/emoji/vulcan.png
+++ b/public/-/emojis/1/vulcan.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan_tone1.png b/public/-/emojis/1/vulcan_tone1.png
index 8aff5d8fa16..8aff5d8fa16 100644
--- a/app/assets/images/emoji/vulcan_tone1.png
+++ b/public/-/emojis/1/vulcan_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan_tone2.png b/public/-/emojis/1/vulcan_tone2.png
index 82b7ad519b4..82b7ad519b4 100644
--- a/app/assets/images/emoji/vulcan_tone2.png
+++ b/public/-/emojis/1/vulcan_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan_tone3.png b/public/-/emojis/1/vulcan_tone3.png
index d1400e1dd28..d1400e1dd28 100644
--- a/app/assets/images/emoji/vulcan_tone3.png
+++ b/public/-/emojis/1/vulcan_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan_tone4.png b/public/-/emojis/1/vulcan_tone4.png
index 47e2b280148..47e2b280148 100644
--- a/app/assets/images/emoji/vulcan_tone4.png
+++ b/public/-/emojis/1/vulcan_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/vulcan_tone5.png b/public/-/emojis/1/vulcan_tone5.png
index 60b5c6077be..60b5c6077be 100644
--- a/app/assets/images/emoji/vulcan_tone5.png
+++ b/public/-/emojis/1/vulcan_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/walking.png b/public/-/emojis/1/walking.png
index 06dc169a3fd..06dc169a3fd 100644
--- a/app/assets/images/emoji/walking.png
+++ b/public/-/emojis/1/walking.png
Binary files differ
diff --git a/app/assets/images/emoji/walking_tone1.png b/public/-/emojis/1/walking_tone1.png
index 4e391b45a0b..4e391b45a0b 100644
--- a/app/assets/images/emoji/walking_tone1.png
+++ b/public/-/emojis/1/walking_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/walking_tone2.png b/public/-/emojis/1/walking_tone2.png
index 31f94a1bce1..31f94a1bce1 100644
--- a/app/assets/images/emoji/walking_tone2.png
+++ b/public/-/emojis/1/walking_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/walking_tone3.png b/public/-/emojis/1/walking_tone3.png
index f7ed8e39c2e..f7ed8e39c2e 100644
--- a/app/assets/images/emoji/walking_tone3.png
+++ b/public/-/emojis/1/walking_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/walking_tone4.png b/public/-/emojis/1/walking_tone4.png
index e58dc04c7b2..e58dc04c7b2 100644
--- a/app/assets/images/emoji/walking_tone4.png
+++ b/public/-/emojis/1/walking_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/walking_tone5.png b/public/-/emojis/1/walking_tone5.png
index ba4e1b58fcb..ba4e1b58fcb 100644
--- a/app/assets/images/emoji/walking_tone5.png
+++ b/public/-/emojis/1/walking_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/waning_crescent_moon.png b/public/-/emojis/1/waning_crescent_moon.png
index cf68706b871..cf68706b871 100644
--- a/app/assets/images/emoji/waning_crescent_moon.png
+++ b/public/-/emojis/1/waning_crescent_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/waning_gibbous_moon.png b/public/-/emojis/1/waning_gibbous_moon.png
index 24e16266119..24e16266119 100644
--- a/app/assets/images/emoji/waning_gibbous_moon.png
+++ b/public/-/emojis/1/waning_gibbous_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/warning.png b/public/-/emojis/1/warning.png
index 35691c2ed97..35691c2ed97 100644
--- a/app/assets/images/emoji/warning.png
+++ b/public/-/emojis/1/warning.png
Binary files differ
diff --git a/app/assets/images/emoji/wastebasket.png b/public/-/emojis/1/wastebasket.png
index 2b3c484b498..2b3c484b498 100644
--- a/app/assets/images/emoji/wastebasket.png
+++ b/public/-/emojis/1/wastebasket.png
Binary files differ
diff --git a/app/assets/images/emoji/watch.png b/public/-/emojis/1/watch.png
index 64819bc6e21..64819bc6e21 100644
--- a/app/assets/images/emoji/watch.png
+++ b/public/-/emojis/1/watch.png
Binary files differ
diff --git a/app/assets/images/emoji/water_buffalo.png b/public/-/emojis/1/water_buffalo.png
index 80446615caf..80446615caf 100644
--- a/app/assets/images/emoji/water_buffalo.png
+++ b/public/-/emojis/1/water_buffalo.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo.png b/public/-/emojis/1/water_polo.png
index cb44576780d..cb44576780d 100644
--- a/app/assets/images/emoji/water_polo.png
+++ b/public/-/emojis/1/water_polo.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo_tone1.png b/public/-/emojis/1/water_polo_tone1.png
index bed1a908d6a..bed1a908d6a 100644
--- a/app/assets/images/emoji/water_polo_tone1.png
+++ b/public/-/emojis/1/water_polo_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo_tone2.png b/public/-/emojis/1/water_polo_tone2.png
index ec5a43b4d4a..ec5a43b4d4a 100644
--- a/app/assets/images/emoji/water_polo_tone2.png
+++ b/public/-/emojis/1/water_polo_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo_tone3.png b/public/-/emojis/1/water_polo_tone3.png
index b081a4a5a96..b081a4a5a96 100644
--- a/app/assets/images/emoji/water_polo_tone3.png
+++ b/public/-/emojis/1/water_polo_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo_tone4.png b/public/-/emojis/1/water_polo_tone4.png
index 82cfbc3b0c7..82cfbc3b0c7 100644
--- a/app/assets/images/emoji/water_polo_tone4.png
+++ b/public/-/emojis/1/water_polo_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/water_polo_tone5.png b/public/-/emojis/1/water_polo_tone5.png
index bd3366eb06c..bd3366eb06c 100644
--- a/app/assets/images/emoji/water_polo_tone5.png
+++ b/public/-/emojis/1/water_polo_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/watermelon.png b/public/-/emojis/1/watermelon.png
index 0761488b4c9..0761488b4c9 100644
--- a/app/assets/images/emoji/watermelon.png
+++ b/public/-/emojis/1/watermelon.png
Binary files differ
diff --git a/app/assets/images/emoji/wave.png b/public/-/emojis/1/wave.png
index e0cd79b45f5..e0cd79b45f5 100644
--- a/app/assets/images/emoji/wave.png
+++ b/public/-/emojis/1/wave.png
Binary files differ
diff --git a/app/assets/images/emoji/wave_tone1.png b/public/-/emojis/1/wave_tone1.png
index 6b2b34b106e..6b2b34b106e 100644
--- a/app/assets/images/emoji/wave_tone1.png
+++ b/public/-/emojis/1/wave_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/wave_tone2.png b/public/-/emojis/1/wave_tone2.png
index b857119732e..b857119732e 100644
--- a/app/assets/images/emoji/wave_tone2.png
+++ b/public/-/emojis/1/wave_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/wave_tone3.png b/public/-/emojis/1/wave_tone3.png
index 6283b670f43..6283b670f43 100644
--- a/app/assets/images/emoji/wave_tone3.png
+++ b/public/-/emojis/1/wave_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/wave_tone4.png b/public/-/emojis/1/wave_tone4.png
index fe6b2baa747..fe6b2baa747 100644
--- a/app/assets/images/emoji/wave_tone4.png
+++ b/public/-/emojis/1/wave_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/wave_tone5.png b/public/-/emojis/1/wave_tone5.png
index 4bd168ebb78..4bd168ebb78 100644
--- a/app/assets/images/emoji/wave_tone5.png
+++ b/public/-/emojis/1/wave_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/wavy_dash.png b/public/-/emojis/1/wavy_dash.png
index 001c8d6e47d..001c8d6e47d 100644
--- a/app/assets/images/emoji/wavy_dash.png
+++ b/public/-/emojis/1/wavy_dash.png
Binary files differ
diff --git a/app/assets/images/emoji/waxing_crescent_moon.png b/public/-/emojis/1/waxing_crescent_moon.png
index 687125173d9..687125173d9 100644
--- a/app/assets/images/emoji/waxing_crescent_moon.png
+++ b/public/-/emojis/1/waxing_crescent_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/waxing_gibbous_moon.png b/public/-/emojis/1/waxing_gibbous_moon.png
index 3a808156318..3a808156318 100644
--- a/app/assets/images/emoji/waxing_gibbous_moon.png
+++ b/public/-/emojis/1/waxing_gibbous_moon.png
Binary files differ
diff --git a/app/assets/images/emoji/wc.png b/public/-/emojis/1/wc.png
index aa433e84ba6..aa433e84ba6 100644
--- a/app/assets/images/emoji/wc.png
+++ b/public/-/emojis/1/wc.png
Binary files differ
diff --git a/app/assets/images/emoji/weary.png b/public/-/emojis/1/weary.png
index 98bfbd24a16..98bfbd24a16 100644
--- a/app/assets/images/emoji/weary.png
+++ b/public/-/emojis/1/weary.png
Binary files differ
diff --git a/app/assets/images/emoji/wedding.png b/public/-/emojis/1/wedding.png
index d0d8aa0bfae..d0d8aa0bfae 100644
--- a/app/assets/images/emoji/wedding.png
+++ b/public/-/emojis/1/wedding.png
Binary files differ
diff --git a/app/assets/images/emoji/whale.png b/public/-/emojis/1/whale.png
index 9f19b44257c..9f19b44257c 100644
--- a/app/assets/images/emoji/whale.png
+++ b/public/-/emojis/1/whale.png
Binary files differ
diff --git a/app/assets/images/emoji/whale2.png b/public/-/emojis/1/whale2.png
index 0df9d3c73a4..0df9d3c73a4 100644
--- a/app/assets/images/emoji/whale2.png
+++ b/public/-/emojis/1/whale2.png
Binary files differ
diff --git a/app/assets/images/emoji/wheel_of_dharma.png b/public/-/emojis/1/wheel_of_dharma.png
index 3666db0016b..3666db0016b 100644
--- a/app/assets/images/emoji/wheel_of_dharma.png
+++ b/public/-/emojis/1/wheel_of_dharma.png
Binary files differ
diff --git a/app/assets/images/emoji/wheelchair.png b/public/-/emojis/1/wheelchair.png
index 4e5b2698eac..4e5b2698eac 100644
--- a/app/assets/images/emoji/wheelchair.png
+++ b/public/-/emojis/1/wheelchair.png
Binary files differ
diff --git a/app/assets/images/emoji/white_check_mark.png b/public/-/emojis/1/white_check_mark.png
index e55f087e544..e55f087e544 100644
--- a/app/assets/images/emoji/white_check_mark.png
+++ b/public/-/emojis/1/white_check_mark.png
Binary files differ
diff --git a/app/assets/images/emoji/white_circle.png b/public/-/emojis/1/white_circle.png
index c19e15684dd..c19e15684dd 100644
--- a/app/assets/images/emoji/white_circle.png
+++ b/public/-/emojis/1/white_circle.png
Binary files differ
diff --git a/app/assets/images/emoji/white_flower.png b/public/-/emojis/1/white_flower.png
index d6af8b60077..d6af8b60077 100644
--- a/app/assets/images/emoji/white_flower.png
+++ b/public/-/emojis/1/white_flower.png
Binary files differ
diff --git a/app/assets/images/emoji/white_large_square.png b/public/-/emojis/1/white_large_square.png
index 6f06c1c79de..6f06c1c79de 100644
--- a/app/assets/images/emoji/white_large_square.png
+++ b/public/-/emojis/1/white_large_square.png
Binary files differ
diff --git a/app/assets/images/emoji/white_medium_small_square.png b/public/-/emojis/1/white_medium_small_square.png
index ae874126750..ae874126750 100644
--- a/app/assets/images/emoji/white_medium_small_square.png
+++ b/public/-/emojis/1/white_medium_small_square.png
Binary files differ
diff --git a/app/assets/images/emoji/white_medium_square.png b/public/-/emojis/1/white_medium_square.png
index 8daacf57059..8daacf57059 100644
--- a/app/assets/images/emoji/white_medium_square.png
+++ b/public/-/emojis/1/white_medium_square.png
Binary files differ
diff --git a/app/assets/images/emoji/white_small_square.png b/public/-/emojis/1/white_small_square.png
index d7ebdb0c0ed..d7ebdb0c0ed 100644
--- a/app/assets/images/emoji/white_small_square.png
+++ b/public/-/emojis/1/white_small_square.png
Binary files differ
diff --git a/app/assets/images/emoji/white_square_button.png b/public/-/emojis/1/white_square_button.png
index 934b1cedfd2..934b1cedfd2 100644
--- a/app/assets/images/emoji/white_square_button.png
+++ b/public/-/emojis/1/white_square_button.png
Binary files differ
diff --git a/app/assets/images/emoji/white_sun_cloud.png b/public/-/emojis/1/white_sun_cloud.png
index 0a4cc100269..0a4cc100269 100644
--- a/app/assets/images/emoji/white_sun_cloud.png
+++ b/public/-/emojis/1/white_sun_cloud.png
Binary files differ
diff --git a/app/assets/images/emoji/white_sun_rain_cloud.png b/public/-/emojis/1/white_sun_rain_cloud.png
index 491f9ca4839..491f9ca4839 100644
--- a/app/assets/images/emoji/white_sun_rain_cloud.png
+++ b/public/-/emojis/1/white_sun_rain_cloud.png
Binary files differ
diff --git a/app/assets/images/emoji/white_sun_small_cloud.png b/public/-/emojis/1/white_sun_small_cloud.png
index cead0bfa521..cead0bfa521 100644
--- a/app/assets/images/emoji/white_sun_small_cloud.png
+++ b/public/-/emojis/1/white_sun_small_cloud.png
Binary files differ
diff --git a/app/assets/images/emoji/wilted_rose.png b/public/-/emojis/1/wilted_rose.png
index 62412b143ae..62412b143ae 100644
--- a/app/assets/images/emoji/wilted_rose.png
+++ b/public/-/emojis/1/wilted_rose.png
Binary files differ
diff --git a/app/assets/images/emoji/wind_blowing_face.png b/public/-/emojis/1/wind_blowing_face.png
index df81b652eb6..df81b652eb6 100644
--- a/app/assets/images/emoji/wind_blowing_face.png
+++ b/public/-/emojis/1/wind_blowing_face.png
Binary files differ
diff --git a/app/assets/images/emoji/wind_chime.png b/public/-/emojis/1/wind_chime.png
index 3c9ef3a95f6..3c9ef3a95f6 100644
--- a/app/assets/images/emoji/wind_chime.png
+++ b/public/-/emojis/1/wind_chime.png
Binary files differ
diff --git a/app/assets/images/emoji/wine_glass.png b/public/-/emojis/1/wine_glass.png
index 3cc98689192..3cc98689192 100644
--- a/app/assets/images/emoji/wine_glass.png
+++ b/public/-/emojis/1/wine_glass.png
Binary files differ
diff --git a/app/assets/images/emoji/wink.png b/public/-/emojis/1/wink.png
index 7ea7810a37d..7ea7810a37d 100644
--- a/app/assets/images/emoji/wink.png
+++ b/public/-/emojis/1/wink.png
Binary files differ
diff --git a/app/assets/images/emoji/wolf.png b/public/-/emojis/1/wolf.png
index ba7220f2de9..ba7220f2de9 100644
--- a/app/assets/images/emoji/wolf.png
+++ b/public/-/emojis/1/wolf.png
Binary files differ
diff --git a/app/assets/images/emoji/woman.png b/public/-/emojis/1/woman.png
index ece440e7a61..ece440e7a61 100644
--- a/app/assets/images/emoji/woman.png
+++ b/public/-/emojis/1/woman.png
Binary files differ
diff --git a/app/assets/images/emoji/woman_tone1.png b/public/-/emojis/1/woman_tone1.png
index ff089b8889b..ff089b8889b 100644
--- a/app/assets/images/emoji/woman_tone1.png
+++ b/public/-/emojis/1/woman_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/woman_tone2.png b/public/-/emojis/1/woman_tone2.png
index 0719c378016..0719c378016 100644
--- a/app/assets/images/emoji/woman_tone2.png
+++ b/public/-/emojis/1/woman_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/woman_tone3.png b/public/-/emojis/1/woman_tone3.png
index 5672e2fd52d..5672e2fd52d 100644
--- a/app/assets/images/emoji/woman_tone3.png
+++ b/public/-/emojis/1/woman_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/woman_tone4.png b/public/-/emojis/1/woman_tone4.png
index 5754aab558b..5754aab558b 100644
--- a/app/assets/images/emoji/woman_tone4.png
+++ b/public/-/emojis/1/woman_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/woman_tone5.png b/public/-/emojis/1/woman_tone5.png
index fc252af3a39..fc252af3a39 100644
--- a/app/assets/images/emoji/woman_tone5.png
+++ b/public/-/emojis/1/woman_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/womans_clothes.png b/public/-/emojis/1/womans_clothes.png
index 01410dc8107..01410dc8107 100644
--- a/app/assets/images/emoji/womans_clothes.png
+++ b/public/-/emojis/1/womans_clothes.png
Binary files differ
diff --git a/app/assets/images/emoji/womans_hat.png b/public/-/emojis/1/womans_hat.png
index b837b6a2e47..b837b6a2e47 100644
--- a/app/assets/images/emoji/womans_hat.png
+++ b/public/-/emojis/1/womans_hat.png
Binary files differ
diff --git a/app/assets/images/emoji/womens.png b/public/-/emojis/1/womens.png
index d4ecc22e7b3..d4ecc22e7b3 100644
--- a/app/assets/images/emoji/womens.png
+++ b/public/-/emojis/1/womens.png
Binary files differ
diff --git a/app/assets/images/emoji/worried.png b/public/-/emojis/1/worried.png
index 7074afcf5b7..7074afcf5b7 100644
--- a/app/assets/images/emoji/worried.png
+++ b/public/-/emojis/1/worried.png
Binary files differ
diff --git a/app/assets/images/emoji/wrench.png b/public/-/emojis/1/wrench.png
index c16b7439697..c16b7439697 100644
--- a/app/assets/images/emoji/wrench.png
+++ b/public/-/emojis/1/wrench.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers.png b/public/-/emojis/1/wrestlers.png
index 71e67cfad85..71e67cfad85 100644
--- a/app/assets/images/emoji/wrestlers.png
+++ b/public/-/emojis/1/wrestlers.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers_tone1.png b/public/-/emojis/1/wrestlers_tone1.png
index 379070fd03b..379070fd03b 100644
--- a/app/assets/images/emoji/wrestlers_tone1.png
+++ b/public/-/emojis/1/wrestlers_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers_tone2.png b/public/-/emojis/1/wrestlers_tone2.png
index 6863ea9209d..6863ea9209d 100644
--- a/app/assets/images/emoji/wrestlers_tone2.png
+++ b/public/-/emojis/1/wrestlers_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers_tone3.png b/public/-/emojis/1/wrestlers_tone3.png
index b7e62910127..b7e62910127 100644
--- a/app/assets/images/emoji/wrestlers_tone3.png
+++ b/public/-/emojis/1/wrestlers_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers_tone4.png b/public/-/emojis/1/wrestlers_tone4.png
index 750f9589233..750f9589233 100644
--- a/app/assets/images/emoji/wrestlers_tone4.png
+++ b/public/-/emojis/1/wrestlers_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/wrestlers_tone5.png b/public/-/emojis/1/wrestlers_tone5.png
index 36ab9bb3f42..36ab9bb3f42 100644
--- a/app/assets/images/emoji/wrestlers_tone5.png
+++ b/public/-/emojis/1/wrestlers_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand.png b/public/-/emojis/1/writing_hand.png
index 85639f8ac40..85639f8ac40 100644
--- a/app/assets/images/emoji/writing_hand.png
+++ b/public/-/emojis/1/writing_hand.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand_tone1.png b/public/-/emojis/1/writing_hand_tone1.png
index 7923d8ebb17..7923d8ebb17 100644
--- a/app/assets/images/emoji/writing_hand_tone1.png
+++ b/public/-/emojis/1/writing_hand_tone1.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand_tone2.png b/public/-/emojis/1/writing_hand_tone2.png
index bcb304e15d2..bcb304e15d2 100644
--- a/app/assets/images/emoji/writing_hand_tone2.png
+++ b/public/-/emojis/1/writing_hand_tone2.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand_tone3.png b/public/-/emojis/1/writing_hand_tone3.png
index fd885fd2d90..fd885fd2d90 100644
--- a/app/assets/images/emoji/writing_hand_tone3.png
+++ b/public/-/emojis/1/writing_hand_tone3.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand_tone4.png b/public/-/emojis/1/writing_hand_tone4.png
index d065b8c64ab..d065b8c64ab 100644
--- a/app/assets/images/emoji/writing_hand_tone4.png
+++ b/public/-/emojis/1/writing_hand_tone4.png
Binary files differ
diff --git a/app/assets/images/emoji/writing_hand_tone5.png b/public/-/emojis/1/writing_hand_tone5.png
index a44b3dd757c..a44b3dd757c 100644
--- a/app/assets/images/emoji/writing_hand_tone5.png
+++ b/public/-/emojis/1/writing_hand_tone5.png
Binary files differ
diff --git a/app/assets/images/emoji/x.png b/public/-/emojis/1/x.png
index 9f9ed0f7ad2..9f9ed0f7ad2 100644
--- a/app/assets/images/emoji/x.png
+++ b/public/-/emojis/1/x.png
Binary files differ
diff --git a/app/assets/images/emoji/yellow_heart.png b/public/-/emojis/1/yellow_heart.png
index 7901a9d0103..7901a9d0103 100644
--- a/app/assets/images/emoji/yellow_heart.png
+++ b/public/-/emojis/1/yellow_heart.png
Binary files differ
diff --git a/app/assets/images/emoji/yen.png b/public/-/emojis/1/yen.png
index 63ee4799d66..63ee4799d66 100644
--- a/app/assets/images/emoji/yen.png
+++ b/public/-/emojis/1/yen.png
Binary files differ
diff --git a/app/assets/images/emoji/yin_yang.png b/public/-/emojis/1/yin_yang.png
index f2900f6338f..f2900f6338f 100644
--- a/app/assets/images/emoji/yin_yang.png
+++ b/public/-/emojis/1/yin_yang.png
Binary files differ
diff --git a/app/assets/images/emoji/yum.png b/public/-/emojis/1/yum.png
index 2df15753ca1..2df15753ca1 100644
--- a/app/assets/images/emoji/yum.png
+++ b/public/-/emojis/1/yum.png
Binary files differ
diff --git a/app/assets/images/emoji/zap.png b/public/-/emojis/1/zap.png
index 47e68e48e49..47e68e48e49 100644
--- a/app/assets/images/emoji/zap.png
+++ b/public/-/emojis/1/zap.png
Binary files differ
diff --git a/app/assets/images/emoji/zero.png b/public/-/emojis/1/zero.png
index 13aca83e018..13aca83e018 100644
--- a/app/assets/images/emoji/zero.png
+++ b/public/-/emojis/1/zero.png
Binary files differ
diff --git a/app/assets/images/emoji/zipper_mouth.png b/public/-/emojis/1/zipper_mouth.png
index f8ced2502a7..f8ced2502a7 100644
--- a/app/assets/images/emoji/zipper_mouth.png
+++ b/public/-/emojis/1/zipper_mouth.png
Binary files differ
diff --git a/app/assets/images/emoji/zzz.png b/public/-/emojis/1/zzz.png
index 9bc72b4469f..9bc72b4469f 100644
--- a/app/assets/images/emoji/zzz.png
+++ b/public/-/emojis/1/zzz.png
Binary files differ
diff --git a/qa/.gitignore b/qa/.gitignore
index 19ec17d0005..102f7e5e54d 100644
--- a/qa/.gitignore
+++ b/qa/.gitignore
@@ -1,2 +1,3 @@
tmp/
.ruby-version
+urls.txt
diff --git a/qa/Gemfile b/qa/Gemfile
index f29006617ed..38e95ba2d65 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -9,3 +9,4 @@ gem 'selenium-webdriver', '~> 3.12'
gem 'airborne', '~> 0.2.13'
gem 'nokogiri', '~> 1.10.1'
gem 'rspec-retry', '~> 0.6.1'
+gem 'faker', '~> 1.6', '>= 1.6.6'
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index c3d9f558c23..c9b0db6a272 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -32,6 +32,8 @@ GEM
diff-lcs (1.3)
domain_name (0.5.20170404)
unf (>= 0.0.5, < 1.0.0)
+ faker (1.9.3)
+ i18n (>= 0.7)
ffi (1.9.25)
http-cookie (1.0.3)
domain_name (~> 0.5)
@@ -99,6 +101,7 @@ DEPENDENCIES
airborne (~> 0.2.13)
capybara (~> 2.16.1)
capybara-screenshot (~> 1.0.18)
+ faker (~> 1.6, >= 1.6.6)
nokogiri (~> 1.10.1)
pry-byebug (~> 3.5.1)
rake (~> 12.3.0)
diff --git a/qa/README.md b/qa/README.md
index 7709db36f8e..735868e7640 100644
--- a/qa/README.md
+++ b/qa/README.md
@@ -42,6 +42,9 @@ following call would login to a local [GDK] instance and run all specs in
bin/qa Test::Instance::All http://localhost:3000
```
+Note: If you want to run tests requiring SSH against GDK, you
+will need to [modify your GDK setup](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/run_qa_against_gdk.md).
+
### Writing tests
1. [Using page objects](qa/page/README.md)
diff --git a/qa/Rakefile b/qa/Rakefile
index 9a7b9c6bb35..b6ad09f9b00 100644
--- a/qa/Rakefile
+++ b/qa/Rakefile
@@ -1,5 +1,6 @@
require_relative 'qa/tools/revoke_all_personal_access_tokens'
require_relative 'qa/tools/delete_subgroups'
+require_relative 'qa/tools/generate_perf_testdata'
desc "Revokes all personal access tokens"
task :revoke_personal_access_tokens do
@@ -10,3 +11,8 @@ desc "Deletes subgroups within a provided group"
task :delete_subgroups do
QA::Tools::DeleteSubgroups.new.run
end
+
+desc "Generate Performance Testdata"
+task :generate_perf_testdata do
+ QA::Tools::GeneratePerfTestdata.new.run
+end
diff --git a/qa/qa/git/repository.rb b/qa/qa/git/repository.rb
index 0aa94101098..b3bad40a90f 100644
--- a/qa/qa/git/repository.rb
+++ b/qa/qa/git/repository.rb
@@ -12,6 +12,7 @@ module QA
module Git
class Repository
include Scenario::Actable
+ RepositoryCommandError = Class.new(StandardError)
attr_writer :use_lfs
attr_accessor :env_vars
@@ -205,6 +206,10 @@ module QA
output.chomp!
Runtime::Logger.debug "Git: output=[#{output}], exitstatus=[#{status.exitstatus}]"
+ unless status.success?
+ raise RepositoryCommandError, "The command #{command} failed (#{status.exitstatus}) with the following output:\n#{output}"
+ end
+
Result.new(status.exitstatus == 0, output)
end
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 11ebd70292e..9fabf83e2ce 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -157,6 +157,10 @@ module QA
find('body').click
end
+ def visit_link_in_element(name)
+ visit find_element(name)['href']
+ end
+
def self.path
raise NotImplementedError
end
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 976e431186d..c0411db6505 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -27,6 +27,12 @@ module QA
element :squash_checkbox
end
+ view 'app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue' do
+ element :dropdown_toggle
+ element :download_email_patches
+ element :download_plain_diff
+ end
+
view 'app/views/projects/merge_requests/show.html.haml' do
element :notes_tab
element :diffs_tab
@@ -159,6 +165,16 @@ module QA
def edit!
click_element :edit_button
end
+
+ def view_email_patches
+ click_element :dropdown_toggle
+ visit_link_in_element(:download_email_patches)
+ end
+
+ def view_plain_diff
+ click_element :dropdown_toggle
+ visit_link_in_element(:download_plain_diff)
+ end
end
end
end
diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb
index 9f1867ef8a5..eabeae1acc4 100644
--- a/qa/qa/page/project/new.rb
+++ b/qa/qa/page/project/new.rb
@@ -24,9 +24,12 @@ module QA
end
def choose_test_namespace
- click_element :project_namespace_select
+ retry_on_exception do
+ click_body
+ click_element :project_namespace_select
- search_and_select(Runtime::Namespace.path)
+ search_and_select(Runtime::Namespace.path)
+ end
end
def go_to_import_project
diff --git a/qa/qa/service/kubernetes_cluster.rb b/qa/qa/service/kubernetes_cluster.rb
index c5f12255d72..41ab702d8b2 100644
--- a/qa/qa/service/kubernetes_cluster.rb
+++ b/qa/qa/service/kubernetes_cluster.rb
@@ -9,7 +9,7 @@ module QA
attr_reader :api_url, :ca_certificate, :token, :rbac
- def initialize(rbac: false)
+ def initialize(rbac: true)
@rbac = rbac
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
index e172206eb88..d4cedc9362d 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
module QA
- # Failure issue: https://gitlab.com/gitlab-org/quality/staging/issues/21
- context 'Manage', :quarantine do
+ context 'Manage' do
describe 'Project activity' do
it 'user creates an event in the activity page upon Git push' do
Runtime::Browser.visit(:gitlab, Page::Main::Login)
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb
new file mode 100644
index 00000000000..9e48ee7ca2a
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module QA
+ context 'Create' do
+ describe 'Download merge request patch and diff' do
+ before(:context) do
+ Runtime::Browser.visit(:gitlab, Page::Main::Login)
+ Page::Main::Login.perform(&:sign_in_using_credentials)
+
+ @merge_request = Resource::MergeRequest.fabricate! do |merge_request|
+ merge_request.title = 'This is a merge request'
+ merge_request.description = 'For downloading patches and diffs'
+ end
+ end
+
+ it 'user views merge request email patches' do
+ @merge_request.visit!
+ Page::MergeRequest::Show.perform(&:view_email_patches)
+
+ expect(page.text).to start_with('From')
+ expect(page).to have_content('Subject: [PATCH] This is a test commit')
+ expect(page).to have_content('diff --git a/added_file.txt b/added_file.txt')
+ end
+
+ it 'user views merge request plain diff' do
+ @merge_request.visit!
+ Page::MergeRequest::Show.perform(&:view_plain_diff)
+
+ expect(page.text).to start_with('diff --git a/added_file.txt b/added_file.txt')
+ expect(page).to have_content('+File Added')
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb
index d1535d6519d..01a367fceac 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
- context 'Create' do
+ # Git protocol v2 is temporarily disabled
+ # https://gitlab.com/gitlab-org/gitlab-ce/issues/55769 (confidential)
+ context 'Create', :quarantine do
describe 'Push over HTTP using Git protocol version 2', :requires_git_protocol_v2 do
it 'user pushes to the repository' do
Runtime::Browser.visit(:gitlab, Page::Main::Login)
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb
index 48800cc81e5..eb59b54e9ab 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
- context 'Create' do
+ # Git protocol v2 is temporarily disabled
+ # https://gitlab.com/gitlab-org/gitlab-ce/issues/55769 (confidential)
+ context 'Create', :quarantine do
describe 'Push over SSH using Git protocol version 2', :requires_git_protocol_v2 do
# Note: If you run this test against GDK make sure you've enabled sshd and
# enabled setting the Git protocol by adding `AcceptEnv GIT_PROTOCOL` to
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 4464fb812b7..6aebd04af03 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
@@ -37,12 +37,7 @@ module QA
it 'user without push rights fails to push to the protected branch' do
create_protected_branch(allow_to_push: false)
- push = push_new_file(branch_name)
-
- expect(push.output)
- .to match(/remote\: GitLab\: You are not allowed to push code to protected branches on this project/)
- expect(push.output)
- .to match(/\[remote rejected\] #{branch_name} -> #{branch_name} \(pre-receive hook declined\)/)
+ expect { push_new_file(branch_name) }.to raise_error(QA::Git::Repository::RepositoryCommandError, /remote: GitLab: You are not allowed to push code to protected branches on this project\.([\s\S]+)\[remote rejected\] #{branch_name} -> #{branch_name} \(pre-receive hook declined\)/)
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb
index 7223831d96f..a8a00296881 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
module QA
- context 'Create' do
+ # Failure issue: https://gitlab.com/gitlab-org/quality/nightly/issues/84
+ context 'Create', :quarantine do
describe 'SSH key support' do
# Note: If you run this test against GDK make sure you've enabled sshd
# See: https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/run_qa_against_gdk.md
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb
index b862a7bd1ed..b862a7bd1ed 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_raw_diff_patch_requests_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/add_ci_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/add_ci_variable_spec.rb
index e444bc7ef1b..0837b720df1 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/add_ci_variable_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/add_ci_variable_spec.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
module QA
- # Failure issue: https://gitlab.com/gitlab-org/quality/staging/issues/30
- context 'Verify', :quarantine do
+ context 'Verify' do
describe 'CI variable support' do
it 'user adds a CI variable' do
Runtime::Browser.visit(:gitlab, Page::Main::Login)
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 02bd378acfc..4212a2b0392 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
@@ -11,163 +11,148 @@ module QA
end
describe 'Auto DevOps support', :orchestrated, :kubernetes, :quarantine do
- [true, false].each do |rbac|
- context "when rbac is #{rbac ? 'enabled' : 'disabled'}" do
- before(:all) do
- login
-
- @project = Resource::Project.fabricate! do |p|
- p.name = Runtime::Env.auto_devops_project_name || 'project-with-autodevops'
- p.description = 'Project with Auto DevOps'
- end
-
- # Disable code_quality check in Auto DevOps pipeline as it takes
- # too long and times out the test
- Resource::CiVariable.fabricate! do |resource|
- resource.project = @project
- resource.key = 'CODE_QUALITY_DISABLED'
- resource.value = '1'
- end
+ context 'when rbac is enabled' do
+ before(:all) do
+ login
- # Create Auto DevOps compatible repo
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = @project
- push.directory = Pathname
- .new(__dir__)
- .join('../../../../../fixtures/auto_devops_rack')
- push.commit_message = 'Create Auto DevOps compatible rack application'
- end
-
- # Create and connect K8s cluster
- @cluster = Service::KubernetesCluster.new(rbac: rbac).create!
- Resource::KubernetesCluster.fabricate! do |cluster|
- cluster.project = @project
- cluster.cluster = @cluster
- cluster.install_helm_tiller = true
- cluster.install_ingress = true
- cluster.install_prometheus = true
- cluster.install_runner = true
- end
+ @project = Resource::Project.fabricate! do |p|
+ p.name = Runtime::Env.auto_devops_project_name || 'project-with-autodevops'
+ p.description = 'Project with Auto DevOps'
+ end
- @project.visit!
- Page::Project::Menu.perform(&:click_ci_cd_settings)
- Page::Project::Settings::CICD.perform do |p|
- p.enable_auto_devops
- end
+ # Disable code_quality check in Auto DevOps pipeline as it takes
+ # too long and times out the test
+ Resource::CiVariable.fabricate! do |resource|
+ resource.project = @project
+ resource.key = 'CODE_QUALITY_DISABLED'
+ resource.value = '1'
end
- after(:all) do
- @cluster&.remove!
+ # Create and connect K8s cluster
+ @cluster = Service::KubernetesCluster.new.create!
+ Resource::KubernetesCluster.fabricate! do |cluster|
+ cluster.project = @project
+ cluster.cluster = @cluster
+ cluster.install_helm_tiller = true
+ cluster.install_ingress = true
+ cluster.install_prometheus = true
+ cluster.install_runner = true
end
- before do
- login
+ # Create Auto DevOps compatible repo
+ Resource::Repository::ProjectPush.fabricate! do |push|
+ push.project = @project
+ push.directory = Pathname
+ .new(__dir__)
+ .join('../../../../../fixtures/auto_devops_rack')
+ push.commit_message = 'Create Auto DevOps compatible rack application'
end
+ end
- it 'runs auto devops' do
- @project.visit!
- Page::Project::Menu.perform(&:click_ci_cd_pipelines)
- Page::Project::Pipeline::Index.perform(&:go_to_latest_pipeline)
+ after(:all) do
+ @cluster&.remove!
+ end
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('build')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 600)
+ it 'runs auto devops' do
+ @project.visit!
+ Page::Project::Menu.perform(&:click_ci_cd_pipelines)
+ Page::Project::Pipeline::Index.perform(&:go_to_latest_pipeline)
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('build')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 600)
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('test')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 600)
+ job.click_element(:pipeline_path)
+ end
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('test')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 600)
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('production')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 1200)
+ job.click_element(:pipeline_path)
+ end
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('production')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 1200)
- Page::Project::Menu.perform(&:click_operations_environments)
- Page::Project::Operations::Environments::Index.perform do |index|
- index.go_to_environment('production')
- end
- Page::Project::Operations::Environments::Show.perform do |show|
- show.view_deployment do
- expect(page).to have_content('Hello World!')
- end
- end
+ job.click_element(:pipeline_path)
end
- it 'user sets application secret variable and Auto DevOps passes it to container' do
- # Set an application secret CI variable (prefixed with K8S_SECRET_)
- Resource::CiVariable.fabricate! do |resource|
- resource.project = @project
- resource.key = 'K8S_SECRET_OPTIONAL_MESSAGE'
- resource.value = 'You can see this application secret'
+ Page::Project::Menu.perform(&:click_operations_environments)
+ Page::Project::Operations::Environments::Index.perform do |index|
+ index.go_to_environment('production')
+ end
+ Page::Project::Operations::Environments::Show.perform do |show|
+ show.view_deployment do
+ expect(page).to have_content('Hello World!')
end
+ end
+ end
- # Our current Auto DevOps implementation won't update the production
- # app if we only update a CI variable with no code change.
- #
- # Workaround: push new code and use the resultant pipeline.
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = @project
- push.commit_message = 'Force a Deployment change by pushing new code'
- push.file_name = 'new_file.txt'
- push.file_content = 'new file contents'
- end
+ it 'user sets application secret variable and Auto DevOps passes it to container' do
+ # Set an application secret CI variable (prefixed with K8S_SECRET_)
+ Resource::CiVariable.fabricate! do |resource|
+ resource.project = @project
+ resource.key = 'K8S_SECRET_OPTIONAL_MESSAGE'
+ resource.value = 'You can see this application secret'
+ end
- @project.visit!
- Page::Project::Menu.perform(&:click_ci_cd_pipelines)
- Page::Project::Pipeline::Index.perform(&:go_to_latest_pipeline)
+ # Our current Auto DevOps implementation won't update the production
+ # app if we only update a CI variable with no code change.
+ #
+ # Workaround: push new code and use the resultant pipeline.
+ Resource::Repository::ProjectPush.fabricate! do |push|
+ push.project = @project
+ push.commit_message = 'Force a Deployment change by pushing new code'
+ push.file_name = 'new_file.txt'
+ push.file_content = 'new file contents'
+ end
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('build')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 600)
+ Page::Project::Menu.perform(&:click_ci_cd_pipelines)
+ Page::Project::Pipeline::Index.perform(&:go_to_latest_pipeline)
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('build')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 600)
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('test')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 600)
+ job.click_element(:pipeline_path)
+ end
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('test')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 600)
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.go_to_job('production')
- end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 1200)
+ job.click_element(:pipeline_path)
+ end
- job.click_element(:pipeline_path)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.go_to_job('production')
+ end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 1200)
+ end
- Page::Project::Menu.perform(&:click_operations_environments)
+ Page::Project::Menu.perform(&:click_operations_environments)
- Page::Project::Operations::Environments::Index.perform do |index|
- index.go_to_environment('production')
- end
+ Page::Project::Operations::Environments::Index.perform do |index|
+ index.go_to_environment('production')
+ end
- Page::Project::Operations::Environments::Show.perform do |show|
- show.view_deployment do
- expect(page).to have_content('Hello World!')
- expect(page).to have_content('You can see this application secret')
- end
+ Page::Project::Operations::Environments::Show.perform do |show|
+ show.view_deployment do
+ expect(page).to have_content('Hello World!')
+ expect(page).to have_content('You can see this application secret')
end
end
end
diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb
index 8aa7d6812ac..229bfb44fa5 100644
--- a/qa/qa/support/api.rb
+++ b/qa/qa/support/api.rb
@@ -20,6 +20,16 @@ module QA
e.response
end
+ def put(url, payload)
+ RestClient::Request.execute(
+ method: :put,
+ url: url,
+ payload: payload,
+ verify_ssl: false)
+ rescue RestClient::ExceptionWithResponse => e
+ e.response
+ end
+
def delete(url)
RestClient::Request.execute(
method: :delete,
diff --git a/qa/qa/tools/generate_perf_testdata.rb b/qa/qa/tools/generate_perf_testdata.rb
new file mode 100644
index 00000000000..ad515014794
--- /dev/null
+++ b/qa/qa/tools/generate_perf_testdata.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+require 'securerandom'
+require 'faker'
+require_relative '../../qa'
+# This script generates testdata for Performance Testing.
+# Required environment variables: PERSONAL_ACCESS_TOKEN and GITLAB_ADDRESS
+# This job creates a urls.txt which contains a hash of all the URLs needed for Performance Testing
+# Run `rake generate_perf_testdata`
+
+module QA
+ module Tools
+ class GeneratePerfTestdata
+ include Support::Api
+
+ def initialize
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
+ raise ArgumentError, "Please provide PERSONAL_ACCESS_TOKEN" unless ENV['PERSONAL_ACCESS_TOKEN']
+
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['PERSONAL_ACCESS_TOKEN'])
+ @group_name = "gitlab-qa-perf-sandbox-#{SecureRandom.hex(8)}"
+ @project_name = "my-test-project-#{SecureRandom.hex(8)}"
+ @urls = {}
+ end
+
+ def run
+ STDOUT.puts 'Running...'
+ group_id = create_group
+ create_project(group_id)
+ create_branch
+ add_new_file
+ methods_arr = [
+ method(:create_issues),
+ method(:create_todos),
+ method(:create_merge_requests),
+ method(:create_issue_with_500_discussions),
+ method(:create_mr_with_large_files)
+ ]
+ threads_arr = []
+
+ methods_arr.each do |m|
+ threads_arr << Thread.new {m.call}
+ end
+
+ threads_arr.each(&:join)
+ STDOUT.puts "\nURLs: #{@urls}"
+ File.open("urls.txt", "w") { |file| file.puts @urls.to_s}
+ STDOUT.puts "\nDone"
+ end
+
+ private
+
+ def create_group
+ group_search_response = post Runtime::API::Request.new(@api_client, "/groups").url, "name=#{@group_name}&path=#{@group_name}"
+ group = JSON.parse(group_search_response.body)
+ @urls[:group_page] = group["web_url"]
+ group["id"]
+ end
+
+ def create_project(group_id)
+ create_project_response = post Runtime::API::Request.new(@api_client, "/projects").url, "name=#{@project_name}&namespace_id=#{group_id}"
+ @urls[:project_page] = JSON.parse(create_project_response.body)["web_url"]
+ end
+
+ def create_issues
+ 30.times do |i|
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/issues").url, "title=issue#{i}&description=desc#{i}"
+ end
+ @urls[:issues_list_page] = @urls[:project_page] + "/issues"
+ STDOUT.puts "Created Issues"
+ end
+
+ def create_todos
+ 30.times do |i|
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/issues/#{i + 1}/todo").url, nil
+ end
+ @urls[:todos_page] = ENV['GITLAB_ADDRESS'] + "/dashboard/todos"
+ STDOUT.puts "Created todos"
+ end
+
+ def create_merge_requests
+ 30.times do |i|
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/merge_requests").url, "source_branch=branch#{i}&target_branch=master&title=MR#{i}"
+ end
+ @urls[:mr_list_page] = @urls[:project_page] + "/merge_requests"
+ STDOUT.puts "Created MRs"
+ end
+
+ def add_new_file
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/files/hello.txt").url, "branch=master&commit_message=\"hello\"&content=\"my new content\""
+ 30.times do |i|
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/files/hello#{i}.txt").url, "branch=branch#{i}&commit_message=\"hello\"&content=\"my new content\""
+ end
+ STDOUT.puts "Added Files"
+ end
+
+ def create_branch
+ 30.times do |i|
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/branches").url, "branch=branch#{i}&ref=master"
+ end
+ STDOUT.puts "Created branches"
+ end
+
+ def create_issue_with_500_discussions
+ issue_id = 1
+ 500.times do
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/issues/#{issue_id}/discussions").url, "body=\"Let us discuss\""
+ end
+ @urls[:large_issue] = @urls[:project_page] + "/issues/#{issue_id}"
+ STDOUT.puts "Created Issue with 500 Discussions"
+ end
+
+ def create_mr_with_large_files
+ content_arr = []
+ 20.times do |i|
+ faker_line_arr = Faker::Lorem.sentences(1500)
+ content = faker_line_arr.join("\n\r")
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/files/hello#{i}.txt").url, "branch=master&commit_message=\"Add hello#{i}.txt\"&content=#{content}"
+ content_arr[i] = faker_line_arr
+ end
+
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/branches").url, "branch=performance&ref=master"
+
+ 20.times do |i|
+ missed_line_array = content_arr[i].each_slice(2).map(&:first)
+ content = missed_line_array.join("\n\rIm new!:D \n\r ")
+ put Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/repository/files/hello#{i}.txt").url, "branch=performance&commit_message=\"Update hello#{i}.txt\"&content=#{content}"
+ end
+
+ create_mr_response = post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/merge_requests").url, "source_branch=performance&target_branch=master&title=Large_MR"
+
+ iid = JSON.parse(create_mr_response.body)["iid"]
+ 500.times do
+ post Runtime::API::Request.new(@api_client, "/projects/#{@group_name}%2F#{@project_name}/merge_requests/#{iid}/discussions").url, "body=\"Let us discuss\""
+ end
+ @urls[:large_mr] = JSON.parse(create_mr_response.body)["web_url"]
+ STDOUT.puts "Created MR with 500 Discussions and 20 Very Large Files"
+ end
+ end
+ end
+end
diff --git a/qa/spec/git/repository_spec.rb b/qa/spec/git/repository_spec.rb
index 62c81050bd9..0ded33a73a2 100644
--- a/qa/spec/git/repository_spec.rb
+++ b/qa/spec/git/repository_spec.rb
@@ -39,7 +39,7 @@ describe QA::Git::Repository do
describe '#clone' do
it 'is unable to resolve host' do
- expect(repository.clone).to include("fatal: unable to access 'http://root@foo/bar.git/'")
+ expect { repository.clone }.to raise_error(described_class::RepositoryCommandError, /The command .* failed \(128\) with the following output/)
end
end
@@ -49,7 +49,7 @@ describe QA::Git::Repository do
end
it 'fails to push changes' do
- expect(repository.push_changes).to include("error: failed to push some refs to 'http://root@foo/bar.git'")
+ expect { repository.push_changes }.to raise_error(described_class::RepositoryCommandError, /The command .* failed \(1\) with the following output/)
end
end
diff --git a/scripts/lint-rugged b/scripts/lint-rugged
index 22e3e1f1505..9466c62a415 100755
--- a/scripts/lint-rugged
+++ b/scripts/lint-rugged
@@ -5,12 +5,18 @@ ALLOWED = [
'lib/gitlab/bare_repository_import/repository.rb',
# Needed to avoid using the git binary to validate a branch name
- 'lib/gitlab/git_ref_validator.rb'
+ 'lib/gitlab/git_ref_validator.rb',
+
+ # Reverted Rugged calls due to Gitaly atop NFS performance
+ # See https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code.
+ 'lib/gitlab/git/rugged_impl/',
+ 'lib/gitlab/gitaly_client/storage_settings.rb'
].freeze
rugged_lines = IO.popen(%w[git grep -i -n rugged -- app config lib], &:read).lines
rugged_lines = rugged_lines.select { |l| /^[^:]*\.rb:/ =~ l }
rugged_lines = rugged_lines.reject { |l| l.start_with?(*ALLOWED) }
+rugged_lines = rugged_lines.reject { |l| /(include|prepend) Gitlab::Git::RuggedImpl/ =~ l}
rugged_lines = rugged_lines.reject do |line|
code, _comment = line.split('# ', 2)
code !~ /rugged/i
diff --git a/spec/controllers/admin/appearances_controller_spec.rb b/spec/controllers/admin/appearances_controller_spec.rb
index 4ddd0953267..621aa148301 100644
--- a/spec/controllers/admin/appearances_controller_spec.rb
+++ b/spec/controllers/admin/appearances_controller_spec.rb
@@ -1,15 +1,17 @@
+# frozen_string_literal: true
+
require 'spec_helper'
describe Admin::AppearancesController do
let(:admin) { create(:admin) }
- let(:header_message) { "Header message" }
- let(:footer_message) { "Footer" }
+ let(:header_message) { 'Header message' }
+ let(:footer_message) { 'Footer' }
describe 'POST #create' do
let(:create_params) do
{
- title: "Foo",
- description: "Bar",
+ title: 'Foo',
+ description: 'Bar',
header_message: header_message,
footer_message: footer_message
}
@@ -24,9 +26,26 @@ describe Admin::AppearancesController do
expect(Appearance.current).to have_attributes(
header_message: header_message,
- footer_message: footer_message
+ footer_message: footer_message,
+ email_header_and_footer_enabled: false,
+ message_background_color: '#E75E40',
+ message_font_color: '#FFFFFF'
)
end
+
+ context 'when enabling header and footer in email' do
+ it 'creates appearance with enabled flag' do
+ create_params[:email_header_and_footer_enabled] = true
+
+ post :create, params: { appearance: create_params }
+
+ expect(Appearance.current).to have_attributes(
+ header_message: header_message,
+ footer_message: footer_message,
+ email_header_and_footer_enabled: true
+ )
+ end
+ end
end
describe 'PUT #update' do
@@ -48,8 +67,25 @@ describe Admin::AppearancesController do
expect(Appearance.current).to have_attributes(
header_message: header_message,
- footer_message: footer_message
+ footer_message: footer_message,
+ email_header_and_footer_enabled: false,
+ message_background_color: '#E75E40',
+ message_font_color: '#FFFFFF'
)
end
+
+ context 'when enabling header and footer in email' do
+ it 'updates appearance with enabled flag' do
+ update_params[:email_header_and_footer_enabled] = true
+
+ post :update, params: { appearance: update_params }
+
+ expect(Appearance.current).to have_attributes(
+ header_message: header_message,
+ footer_message: footer_message,
+ email_header_and_footer_enabled: true
+ )
+ end
+ end
end
end
diff --git a/spec/controllers/concerns/send_file_upload_spec.rb b/spec/controllers/concerns/send_file_upload_spec.rb
index cf3b24f50a3..aa71a247956 100644
--- a/spec/controllers/concerns/send_file_upload_spec.rb
+++ b/spec/controllers/concerns/send_file_upload_spec.rb
@@ -112,7 +112,7 @@ describe SendFileUpload do
it 'sends a file with a custom type' do
headers = double
- expected_headers = %r(response-content-disposition=attachment%3B%20filename%3D%22test.js%22%3B%20filename%2A%3DUTF-8%27%27test.js&response-content-type=application/ecmascript)
+ expected_headers = /response-content-disposition=attachment%3B%20filename%3D%22test.js%22%3B%20filename%2A%3DUTF-8%27%27test.js&response-content-type=application%2Fecmascript/
expect(Gitlab::Workhorse).to receive(:send_url).with(expected_headers).and_call_original
expect(headers).to receive(:store).with(Gitlab::Workhorse::SEND_DATA_HEADER, /^send-url:/)
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index 4b164d0aa6b..ab40b4eb178 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -13,7 +13,7 @@ describe Dashboard::MilestonesController do
)
end
let(:issue) { create(:issue, project: project, milestone: project_milestone) }
- let(:group_issue) { create(:issue, milestone: group_milestone) }
+ let(:group_issue) { create(:issue, milestone: group_milestone, project: create(:project, group: group)) }
let!(:label) { create(:label, project: project, title: 'Issue Label', issues: [issue]) }
let!(:group_label) { create(:group_label, group: group, title: 'Group Issue Label', issues: [group_issue]) }
diff --git a/spec/controllers/google_api/authorizations_controller_spec.rb b/spec/controllers/google_api/authorizations_controller_spec.rb
index 1e8e82da4f3..d9ba85cf56a 100644
--- a/spec/controllers/google_api/authorizations_controller_spec.rb
+++ b/spec/controllers/google_api/authorizations_controller_spec.rb
@@ -6,7 +6,7 @@ describe GoogleApi::AuthorizationsController do
let(:token) { 'token' }
let(:expires_at) { 1.hour.since.strftime('%s') }
- subject { get :callback, params: { code: 'xxx', state: @state } }
+ subject { get :callback, params: { code: 'xxx', state: state } }
before do
sign_in(user)
@@ -15,35 +15,57 @@ describe GoogleApi::AuthorizationsController do
.to receive(:get_token).and_return([token, expires_at])
end
- it 'sets token and expires_at in session' do
- subject
+ shared_examples_for 'access denied' do
+ it 'returns a 404' do
+ subject
- expect(session[GoogleApi::CloudPlatform::Client.session_key_for_token])
- .to eq(token)
- expect(session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at])
- .to eq(expires_at)
+ expect(session[GoogleApi::CloudPlatform::Client.session_key_for_token]).to be_nil
+ expect(response).to have_http_status(:not_found)
+ end
end
- context 'when redirect uri key is stored in state' do
- set(:project) { create(:project) }
- let(:redirect_uri) { project_clusters_url(project).to_s }
+ context 'session key is present' do
+ let(:session_key) { 'session-key' }
+ let(:redirect_uri) { 'example.com' }
before do
- @state = GoogleApi::CloudPlatform::Client
- .new_session_key_for_redirect_uri do |key|
- session[key] = redirect_uri
+ session[GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(session_key)] = redirect_uri
+ end
+
+ context 'session key matches state param' do
+ let(:state) { session_key }
+
+ it 'sets token and expires_at in session' do
+ subject
+
+ expect(session[GoogleApi::CloudPlatform::Client.session_key_for_token])
+ .to eq(token)
+ expect(session[GoogleApi::CloudPlatform::Client.session_key_for_expires_at])
+ .to eq(expires_at)
+ end
+
+ it 'redirects to the URL stored in state param' do
+ expect(subject).to redirect_to(redirect_uri)
end
end
- it 'redirects to the URL stored in state param' do
- expect(subject).to redirect_to(redirect_uri)
+ context 'session key does not match state param' do
+ let(:state) { 'bad-key' }
+
+ it_behaves_like 'access denied'
end
- end
- context 'when redirection url is not stored in state' do
- it 'redirects to root_path' do
- expect(subject).to redirect_to(root_path)
+ context 'state param is blank' do
+ let(:state) { '' }
+
+ it_behaves_like 'access denied'
end
end
+
+ context 'state param is present, but session key is blank' do
+ let(:state) { 'session-key' }
+
+ it_behaves_like 'access denied'
+ end
end
end
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
deleted file mode 100644
index a0f40874db1..00000000000
--- a/spec/controllers/graphql_controller_spec.rb
+++ /dev/null
@@ -1,112 +0,0 @@
-require 'spec_helper'
-
-describe GraphqlController do
- describe 'execute' do
- let(:user) { nil }
-
- before do
- sign_in(user) if user
-
- run_test_query!
- end
-
- subject { query_response }
-
- context 'graphql is disabled by feature flag' do
- let(:user) { nil }
-
- before do
- stub_feature_flags(graphql: false)
- end
-
- it 'returns 404' do
- run_test_query!
-
- expect(response).to have_gitlab_http_status(404)
- end
- end
-
- context 'signed out' do
- let(:user) { nil }
-
- it 'runs the query with current_user: nil' do
- is_expected.to eq('echo' => 'nil says: test success')
- end
- end
-
- context 'signed in' do
- let(:user) { create(:user, username: 'Simon') }
-
- it 'runs the query with current_user set' do
- is_expected.to eq('echo' => '"Simon" says: test success')
- end
- end
-
- context 'invalid variables' do
- it 'returns an error' do
- run_test_query!(variables: "This is not JSON")
-
- expect(response).to have_gitlab_http_status(422)
- expect(json_response['errors'].first['message']).not_to be_nil
- end
- end
- end
-
- context 'token authentication' do
- before do
- stub_authentication_activity_metrics(debug: false)
- end
-
- let(:user) { create(:user, username: 'Simon') }
- let(:personal_access_token) { create(:personal_access_token, user: user) }
-
- context "when the 'personal_access_token' param is populated with the personal access token" do
- it 'logs the user in' do
- expect(authentication_metrics)
- .to increment(:user_authenticated_counter)
- .and increment(:user_session_override_counter)
- .and increment(:user_sessionless_authentication_counter)
-
- run_test_query!(private_token: personal_access_token.token)
-
- expect(response).to have_gitlab_http_status(200)
- expect(query_response).to eq('echo' => '"Simon" says: test success')
- end
- end
-
- context 'when the personal access token has no api scope' do
- it 'does not log the user in' do
- personal_access_token.update(scopes: [:read_user])
-
- run_test_query!(private_token: personal_access_token.token)
-
- expect(response).to have_gitlab_http_status(200)
-
- expect(query_response).to eq('echo' => 'nil says: test success')
- end
- end
-
- context 'without token' do
- it 'shows public data' do
- run_test_query!
-
- expect(query_response).to eq('echo' => 'nil says: test success')
- end
- end
- end
-
- # Chosen to exercise all the moving parts in GraphqlController#execute
- def run_test_query!(variables: { 'text' => 'test success' }, private_token: nil)
- query = <<~QUERY
- query Echo($text: String) {
- echo(text: $text)
- }
- QUERY
-
- post :execute, params: { query: query, operationName: 'Echo', variables: variables, private_token: private_token }
- end
-
- def query_response
- json_response['data']
- end
-end
diff --git a/spec/controllers/groups/clusters/applications_controller_spec.rb b/spec/controllers/groups/clusters/applications_controller_spec.rb
index dd5263b077c..16a63536ea6 100644
--- a/spec/controllers/groups/clusters/applications_controller_spec.rb
+++ b/spec/controllers/groups/clusters/applications_controller_spec.rb
@@ -9,9 +9,25 @@ describe Groups::Clusters::ApplicationsController do
Clusters::Cluster::APPLICATIONS[application]
end
+ shared_examples 'a secure endpoint' do
+ it { expect { subject }.to be_allowed_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) }
+ it { expect { subject }.to be_denied_for(:reporter).of(group) }
+ it { expect { subject }.to be_denied_for(:guest).of(group) }
+ it { expect { subject }.to be_denied_for(:user) }
+ it { expect { subject }.to be_denied_for(:external) }
+ end
+
+ let(:cluster) { create(:cluster, :group, :provided_by_gcp) }
+ let(:group) { cluster.group }
+
describe 'POST create' do
- let(:cluster) { create(:cluster, :group, :provided_by_gcp) }
- let(:group) { cluster.group }
+ subject do
+ post :create, params: params.merge(group_id: group)
+ end
+
let(:application) { 'helm' }
let(:params) { { application: application, id: cluster.id } }
@@ -26,7 +42,7 @@ describe Groups::Clusters::ApplicationsController do
it 'schedule an application installation' do
expect(ClusterInstallAppWorker).to receive(:perform_async).with(application, anything).once
- expect { go }.to change { current_application.count }
+ expect { subject }.to change { current_application.count }
expect(response).to have_http_status(:no_content)
expect(cluster.application_helm).to be_scheduled
end
@@ -37,7 +53,7 @@ describe Groups::Clusters::ApplicationsController do
end
it 'return 404' do
- expect { go }.not_to change { current_application.count }
+ expect { subject }.not_to change { current_application.count }
expect(response).to have_http_status(:not_found)
end
end
@@ -46,9 +62,7 @@ describe Groups::Clusters::ApplicationsController do
let(:application) { 'unkwnown-app' }
it 'return 404' do
- go
-
- expect(response).to have_http_status(:not_found)
+ is_expected.to have_http_status(:not_found)
end
end
@@ -58,9 +72,7 @@ describe Groups::Clusters::ApplicationsController do
end
it 'returns 400' do
- go
-
- expect(response).to have_http_status(:bad_request)
+ is_expected.to have_http_status(:bad_request)
end
end
end
@@ -70,18 +82,66 @@ describe Groups::Clusters::ApplicationsController do
allow(ClusterInstallAppWorker).to receive(:perform_async)
end
- it { expect { go }.to be_allowed_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) }
- it { expect { go }.to be_denied_for(:reporter).of(group) }
- it { expect { go }.to be_denied_for(:guest).of(group) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
+ it_behaves_like 'a secure endpoint'
end
+ end
- def go
- post :create, params: params.merge(group_id: group)
+ describe 'PATCH update' do
+ subject do
+ patch :update, params: params.merge(group_id: group)
+ end
+
+ let!(:application) { create(:clusters_applications_cert_managers, :installed, cluster: cluster) }
+ let(:application_name) { application.name }
+ let(:params) { { application: application_name, id: cluster.id, email: "new-email@example.com" } }
+
+ describe 'functionality' do
+ let(:user) { create(:user) }
+
+ before do
+ group.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context "when cluster and app exists" do
+ it "schedules an application update" do
+ expect(ClusterPatchAppWorker).to receive(:perform_async).with(application.name, anything).once
+
+ is_expected.to have_http_status(:no_content)
+
+ expect(cluster.application_cert_manager).to be_scheduled
+ end
+ end
+
+ context 'when cluster do not exists' do
+ before do
+ cluster.destroy!
+ end
+
+ it { is_expected.to have_http_status(:not_found) }
+ end
+
+ context 'when application is unknown' do
+ let(:application_name) { 'unkwnown-app' }
+
+ it { is_expected.to have_http_status(:not_found) }
+ end
+
+ context 'when application is already scheduled' do
+ before do
+ application.make_scheduled!
+ end
+
+ it { is_expected.to have_http_status(:bad_request) }
+ end
+ end
+
+ describe 'security' do
+ before do
+ allow(ClusterPatchAppWorker).to receive(:perform_async)
+ end
+
+ it_behaves_like 'a secure endpoint'
end
end
end
diff --git a/spec/controllers/groups/shared_projects_controller_spec.rb b/spec/controllers/groups/shared_projects_controller_spec.rb
index dab7700cf64..b0c20fb5a90 100644
--- a/spec/controllers/groups/shared_projects_controller_spec.rb
+++ b/spec/controllers/groups/shared_projects_controller_spec.rb
@@ -6,6 +6,8 @@ describe Groups::SharedProjectsController do
end
def share_project(project)
+ group.add_developer(user)
+
Projects::GroupLinks::CreateService.new(
project,
user,
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index 7d87b33e503..21e5122c06b 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -227,9 +227,7 @@ describe GroupsController do
context 'searching' do
before do
- # Remove in https://gitlab.com/gitlab-org/gitlab-ce/issues/54643
- stub_feature_flags(use_cte_for_group_issues_search: false)
- stub_feature_flags(use_subquery_for_group_issues_search: true)
+ stub_feature_flags(attempt_group_search_optimizations: true)
end
it 'works with popularity sort' do
diff --git a/spec/controllers/omniauth_callbacks_controller_spec.rb b/spec/controllers/omniauth_callbacks_controller_spec.rb
index 232a5e2793b..e0da23ca0b8 100644
--- a/spec/controllers/omniauth_callbacks_controller_spec.rb
+++ b/spec/controllers/omniauth_callbacks_controller_spec.rb
@@ -193,7 +193,7 @@ describe OmniauthCallbacksController, type: :controller do
before do
stub_omniauth_saml_config({ enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'],
providers: [saml_config] })
- mock_auth_hash('saml', 'my-uid', user.email, mock_saml_response)
+ mock_auth_hash_with_saml_xml('saml', 'my-uid', user.email, mock_saml_response)
request.env["devise.mapping"] = Devise.mappings[:user]
request.env['omniauth.auth'] = Rails.application.env_config['omniauth.auth']
post :saml, params: { SAMLResponse: mock_saml_response }
diff --git a/spec/controllers/projects/autocomplete_sources_controller_spec.rb b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
index 4bc72042710..a9a058e7e17 100644
--- a/spec/controllers/projects/autocomplete_sources_controller_spec.rb
+++ b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
@@ -35,4 +35,35 @@ describe Projects::AutocompleteSourcesController do
avatar_url: user.avatar_url)
end
end
+
+ describe 'GET milestones' do
+ let(:group) { create(:group, :public) }
+ let(:project) { create(:project, :public, namespace: group) }
+ let!(:project_milestone) { create(:milestone, project: project) }
+ let!(:group_milestone) { create(:milestone, group: group) }
+
+ before do
+ sign_in(user)
+ end
+
+ it 'lists milestones' do
+ group.add_owner(user)
+
+ get :milestones, format: :json, params: { namespace_id: group.path, project_id: project.path }
+
+ milestone_titles = json_response.map { |milestone| milestone["title"] }
+ expect(milestone_titles).to match_array([project_milestone.title, group_milestone.title])
+ end
+
+ context 'when user cannot read project issues and merge requests' do
+ it 'renders 404' do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+
+ get :milestones, format: :json, params: { namespace_id: group.path, project_id: project.path }
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
end
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 38957e96798..3801fca09dc 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -144,54 +144,34 @@ describe Projects::BlobController do
end
context 'when rendering for merge request' do
- it 'renders diff context lines Gitlab::Diff::Line array' do
- do_get(since: 1, to: 5, offset: 10, from_merge_request: true)
-
- lines = JSON.parse(response.body)
-
- expect(lines.first).to have_key('type')
- expect(lines.first).to have_key('rich_text')
- expect(lines.first).to have_key('rich_text')
+ let(:presenter) { double(:presenter, diff_lines: diff_lines) }
+ let(:diff_lines) do
+ Array.new(3, Gitlab::Diff::Line.new('plain', nil, nil, nil, nil, rich_text: 'rich'))
end
- context 'when rendering match lines' do
- it 'adds top match line when "since" is less than 1' do
- do_get(since: 5, to: 10, offset: 10, from_merge_request: true)
-
- match_line = JSON.parse(response.body).first
-
- expect(match_line['type']).to eq('match')
- expect(match_line['meta_data']).to have_key('old_pos')
- expect(match_line['meta_data']).to have_key('new_pos')
- end
-
- it 'does not add top match line when "since" is equal 1' do
- do_get(since: 1, to: 10, offset: 10, from_merge_request: true)
-
- match_line = JSON.parse(response.body).first
-
- expect(match_line['type']).to be_nil
- end
+ before do
+ allow(Blobs::UnfoldPresenter).to receive(:new).and_return(presenter)
+ end
- it 'adds bottom match line when "t"o is less than blob size' do
- do_get(since: 1, to: 5, offset: 10, from_merge_request: true, bottom: true)
+ it 'renders diff context lines Gitlab::Diff::Line array' do
+ do_get(since: 1, to: 2, offset: 0, from_merge_request: true)
- match_line = JSON.parse(response.body).last
+ lines = JSON.parse(response.body)
- expect(match_line['type']).to eq('match')
- expect(match_line['meta_data']).to have_key('old_pos')
- expect(match_line['meta_data']).to have_key('new_pos')
+ expect(lines.size).to eq(diff_lines.size)
+ lines.each do |line|
+ expect(line).to have_key('type')
+ expect(line['text']).to eq('plain')
+ expect(line['rich_text']).to eq('rich')
end
+ end
- it 'does not add bottom match line when "to" is less than blob size' do
- commit_id = project.repository.commit('master').id
- blob = project.repository.blob_at(commit_id, 'CHANGELOG')
- do_get(since: 1, to: blob.lines.count, offset: 10, from_merge_request: true, bottom: true)
+ it 'handles full being true' do
+ do_get(full: true, from_merge_request: true)
- match_line = JSON.parse(response.body).last
+ lines = JSON.parse(response.body)
- expect(match_line['type']).to be_nil
- end
+ expect(lines.size).to eq(diff_lines.size)
end
end
end
diff --git a/spec/controllers/projects/clusters/applications_controller_spec.rb b/spec/controllers/projects/clusters/applications_controller_spec.rb
index cb558259225..cd1a01f8acc 100644
--- a/spec/controllers/projects/clusters/applications_controller_spec.rb
+++ b/spec/controllers/projects/clusters/applications_controller_spec.rb
@@ -9,7 +9,22 @@ describe Projects::Clusters::ApplicationsController do
Clusters::Cluster::APPLICATIONS[application]
end
+ shared_examples 'a secure endpoint' do
+ it { expect { subject }.to be_allowed_for(:admin) }
+ it { expect { subject }.to be_allowed_for(:owner).of(project) }
+ it { expect { subject }.to be_allowed_for(:maintainer).of(project) }
+ it { expect { subject }.to be_denied_for(:developer).of(project) }
+ it { expect { subject }.to be_denied_for(:reporter).of(project) }
+ it { expect { subject }.to be_denied_for(:guest).of(project) }
+ it { expect { subject }.to be_denied_for(:user) }
+ it { expect { subject }.to be_denied_for(:external) }
+ end
+
describe 'POST create' do
+ subject do
+ post :create, params: params.merge(namespace_id: project.namespace, project_id: project)
+ end
+
let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
let(:application) { 'helm' }
@@ -26,7 +41,7 @@ describe Projects::Clusters::ApplicationsController do
it 'schedule an application installation' do
expect(ClusterInstallAppWorker).to receive(:perform_async).with(application, anything).once
- expect { go }.to change { current_application.count }
+ expect { subject }.to change { current_application.count }
expect(response).to have_http_status(:no_content)
expect(cluster.application_helm).to be_scheduled
end
@@ -37,7 +52,7 @@ describe Projects::Clusters::ApplicationsController do
end
it 'return 404' do
- expect { go }.not_to change { current_application.count }
+ expect { subject }.not_to change { current_application.count }
expect(response).to have_http_status(:not_found)
end
end
@@ -46,9 +61,7 @@ describe Projects::Clusters::ApplicationsController do
let(:application) { 'unkwnown-app' }
it 'return 404' do
- go
-
- expect(response).to have_http_status(:not_found)
+ is_expected.to have_http_status(:not_found)
end
end
@@ -58,9 +71,7 @@ describe Projects::Clusters::ApplicationsController do
end
it 'returns 400' do
- go
-
- expect(response).to have_http_status(:bad_request)
+ is_expected.to have_http_status(:bad_request)
end
end
end
@@ -70,18 +81,68 @@ describe Projects::Clusters::ApplicationsController do
allow(ClusterInstallAppWorker).to receive(:perform_async)
end
- it { expect { go }.to be_allowed_for(:admin) }
- it { expect { go }.to be_allowed_for(:owner).of(project) }
- it { expect { go }.to be_allowed_for(:maintainer).of(project) }
- it { expect { go }.to be_denied_for(:developer).of(project) }
- it { expect { go }.to be_denied_for(:reporter).of(project) }
- it { expect { go }.to be_denied_for(:guest).of(project) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
+ it_behaves_like 'a secure endpoint'
end
+ end
- def go
- post :create, params: params.merge(namespace_id: project.namespace, project_id: project)
+ describe 'PATCH update' do
+ subject do
+ patch :update, params: params.merge(namespace_id: project.namespace, project_id: project)
+ end
+
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+ let(:project) { cluster.project }
+ let!(:application) { create(:clusters_applications_knative, :installed, cluster: cluster) }
+ let(:application_name) { application.name }
+ let(:params) { { application: application_name, id: cluster.id, hostname: "new.example.com" } }
+
+ describe 'functionality' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context "when cluster and app exists" do
+ it "schedules an application update" do
+ expect(ClusterPatchAppWorker).to receive(:perform_async).with(application.name, anything).once
+
+ is_expected.to have_http_status(:no_content)
+
+ expect(cluster.application_knative).to be_scheduled
+ end
+ end
+
+ context 'when cluster do not exists' do
+ before do
+ cluster.destroy!
+ end
+
+ it { is_expected.to have_http_status(:not_found) }
+ end
+
+ context 'when application is unknown' do
+ let(:application_name) { 'unkwnown-app' }
+
+ it { is_expected.to have_http_status(:not_found) }
+ end
+
+ context 'when application is already scheduled' do
+ before do
+ application.make_scheduled!
+ end
+
+ it { is_expected.to have_http_status(:bad_request) }
+ end
+ end
+
+ describe 'security' do
+ before do
+ allow(ClusterPatchAppWorker).to receive(:perform_async)
+ end
+
+ it_behaves_like 'a secure endpoint'
end
end
end
diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb
index 675eeff8d12..ce021b2f085 100644
--- a/spec/controllers/projects/group_links_controller_spec.rb
+++ b/spec/controllers/projects/group_links_controller_spec.rb
@@ -65,8 +65,24 @@ describe Projects::GroupLinksController do
end
end
+ context 'when user does not have access to the public group' do
+ let(:group) { create(:group, :public) }
+
+ include_context 'link project to group'
+
+ it 'renders 404' do
+ expect(response.status).to eq 404
+ end
+
+ it 'does not share project with that group' do
+ expect(group.shared_projects).not_to include project
+ end
+ end
+
context 'when project group id equal link group id' do
before do
+ group2.add_developer(user)
+
post(:create, params: {
namespace_id: project.namespace,
project_id: project,
@@ -102,5 +118,26 @@ describe Projects::GroupLinksController do
expect(flash[:alert]).to eq('Please select a group.')
end
end
+
+ context 'when link is not persisted in the database' do
+ before do
+ allow(::Projects::GroupLinks::CreateService).to receive_message_chain(:new, :execute)
+ .and_return({ status: :error, http_status: 409, message: 'error' })
+
+ post(:create, params: {
+ namespace_id: project.namespace,
+ project_id: project,
+ link_group_id: group.id,
+ link_group_access: ProjectGroupLink.default_access
+ })
+ end
+
+ it 'redirects to project group links page' do
+ expect(response).to redirect_to(
+ project_project_members_path(project)
+ )
+ expect(flash[:alert]).to eq('error')
+ end
+ end
end
end
diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb
index d989ec22481..02a392f23c2 100644
--- a/spec/controllers/projects/settings/operations_controller_spec.rb
+++ b/spec/controllers/projects/settings/operations_controller_spec.rb
@@ -74,38 +74,55 @@ describe Projects::Settings::OperationsController do
{
error_tracking_setting_attributes: {
enabled: '1',
- api_url: 'http://url',
- token: 'token'
+ api_host: 'http://url',
+ token: 'token',
+ project: {
+ slug: 'sentry-project',
+ name: 'Sentry Project',
+ organization_slug: 'sentry-org',
+ organization_name: 'Sentry Org'
+ }
}
}
end
+
let(:error_tracking_permitted) do
ActionController::Parameters.new(error_tracking_params).permit!
end
- context 'when update succeeds' do
- before do
- stub_operations_update_service_returning(status: :success)
- end
-
- it 'shows a notice' do
- patch :update, params: project_params(project, error_tracking_params)
-
- expect(response).to redirect_to(operations_url)
- expect(flash[:notice]).to eq _('Your changes have been saved')
- end
- end
-
- context 'when update fails' do
- before do
- stub_operations_update_service_returning(status: :error)
+ context 'format json' do
+ context 'when update succeeds' do
+ before do
+ stub_operations_update_service_returning(status: :success)
+ end
+
+ it 'returns success status' do
+ patch :update,
+ params: project_params(project, error_tracking_params),
+ format: :json
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq('status' => 'success')
+ expect(flash[:notice]).to eq('Your changes have been saved')
+ end
end
- it 'renders show page' do
- patch :update, params: project_params(project, error_tracking_params)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
+ context 'when update fails' do
+ before do
+ stub_operations_update_service_returning(
+ status: :error,
+ message: 'error message'
+ )
+ end
+
+ it 'returns error' do
+ patch :update,
+ params: project_params(project, error_tracking_params),
+ format: :json
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).not_to be_nil
+ end
end
end
diff --git a/spec/controllers/snippets_controller_spec.rb b/spec/controllers/snippets_controller_spec.rb
index 5c6858dc7b2..77a94f26d8c 100644
--- a/spec/controllers/snippets_controller_spec.rb
+++ b/spec/controllers/snippets_controller_spec.rb
@@ -205,6 +205,8 @@ describe SnippetsController do
end
context 'when the snippet description contains a file' do
+ include FileMoverHelpers
+
let(:picture_file) { '/-/system/temp/secret56/picture.jpg' }
let(:text_file) { '/-/system/temp/secret78/text.txt' }
let(:description) do
@@ -215,6 +217,8 @@ describe SnippetsController do
before do
allow(FileUtils).to receive(:mkdir_p)
allow(FileUtils).to receive(:move)
+ stub_file_mover(text_file)
+ stub_file_mover(picture_file)
end
subject { create_snippet({ description: description }, { files: [picture_file, text_file] }) }
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index af61026098b..4f6a6881193 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -185,13 +185,32 @@ describe UsersController do
context 'for user' do
context 'with public profile' do
- it 'renders calendar_activities' do
- push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
- EventCreateService.new.push(project, public_user, push_data)
+ let(:issue) { create(:issue, project: project, author: user) }
+ let(:note) { create(:note, noteable: issue, author: user, project: project) }
+
+ render_views
+
+ before do
+ create_push_event
+ create_note_event
+ end
+ it 'renders calendar_activities' do
get :calendar_activities, params: { username: public_user.username }
+
expect(assigns[:events]).not_to be_empty
end
+
+ it 'avoids N+1 queries', :request_store do
+ get :calendar_activities, params: { username: public_user.username }
+
+ control = ActiveRecord::QueryRecorder.new { get :calendar_activities, params: { username: public_user.username } }
+
+ create_push_event
+ create_note_event
+
+ expect { get :calendar_activities, params: { username: public_user.username } }.not_to exceed_query_limit(control)
+ end
end
context 'with private profile' do
@@ -203,6 +222,15 @@ describe UsersController do
expect(response).to have_gitlab_http_status(:not_found)
end
end
+
+ def create_push_event
+ push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
+ EventCreateService.new.push(project, public_user, push_data)
+ end
+
+ def create_note_event
+ EventCreateService.new.leave_note(note, public_user)
+ end
end
end
diff --git a/spec/factories/ci/group_variables.rb b/spec/factories/ci/group_variables.rb
index 64716842b12..9bf520a2c0a 100644
--- a/spec/factories/ci/group_variables.rb
+++ b/spec/factories/ci/group_variables.rb
@@ -2,6 +2,7 @@ FactoryBot.define do
factory :ci_group_variable, class: Ci::GroupVariable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
+ masked false
trait(:protected) do
protected true
diff --git a/spec/factories/ci/variables.rb b/spec/factories/ci/variables.rb
index 3d014b9b54f..97a7c9ba252 100644
--- a/spec/factories/ci/variables.rb
+++ b/spec/factories/ci/variables.rb
@@ -2,6 +2,7 @@ FactoryBot.define do
factory :ci_variable, class: Ci::Variable do
sequence(:key) { |n| "VARIABLE_#{n}" }
value 'VARIABLE_VALUE'
+ masked false
trait(:protected) do
protected true
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index 2392bfc4a53..18f724770b5 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -101,6 +101,15 @@ FactoryBot.define do
end
end
+ trait :with_merge_request_pipeline do
+ after(:build) do |merge_request|
+ merge_request.merge_request_pipelines << build(:ci_pipeline,
+ source: :merge_request_event,
+ merge_request: merge_request,
+ project: merge_request.source_project)
+ end
+ end
+
trait :deployed_review_app do
target_branch 'pages-deploy-target'
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index ed9c0ea9ac0..97b432a6751 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -141,6 +141,56 @@ describe "Admin Runners" do
end
end
+ describe 'filter by tag', :js do
+ it 'shows correct runner when tag matches' do
+ create :ci_runner, description: 'runner-blue', tag_list: ['blue']
+ create :ci_runner, description: 'runner-red', tag_list: ['red']
+
+ visit admin_runners_path
+
+ expect(page).to have_content 'runner-blue'
+ expect(page).to have_content 'runner-red'
+
+ input_filtered_search_keys('tag:blue')
+
+ expect(page).to have_content 'runner-blue'
+ expect(page).not_to have_content 'runner-red'
+ end
+
+ it 'shows no runner when tag does not match' do
+ create :ci_runner, description: 'runner-blue', tag_list: ['blue']
+ create :ci_runner, description: 'runner-red', tag_list: ['blue']
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('tag:red')
+
+ expect(page).not_to have_content 'runner-blue'
+ expect(page).not_to have_content 'runner-blue'
+ expect(page).to have_text 'No runners found'
+ end
+
+ it 'shows correct runner when tag is selected and search term is entered' do
+ create :ci_runner, description: 'runner-a-1', tag_list: ['blue']
+ create :ci_runner, description: 'runner-a-2', tag_list: ['red']
+ create :ci_runner, description: 'runner-b-1', tag_list: ['blue']
+
+ visit admin_runners_path
+
+ input_filtered_search_keys('tag:blue')
+
+ expect(page).to have_content 'runner-a-1'
+ expect(page).to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+
+ input_filtered_search_keys('tag:blue runner-a')
+
+ expect(page).to have_content 'runner-a-1'
+ expect(page).not_to have_content 'runner-b-1'
+ expect(page).not_to have_content 'runner-a-2'
+ end
+ end
+
it 'sorts by last contact date', :js do
create(:ci_runner, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
create(:ci_runner, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')
diff --git a/spec/features/dashboard/activity_spec.rb b/spec/features/dashboard/activity_spec.rb
index bf91dc121d8..c55dc4523f7 100644
--- a/spec/features/dashboard/activity_spec.rb
+++ b/spec/features/dashboard/activity_spec.rb
@@ -39,6 +39,8 @@ describe 'Dashboard > Activity' do
event
end
+ let(:issue) { create(:issue, project: project) }
+
let!(:merged_event) do
create(:event, :merged, project: project, target: merge_request, author: user)
end
@@ -59,6 +61,10 @@ describe 'Dashboard > Activity' do
create(:event, :closed, project: project, target: milestone, author: user)
end
+ let!(:issue_event) do
+ create(:event, :created, project: project, target: issue, author: user)
+ end
+
before do
project.add_maintainer(user)
@@ -74,6 +80,7 @@ describe 'Dashboard > Activity' do
expect(page).to have_content('closed')
expect(page).to have_content('commented on')
expect(page).to have_content('closed milestone')
+ expect(page).to have_content('opened issue')
end
end
@@ -87,6 +94,7 @@ describe 'Dashboard > Activity' do
expect(page).not_to have_content('accepted')
expect(page).not_to have_content('closed')
expect(page).not_to have_content('commented on')
+ expect(page).not_to have_content('opened issue')
end
end
@@ -100,6 +108,7 @@ describe 'Dashboard > Activity' do
expect(page).to have_content('accepted')
expect(page).not_to have_content('closed')
expect(page).not_to have_content('commented on')
+ expect(page).not_to have_content('opened issue')
end
end
@@ -111,9 +120,10 @@ describe 'Dashboard > Activity' do
expect(page).not_to have_content('pushed new branch')
expect(page).not_to have_content('joined')
expect(page).not_to have_content('accepted')
- expect(page).to have_content('closed')
+ expect(page).not_to have_content('closed')
expect(page).not_to have_content('commented on')
- expect(page).to have_content('closed milestone')
+ expect(page).not_to have_content('closed milestone')
+ expect(page).to have_content('opened issue')
end
end
@@ -127,6 +137,7 @@ describe 'Dashboard > Activity' do
expect(page).not_to have_content('accepted')
expect(page).not_to have_content('closed')
expect(page).to have_content('commented on')
+ expect(page).not_to have_content('opened issue')
end
end
@@ -140,6 +151,7 @@ describe 'Dashboard > Activity' do
expect(page).not_to have_content('accepted')
expect(page).not_to have_content('closed')
expect(page).not_to have_content('commented on')
+ expect(page).not_to have_content('opened issue')
end
end
@@ -155,6 +167,7 @@ describe 'Dashboard > Activity' do
expect(page).not_to have_content('accepted')
expect(page).not_to have_content('closed')
expect(page).not_to have_content('commented on')
+ expect(page).not_to have_content('opened issue')
end
end
end
diff --git a/spec/features/group_variables_spec.rb b/spec/features/group_variables_spec.rb
index 57e3ddfb39c..1a53e7c9512 100644
--- a/spec/features/group_variables_spec.rb
+++ b/spec/features/group_variables_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe 'Group variables', :js do
let(:user) { create(:user) }
let(:group) { create(:group) }
- let!(:variable) { create(:ci_group_variable, key: 'test_key', value: 'test value', group: group) }
+ let!(:variable) { create(:ci_group_variable, key: 'test_key', value: 'test_value', group: group) }
let(:page_path) { group_settings_ci_cd_path(group) }
before do
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 8eb413bdd8d..986f3823275 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -278,7 +278,12 @@ describe 'GFM autocomplete', :js do
end
end
- context 'labels' do
+ # This context has just one example in each contexts in order to improve spec performance.
+ context 'labels', :quarantine do
+ let!(:backend) { create(:label, project: project, title: 'backend') }
+ let!(:bug) { create(:label, project: project, title: 'bug') }
+ let!(:feature_proposal) { create(:label, project: project, title: 'feature proposal') }
+
it 'opens autocomplete menu for Labels when field starts with text with item escaping HTML characters' do
create(:label, project: project, title: label_xss_title)
@@ -293,6 +298,83 @@ describe 'GFM autocomplete', :js do
expect(find('.atwho-view-ul').text).to have_content('alert label')
end
end
+
+ context 'when no labels are assigned' do
+ it 'shows labels' do
+ note = find('#note-body')
+
+ # It should show all the labels on "~".
+ type(note, '~')
+ wait_for_requests
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show all the labels on "/label ~".
+ type(note, '/label ~')
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show all the labels on "/relabel ~".
+ type(note, '/relabel ~')
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show no labels on "/unlabel ~".
+ type(note, '/unlabel ~')
+ expect_labels(not_shown: [backend, bug, feature_proposal])
+ end
+ end
+
+ context 'when some labels are assigned' do
+ before do
+ issue.labels << [backend]
+ end
+
+ it 'shows labels' do
+ note = find('#note-body')
+
+ # It should show all the labels on "~".
+ type(note, '~')
+ wait_for_requests
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show only unset labels on "/label ~".
+ type(note, '/label ~')
+ expect_labels(shown: [bug, feature_proposal], not_shown: [backend])
+
+ # It should show all the labels on "/relabel ~".
+ type(note, '/relabel ~')
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show only set labels on "/unlabel ~".
+ type(note, '/unlabel ~')
+ expect_labels(shown: [backend], not_shown: [bug, feature_proposal])
+ end
+ end
+
+ context 'when all labels are assigned' do
+ before do
+ issue.labels << [backend, bug, feature_proposal]
+ end
+
+ it 'shows labels' do
+ note = find('#note-body')
+
+ # It should show all the labels on "~".
+ type(note, '~')
+ wait_for_requests
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show no labels on "/label ~".
+ type(note, '/label ~')
+ expect_labels(not_shown: [backend, bug, feature_proposal])
+
+ # It should show all the labels on "/relabel ~".
+ type(note, '/relabel ~')
+ expect_labels(shown: [backend, bug, feature_proposal])
+
+ # It should show all the labels on "/unlabel ~".
+ type(note, '/unlabel ~')
+ expect_labels(shown: [backend, bug, feature_proposal])
+ end
+ end
end
shared_examples 'autocomplete suggestions' do
diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index e60486f6dcb..0f604db870f 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -93,4 +93,22 @@ describe "User creates issue" do
end
end
end
+
+ context "when signed in as user with special characters in their name" do
+ let(:user_special) { create(:user, name: "Jon O'Shea") }
+
+ before do
+ project.add_developer(user_special)
+ sign_in(user_special)
+
+ visit(new_project_issue_path(project))
+ end
+
+ it "will correctly escape user names with an apostrophe when clicking 'Assign to me'", :js do
+ first('.assign-to-me-link').click
+
+ expect(page).to have_content(user_special.name)
+ expect(page.find('input[name="issue[assignee_ids][]"]', visible: false)['data-meta']).to eq(user_special.name)
+ end
+ end
end
diff --git a/spec/features/issues/user_uses_quick_actions_spec.rb b/spec/features/issues/user_uses_quick_actions_spec.rb
index 27cffdc5f8b..b5e7c3954e2 100644
--- a/spec/features/issues/user_uses_quick_actions_spec.rb
+++ b/spec/features/issues/user_uses_quick_actions_spec.rb
@@ -243,7 +243,9 @@ describe 'Issues > User uses quick actions', :js do
it 'does not move the issue' do
add_note("/move not/valid")
- expect(page).not_to have_content 'Commands applied'
+ wait_for_requests
+
+ expect(page).to have_content 'Commands applied'
expect(issue.reload).to be_open
end
end
diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb
index 406e80e91aa..9bc340ed4bb 100644
--- a/spec/features/issues_spec.rb
+++ b/spec/features/issues_spec.rb
@@ -233,8 +233,8 @@ describe 'Issues' do
created_at: Time.now - (index * 60))
end
end
- let(:newer_due_milestone) { create(:milestone, due_date: '2013-12-11') }
- let(:later_due_milestone) { create(:milestone, due_date: '2013-12-12') }
+ let(:newer_due_milestone) { create(:milestone, project: project, due_date: '2013-12-11') }
+ let(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') }
it 'sorts by newest' do
visit project_issues_path(project, sort: sort_value_created_date)
diff --git a/spec/features/markdown/copy_as_gfm_spec.rb b/spec/features/markdown/copy_as_gfm_spec.rb
index 60ddb02da2c..c30ac9c4ae2 100644
--- a/spec/features/markdown/copy_as_gfm_spec.rb
+++ b/spec/features/markdown/copy_as_gfm_spec.rb
@@ -55,15 +55,10 @@ describe 'Copy as GFM', :js do
To see how GitLab looks please see the [features page on our website](https://about.gitlab.com/features/).
* Manage Git repositories with fine grained access controls that keep your code secure
-
* Perform code reviews and enhance collaboration with merge requests
-
* Complete continuous integration (CI) and CD pipelines to builds, test, and deploy your applications
-
* Each project can also have an issue tracker, issue board, and a wiki
-
* Used by more than 100,000 organizations, GitLab is the most popular solution to manage Git repositories on-premises
-
* Completely free and open source (MIT Expat license)
GFM
)
@@ -116,13 +111,11 @@ describe 'Copy as GFM', :js do
<<~GFM,
* [ ] Unchecked task
-
* [x] Checked task
GFM
<<~GFM
1. [ ] Unchecked ordered task
-
1. [x] Checked ordered task
GFM
)
@@ -551,7 +544,6 @@ describe 'Copy as GFM', :js do
<<~GFM,
* List item
-
* List item 2
GFM
@@ -565,7 +557,6 @@ describe 'Copy as GFM', :js do
# nested lists
<<~GFM,
* Nested
-
* Lists
GFM
@@ -578,7 +569,6 @@ describe 'Copy as GFM', :js do
<<~GFM,
1. Ordered list item
-
1. Ordered list item 2
GFM
@@ -592,7 +582,6 @@ describe 'Copy as GFM', :js do
# nested ordered list
<<~GFM,
1. Nested
-
1. Ordered lists
GFM
diff --git a/spec/features/merge_request/maintainer_edits_fork_spec.rb b/spec/features/merge_request/maintainer_edits_fork_spec.rb
index 7839b97122c..b35f985126c 100644
--- a/spec/features/merge_request/maintainer_edits_fork_spec.rb
+++ b/spec/features/merge_request/maintainer_edits_fork_spec.rb
@@ -18,13 +18,15 @@ describe 'a maintainer edits files on a source-branch of an MR from a fork', :js
end
before do
+ stub_feature_flags(web_ide_default: false)
+
target_project.add_maintainer(user)
sign_in(user)
visit project_merge_request_path(target_project, merge_request)
click_link 'Changes'
wait_for_requests
- first('.js-file-title').click_link 'Edit'
+ first('.js-file-title').find('.js-edit-blob').click
wait_for_requests
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 51b78d3e7d1..19edce1b562 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -178,7 +178,7 @@ describe 'Merge request > User posts diff notes', :js do
end
end
- describe 'with muliple note forms' do
+ describe 'with multiple note forms' do
before do
visit diffs_project_merge_request_path(project, merge_request, view: 'inline')
click_diff_line(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]'))
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index 1bbcf455ac7..dc0862be6fc 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -67,7 +67,7 @@ describe 'Merge request > User posts notes', :js do
end
end
- describe 'when reply_to_individual_notes feature flag is not set' do
+ describe 'when reply_to_individual_notes feature flag is disabled' do
before do
stub_feature_flags(reply_to_individual_notes: false)
visit project_merge_request_path(project, merge_request)
@@ -78,9 +78,8 @@ describe 'Merge request > User posts notes', :js do
end
end
- describe 'when reply_to_individual_notes feature flag is set' do
+ describe 'when reply_to_individual_notes feature flag is not set' do
before do
- stub_feature_flags(reply_to_individual_notes: true)
visit project_merge_request_path(project, merge_request)
end
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 7b473faa884..97b2aa82fce 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
@@ -49,7 +49,7 @@ describe 'Merge request > User sees merge request pipelines', :js do
let!(:merge_request_pipeline) do
Ci::CreatePipelineService.new(project, user, ref: 'feature')
- .execute(:merge_request, merge_request: merge_request)
+ .execute(:merge_request_event, merge_request: merge_request)
end
before do
@@ -81,7 +81,7 @@ describe 'Merge request > User sees merge request pipelines', :js do
let!(:merge_request_pipeline_2) do
Ci::CreatePipelineService.new(project, user, ref: 'feature')
- .execute(:merge_request, merge_request: merge_request)
+ .execute(:merge_request_event, merge_request: merge_request)
end
before do
@@ -220,7 +220,7 @@ describe 'Merge request > User sees merge request pipelines', :js do
let!(:merge_request_pipeline) do
Ci::CreatePipelineService.new(forked_project, user2, ref: 'feature')
- .execute(:merge_request, merge_request: merge_request)
+ .execute(:merge_request_event, merge_request: merge_request)
end
let(:forked_project) { fork_project(project, user2, repository: true) }
@@ -263,7 +263,7 @@ describe 'Merge request > User sees merge request pipelines', :js do
let!(:merge_request_pipeline_2) do
Ci::CreatePipelineService.new(forked_project, user2, ref: 'feature')
- .execute(:merge_request, merge_request: merge_request)
+ .execute(:merge_request_event, merge_request: merge_request)
end
before do
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index aa91ade46ca..5c45e363997 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -1,7 +1,11 @@
require 'rails_helper'
describe 'Merge request > User sees versions', :js do
- let(:merge_request) { create(:merge_request, importing: true) }
+ let(:merge_request) do
+ create(:merge_request).tap do |mr|
+ mr.merge_request_diff.destroy
+ end
+ end
let(:project) { merge_request.source_project }
let(:user) { project.creator }
let!(:merge_request_diff1) { merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') }
diff --git a/spec/features/merge_requests/user_lists_merge_requests_spec.rb b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
index ef7ae490b0f..c691011b9ca 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -13,7 +13,7 @@ describe 'Merge requests > User lists merge requests' do
source_project: project,
source_branch: 'fix',
assignee: user,
- milestone: create(:milestone, due_date: '2013-12-11'),
+ milestone: create(:milestone, project: project, due_date: '2013-12-11'),
created_at: 1.minute.ago,
updated_at: 1.minute.ago)
create(:merge_request,
@@ -21,7 +21,7 @@ describe 'Merge requests > User lists merge requests' do
source_project: project,
source_branch: 'markdown',
assignee: user,
- milestone: create(:milestone, due_date: '2013-12-12'),
+ milestone: create(:milestone, project: project, due_date: '2013-12-12'),
created_at: 2.minutes.ago,
updated_at: 2.minutes.ago)
create(:merge_request,
diff --git a/spec/features/profiles/active_sessions_spec.rb b/spec/features/profiles/active_sessions_spec.rb
index d3050760c06..2aa0177af5d 100644
--- a/spec/features/profiles/active_sessions_spec.rb
+++ b/spec/features/profiles/active_sessions_spec.rb
@@ -7,6 +7,8 @@ describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state do
end
end
+ let(:admin) { create(:admin) }
+
around do |example|
Timecop.freeze(Time.zone.parse('2018-03-12 09:06')) do
example.run
@@ -16,6 +18,7 @@ describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state do
it 'User sees their active sessions' do
Capybara::Session.new(:session1)
Capybara::Session.new(:session2)
+ Capybara::Session.new(:session3)
# note: headers can only be set on the non-js (aka. rack-test) driver
using_session :session1 do
@@ -37,9 +40,27 @@ describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state do
gitlab_sign_in(user)
end
+ # set an admin session impersonating the user
+ using_session :session3 do
+ Capybara.page.driver.header(
+ 'User-Agent',
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
+ )
+
+ gitlab_sign_in(admin)
+
+ visit admin_user_path(user)
+
+ click_link 'Impersonate'
+ end
+
using_session :session1 do
visit profile_active_sessions_path
+ expect(page).to(
+ have_selector('ul.list-group li.list-group-item', { text: 'Signed in on',
+ count: 2 }))
+
expect(page).to have_content(
'127.0.0.1 ' \
'This is your current session ' \
@@ -57,33 +78,8 @@ describe 'Profile > Active Sessions', :clean_gitlab_redis_shared_state do
)
expect(page).to have_selector '[title="Smartphone"]', count: 1
- end
- end
-
- it 'User can revoke a session', :js, :redis_session_store do
- Capybara::Session.new(:session1)
- Capybara::Session.new(:session2)
-
- # set an additional session in another browser
- using_session :session2 do
- gitlab_sign_in(user)
- end
-
- using_session :session1 do
- gitlab_sign_in(user)
- visit profile_active_sessions_path
-
- expect(page).to have_link('Revoke', count: 1)
-
- accept_confirm { click_on 'Revoke' }
-
- expect(page).not_to have_link('Revoke')
- end
-
- using_session :session2 do
- visit profile_active_sessions_path
- expect(page).to have_content('You need to sign in or sign up before continuing.')
+ expect(page).not_to have_content('Chrome on Windows')
end
end
end
diff --git a/spec/features/project_variables_spec.rb b/spec/features/project_variables_spec.rb
index a93df3696d2..6bdf5df1036 100644
--- a/spec/features/project_variables_spec.rb
+++ b/spec/features/project_variables_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe 'Project variables', :js do
let(:user) { create(:user) }
let(:project) { create(:project) }
- let(:variable) { create(:ci_variable, key: 'test_key', value: 'test value') }
+ let(:variable) { create(:ci_variable, key: 'test_key', value: 'test_value') }
let(:page_path) { project_settings_ci_cd_path(project) }
before do
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 3edcc7ac2cd..a7aa63018fd 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -548,10 +548,7 @@ describe 'File blob', :js do
it 'displays an auxiliary viewer' do
aggregate_failures do
# shows names of dependency manager and package
- expect(page).to have_content('This project manages its dependencies using RubyGems and defines a gem named activerecord.')
-
- # shows a link to the gem
- expect(page).to have_link('activerecord', href: 'https://rubygems.org/gems/activerecord')
+ expect(page).to have_content('This project manages its dependencies using RubyGems.')
# shows a learn more link
expect(page).to have_link('Learn more', href: 'https://rubygems.org/')
diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb
index 828f6f9921e..57d21f3e182 100644
--- a/spec/features/projects/blobs/edit_spec.rb
+++ b/spec/features/projects/blobs/edit_spec.rb
@@ -49,6 +49,15 @@ describe 'Editing file blob', :js do
end
end
+ it 'updates the content of file with a number as file path' do
+ project.repository.create_file(user, '1', 'test', message: 'testing', branch_name: branch)
+ visit project_blob_path(project, tree_join(branch, '1'))
+
+ edit_and_commit
+
+ expect(page).to have_content 'NextFeature'
+ end
+
context 'from blob file path' do
before do
visit project_blob_path(project, tree_join(branch, file_path))
diff --git a/spec/features/projects/clusters/applications_spec.rb b/spec/features/projects/clusters/applications_spec.rb
index 2c8d014c36d..713e25cdcb2 100644
--- a/spec/features/projects/clusters/applications_spec.rb
+++ b/spec/features/projects/clusters/applications_spec.rb
@@ -17,7 +17,7 @@ describe 'Clusters Applications', :js do
end
context 'when cluster is being created' do
- let(:cluster) { create(:cluster, :providing_by_gcp, projects: [project])}
+ let(:cluster) { create(:cluster, :providing_by_gcp, projects: [project]) }
it 'user is unable to install applications' do
page.within('.js-cluster-application-row-helm') do
@@ -28,9 +28,11 @@ describe 'Clusters Applications', :js do
end
context 'when cluster is created' do
- let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project])}
+ let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
it 'user can install applications' do
+ wait_for_requests
+
page.within('.js-cluster-application-row-helm') do
expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to be_nil
expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Install')
@@ -44,6 +46,8 @@ describe 'Clusters Applications', :js do
page.within('.js-cluster-application-row-helm') do
page.find(:css, '.js-cluster-application-install-button').click
end
+
+ wait_for_requests
end
it 'they see status transition' do
@@ -52,8 +56,6 @@ describe 'Clusters Applications', :js do
expect(page.find(:css, '.js-cluster-application-install-button')['disabled']).to eq('true')
expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing')
- wait_until_helm_created!
-
Clusters::Cluster.last.application_helm.make_installing!
# FE starts polling and update the buttons to "Installing"
@@ -76,7 +78,7 @@ describe 'Clusters Applications', :js do
end
context 'on an abac cluster' do
- let(:cluster) { create(:cluster, :provided_by_gcp, :rbac_disabled, projects: [project])}
+ let(:cluster) { create(:cluster, :provided_by_gcp, :rbac_disabled, projects: [project]) }
it 'should show info block and not be installable' do
page.within('.js-cluster-application-row-knative') do
@@ -87,7 +89,7 @@ describe 'Clusters Applications', :js do
end
context 'on an rbac cluster' do
- let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project])}
+ let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
it 'should not show callout block and be installable' do
page.within('.js-cluster-application-row-knative') do
@@ -95,6 +97,60 @@ describe 'Clusters Applications', :js do
expect(page).to have_css('.js-cluster-application-install-button:not([disabled])')
end
end
+
+ describe 'when user clicks install button' do
+ def domainname_form_value
+ page.find('.js-knative-domainname').value
+ end
+
+ before do
+ allow(ClusterInstallAppWorker).to receive(:perform_async)
+ allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_in)
+ allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_async)
+
+ page.within('.js-cluster-application-row-knative') do
+ expect(page).to have_css('.js-cluster-application-install-button:not([disabled])')
+
+ page.find('.js-knative-domainname').set("domain.example.org")
+
+ click_button 'Install'
+
+ wait_for_requests
+
+ expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installing')
+
+ Clusters::Cluster.last.application_knative.make_installing!
+ Clusters::Cluster.last.application_knative.make_installed!
+ Clusters::Cluster.last.application_knative.update_attribute(:external_ip, '127.0.0.1')
+ end
+ end
+
+ it 'shows status transition' do
+ page.within('.js-cluster-application-row-knative') do
+ expect(domainname_form_value).to eq('domain.example.org')
+ expect(page).to have_css('.js-cluster-application-install-button', exact_text: 'Installed')
+ end
+
+ expect(page).to have_content('Knative was successfully installed on your Kubernetes cluster')
+ expect(page).to have_css('.js-knative-save-domain-button'), exact_text: 'Save changes'
+ end
+
+ it 'can then update the domain' do
+ page.within('.js-cluster-application-row-knative') do
+ expect(ClusterPatchAppWorker).to receive(:perform_async)
+
+ expect(domainname_form_value).to eq('domain.example.org')
+
+ page.find('.js-knative-domainname').set("new.domain.example.org")
+
+ click_button 'Save changes'
+
+ wait_for_requests
+
+ expect(domainname_form_value).to eq('new.domain.example.org')
+ end
+ end
+ end
end
end
@@ -148,6 +204,8 @@ describe 'Clusters Applications', :js do
page.within('.js-cluster-application-row-ingress') do
expect(page).to have_css('.js-cluster-application-install-button:not([disabled])')
page.find(:css, '.js-cluster-application-install-button').click
+
+ wait_for_requests
end
end
@@ -184,14 +242,4 @@ describe 'Clusters Applications', :js do
end
end
end
-
- def wait_until_helm_created!
- retries = 0
-
- while Clusters::Cluster.last.application_helm.nil?
- raise "Timed out waiting for helm application to be created in DB" if (retries += 1) > 3
-
- sleep(1)
- end
- end
end
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index a8a3b6910fb..3090f1a2131 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -120,7 +120,7 @@ describe 'Environment' do
end
it 'does show a play button' do
- expect(page).to have_link(action.name.humanize)
+ expect(page).to have_link(action.name)
end
it 'does allow to play manual action', :js do
@@ -128,7 +128,7 @@ describe 'Environment' do
find('button.dropdown').click
- expect { click_link(action.name.humanize) }
+ expect { click_link(action.name) }
.not_to change { Ci::Pipeline.count }
wait_for_all_requests
@@ -140,7 +140,7 @@ describe 'Environment' do
context 'when user has no ability to trigger a deployment' do
it 'does not show a play button' do
- expect(page).not_to have_link(action.name.humanize)
+ expect(page).not_to have_link(action.name)
end
end
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 66c6545204b..b2a435e554d 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -183,14 +183,14 @@ describe 'Environments page', :js do
it 'shows a play button' do
find('.js-environment-actions-dropdown').click
- expect(page).to have_content(action.name.humanize)
+ expect(page).to have_content(action.name)
end
it 'allows to play a manual action', :js do
expect(action).to be_manual
find('.js-environment-actions-dropdown').click
- expect(page).to have_content(action.name.humanize)
+ expect(page).to have_content(action.name)
expect { find('.js-manual-action-link').click }
.not_to change { Ci::Pipeline.count }
@@ -311,7 +311,7 @@ describe 'Environments page', :js do
it "has link to the delayed job's action" do
find('.js-environment-actions-dropdown').click
- expect(page).to have_button('Delayed job')
+ expect(page).to have_button('delayed job')
expect(page).to have_content(/\d{2}:\d{2}:\d{2}/)
end
@@ -333,7 +333,7 @@ describe 'Environments page', :js do
context 'when user played a delayed job immediately' do
before do
find('.js-environment-actions-dropdown').click
- page.accept_confirm { click_button('Delayed job') }
+ page.accept_confirm { click_button('delayed job') }
wait_for_requests
end
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index fceead0b45e..b2d2dba55f1 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -27,6 +27,7 @@ describe 'Project > Members > Invite group', :js do
before do
project.add_maintainer(maintainer)
+ group_to_share_with.add_guest(maintainer)
sign_in(maintainer)
end
@@ -112,6 +113,7 @@ describe 'Project > Members > Invite group', :js do
before do
project.add_maintainer(maintainer)
+ group.add_guest(maintainer)
sign_in(maintainer)
visit project_settings_members_path(project)
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 72ef460d315..36b8c15b8b6 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -666,7 +666,7 @@ describe 'Pipeline', :js do
let(:pipeline) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: merge_request.source_project,
ref: 'feature',
sha: merge_request.diff_head_sha,
diff --git a/spec/features/projects/settings/operations_settings_spec.rb b/spec/features/projects/settings/operations_settings_spec.rb
index 06290c67c70..af56cb0d4ee 100644
--- a/spec/features/projects/settings/operations_settings_spec.rb
+++ b/spec/features/projects/settings/operations_settings_spec.rb
@@ -20,4 +20,81 @@ describe 'Projects > Settings > For a forked project', :js do
expect(page).to have_selector('a[title="Operations"]', visible: false)
end
end
+
+ describe 'Settings > Operations' do
+ context 'error tracking settings form' do
+ let(:sentry_list_projects_url) { 'http://sentry.example.com/api/0/projects/' }
+
+ context 'success path' do
+ let(:projects_sample_response) do
+ Gitlab::Utils.deep_indifferent_access(
+ JSON.parse(fixture_file('sentry/list_projects_sample_response.json'))
+ )
+ end
+
+ before do
+ WebMock.stub_request(:get, sentry_list_projects_url)
+ .to_return(
+ status: 200,
+ headers: { 'Content-Type' => 'application/json' },
+ body: projects_sample_response.to_json
+ )
+ end
+
+ it 'successfully fills and submits the form' do
+ visit project_settings_operations_path(project)
+
+ wait_for_requests
+
+ expect(page).to have_content('Sentry API URL')
+ expect(page.body).to include('Error Tracking')
+ expect(page).to have_button('Connect')
+
+ check('Active')
+ fill_in('error-tracking-api-host', with: 'http://sentry.example.com')
+ fill_in('error-tracking-token', with: 'token')
+
+ click_button('Connect')
+
+ within('div#project-dropdown') do
+ click_button('Select project')
+ click_button('Sentry | Internal')
+ end
+
+ click_button('Save changes')
+
+ wait_for_requests
+
+ assert_text('Your changes have been saved')
+ end
+ end
+
+ context 'project dropdown fails to load' do
+ before do
+ WebMock.stub_request(:get, sentry_list_projects_url)
+ .to_return(
+ status: 400,
+ headers: { 'Content-Type' => 'application/json' },
+ body: {
+ message: 'Sentry response code: 401'
+ }.to_json
+ )
+ end
+
+ it 'displays error message' do
+ visit project_settings_operations_path(project)
+
+ wait_for_requests
+
+ check('Active')
+ fill_in('error-tracking-api-host', with: 'http://sentry.example.com')
+ fill_in('error-tracking-token', with: 'token')
+
+ click_button('Connect')
+
+ assert_text('Connection has failed. Re-check Auth Token and try again.')
+ end
+ end
+ end
+ end
end
diff --git a/spec/features/projects/settings/project_settings_spec.rb b/spec/features/projects/settings/project_settings_spec.rb
new file mode 100644
index 00000000000..7afddc0e712
--- /dev/null
+++ b/spec/features/projects/settings/project_settings_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Projects settings' do
+ set(:project) { create(:project) }
+ let(:user) { project.owner }
+ let(:panel) { find('.general-settings', match: :first) }
+ let(:button) { panel.find('.btn.js-settings-toggle') }
+ let(:title) { panel.find('.settings-title') }
+
+ before do
+ sign_in(user)
+ visit edit_project_path(project)
+ end
+
+ it 'can toggle sections by clicking the title or button', :js do
+ expect_toggle_state(:expanded)
+
+ button.click
+
+ expect_toggle_state(:collapsed)
+
+ button.click
+
+ expect_toggle_state(:expanded)
+
+ title.click
+
+ expect_toggle_state(:collapsed)
+
+ title.click
+
+ expect_toggle_state(:expanded)
+ end
+
+ def expect_toggle_state(state)
+ is_collapsed = state == :collapsed
+
+ expect(button).to have_content(is_collapsed ? 'Expand' : 'Collapse')
+ expect(panel[:class]).send(is_collapsed ? 'not_to' : 'to', include('expanded'))
+ end
+end
diff --git a/spec/features/projects/settings/user_manages_group_links_spec.rb b/spec/features/projects/settings/user_manages_group_links_spec.rb
index 676659b90c3..e5a58c44e41 100644
--- a/spec/features/projects/settings/user_manages_group_links_spec.rb
+++ b/spec/features/projects/settings/user_manages_group_links_spec.rb
@@ -10,6 +10,7 @@ describe 'Projects > Settings > User manages group links' do
before do
project.add_maintainer(user)
+ group_market.add_guest(user)
sign_in(user)
share_link = project.project_group_links.new(group_access: Gitlab::Access::MAINTAINER)
diff --git a/spec/features/projects/user_sees_sidebar_spec.rb b/spec/features/projects/user_sees_sidebar_spec.rb
index ee5734a9bf1..383e8824b7b 100644
--- a/spec/features/projects/user_sees_sidebar_spec.rb
+++ b/spec/features/projects/user_sees_sidebar_spec.rb
@@ -4,6 +4,108 @@ describe 'Projects > User sees sidebar' do
let(:user) { create(:user) }
let(:project) { create(:project, :private, public_builds: false, namespace: user.namespace) }
+ # NOTE: See documented behaviour https://design.gitlab.com/regions/navigation#contextual-navigation
+ context 'on different viewports', :js do
+ include MobileHelpers
+
+ before do
+ sign_in(user)
+ end
+
+ shared_examples 'has a expanded nav sidebar' do
+ it 'has a expanded desktop nav-sidebar on load' do
+ expect(page).to have_content('Collapse sidebar')
+ expect(page).not_to have_selector('.sidebar-collapsed-desktop')
+ expect(page).not_to have_selector('.sidebar-expanded-mobile')
+ end
+
+ it 'can collapse the nav-sidebar' do
+ page.find('.nav-sidebar .js-toggle-sidebar').click
+ expect(page).to have_selector('.sidebar-collapsed-desktop')
+ expect(page).not_to have_content('Collapse sidebar')
+ expect(page).not_to have_selector('.sidebar-expanded-mobile')
+ end
+ end
+
+ shared_examples 'has a collapsed nav sidebar' do
+ it 'has a collapsed desktop nav-sidebar on load' do
+ expect(page).not_to have_content('Collapse sidebar')
+ expect(page).not_to have_selector('.sidebar-expanded-mobile')
+ end
+
+ it 'can expand the nav-sidebar' do
+ page.find('.nav-sidebar .js-toggle-sidebar').click
+ expect(page).to have_selector('.sidebar-expanded-mobile')
+ expect(page).to have_content('Collapse sidebar')
+ end
+ end
+
+ shared_examples 'has a mobile nav-sidebar' do
+ it 'has a hidden nav-sidebar on load' do
+ expect(page).not_to have_content('.mobile-nav-open')
+ expect(page).not_to have_selector('.sidebar-expanded-mobile')
+ end
+
+ it 'can expand the nav-sidebar' do
+ page.find('.toggle-mobile-nav').click
+ expect(page).to have_selector('.mobile-nav-open')
+ expect(page).to have_selector('.sidebar-expanded-mobile')
+ end
+ end
+
+ context 'with a extra small viewport' do
+ before do
+ resize_screen_xs
+ visit project_path(project)
+ expect(page).to have_selector('.nav-sidebar')
+ expect(page).to have_selector('.toggle-mobile-nav')
+ end
+
+ it_behaves_like 'has a mobile nav-sidebar'
+ end
+
+ context 'with a small size viewport' do
+ before do
+ resize_screen_sm
+ visit project_path(project)
+ expect(page).to have_selector('.nav-sidebar')
+ expect(page).to have_selector('.toggle-mobile-nav')
+ end
+
+ it_behaves_like 'has a mobile nav-sidebar'
+ end
+
+ context 'with medium size viewport' do
+ before do
+ resize_window(768, 800)
+ visit project_path(project)
+ expect(page).to have_selector('.nav-sidebar')
+ end
+
+ it_behaves_like 'has a collapsed nav sidebar'
+ end
+
+ context 'with viewport size 1199px' do
+ before do
+ resize_window(1199, 800)
+ visit project_path(project)
+ expect(page).to have_selector('.nav-sidebar')
+ end
+
+ it_behaves_like 'has a collapsed nav sidebar'
+ end
+
+ context 'with a extra large viewport' do
+ before do
+ resize_window(1200, 800)
+ visit project_path(project)
+ expect(page).to have_selector('.nav-sidebar')
+ end
+
+ it_behaves_like 'has a expanded nav sidebar'
+ end
+ end
+
context 'as owner' do
before do
sign_in(user)
diff --git a/spec/features/security/group/private_access_spec.rb b/spec/features/security/group/private_access_spec.rb
index 4705cd12d23..3238e07fe15 100644
--- a/spec/features/security/group/private_access_spec.rb
+++ b/spec/features/security/group/private_access_spec.rb
@@ -27,7 +27,7 @@ describe 'Private Group access' do
it { is_expected.to be_allowed_for(:developer).of(group) }
it { is_expected.to be_allowed_for(:reporter).of(group) }
it { is_expected.to be_allowed_for(:guest).of(group) }
- it { is_expected.to be_allowed_for(project_guest) }
+ it { is_expected.to be_denied_for(project_guest) }
it { is_expected.to be_denied_for(:user) }
it { is_expected.to be_denied_for(:external) }
it { is_expected.to be_denied_for(:visitor) }
@@ -42,7 +42,7 @@ describe 'Private Group access' do
it { is_expected.to be_allowed_for(:developer).of(group) }
it { is_expected.to be_allowed_for(:reporter).of(group) }
it { is_expected.to be_allowed_for(:guest).of(group) }
- it { is_expected.to be_allowed_for(project_guest) }
+ it { is_expected.to be_denied_for(project_guest) }
it { is_expected.to be_denied_for(:user) }
it { is_expected.to be_denied_for(:external) }
it { is_expected.to be_denied_for(:visitor) }
@@ -58,7 +58,7 @@ describe 'Private Group access' do
it { is_expected.to be_allowed_for(:developer).of(group) }
it { is_expected.to be_allowed_for(:reporter).of(group) }
it { is_expected.to be_allowed_for(:guest).of(group) }
- it { is_expected.to be_allowed_for(project_guest) }
+ it { is_expected.to be_denied_for(project_guest) }
it { is_expected.to be_denied_for(:user) }
it { is_expected.to be_denied_for(:external) }
it { is_expected.to be_denied_for(:visitor) }
@@ -73,7 +73,7 @@ describe 'Private Group access' do
it { is_expected.to be_allowed_for(:developer).of(group) }
it { is_expected.to be_allowed_for(:reporter).of(group) }
it { is_expected.to be_allowed_for(:guest).of(group) }
- it { is_expected.to be_allowed_for(project_guest) }
+ it { is_expected.to be_denied_for(project_guest) }
it { is_expected.to be_denied_for(:user) }
it { is_expected.to be_denied_for(:external) }
it { is_expected.to be_denied_for(:visitor) }
@@ -93,4 +93,28 @@ describe 'Private Group access' do
it { is_expected.to be_denied_for(:visitor) }
it { is_expected.to be_denied_for(:external) }
end
+
+ describe 'GET /groups/:path for shared projects' do
+ let(:project) { create(:project, :public) }
+ before do
+ Projects::GroupLinks::CreateService.new(
+ project,
+ create(:user),
+ link_group_access: ProjectGroupLink::DEVELOPER
+ ).execute(group)
+ end
+
+ subject { group_path(group) }
+
+ it { is_expected.to be_allowed_for(:admin) }
+ 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) }
+ it { is_expected.to be_allowed_for(:reporter).of(group) }
+ it { is_expected.to be_allowed_for(:guest).of(group) }
+ it { is_expected.to be_denied_for(project_guest) }
+ it { is_expected.to be_denied_for(:user) }
+ it { is_expected.to be_denied_for(:external) }
+ it { is_expected.to be_denied_for(:visitor) }
+ end
end
diff --git a/spec/finders/admin/runners_finder_spec.rb b/spec/finders/admin/runners_finder_spec.rb
index 0b2325cc7ca..94ccb398801 100644
--- a/spec/finders/admin/runners_finder_spec.rb
+++ b/spec/finders/admin/runners_finder_spec.rb
@@ -37,6 +37,14 @@ describe Admin::RunnersFinder do
end
end
+ context 'filter by tag_name' do
+ it 'calls the corresponding scope on Ci::Runner' do
+ expect(Ci::Runner).to receive(:tagged_with).with(%w[tag1 tag2]).and_call_original
+
+ described_class.new(params: { tag_name: %w[tag1 tag2] }).execute
+ end
+ end
+
context 'sort' do
context 'without sort param' do
it 'sorts by created_at' do
diff --git a/spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb b/spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb
new file mode 100644
index 00000000000..79d2f9cdb45
--- /dev/null
+++ b/spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Autocomplete::ActsAsTaggableOn::TagsFinder do
+ describe '#execute' do
+ context 'with empty params' do
+ it 'returns all tags' do
+ tag1 = ActsAsTaggableOn::Tag.create!(name: 'tag1')
+ tag2 = ActsAsTaggableOn::Tag.create!(name: 'tag2')
+
+ tags = described_class.new(params: {}).execute
+
+ expect(tags).to match_array [tag1, tag2]
+ end
+ end
+
+ context 'filter by search' do
+ context 'with an empty search term' do
+ it 'returns an empty collection' do
+ ActsAsTaggableOn::Tag.create!(name: 'tag1')
+ ActsAsTaggableOn::Tag.create!(name: 'tag2')
+
+ tags = described_class.new(params: { search: '' }).execute
+
+ expect(tags).to be_empty
+ end
+ end
+
+ context 'with a search containing 2 characters' do
+ it 'returns the tag that strictly matches the search term' do
+ tag1 = ActsAsTaggableOn::Tag.create!(name: 't1')
+ ActsAsTaggableOn::Tag.create!(name: 't11')
+
+ tags = described_class.new(params: { search: 't1' }).execute
+
+ expect(tags).to match_array [tag1]
+ end
+ end
+
+ context 'with a search containing 3 characters' do
+ it 'returns the tag that partially matches the search term' do
+ tag1 = ActsAsTaggableOn::Tag.create!(name: 'tag1')
+ tag2 = ActsAsTaggableOn::Tag.create!(name: 'tag11')
+
+ tags = described_class.new(params: { search: 'ag1' }).execute
+
+ expect(tags).to match_array [tag1, tag2]
+ end
+ end
+ end
+
+ context 'limit' do
+ it 'limits the result set by the limit constant' do
+ stub_const("#{described_class}::LIMIT", 1)
+
+ ActsAsTaggableOn::Tag.create!(name: 'tag1')
+ ActsAsTaggableOn::Tag.create!(name: 'tag2')
+
+ tags = described_class.new(params: { search: 'tag' }).execute
+
+ expect(tags.count).to eq 1
+ end
+ end
+ end
+end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index 47e2548c3d6..55efab7dec3 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -715,7 +715,7 @@ describe IssuesFinder do
before do
allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
- stub_feature_flags(use_subquery_for_group_issues_search: true)
+ stub_feature_flags(attempt_group_search_optimizations: true)
end
context 'when there is no search param' do
@@ -746,11 +746,11 @@ describe IssuesFinder do
end
end
- context 'when the use_subquery_for_group_issues_search flag is disabled' do
+ context 'when the attempt_group_search_optimizations flag is disabled' do
let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
before do
- stub_feature_flags(use_subquery_for_group_issues_search: false)
+ stub_feature_flags(attempt_group_search_optimizations: false)
end
it 'returns false' do
@@ -758,6 +758,14 @@ describe IssuesFinder do
end
end
+ context 'when force_cte? is true' do
+ let(:params) { { search: 'foo', attempt_group_search_optimizations: true, force_cte: true } }
+
+ it 'returns false' do
+ expect(finder.use_subquery_for_search?).to be_falsey
+ end
+ end
+
context 'when all conditions are met' do
let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
@@ -767,72 +775,59 @@ describe IssuesFinder do
end
end
- describe '#use_cte_for_search?' do
+ describe '#use_cte_for_count?' do
let(:finder) { described_class.new(nil, params) }
before do
allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
- stub_feature_flags(use_cte_for_group_issues_search: true)
- stub_feature_flags(use_subquery_for_group_issues_search: false)
+ stub_feature_flags(attempt_group_search_optimizations: true)
end
context 'when there is no search param' do
- let(:params) { { attempt_group_search_optimizations: true } }
+ let(:params) { { attempt_group_search_optimizations: true, force_cte: true } }
it 'returns false' do
- expect(finder.use_cte_for_search?).to be_falsey
+ expect(finder.use_cte_for_count?).to be_falsey
end
end
context 'when the database is not Postgres' do
- let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
+ let(:params) { { search: 'foo', force_cte: true, attempt_group_search_optimizations: true } }
before do
allow(Gitlab::Database).to receive(:postgresql?).and_return(false)
end
it 'returns false' do
- expect(finder.use_cte_for_search?).to be_falsey
+ expect(finder.use_cte_for_count?).to be_falsey
end
end
- context 'when the attempt_group_search_optimizations param is falsey' do
+ context 'when the force_cte param is falsey' do
let(:params) { { search: 'foo' } }
it 'returns false' do
- expect(finder.use_cte_for_search?).to be_falsey
- end
- end
-
- context 'when the use_cte_for_group_issues_search flag is disabled' do
- let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
-
- before do
- stub_feature_flags(use_cte_for_group_issues_search: false)
- end
-
- it 'returns false' do
- expect(finder.use_cte_for_search?).to be_falsey
+ expect(finder.use_cte_for_count?).to be_falsey
end
end
- context 'when use_subquery_for_search? is true' do
- let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
+ context 'when the attempt_group_search_optimizations flag is disabled' do
+ let(:params) { { search: 'foo', force_cte: true, attempt_group_search_optimizations: true } }
before do
- stub_feature_flags(use_subquery_for_group_issues_search: true)
+ stub_feature_flags(attempt_group_search_optimizations: false)
end
it 'returns false' do
- expect(finder.use_cte_for_search?).to be_falsey
+ expect(finder.use_cte_for_count?).to be_falsey
end
end
context 'when all conditions are met' do
- let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
+ let(:params) { { search: 'foo', force_cte: true, attempt_group_search_optimizations: true } }
it 'returns true' do
- expect(finder.use_cte_for_search?).to be_truthy
+ expect(finder.use_cte_for_count?).to be_truthy
end
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 107da08a0a9..503b88fcbad 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -13,275 +13,409 @@ describe MergeRequestsFinder do
end
end
- let(:user) { create :user }
- let(:user2) { create :user }
-
- let(:group) { create(:group) }
- let(:subgroup) { create(:group, parent: group) }
- let(:project1) { create_project_without_n_plus_1(group: group) }
- let(:project2) do
- Gitlab::GitalyClient.allow_n_plus_1_calls do
- fork_project(project1, user)
+ context "multiple projects with merge requests" do
+ let(:user) { create :user }
+ let(:user2) { create :user }
+
+ let(:group) { create(:group) }
+ let(:subgroup) { create(:group, parent: group) }
+ let(:project1) { create_project_without_n_plus_1(group: group) }
+ let(:project2) do
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ fork_project(project1, user)
+ end
end
- end
- let(:project3) do
- Gitlab::GitalyClient.allow_n_plus_1_calls do
- p = fork_project(project1, user)
- p.update!(archived: true)
- p
+ let(:project3) do
+ Gitlab::GitalyClient.allow_n_plus_1_calls do
+ p = fork_project(project1, user)
+ p.update!(archived: true)
+ p
+ end
end
- end
- let(:project4) { create_project_without_n_plus_1(group: subgroup) }
- let(:project5) { create_project_without_n_plus_1(group: subgroup) }
- let(:project6) { create_project_without_n_plus_1(group: subgroup) }
-
- let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) }
- let!(:merge_request2) { create(:merge_request, :conflict, author: user, source_project: project2, target_project: project1, state: 'closed') }
- let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, state: 'locked', title: 'thing WIP thing') }
- let!(:merge_request4) { create(:merge_request, :simple, author: user, source_project: project3, target_project: project3, title: 'WIP thing') }
- let!(:merge_request5) { create(:merge_request, :simple, author: user, source_project: project4, target_project: project4, title: '[WIP]') }
- let!(:merge_request6) { create(:merge_request, :simple, author: user, source_project: project5, target_project: project5, title: 'WIP: thing') }
- let!(:merge_request7) { create(:merge_request, :simple, author: user, source_project: project6, target_project: project6, title: 'wip thing') }
- let!(:merge_request8) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project1, title: '[wip] thing') }
- let!(:merge_request9) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project2, title: 'wip: thing') }
-
- before do
- project1.add_maintainer(user)
- project2.add_developer(user)
- project3.add_developer(user)
- project2.add_developer(user2)
- project4.add_developer(user)
- project5.add_developer(user)
- project6.add_developer(user)
- end
-
- describe "#execute" do
- it 'filters by scope' do
- params = { scope: 'authored', state: 'opened' }
- merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(7)
+ let(:project4) { create_project_without_n_plus_1(:repository, group: subgroup) }
+ let(:project5) { create_project_without_n_plus_1(group: subgroup) }
+ let(:project6) { create_project_without_n_plus_1(group: subgroup) }
+
+ let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) }
+ let!(:merge_request2) { create(:merge_request, :conflict, author: user, source_project: project2, target_project: project1, state: 'closed') }
+ let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2, state: 'locked', title: 'thing WIP thing') }
+ let!(:merge_request4) { create(:merge_request, :simple, author: user, source_project: project3, target_project: project3, title: 'WIP thing') }
+ let!(:merge_request5) { create(:merge_request, :simple, author: user, source_project: project4, target_project: project4, title: '[WIP]') }
+ let!(:merge_request6) { create(:merge_request, :simple, author: user, source_project: project5, target_project: project5, title: 'WIP: thing') }
+ let!(:merge_request7) { create(:merge_request, :simple, author: user, source_project: project6, target_project: project6, title: 'wip thing') }
+ let!(:merge_request8) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project1, title: '[wip] thing') }
+ let!(:merge_request9) { create(:merge_request, :simple, author: user, source_project: project1, target_project: project2, title: 'wip: thing') }
+
+ before do
+ project1.add_maintainer(user)
+ project2.add_developer(user)
+ project3.add_developer(user)
+ project2.add_developer(user2)
+ project4.add_developer(user)
+ project5.add_developer(user)
+ project6.add_developer(user)
end
- it 'filters by project' do
- params = { project_id: project1.id, scope: 'authored', state: 'opened' }
- merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(2)
- end
+ describe '#execute' do
+ it 'filters by scope' do
+ params = { scope: 'authored', state: 'opened' }
+ merge_requests = described_class.new(user, params).execute
+ expect(merge_requests.size).to eq(7)
+ end
+
+ it 'filters by project' do
+ params = { project_id: project1.id, scope: 'authored', state: 'opened' }
+ merge_requests = described_class.new(user, params).execute
+ expect(merge_requests.size).to eq(2)
+ end
+
+ it 'filters by commit sha' do
+ merge_requests = described_class.new(
+ user,
+ commit_sha: merge_request5.merge_request_diff.last_commit_sha
+ ).execute
+
+ expect(merge_requests).to contain_exactly(merge_request5)
+ end
+
+ context 'filtering by group' do
+ it 'includes all merge requests when user has access' do
+ params = { group_id: group.id }
+
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests.size).to eq(3)
+ end
- context 'filtering by group' do
- it 'includes all merge requests when user has access' do
- params = { group_id: group.id }
+ it 'excludes merge requests from projects the user does not have access to' do
+ private_project = create_project_without_n_plus_1(:private, group: group)
+ private_mr = create(:merge_request, :simple, author: user, source_project: private_project, target_project: private_project)
+ params = { group_id: group.id }
+ private_project.add_guest(user)
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests.size).to eq(3)
+ expect(merge_requests).not_to include(private_mr)
+ end
+
+ it 'filters by group including subgroups', :nested_groups do
+ params = { group_id: group.id, include_subgroups: true }
+
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests.size).to eq(6)
+ end
+ end
+
+ it 'filters by non_archived' do
+ params = { non_archived: true }
merge_requests = described_class.new(user, params).execute
+ expect(merge_requests.size).to eq(8)
+ end
+
+ it 'filters by iid' do
+ params = { project_id: project1.id, iids: merge_request1.iid }
- expect(merge_requests.size).to eq(3)
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request1)
end
- it 'excludes merge requests from projects the user does not have access to' do
- private_project = create_project_without_n_plus_1(:private, group: group)
- private_mr = create(:merge_request, :simple, author: user, source_project: private_project, target_project: private_project)
- params = { group_id: group.id }
+ it 'filters by source branch' do
+ params = { source_branch: merge_request2.source_branch }
- private_project.add_guest(user)
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(3)
- expect(merge_requests).not_to include(private_mr)
+ expect(merge_requests).to contain_exactly(merge_request2)
end
- it 'filters by group including subgroups', :nested_groups do
- params = { group_id: group.id, include_subgroups: true }
+ it 'filters by target branch' do
+ params = { target_branch: merge_request2.target_branch }
merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(6)
+ expect(merge_requests).to contain_exactly(merge_request2)
end
- end
- it 'filters by non_archived' do
- params = { non_archived: true }
- merge_requests = described_class.new(user, params).execute
- expect(merge_requests.size).to eq(8)
- end
+ it 'filters by state' do
+ params = { state: 'locked' }
- it 'filters by iid' do
- params = { project_id: project1.id, iids: merge_request1.iid }
+ merge_requests = described_class.new(user, params).execute
- merge_requests = described_class.new(user, params).execute
+ expect(merge_requests).to contain_exactly(merge_request3)
+ end
- expect(merge_requests).to contain_exactly(merge_request1)
- end
+ it 'filters by wip' do
+ params = { wip: 'yes' }
- it 'filters by source branch' do
- params = { source_branch: merge_request2.source_branch }
+ merge_requests = described_class.new(user, params).execute
- merge_requests = described_class.new(user, params).execute
+ expect(merge_requests).to contain_exactly(merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
+ end
- expect(merge_requests).to contain_exactly(merge_request2)
- end
+ it 'filters by not wip' do
+ params = { wip: 'no' }
- it 'filters by target branch' do
- params = { target_branch: merge_request2.target_branch }
+ merge_requests = described_class.new(user, params).execute
- merge_requests = described_class.new(user, params).execute
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3)
+ end
- expect(merge_requests).to contain_exactly(merge_request2)
- end
+ it 'returns all items if no valid wip param exists' do
+ params = { wip: '' }
- it 'filters by state' do
- params = { state: 'locked' }
+ merge_requests = described_class.new(user, params).execute
- merge_requests = described_class.new(user, params).execute
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3, merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
+ end
- expect(merge_requests).to contain_exactly(merge_request3)
- end
+ it 'adds wip to scalar params' do
+ scalar_params = described_class.scalar_params
- it 'filters by wip' do
- params = { wip: 'yes' }
+ expect(scalar_params).to include(:wip, :assignee_id)
+ end
- merge_requests = described_class.new(user, params).execute
+ context 'filtering by group milestone' do
+ let!(:group) { create(:group, :public) }
+ let(:group_milestone) { create(:milestone, group: group) }
+ let!(:group_member) { create(:group_member, group: group, user: user) }
+ let(:params) { { milestone_title: group_milestone.title } }
- expect(merge_requests).to contain_exactly(merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
- end
+ before do
+ project2.update(namespace: group)
+ merge_request2.update(milestone: group_milestone)
+ merge_request3.update(milestone: group_milestone)
+ end
- it 'filters by not wip' do
- params = { wip: 'no' }
+ it 'returns issues assigned to that group milestone' do
+ merge_requests = described_class.new(user, params).execute
- merge_requests = described_class.new(user, params).execute
+ expect(merge_requests).to contain_exactly(merge_request2, merge_request3)
+ end
+ end
- expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3)
- end
+ context 'filtering by created_at/updated_at' do
+ let(:new_project) { create(:project, forked_from_project: project1) }
- it 'returns all items if no valid wip param exists' do
- params = { wip: '' }
+ let!(:new_merge_request) do
+ create(:merge_request,
+ :simple,
+ author: user,
+ created_at: 1.week.from_now,
+ updated_at: 1.week.from_now,
+ source_project: new_project,
+ target_project: new_project)
+ end
- merge_requests = described_class.new(user, params).execute
+ let!(:old_merge_request) do
+ create(:merge_request,
+ :simple,
+ author: user,
+ source_branch: 'feature_1',
+ created_at: 1.week.ago,
+ updated_at: 1.week.ago,
+ source_project: new_project,
+ target_project: new_project)
+ end
- expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request3, merge_request4, merge_request5, merge_request6, merge_request7, merge_request8, merge_request9)
- end
+ before do
+ new_project.add_maintainer(user)
+ end
- it 'adds wip to scalar params' do
- scalar_params = described_class.scalar_params
+ it 'filters by created_after' do
+ params = { project_id: new_project.id, created_after: new_merge_request.created_at }
- expect(scalar_params).to include(:wip, :assignee_id)
- end
+ merge_requests = described_class.new(user, params).execute
- context 'filtering by group milestone' do
- let!(:group) { create(:group, :public) }
- let(:group_milestone) { create(:milestone, group: group) }
- let!(:group_member) { create(:group_member, group: group, user: user) }
- let(:params) { { milestone_title: group_milestone.title } }
+ expect(merge_requests).to contain_exactly(new_merge_request)
+ end
- before do
- project2.update(namespace: group)
- merge_request2.update(milestone: group_milestone)
- merge_request3.update(milestone: group_milestone)
- end
+ it 'filters by created_before' do
+ params = { project_id: new_project.id, created_before: old_merge_request.created_at }
- it 'returns issues assigned to that group milestone' do
- merge_requests = described_class.new(user, params).execute
+ merge_requests = described_class.new(user, params).execute
- expect(merge_requests).to contain_exactly(merge_request2, merge_request3)
- end
- end
+ expect(merge_requests).to contain_exactly(old_merge_request)
+ end
- context 'filtering by created_at/updated_at' do
- let(:new_project) { create(:project, forked_from_project: project1) }
-
- let!(:new_merge_request) do
- create(:merge_request,
- :simple,
- author: user,
- created_at: 1.week.from_now,
- updated_at: 1.week.from_now,
- source_project: new_project,
- target_project: new_project)
- end
+ it 'filters by created_after and created_before' do
+ params = {
+ project_id: new_project.id,
+ created_after: old_merge_request.created_at,
+ created_before: new_merge_request.created_at
+ }
- let!(:old_merge_request) do
- create(:merge_request,
- :simple,
- author: user,
- source_branch: 'feature_1',
- created_at: 1.week.ago,
- updated_at: 1.week.ago,
- source_project: new_project,
- target_project: new_project)
- end
+ merge_requests = described_class.new(user, params).execute
- before do
- new_project.add_maintainer(user)
- end
+ expect(merge_requests).to contain_exactly(old_merge_request, new_merge_request)
+ end
- it 'filters by created_after' do
- params = { project_id: new_project.id, created_after: new_merge_request.created_at }
+ it 'filters by updated_after' do
+ params = { project_id: new_project.id, updated_after: new_merge_request.updated_at }
- merge_requests = described_class.new(user, params).execute
+ merge_requests = described_class.new(user, params).execute
- expect(merge_requests).to contain_exactly(new_merge_request)
- end
+ expect(merge_requests).to contain_exactly(new_merge_request)
+ end
- it 'filters by created_before' do
- params = { project_id: new_project.id, created_before: old_merge_request.created_at }
+ it 'filters by updated_before' do
+ params = { project_id: new_project.id, updated_before: old_merge_request.updated_at }
- merge_requests = described_class.new(user, params).execute
+ merge_requests = described_class.new(user, params).execute
- expect(merge_requests).to contain_exactly(old_merge_request)
- end
+ expect(merge_requests).to contain_exactly(old_merge_request)
+ end
- it 'filters by created_after and created_before' do
- params = {
- project_id: new_project.id,
- created_after: old_merge_request.created_at,
- created_before: new_merge_request.created_at
- }
+ it 'filters by updated_after and updated_before' do
+ params = {
+ project_id: new_project.id,
+ updated_after: old_merge_request.updated_at,
+ updated_before: new_merge_request.updated_at
+ }
- merge_requests = described_class.new(user, params).execute
+ merge_requests = described_class.new(user, params).execute
- expect(merge_requests).to contain_exactly(old_merge_request, new_merge_request)
+ expect(merge_requests).to contain_exactly(old_merge_request, new_merge_request)
+ end
end
+ end
- it 'filters by updated_after' do
- params = { project_id: new_project.id, updated_after: new_merge_request.updated_at }
+ describe '#row_count', :request_store do
+ it 'returns the number of rows for the default state' do
+ finder = described_class.new(user)
- merge_requests = described_class.new(user, params).execute
+ expect(finder.row_count).to eq(7)
+ end
- expect(merge_requests).to contain_exactly(new_merge_request)
+ it 'returns the number of rows for a given state' do
+ finder = described_class.new(user, state: 'closed')
+
+ expect(finder.row_count).to eq(1)
end
+ end
+ end
- it 'filters by updated_before' do
- params = { project_id: new_project.id, updated_before: old_merge_request.updated_at }
+ context 'when projects require different access levels for merge requests' do
+ let(:user) { create(:user) }
- merge_requests = described_class.new(user, params).execute
+ let(:public_project) { create(:project, :public) }
+ let(:internal) { create(:project, :internal) }
+ let(:private_project) { create(:project, :private) }
+ let(:public_with_private_repo) { create(:project, :public, :repository, :repository_private) }
+ let(:internal_with_private_repo) { create(:project, :internal, :repository, :repository_private) }
+
+ let(:merge_requests) { described_class.new(user, {}).execute }
+
+ let!(:mr_public) { create(:merge_request, source_project: public_project) }
+ let!(:mr_private) { create(:merge_request, source_project: private_project) }
+ let!(:mr_internal) { create(:merge_request, source_project: internal) }
+ let!(:mr_private_repo_access) { create(:merge_request, source_project: public_with_private_repo) }
+ let!(:mr_internal_private_repo_access) { create(:merge_request, source_project: internal_with_private_repo) }
+
+ context 'with admin user' do
+ let(:user) { create(:user, :admin) }
- expect(merge_requests).to contain_exactly(old_merge_request)
+ it 'returns all merge requests' do
+ expect(merge_requests).to eq(
+ [mr_internal_private_repo_access, mr_private_repo_access, mr_internal, mr_private, mr_public]
+ )
end
+ end
- it 'filters by updated_after and updated_before' do
- params = {
- project_id: new_project.id,
- updated_after: old_merge_request.updated_at,
- updated_before: new_merge_request.updated_at
- }
+ context 'when project restricts merge requests' do
+ let(:non_member) { create(:user) }
+ let(:project) { create(:project, :repository, :public, :merge_requests_private) }
+ let!(:merge_request) { create(:merge_request, source_project: project) }
- merge_requests = described_class.new(user, params).execute
+ it "returns nothing to to non members" do
+ merge_requests = described_class.new(
+ non_member,
+ project_id: project.id
+ ).execute
- expect(merge_requests).to contain_exactly(old_merge_request, new_merge_request)
+ expect(merge_requests).to be_empty
end
end
- end
- describe '#row_count', :request_store do
- it 'returns the number of rows for the default state' do
- finder = described_class.new(user)
+ context 'with external user' do
+ let(:user) { create(:user, :external) }
- expect(finder.row_count).to eq(7)
+ it 'returns only public merge requests' do
+ expect(merge_requests).to eq([mr_public])
+ end
end
- it 'returns the number of rows for a given state' do
- finder = described_class.new(user, state: 'closed')
+ context 'with authenticated user' do
+ it 'returns public and internal merge requests' do
+ expect(merge_requests).to eq([mr_internal, mr_public])
+ end
+
+ context 'being added to the private project' do
+ context 'as a guest' do
+ before do
+ private_project.add_guest(user)
+ end
+
+ it 'does not return merge requests from the private project' do
+ expect(merge_requests).to eq([mr_internal, mr_public])
+ end
+ end
+
+ context 'as a developer' do
+ before do
+ private_project.add_developer(user)
+ end
+
+ it 'returns merge requests from the private project' do
+ expect(merge_requests).to eq([mr_internal, mr_private, mr_public])
+ end
+ end
+ end
- expect(finder.row_count).to eq(1)
+ context 'being added to the public project with private repo access' do
+ context 'as a guest' do
+ before do
+ public_with_private_repo.add_guest(user)
+ end
+
+ it 'returns merge requests from the project' do
+ expect(merge_requests).to eq([mr_internal, mr_public])
+ end
+ end
+
+ context 'as a reporter' do
+ before do
+ public_with_private_repo.add_reporter(user)
+ end
+
+ it 'returns merge requests from the project' do
+ expect(merge_requests).to eq([mr_private_repo_access, mr_internal, mr_public])
+ end
+ end
+ end
+
+ context 'being added to the internal project with private repo access' do
+ context 'as a guest' do
+ before do
+ internal_with_private_repo.add_guest(user)
+ end
+
+ it 'returns merge requests from the project' do
+ expect(merge_requests).to eq([mr_internal, mr_public])
+ end
+ end
+
+ context 'as a reporter' do
+ before do
+ internal_with_private_repo.add_reporter(user)
+ end
+
+ it 'returns merge requests from the project' do
+ expect(merge_requests).to eq([mr_internal_private_repo_access, mr_internal, mr_public])
+ end
+ end
+ end
end
end
end
diff --git a/spec/fixtures/security-reports/remediations/gl-dependency-scanning-report.json b/spec/fixtures/security-reports/remediations/gl-dependency-scanning-report.json
new file mode 100644
index 00000000000..c96e831b027
--- /dev/null
+++ b/spec/fixtures/security-reports/remediations/gl-dependency-scanning-report.json
@@ -0,0 +1,104 @@
+{
+ "version": "2.0",
+ "vulnerabilities": [
+ {
+ "category": "dependency_scanning",
+ "name": "Regular Expression Denial of Service",
+ "message": "Regular Expression Denial of Service in debug",
+ "description": "The debug module is vulnerable to regular expression denial of service when untrusted user input is passed into the `o` formatter. It takes around 50k characters to block for 2 seconds making this a low severity issue.",
+ "cve": "yarn.lock:debug:gemnasium:37283ed4-0380-40d7-ada7-2d994afcc62a",
+ "severity": "Unknown",
+ "solution": "Upgrade to latest versions.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {
+ "file": "yarn.lock",
+ "dependency": {
+ "package": {
+ "name": "debug"
+ },
+ "version": "1.0.5"
+ }
+ },
+ "identifiers": [
+ {
+ "type": "gemnasium",
+ "name": "Gemnasium-37283ed4-0380-40d7-ada7-2d994afcc62a",
+ "value": "37283ed4-0380-40d7-ada7-2d994afcc62a",
+ "url": "https://deps.sec.gitlab.com/packages/npm/debug/versions/1.0.5/advisories"
+ }
+ ],
+ "links": [
+ {
+ "url": "https://nodesecurity.io/advisories/534"
+ },
+ {
+ "url": "https://github.com/visionmedia/debug/issues/501"
+ },
+ {
+ "url": "https://github.com/visionmedia/debug/pull/504"
+ }
+ ]
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Authentication bypass via incorrect DOM traversal and canonicalization",
+ "message": "Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js",
+ "description": "Some XML DOM traversal and canonicalization APIs may be inconsistent in handling of comments within XML nodes. Incorrect use of these APIs by some SAML libraries results in incorrect parsing of the inner text of XML nodes such that any inner text after the comment is lost prior to cryptographically signing the SAML message. Text after the comment therefore has no impact on the signature on the SAML message.\r\n\r\nA remote attacker can modify SAML content for a SAML service provider without invalidating the cryptographic signature, which may allow attackers to bypass primary authentication for the affected SAML service provider.",
+ "cve": "yarn.lock:saml2-js:gemnasium:9952e574-7b5b-46fa-a270-aeb694198a98",
+ "severity": "Unknown",
+ "solution": "Upgrade to fixed version.\r\n",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {
+ "file": "yarn.lock",
+ "dependency": {
+ "package": {
+ "name": "saml2-js"
+ },
+ "version": "1.5.0"
+ }
+ },
+ "identifiers": [
+ {
+ "type": "gemnasium",
+ "name": "Gemnasium-9952e574-7b5b-46fa-a270-aeb694198a98",
+ "value": "9952e574-7b5b-46fa-a270-aeb694198a98",
+ "url": "https://deps.sec.gitlab.com/packages/npm/saml2-js/versions/1.5.0/advisories"
+ },
+ {
+ "type": "cve",
+ "name": "CVE-2017-11429",
+ "value": "CVE-2017-11429",
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11429"
+ }
+ ],
+ "links": [
+ {
+ "url": "https://github.com/Clever/saml2/commit/3546cb61fd541f219abda364c5b919633609ef3d#diff-af730f9f738de1c9ad87596df3f6de84R279"
+ },
+ {
+ "url": "https://github.com/Clever/saml2/issues/127"
+ },
+ {
+ "url": "https://www.kb.cert.org/vuls/id/475445"
+ }
+ ]
+ }
+ ],
+ "remediations": [
+ {
+ "fixes": [
+ {
+ "cve": "yarn.lock:saml2-js:gemnasium:9952e574-7b5b-46fa-a270-aeb694198a98"
+ }
+ ],
+ "summary": "Upgrade saml2-js",
+ "diff": "ZGlmZiAtLWdpdCBhL3lhcm4ubG9jayBiL3lhcm4ubG9jawppbmRleCAwZWNjOTJmLi43ZmE0NTU0IDEwMDY0NAotLS0gYS95YXJuLmxvY2sKKysrIGIveWFybi5sb2NrCkBAIC0yLDEwMyArMiwxMjQgQEAKICMgeWFybiBsb2NrZmlsZSB2MQogCiAKLWFzeW5jQH4wLjIuNzoKLSAgdmVyc2lvbiAiMC4yLjEwIgotICByZXNvbHZlZCAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTAuMi4xMC50Z3ojYjZiYmUwYjA2NzRiOWQ3MTk3MDhjYTM4ZGU4YzIzN2NiNTI2YzNkMSIKLQotYXN5bmNAfjEuNS4yOgotICB2ZXJzaW9uICIxLjUuMiIKLSAgcmVzb2x2ZWQgImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjUuMi50Z3ojZWM2YTYxYWU1NjQ4MGMwYzNjYjI0MWM5NTYxOGUyMDg5MmY5NjcyYSIKK2FzeW5jQF4yLjEuNSwgYXN5bmNAXjIuNS4wOgorICB2ZXJzaW9uICIyLjYuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYXN5bmMvLS9hc3luYy0yLjYuMS50Z3ojYjI0NWEyM2NhNzE5MzAwNDRlYzUzZmE0NmFhMDBhM2U4N2M2YTYxMCIKKyAgaW50ZWdyaXR5IHNoYTUxMi1mTkVpTDIrQVp0NkFsQXcvMjlDcjBVRGU0c1JBSENwRUhoNTRXTXorQmI3UWZOY0Z3NGgzbG9vZnlKcExlUXM0WXg3eXVxdS8yZExnTTVoS09zNkhsUT09CisgIGRlcGVuZGVuY2llczoKKyAgICBsb2Rhc2ggIl40LjE3LjEwIgogCi1kZWJ1Z0BeMS4wLjQ6Ci0gIHZlcnNpb24gIjEuMC41IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9kZWJ1Zy8tL2RlYnVnLTEuMC41LnRneiNmNzI0MTIxNzQzMGY5OWRlYzRjMmI0NzNlYWI5MjIyOGU4NzRjMmFjIgorZGVidWdAXjIuNi4wOgorICB2ZXJzaW9uICIyLjYuOSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3ojNWQxMjg1MTVkZjEzNGZmMzI3ZTkwYTRjOTNmNGUwNzdhNTM2MzQxZiIKKyAgaW50ZWdyaXR5IHNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09CiAgIGRlcGVuZGVuY2llczoKICAgICBtcyAiMi4wLjAiCiAKLWVqc0B+MC44LjM6Ci0gIHZlcnNpb24gIjAuOC44IgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9lanMvLS9lanMtMC44LjgudGd6I2ZmZGM1NmRjYzM1ZDAyOTI2ZGQ1MGFkMTM0MzliYmM1NDA2MWQ1OTgiCitlanNAXjIuNS42OgorICB2ZXJzaW9uICIyLjYuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZWpzLy0vZWpzLTIuNi4xLnRneiM0OThlYzBkNDk1NjU1YWJjNmYyM2NkNjE4NjhkOTI2NDY0MDcxYWEwIgorICBpbnRlZ3JpdHkgc2hhNTEyLTB4eTRBL3R3ZnJSQ25raGZrOEVyRGk1RHFkQXNBcWVHeGh0NHhrQ1Vyc3ZoaGJRTnM3RSs0alYwQ043K05LSVkwYUhFNzIrWHZxdEJJWHpEMzFaYlhRPT0KKworbG9kYXNoLW5vZGVAfjIuNC4xOgorICB2ZXJzaW9uICIyLjQuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vbG9kYXNoLW5vZGUvLS9sb2Rhc2gtbm9kZS0yLjQuMS50Z3ojZWE4MmY3YjEwMGM3MzNkMWE0MmFmNzY4MDFlNTA2MTA1ZTJhODBlYyIKKyAgaW50ZWdyaXR5IHNoYTEtNm9MM3NRREhNOUdrS3Zkb0FlVUdFRjRxZ093PQorCitsb2Rhc2hAXjQuMTcuMTA6CisgIHZlcnNpb24gIjQuMTcuMTEiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiNiMzllYTYyMjllZjYwN2VjZDg5ZTJjOGRmMTI1MzY4OTFjYWM5YjhkIgorICBpbnRlZ3JpdHkgc2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0KIAogbXNAMi4wLjA6CiAgIHZlcnNpb24gIjIuMC4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9tcy8tL21zLTIuMC4wLnRneiM1NjA4YWVhZGZjMDBiZTZjMjkwMWRmNWY5ODYxNzg4ZGUwZDU5N2M4IgorICBpbnRlZ3JpdHkgc2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9CiAKLW5vZGUtZm9yZ2VAMC4yLjI0OgotICB2ZXJzaW9uICIwLjIuMjQiCi0gIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL25vZGUtZm9yZ2UvLS9ub2RlLWZvcmdlLTAuMi4yNC50Z3ojZmE2Zjg0NmY0MmZhOTNmNjNhMGEzMGM5ZmJmZjdiNGUxMzBlMDg1OCIKK25vZGUtZm9yZ2VAXjAuNy4wOgorICB2ZXJzaW9uICIwLjcuNiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vbm9kZS1mb3JnZS8tL25vZGUtZm9yZ2UtMC43LjYudGd6I2ZkZjNiNDE4YWVlMWY5NGYwZWY2NDJjZDYzNDg2Yzc3Y2E5NzI0YWMiCisgIGludGVncml0eSBzaGE1MTItc29sMzBMVXB6MWpRRkJqT0t3Ymp4aWppRTNiNnBqZDc0WXdmRDBmSk9LUGpGK2ZPTktiMllnOHJZZ1M2K2JLNlZEbCsvd2ZyNElZcEM3akR6TFVJZnc9PQogCiBzYW1sMi1qc0BeMS41LjA6Ci0gIHZlcnNpb24gIjEuNS4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9zYW1sMi1qcy8tL3NhbWwyLWpzLTEuNS4wLnRneiNjMGQyMjY4YTE3OWU3MzI5ZDI5ZWIyNWFhODJkZjU1MDM3NzRiMGQ5IgorICB2ZXJzaW9uICIxLjEyLjQiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3NhbWwyLWpzLy0vc2FtbDItanMtMS4xMi40LnRneiNjMjg4ZjIwYmRhNmQyYjkxMDczYjE2Yzk0ZWE3MmYyMjM0OWFjM2IzIgorICBpbnRlZ3JpdHkgc2hhMS13b2p5QzlwdEs1RUhPeGJKVHFjdklqU2F3N009CiAgIGRlcGVuZGVuY2llczoKLSAgICBhc3luYyAifjEuNS4yIgotICAgIGRlYnVnICJeMS4wLjQiCi0gICAgdW5kZXJzY29yZSAifjEuNi4wIgotICAgIHhtbC1jcnlwdG8gIl4wLjguMSIKLSAgICB4bWwtZW5jcnlwdGlvbiAifjAuNy40IgotICAgIHhtbDJqcyAifjAuNC4xIgotICAgIHhtbGJ1aWxkZXIgIn4yLjEuMCIKLSAgICB4bWxkb20gIn4wLjEuMTkiCisgICAgYXN5bmMgIl4yLjUuMCIKKyAgICBkZWJ1ZyAiXjIuNi4wIgorICAgIHVuZGVyc2NvcmUgIl4xLjguMCIKKyAgICB4bWwtY3J5cHRvICJeMC4xMC4wIgorICAgIHhtbC1lbmNyeXB0aW9uICJeMC4xMS4wIgorICAgIHhtbDJqcyAiXjAuNC4wIgorICAgIHhtbGJ1aWxkZXIgIn4yLjIuMCIKKyAgICB4bWxkb20gIl4wLjEuMCIKIAogc2F4QD49MC42LjA6CiAgIHZlcnNpb24gIjEuMi40IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9zYXgvLS9zYXgtMS4yLjQudGd6IzI4MTYyMzRlMjM3OGJkZGM0ZTUzNTRmYWI1Y2FhODk1ZGY3MTAwZDkiCisgIGludGVncml0eSBzaGE1MTItTnFWRHY5VHBBTlVqRm0wTjh1TTVHeEwzNlVnS2k5L2F0WncreDdZRm5ROGNrd0ZHS3JsNHhYNHlXdHJleTNVSm01blAxa1VibllnTG9wcVdOU1JoV3c9PQogCi11bmRlcnNjb3JlQD49MS41Lng6Cit1bmRlcnNjb3JlQF4xLjguMDoKICAgdmVyc2lvbiAiMS45LjEiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOS4xLnRneiMwNmRjZTM0YTBlNjhhN2JhYmMyOWIzNjViOGU3NGI4OTI1MjAzOTYxIgorICBpbnRlZ3JpdHkgc2hhNTEyLTUvNGV0bkNrZDljOGd3Z293aTUvb20vbVlPNWFqQ2FPZ2R6ai9vVyswZVFWOVd4S0JEWnc1K3ljbUttZWFUWGpJblMvVzBCenBHTG8yeFIyYUJ3WmRnPT0KIAotdW5kZXJzY29yZUB+MS42LjA6Ci0gIHZlcnNpb24gIjEuNi4wIgotICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3ojOGIzOGIxMGNhY2RlZjYzMzM3YjhiMjRlNGZmODZkNDVhZWE1MjlhOCIKLQoteG1sLWNyeXB0b0BeMC44LjE6Ci0gIHZlcnNpb24gIjAuOC41IgotICByZXNvbHZlZCAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWwtY3J5cHRvLy0veG1sLWNyeXB0by0wLjguNS50Z3ojMmJiY2ZiM2ViMzNmM2E4MmEyMThiODIyYmY2NzJiNmIxYzIwZTUzOCIKK3htbC1jcnlwdG9AXjAuMTAuMDoKKyAgdmVyc2lvbiAiMC4xMC4xIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS94bWwtY3J5cHRvLy0veG1sLWNyeXB0by0wLjEwLjEudGd6I2Y4MzJmNzRjY2Y1NmYyNGFmY2FlMTE2M2ExZmNhYjQ0ZDk2Nzc0YTgiCisgIGludGVncml0eSBzaGExLStETDNUTTlXOGtyOHJoRmpvZnlyUk5sbmRLZz0KICAgZGVwZW5kZW5jaWVzOgogICAgIHhtbGRvbSAiPTAuMS4xOSIKICAgICB4cGF0aC5qcyAiPj0wLjAuMyIKIAoteG1sLWVuY3J5cHRpb25AfjAuNy40OgotICB2ZXJzaW9uICIwLjcuNCIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veG1sLWVuY3J5cHRpb24vLS94bWwtZW5jcnlwdGlvbi0wLjcuNC50Z3ojNDI3OTFlYzY0ZDU1NmQyNDU1ZGNiOWRhMGE1NDEyMzY2NWFjNjVjNyIKK3htbC1lbmNyeXB0aW9uQF4wLjExLjA6CisgIHZlcnNpb24gIjAuMTEuMiIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veG1sLWVuY3J5cHRpb24vLS94bWwtZW5jcnlwdGlvbi0wLjExLjIudGd6I2MyMTdmNTUwOTU0N2UzNGI1MDBiODI5ZjJjMGJjYTg1Y2NhNzNhMjEiCisgIGludGVncml0eSBzaGE1MTItalZ2RVM3aTVvdmRPN04rTmpnbmNBMzI2eFlLamhxZUFubnZJZ1JuWTdST0xDZkZxRURMd1AwU3hwLzMwU0hHMEFYUVYxMDQ4VDV5aW5PRnl2d0dGemc9PQogICBkZXBlbmRlbmNpZXM6Ci0gICAgYXN5bmMgIn4wLjIuNyIKLSAgICBlanMgIn4wLjguMyIKLSAgICBub2RlLWZvcmdlICIwLjIuMjQiCisgICAgYXN5bmMgIl4yLjEuNSIKKyAgICBlanMgIl4yLjUuNiIKKyAgICBub2RlLWZvcmdlICJeMC43LjAiCiAgICAgeG1sZG9tICJ+MC4xLjE1IgotICAgIHhwYXRoICIwLjAuNSIKKyAgICB4cGF0aCAiMC4wLjI3IgogCi14bWwyanNAfjAuNC4xOgoreG1sMmpzQF4wLjQuMDoKICAgdmVyc2lvbiAiMC40LjE5IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS94bWwyanMvLS94bWwyanMtMC40LjE5LnRneiM2ODZjMjBmMjEzMjA5ZTk0YWJmMGQxYmNmMWVmYWEyOTFjNzgyN2E3IgorICBpbnRlZ3JpdHkgc2hhNTEyLWVzWm5KWkpPaUpSOXdXS015dXZTRTF5NkRxNUxDdUphbnFoeHNsSDJieE02ZHVhaE5aK0hNcENMaEJRR1prYlg2eFJmOHgxWTJlSmxndDJxM3FvNDlRPT0KICAgZGVwZW5kZW5jaWVzOgogICAgIHNheCAiPj0wLjYuMCIKICAgICB4bWxidWlsZGVyICJ+OS4wLjEiCiAKLXhtbGJ1aWxkZXJAfjIuMS4wOgotICB2ZXJzaW9uICIyLjEuMCIKLSAgcmVzb2x2ZWQgImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sYnVpbGRlci8tL3htbGJ1aWxkZXItMi4xLjAudGd6IzZkZGFlMzE2ODNiNmRmMTIxMDBiMjlmYzhhMGQ0ZjQ2MzQ5YWJiZWQiCit4bWxidWlsZGVyQH4yLjIuMDoKKyAgdmVyc2lvbiAiMi4yLjEiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3htbGJ1aWxkZXIvLS94bWxidWlsZGVyLTIuMi4xLnRneiM5MzI2NDMwZjEzMGQ4NzQzNWQ0YzQwODY2NDNhYTI5MjZlMTA1YTMyIgorICBpbnRlZ3JpdHkgc2hhMS1reVpERHhNTmgwTmRURUNHWkRxaWttNFFXakk9CiAgIGRlcGVuZGVuY2llczoKLSAgICB1bmRlcnNjb3JlICI+PTEuNS54IgorICAgIGxvZGFzaC1ub2RlICJ+Mi40LjEiCiAKIHhtbGJ1aWxkZXJAfjkuMC4xOgogICB2ZXJzaW9uICI5LjAuNyIKLSAgcmVzb2x2ZWQgImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sYnVpbGRlci8tL3htbGJ1aWxkZXItOS4wLjcudGd6IzEzMmVlNjNkMmVjNTU2NWM1NTdlMjBmNGMyMmRmOWFjYTY4NmIxMGQiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3htbGJ1aWxkZXIvLS94bWxidWlsZGVyLTkuMC43LnRneiMxMzJlZTYzZDJlYzU1NjVjNTU3ZTIwZjRjMjJkZjlhY2E2ODZiMTBkIgorICBpbnRlZ3JpdHkgc2hhMS1FeTdtUFM3RlZseFZmaUQwd2kzNXJLYUdzUTA9CiAKIHhtbGRvbUA9MC4xLjE5OgogICB2ZXJzaW9uICIwLjEuMTkiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL3htbGRvbS8tL3htbGRvbS0wLjEuMTkudGd6IzYzMWZjMDc3NzZlZmQ4NDExOGJmMjUxNzFiMzdlZDRkMDc1YTBhYmMiCisgIGludGVncml0eSBzaGExLVl4L0FkM2J2MkVFWXZ5VVhHemZ0VFFkYUNydz0KIAoteG1sZG9tQH4wLjEuMTUsIHhtbGRvbUB+MC4xLjE5OgoreG1sZG9tQF4wLjEuMCwgeG1sZG9tQH4wLjEuMTU6CiAgIHZlcnNpb24gIjAuMS4yNyIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veG1sZG9tLy0veG1sZG9tLTAuMS4yNy50Z3ojZDUwMWY5N2IzYmRiNDAzYWY4ZWY5ZWNjMjA1NzMxODdhYWRhYzBlOSIKKyAgaW50ZWdyaXR5IHNoYTEtMVFINWV6dmJRRHI0NzU3TUlGY3hoNnJhd09rPQogCiB4cGF0aC5qc0A+PTAuMC4zOgogICB2ZXJzaW9uICIxLjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veHBhdGguanMvLS94cGF0aC5qcy0xLjEuMC50Z3ojMzgxNmE0NGVkNGJiMzUyMDkxMDgzZDAwMmEzODNkZDUxMDRhNWZmMSIKKyAgaW50ZWdyaXR5IHNoYTUxMi1qZytxa2ZTNEs4RTc5NjVzcWFVbDhtUm5nWGlLYjNXWkdmT05nRTE4cHIwM0ZVUWl1U1Y2RytFajR0UzU1QitySVFTRkVJdzNwaGRWQVE0cFBxTldmUT09CiAKLXhwYXRoQDAuMC41OgotICB2ZXJzaW9uICIwLjAuNSIKLSAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veHBhdGgvLS94cGF0aC0wLjAuNS50Z3ojNDU0MDM2ZjZlZjBmM2RmNWFmNWQ0YmE0YTExOWZiNzU2NzRiM2U2YyIKK3hwYXRoQDAuMC4yNzoKKyAgdmVyc2lvbiAiMC4wLjI3IgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS94cGF0aC8tL3hwYXRoLTAuMC4yNy50Z3ojZGQzNDIxZmJkY2M1NjQ2YWMzMmM0ODUzMWI0ZDdlOWQwYzJjZmE5MiIKKyAgaW50ZWdyaXR5IHNoYTUxMi1mZzAzV1J4dGtDVjZvaENsZVBOQUVDWXNtcEtLVHY1TDh5L1gzRG4xaFFyZWMzUE94MmpIWi8wUDJxUTZIdnNyVTFCbWVxWGNvZjNOR0d1ZUc2THh3UT09Cg=="
+ }
+ ]
+}
diff --git a/spec/fixtures/security-reports/remediations/remediation.patch b/spec/fixtures/security-reports/remediations/remediation.patch
new file mode 100644
index 00000000000..bbfb6874627
--- /dev/null
+++ b/spec/fixtures/security-reports/remediations/remediation.patch
@@ -0,0 +1,180 @@
+diff --git a/yarn.lock b/yarn.lock
+index 0ecc92f..7fa4554 100644
+--- a/yarn.lock
++++ b/yarn.lock
+@@ -2,103 +2,124 @@
+ # yarn lockfile v1
+
+
+-async@~0.2.7:
+- version "0.2.10"
+- resolved "http://registry.npmjs.org/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+-
+-async@~1.5.2:
+- version "1.5.2"
+- resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
++async@^2.1.5, async@^2.5.0:
++ version "2.6.1"
++ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
++ integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
++ dependencies:
++ lodash "^4.17.10"
+
+-debug@^1.0.4:
+- version "1.0.5"
+- resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.5.tgz#f7241217430f99dec4c2b473eab92228e874c2ac"
++debug@^2.6.0:
++ version "2.6.9"
++ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
++ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+-ejs@~0.8.3:
+- version "0.8.8"
+- resolved "https://registry.yarnpkg.com/ejs/-/ejs-0.8.8.tgz#ffdc56dcc35d02926dd50ad13439bbc54061d598"
++ejs@^2.5.6:
++ version "2.6.1"
++ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
++ integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
++
++lodash-node@~2.4.1:
++ version "2.4.1"
++ resolved "https://registry.yarnpkg.com/lodash-node/-/lodash-node-2.4.1.tgz#ea82f7b100c733d1a42af76801e506105e2a80ec"
++ integrity sha1-6oL3sQDHM9GkKvdoAeUGEF4qgOw=
++
++lodash@^4.17.10:
++ version "4.17.11"
++ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
++ integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
+
+ ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
++ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+-node-forge@0.2.24:
+- version "0.2.24"
+- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.2.24.tgz#fa6f846f42fa93f63a0a30c9fbff7b4e130e0858"
++node-forge@^0.7.0:
++ version "0.7.6"
++ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
++ integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==
+
+ saml2-js@^1.5.0:
+- version "1.5.0"
+- resolved "https://registry.yarnpkg.com/saml2-js/-/saml2-js-1.5.0.tgz#c0d2268a179e7329d29eb25aa82df5503774b0d9"
++ version "1.12.4"
++ resolved "https://registry.yarnpkg.com/saml2-js/-/saml2-js-1.12.4.tgz#c288f20bda6d2b91073b16c94ea72f22349ac3b3"
++ integrity sha1-wojyC9ptK5EHOxbJTqcvIjSaw7M=
+ dependencies:
+- async "~1.5.2"
+- debug "^1.0.4"
+- underscore "~1.6.0"
+- xml-crypto "^0.8.1"
+- xml-encryption "~0.7.4"
+- xml2js "~0.4.1"
+- xmlbuilder "~2.1.0"
+- xmldom "~0.1.19"
++ async "^2.5.0"
++ debug "^2.6.0"
++ underscore "^1.8.0"
++ xml-crypto "^0.10.0"
++ xml-encryption "^0.11.0"
++ xml2js "^0.4.0"
++ xmlbuilder "~2.2.0"
++ xmldom "^0.1.0"
+
+ sax@>=0.6.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
++ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+-underscore@>=1.5.x:
++underscore@^1.8.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
++ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+-underscore@~1.6.0:
+- version "1.6.0"
+- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+-
+-xml-crypto@^0.8.1:
+- version "0.8.5"
+- resolved "http://registry.npmjs.org/xml-crypto/-/xml-crypto-0.8.5.tgz#2bbcfb3eb33f3a82a218b822bf672b6b1c20e538"
++xml-crypto@^0.10.0:
++ version "0.10.1"
++ resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-0.10.1.tgz#f832f74ccf56f24afcae1163a1fcab44d96774a8"
++ integrity sha1-+DL3TM9W8kr8rhFjofyrRNlndKg=
+ dependencies:
+ xmldom "=0.1.19"
+ xpath.js ">=0.0.3"
+
+-xml-encryption@~0.7.4:
+- version "0.7.4"
+- resolved "https://registry.yarnpkg.com/xml-encryption/-/xml-encryption-0.7.4.tgz#42791ec64d556d2455dcb9da0a54123665ac65c7"
++xml-encryption@^0.11.0:
++ version "0.11.2"
++ resolved "https://registry.yarnpkg.com/xml-encryption/-/xml-encryption-0.11.2.tgz#c217f5509547e34b500b829f2c0bca85cca73a21"
++ integrity sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg==
+ dependencies:
+- async "~0.2.7"
+- ejs "~0.8.3"
+- node-forge "0.2.24"
++ async "^2.1.5"
++ ejs "^2.5.6"
++ node-forge "^0.7.0"
+ xmldom "~0.1.15"
+- xpath "0.0.5"
++ xpath "0.0.27"
+
+-xml2js@~0.4.1:
++xml2js@^0.4.0:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
++ integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~9.0.1"
+
+-xmlbuilder@~2.1.0:
+- version "2.1.0"
+- resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.1.0.tgz#6ddae31683b6df12100b29fc8a0d4f46349abbed"
++xmlbuilder@~2.2.0:
++ version "2.2.1"
++ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-2.2.1.tgz#9326430f130d87435d4c4086643aa2926e105a32"
++ integrity sha1-kyZDDxMNh0NdTECGZDqikm4QWjI=
+ dependencies:
+- underscore ">=1.5.x"
++ lodash-node "~2.4.1"
+
+ xmlbuilder@~9.0.1:
+ version "9.0.7"
+- resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
++ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
++ integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+
+ xmldom@=0.1.19:
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc"
++ integrity sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw=
+
+-xmldom@~0.1.15, xmldom@~0.1.19:
++xmldom@^0.1.0, xmldom@~0.1.15:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
++ integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk=
+
+ xpath.js@>=0.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xpath.js/-/xpath.js-1.1.0.tgz#3816a44ed4bb352091083d002a383dd5104a5ff1"
++ integrity sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==
+
+-xpath@0.0.5:
+- version "0.0.5"
+- resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.5.tgz#454036f6ef0f3df5af5d4ba4a119fb75674b3e6c"
++xpath@0.0.27:
++ version "0.0.27"
++ resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92"
++ integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==
diff --git a/spec/fixtures/security-reports/remediations/yarn.lock b/spec/fixtures/security-reports/remediations/yarn.lock
new file mode 100644
index 00000000000..0ecc92fb711
--- /dev/null
+++ b/spec/fixtures/security-reports/remediations/yarn.lock
@@ -0,0 +1,104 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+async@~0.2.7:
+ version "0.2.10"
+ resolved "http://registry.npmjs.org/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
+async@~1.5.2:
+ version "1.5.2"
+ resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+debug@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.5.tgz#f7241217430f99dec4c2b473eab92228e874c2ac"
+ dependencies:
+ ms "2.0.0"
+
+ejs@~0.8.3:
+ version "0.8.8"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-0.8.8.tgz#ffdc56dcc35d02926dd50ad13439bbc54061d598"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+node-forge@0.2.24:
+ version "0.2.24"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.2.24.tgz#fa6f846f42fa93f63a0a30c9fbff7b4e130e0858"
+
+saml2-js@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/saml2-js/-/saml2-js-1.5.0.tgz#c0d2268a179e7329d29eb25aa82df5503774b0d9"
+ dependencies:
+ async "~1.5.2"
+ debug "^1.0.4"
+ underscore "~1.6.0"
+ xml-crypto "^0.8.1"
+ xml-encryption "~0.7.4"
+ xml2js "~0.4.1"
+ xmlbuilder "~2.1.0"
+ xmldom "~0.1.19"
+
+sax@>=0.6.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+underscore@>=1.5.x:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+
+underscore@~1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+
+xml-crypto@^0.8.1:
+ version "0.8.5"
+ resolved "http://registry.npmjs.org/xml-crypto/-/xml-crypto-0.8.5.tgz#2bbcfb3eb33f3a82a218b822bf672b6b1c20e538"
+ dependencies:
+ xmldom "=0.1.19"
+ xpath.js ">=0.0.3"
+
+xml-encryption@~0.7.4:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/xml-encryption/-/xml-encryption-0.7.4.tgz#42791ec64d556d2455dcb9da0a54123665ac65c7"
+ dependencies:
+ async "~0.2.7"
+ ejs "~0.8.3"
+ node-forge "0.2.24"
+ xmldom "~0.1.15"
+ xpath "0.0.5"
+
+xml2js@~0.4.1:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~9.0.1"
+
+xmlbuilder@~2.1.0:
+ version "2.1.0"
+ resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.1.0.tgz#6ddae31683b6df12100b29fc8a0d4f46349abbed"
+ dependencies:
+ underscore ">=1.5.x"
+
+xmlbuilder@~9.0.1:
+ version "9.0.7"
+ resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+
+xmldom@=0.1.19:
+ version "0.1.19"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc"
+
+xmldom@~0.1.15, xmldom@~0.1.19:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xpath.js@>=0.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xpath.js/-/xpath.js-1.1.0.tgz#3816a44ed4bb352091083d002a383dd5104a5ff1"
+
+xpath@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.5.tgz#454036f6ef0f3df5af5d4ba4a119fb75674b3e6c"
diff --git a/spec/fixtures/trace/sample_trace b/spec/fixtures/trace/sample_trace
index 3d8beb0dec2..8f9747f8143 100644
--- a/spec/fixtures/trace/sample_trace
+++ b/spec/fixtures/trace/sample_trace
@@ -1795,7 +1795,7 @@ GroupsController
when requesting a redirected path
returns not found
PUT transfer
- when transfering to a subgroup goes right
+ when transferring to a subgroup goes right
should return a notice (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
should redirect to the new path (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
when converting to a root group goes right
@@ -2299,7 +2299,7 @@ Groups::TransferService
should update subgroups path (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
should update projects path (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
should create redirect for the subgroups and projects (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
- when transfering a group with nested groups and projects
+ when transferring a group with nested groups and projects
should update subgroups path (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
should update projects path (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
should create redirect for the subgroups and projects (PENDING: around hook at ./spec/spec_helper.rb:190 did not execute the example)
@@ -2426,9 +2426,9 @@ Groups::MilestonesController
lists legacy group milestones and group milestones
#show
when there is a title parameter
- searchs for a legacy group milestone
+ searches for a legacy group milestone
when there is not a title parameter
- searchs for a group milestone
+ searches for a group milestone
behaves like milestone tabs
#merge_requests
as html
@@ -3109,11 +3109,11 @@ Pending: (Failures listed here are expected and do not affect your suite's statu
# around hook at ./spec/spec_helper.rb:186 did not execute the example
# ./spec/controllers/groups_controller_spec.rb:129
- 15) GroupsController PUT transfer when transfering to a subgroup goes right should return a notice
+ 15) GroupsController PUT transfer when transferring to a subgroup goes right should return a notice
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/controllers/groups_controller_spec.rb:516
- 16) GroupsController PUT transfer when transfering to a subgroup goes right should redirect to the new path
+ 16) GroupsController PUT transfer when transferring to a subgroup goes right should redirect to the new path
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/controllers/groups_controller_spec.rb:520
@@ -3301,15 +3301,15 @@ Pending: (Failures listed here are expected and do not affect your suite's statu
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/services/groups/transfer_service_spec.rb:341
- 63) Groups::TransferService#execute when transferring a subgroup into another group when transfering a group with nested groups and projects should update subgroups path
+ 63) Groups::TransferService#execute when transferring a subgroup into another group when transferring a group with nested groups and projects should update subgroups path
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/services/groups/transfer_service_spec.rb:363
- 64) Groups::TransferService#execute when transferring a subgroup into another group when transfering a group with nested groups and projects should update projects path
+ 64) Groups::TransferService#execute when transferring a subgroup into another group when transferring a group with nested groups and projects should update projects path
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/services/groups/transfer_service_spec.rb:375
- 65) Groups::TransferService#execute when transferring a subgroup into another group when transfering a group with nested groups and projects should create redirect for the subgroups and projects
+ 65) Groups::TransferService#execute when transferring a subgroup into another group when transferring a group with nested groups and projects should create redirect for the subgroups and projects
# around hook at ./spec/spec_helper.rb:190 did not execute the example
# ./spec/services/groups/transfer_service_spec.rb:383
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index b79e6e0fe7b..c7008c780d6 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -6,21 +6,17 @@ import GfmAutoComplete from '~/gfm_auto_complete';
import 'vendor/jquery.caret';
import 'vendor/jquery.atwho';
-import { TEST_HOST } from 'helpers/test_constants';
-import labelsFixture from 'fixtures/autocomplete_sources/labels.json'; // eslint-disable-line import/no-unresolved
-
describe('GfmAutoComplete', () => {
const gfmAutoCompleteCallbacks = GfmAutoComplete.prototype.getDefaultCallbacks.call({
fetchData: () => {},
});
let atwhoInstance;
+ let items;
let sorterValue;
describe('DefaultOptions.sorter', () => {
describe('assets loading', () => {
- let items;
-
beforeEach(() => {
jest.spyOn(GfmAutoComplete, 'isLoading').mockReturnValue(true);
@@ -65,7 +61,7 @@ describe('GfmAutoComplete', () => {
atwhoInstance = { setting: {} };
const query = 'query';
- const items = [];
+ items = [];
const searchKey = 'searchKey';
gfmAutoCompleteCallbacks.sorter.call(atwhoInstance, query, items, searchKey);
@@ -254,90 +250,4 @@ describe('GfmAutoComplete', () => {
).toBe('<li><small>grp/proj#5</small> Some Issue</li>');
});
});
-
- describe('labels', () => {
- const dataSources = {
- labels: `${TEST_HOST}/autocomplete_sources/labels`,
- };
-
- const allLabels = labelsFixture;
- const assignedLabels = allLabels.filter(label => label.set);
- const unassignedLabels = allLabels.filter(label => !label.set);
-
- let autocomplete;
- let $textarea;
-
- beforeEach(() => {
- autocomplete = new GfmAutoComplete(dataSources);
- $textarea = $('<textarea></textarea>');
- autocomplete.setup($textarea, { labels: true });
- });
-
- afterEach(() => {
- autocomplete.destroy();
- });
-
- const triggerDropdown = text => {
- $textarea
- .trigger('focus')
- .val(text)
- .caret('pos', -1);
- $textarea.trigger('keyup');
-
- return new Promise(window.requestAnimationFrame);
- };
-
- const getDropdownItems = () => {
- const dropdown = document.getElementById('at-view-labels');
- const items = dropdown.getElementsByTagName('li');
- return [].map.call(items, item => item.textContent.trim());
- };
-
- const expectLabels = ({ input, output }) =>
- triggerDropdown(input).then(() => {
- expect(getDropdownItems()).toEqual(output.map(label => label.title));
- });
-
- describe('with no labels assigned', () => {
- beforeEach(() => {
- autocomplete.cachedData['~'] = [...unassignedLabels];
- });
-
- it.each`
- input | output
- ${'~'} | ${unassignedLabels}
- ${'/label ~'} | ${unassignedLabels}
- ${'/relabel ~'} | ${unassignedLabels}
- ${'/unlabel ~'} | ${[]}
- `('$input shows $output.length labels', expectLabels);
- });
-
- describe('with some labels assigned', () => {
- beforeEach(() => {
- autocomplete.cachedData['~'] = allLabels;
- });
-
- it.each`
- input | output
- ${'~'} | ${allLabels}
- ${'/label ~'} | ${unassignedLabels}
- ${'/relabel ~'} | ${allLabels}
- ${'/unlabel ~'} | ${assignedLabels}
- `('$input shows $output.length labels', expectLabels);
- });
-
- describe('with all labels assigned', () => {
- beforeEach(() => {
- autocomplete.cachedData['~'] = [...assignedLabels];
- });
-
- it.each`
- input | output
- ${'~'} | ${assignedLabels}
- ${'/label ~'} | ${[]}
- ${'/relabel ~'} | ${assignedLabels}
- ${'/unlabel ~'} | ${assignedLabels}
- `('$input shows $output.length labels', expectLabels);
- });
- });
});
diff --git a/spec/graphql/resolvers/metadata_resolver_spec.rb b/spec/graphql/resolvers/metadata_resolver_spec.rb
new file mode 100644
index 00000000000..e662ed127a5
--- /dev/null
+++ b/spec/graphql/resolvers/metadata_resolver_spec.rb
@@ -0,0 +1,11 @@
+require 'spec_helper'
+
+describe Resolvers::MetadataResolver do
+ include GraphqlHelpers
+
+ describe '#resolve' do
+ it 'returns version and revision' do
+ expect(resolve(described_class)).to eq(version: Gitlab::VERSION, revision: Gitlab.revision)
+ end
+ end
+end
diff --git a/spec/graphql/types/metadata_type_spec.rb b/spec/graphql/types/metadata_type_spec.rb
new file mode 100644
index 00000000000..55205bf5b6a
--- /dev/null
+++ b/spec/graphql/types/metadata_type_spec.rb
@@ -0,0 +1,5 @@
+require 'spec_helper'
+
+describe GitlabSchema.types['Metadata'] do
+ it { expect(described_class.graphql_name).to eq('Metadata') }
+end
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index e1df6f9811d..07c61ea7647 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -5,7 +5,7 @@ describe GitlabSchema.types['Query'] do
expect(described_class.graphql_name).to eq('Query')
end
- it { is_expected.to have_graphql_fields(:project, :echo) }
+ it { is_expected.to have_graphql_fields(:project, :echo, :metadata) }
describe 'project field' do
subject { described_class.fields['project'] }
@@ -20,4 +20,17 @@ describe GitlabSchema.types['Query'] do
is_expected.to require_graphql_authorizations(:read_project)
end
end
+
+ describe 'metadata field' do
+ subject { described_class.fields['metadata'] }
+
+ it 'returns metadata' do
+ is_expected.to have_graphql_type(Types::MetadataType)
+ is_expected.to have_graphql_resolver(Resolvers::MetadataResolver)
+ end
+
+ it 'authorizes with read_instance_metadata' do
+ is_expected.to require_graphql_authorizations(:read_instance_metadata)
+ end
+ end
end
diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb
index 23d7e41803e..03b4c19ec22 100644
--- a/spec/helpers/emails_helper_spec.rb
+++ b/spec/helpers/emails_helper_spec.rb
@@ -142,4 +142,58 @@ describe EmailsHelper do
end
end
end
+
+ describe 'header and footer messages' do
+ context 'when email_header_and_footer_enabled is enabled' do
+ it 'returns header and footer messages' do
+ create :appearance, header_message: 'Foo', footer_message: 'Bar', email_header_and_footer_enabled: true
+
+ aggregate_failures do
+ expect(html_header_message).to eq(%{<div class="header-message" style=""><p>Foo</p></div>})
+ expect(html_footer_message).to eq(%{<div class="footer-message" style=""><p>Bar</p></div>})
+ expect(text_header_message).to eq('Foo')
+ expect(text_footer_message).to eq('Bar')
+ end
+ end
+
+ context 'when header and footer messages are empty' do
+ it 'returns nil' do
+ create :appearance, header_message: '', footer_message: '', email_header_and_footer_enabled: true
+
+ aggregate_failures do
+ expect(html_header_message).to eq(nil)
+ expect(html_footer_message).to eq(nil)
+ expect(text_header_message).to eq(nil)
+ expect(text_footer_message).to eq(nil)
+ end
+ end
+ end
+
+ context 'when header and footer messages are nil' do
+ it 'returns nil' do
+ create :appearance, header_message: nil, footer_message: nil, email_header_and_footer_enabled: true
+
+ aggregate_failures do
+ expect(html_header_message).to eq(nil)
+ expect(html_footer_message).to eq(nil)
+ expect(text_header_message).to eq(nil)
+ expect(text_footer_message).to eq(nil)
+ end
+ end
+ end
+ end
+
+ context 'when email_header_and_footer_enabled is disabled' do
+ it 'returns header and footer messages' do
+ create :appearance, header_message: 'Foo', footer_message: 'Bar', email_header_and_footer_enabled: false
+
+ aggregate_failures do
+ expect(html_header_message).to eq(nil)
+ expect(html_footer_message).to eq(nil)
+ expect(text_header_message).to eq(nil)
+ expect(text_footer_message).to eq(nil)
+ end
+ end
+ end
+ end
end
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index e0e8ebd0c3c..db0d45c3692 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -36,10 +36,11 @@ describe PreferencesHelper do
end
describe '#first_day_of_week_choices' do
- it 'returns Sunday and Monday as choices' do
+ it 'returns Saturday, Sunday and Monday as choices' do
expect(helper.first_day_of_week_choices).to eq [
['Sunday', 0],
- ['Monday', 1]
+ ['Monday', 1],
+ ['Saturday', 6]
]
end
end
@@ -47,14 +48,21 @@ describe PreferencesHelper do
describe '#first_day_of_week_choices_with_default' do
it 'returns choices including system default' do
expect(helper.first_day_of_week_choices_with_default).to eq [
- ['System default (Sunday)', nil], ['Sunday', 0], ['Monday', 1]
+ ['System default (Sunday)', nil], ['Sunday', 0], ['Monday', 1], ['Saturday', 6]
]
end
it 'returns choices including system default set to Monday' do
stub_application_setting(first_day_of_week: 1)
expect(helper.first_day_of_week_choices_with_default).to eq [
- ['System default (Monday)', nil], ['Sunday', 0], ['Monday', 1]
+ ['System default (Monday)', nil], ['Sunday', 0], ['Monday', 1], ['Saturday', 6]
+ ]
+ end
+
+ it 'returns choices including system default set to Saturday' do
+ stub_application_setting(first_day_of_week: 6)
+ expect(helper.first_day_of_week_choices_with_default).to eq [
+ ['System default (Saturday)', nil], ['Sunday', 0], ['Monday', 1], ['Saturday', 6]
]
end
end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 49895b0680b..291eafece94 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -3,6 +3,56 @@ require 'spec_helper'
describe ProjectsHelper do
include ProjectForksHelper
+ describe '#error_tracking_setting_project_json' do
+ let(:project) { create(:project) }
+
+ context 'error tracking setting does not exist' do
+ before do
+ helper.instance_variable_set(:@project, project)
+ end
+
+ it 'returns nil' do
+ expect(helper.error_tracking_setting_project_json).to be_nil
+ end
+ end
+
+ context 'error tracking setting exists' do
+ let!(:error_tracking_setting) { create(:project_error_tracking_setting, project: project) }
+
+ context 'api_url present' do
+ let(:json) do
+ {
+ name: error_tracking_setting.project_name,
+ organization_name: error_tracking_setting.organization_name,
+ organization_slug: error_tracking_setting.organization_slug,
+ slug: error_tracking_setting.project_slug
+ }.to_json
+ end
+
+ before do
+ helper.instance_variable_set(:@project, project)
+ end
+
+ it 'returns error tracking json' do
+ expect(helper.error_tracking_setting_project_json).to eq(json)
+ end
+ end
+
+ context 'api_url not present' do
+ before do
+ project.error_tracking_setting.api_url = nil
+ project.error_tracking_setting.enabled = false
+
+ helper.instance_variable_set(:@project, project)
+ end
+
+ it 'returns nil' do
+ expect(helper.error_tracking_setting_project_json).to be_nil
+ end
+ end
+ end
+ end
+
describe "#project_status_css_class" do
it "returns appropriate class" do
expect(project_status_css_class("started")).to eq("table-active")
diff --git a/spec/javascripts/api_spec.js b/spec/javascripts/api_spec.js
index 1e9470970ff..e537e0e8afc 100644
--- a/spec/javascripts/api_spec.js
+++ b/spec/javascripts/api_spec.js
@@ -139,6 +139,40 @@ describe('Api', () => {
});
});
+ describe('projectMergeRequests', () => {
+ const projectPath = 'abc';
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests`;
+
+ it('fetches all merge requests for a project', done => {
+ const mockData = [{ source_branch: 'foo' }, { source_branch: 'bar' }];
+ mock.onGet(expectedUrl).reply(200, mockData);
+ Api.projectMergeRequests(projectPath)
+ .then(({ data }) => {
+ expect(data.length).toEqual(2);
+ expect(data[0].source_branch).toBe('foo');
+ expect(data[1].source_branch).toBe('bar');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('fetches merge requests filtered with passed params', done => {
+ const params = {
+ source_branch: 'bar',
+ };
+ const mockData = [{ source_branch: 'bar' }];
+ mock.onGet(expectedUrl, { params }).reply(200, mockData);
+
+ Api.projectMergeRequests(projectPath, params)
+ .then(({ data }) => {
+ expect(data.length).toEqual(1);
+ expect(data[0].source_branch).toBe('bar');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
describe('projectMergeRequest', () => {
it('fetches a merge request', done => {
const projectPath = 'abc';
diff --git a/spec/javascripts/awards_handler_spec.js b/spec/javascripts/awards_handler_spec.js
index ce5d2022441..e5b5707dcef 100644
--- a/spec/javascripts/awards_handler_spec.js
+++ b/spec/javascripts/awards_handler_spec.js
@@ -1,12 +1,16 @@
import $ from 'jquery';
import Cookies from 'js-cookie';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
import loadAwardsHandler from '~/awards_handler';
import '~/lib/utils/common_utils';
+import { EMOJI_VERSION } from '~/emoji';
window.gl = window.gl || {};
window.gon = window.gon || {};
let openAndWaitForEmojiMenu;
+let mock;
let awardsHandler = null;
const urlRoot = gon.relative_url_root;
@@ -19,8 +23,13 @@ const lazyAssert = function(done, assertFn) {
};
describe('AwardsHandler', function() {
+ const emojiData = getJSONFixture('emojis/emojis.json');
preloadFixtures('snippets/show.html.raw');
+
beforeEach(function(done) {
+ mock = new MockAdapter(axios);
+ mock.onGet(`/-/emojis/${EMOJI_VERSION}/emojis.json`).reply(200, emojiData);
+
loadFixtures('snippets/show.html.raw');
loadAwardsHandler(true)
.then(obj => {
@@ -53,6 +62,8 @@ describe('AwardsHandler', function() {
// restore original url root value
gon.relative_url_root = urlRoot;
+ mock.restore();
+
// Undo what we did to the shared <body>
$('body').removeAttr('data-page');
diff --git a/spec/javascripts/badges/store/actions_spec.js b/spec/javascripts/badges/store/actions_spec.js
index 2623465ebd6..e8d5f8c3aac 100644
--- a/spec/javascripts/badges/store/actions_spec.js
+++ b/spec/javascripts/badges/store/actions_spec.js
@@ -411,7 +411,7 @@ describe('Badges store actions', () => {
it('escapes user input', done => {
spyOn(axios, 'get').and.callFake(() => Promise.resolve({ data: createDummyBadgeResponse() }));
- badgeInForm.imageUrl = '&make-sandwhich=true';
+ badgeInForm.imageUrl = '&make-sandwich=true';
badgeInForm.linkUrl = '<script>I am dangerous!</script>';
actions
@@ -422,7 +422,7 @@ describe('Badges store actions', () => {
expect(url).toMatch(`^${dummyEndpointUrl}/render?`);
expect(url).toMatch('\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&');
- expect(url).toMatch('&image_url=%26make-sandwhich%3Dtrue$');
+ expect(url).toMatch('&image_url=%26make-sandwich%3Dtrue$');
})
.then(done)
.catch(done.fail);
diff --git a/spec/javascripts/behaviors/copy_as_gfm_spec.js b/spec/javascripts/behaviors/copy_as_gfm_spec.js
index ca849f75860..d653fca0988 100644
--- a/spec/javascripts/behaviors/copy_as_gfm_spec.js
+++ b/spec/javascripts/behaviors/copy_as_gfm_spec.js
@@ -100,7 +100,7 @@ describe('CopyAsGFM', () => {
simulateCopy();
setTimeout(() => {
- const expectedGFM = '* List Item1\n\n* List Item2';
+ const expectedGFM = '* List Item1\n* List Item2';
expect(clipboardData.setData).toHaveBeenCalledWith('text/x-gfm', expectedGFM);
done();
@@ -114,7 +114,7 @@ describe('CopyAsGFM', () => {
simulateCopy();
setTimeout(() => {
- const expectedGFM = '1. List Item1\n\n1. List Item2';
+ const expectedGFM = '1. List Item1\n1. List Item2';
expect(clipboardData.setData).toHaveBeenCalledWith('text/x-gfm', expectedGFM);
done();
diff --git a/spec/javascripts/boards/components/issue_due_date_spec.js b/spec/javascripts/boards/components/issue_due_date_spec.js
index 054cf8c5b7d..68e26b68f04 100644
--- a/spec/javascripts/boards/components/issue_due_date_spec.js
+++ b/spec/javascripts/boards/components/issue_due_date_spec.js
@@ -43,7 +43,7 @@ describe('Issue Due Date component', () => {
date.setDate(date.getDate() + 5);
vm = createComponent(date);
- expect(vm.$el.querySelector('time').textContent.trim()).toEqual(dateFormat(date, 'dddd', true));
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual(dateFormat(date, 'dddd'));
});
it('should render month and day for other dates', () => {
@@ -53,7 +53,7 @@ describe('Issue Due Date component', () => {
const isDueInCurrentYear = today.getFullYear() === date.getFullYear();
const format = isDueInCurrentYear ? 'mmm d' : 'mmm d, yyyy';
- expect(vm.$el.querySelector('time').textContent.trim()).toEqual(dateFormat(date, format, true));
+ expect(vm.$el.querySelector('time').textContent.trim()).toEqual(dateFormat(date, format));
});
it('should contain the correct `.text-danger` css class for overdue issue', () => {
diff --git a/spec/javascripts/clusters/components/application_row_spec.js b/spec/javascripts/clusters/components/application_row_spec.js
index 8cb9713964e..a2dd4e93daf 100644
--- a/spec/javascripts/clusters/components/application_row_spec.js
+++ b/spec/javascripts/clusters/components/application_row_spec.js
@@ -230,7 +230,7 @@ describe('Application Row', () => {
expect(upgradeBtn.innerHTML).toContain('Upgrade');
});
- it('has enabled "Retry upgrade" when APPLICATION_STATUS.UPDATE_ERRORED', () => {
+ it('has enabled "Retry update" when APPLICATION_STATUS.UPDATE_ERRORED', () => {
vm = mountComponent(ApplicationRow, {
...DEFAULT_APPLICATION_STATE,
status: APPLICATION_STATUS.UPDATE_ERRORED,
@@ -239,10 +239,10 @@ describe('Application Row', () => {
expect(upgradeBtn).not.toBe(null);
expect(vm.upgradeFailed).toBe(true);
- expect(upgradeBtn.innerHTML).toContain('Retry upgrade');
+ expect(upgradeBtn.innerHTML).toContain('Retry update');
});
- it('has disabled "Retry upgrade" when APPLICATION_STATUS.UPDATING', () => {
+ it('has disabled "Updating" when APPLICATION_STATUS.UPDATING', () => {
vm = mountComponent(ApplicationRow, {
...DEFAULT_APPLICATION_STATE,
status: APPLICATION_STATUS.UPDATING,
@@ -251,7 +251,7 @@ describe('Application Row', () => {
expect(upgradeBtn).not.toBe(null);
expect(vm.isUpgrading).toBe(true);
- expect(upgradeBtn.innerHTML).toContain('Upgrading');
+ expect(upgradeBtn.innerHTML).toContain('Updating');
});
it('clicking upgrade button emits event', () => {
@@ -295,7 +295,7 @@ describe('Application Row', () => {
expect(failureMessage).not.toBe(null);
expect(failureMessage.innerHTML).toContain(
- 'Something went wrong when upgrading GitLab Runner. Please check the logs and try again.',
+ 'Update failed. Please check the logs and try again.',
);
});
});
diff --git a/spec/javascripts/clusters/components/applications_spec.js b/spec/javascripts/clusters/components/applications_spec.js
index 14ef1193984..8daf0282184 100644
--- a/spec/javascripts/clusters/components/applications_spec.js
+++ b/spec/javascripts/clusters/components/applications_spec.js
@@ -1,7 +1,9 @@
import Vue from 'vue';
import applications from '~/clusters/components/applications.vue';
import { CLUSTER_TYPE } from '~/clusters/constants';
+import eventHub from '~/clusters/event_hub';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import { APPLICATIONS_MOCK_STATE } from '../services/mock_data';
describe('Applications', () => {
let vm;
@@ -18,16 +20,8 @@ describe('Applications', () => {
describe('Project cluster applications', () => {
beforeEach(() => {
vm = mountComponent(Applications, {
+ applications: APPLICATIONS_MOCK_STATE,
type: CLUSTER_TYPE.PROJECT,
- applications: {
- helm: { title: 'Helm Tiller' },
- ingress: { title: 'Ingress' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub' },
- knative: { title: 'Knative' },
- },
});
});
@@ -64,15 +58,7 @@ describe('Applications', () => {
beforeEach(() => {
vm = mountComponent(Applications, {
type: CLUSTER_TYPE.GROUP,
- applications: {
- helm: { title: 'Helm Tiller' },
- ingress: { title: 'Ingress' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub' },
- knative: { title: 'Knative' },
- },
+ applications: APPLICATIONS_MOCK_STATE,
});
});
@@ -111,17 +97,12 @@ describe('Applications', () => {
it('renders ip address with a clipboard button', () => {
vm = mountComponent(Applications, {
applications: {
+ ...APPLICATIONS_MOCK_STATE,
ingress: {
title: 'Ingress',
status: 'installed',
externalIp: '0.0.0.0',
},
- helm: { title: 'Helm Tiller' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '' },
- knative: { title: 'Knative', hostname: '' },
},
});
@@ -137,16 +118,11 @@ describe('Applications', () => {
it('renders an input text with a question mark and an alert text', () => {
vm = mountComponent(Applications, {
applications: {
+ ...APPLICATIONS_MOCK_STATE,
ingress: {
title: 'Ingress',
status: 'installed',
},
- helm: { title: 'Helm Tiller' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '' },
- knative: { title: 'Knative', hostname: '' },
},
});
@@ -160,15 +136,7 @@ describe('Applications', () => {
describe('before installing', () => {
it('does not render the IP address', () => {
vm = mountComponent(Applications, {
- applications: {
- helm: { title: 'Helm Tiller' },
- ingress: { title: 'Ingress' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '' },
- knative: { title: 'Knative', hostname: '' },
- },
+ applications: APPLICATIONS_MOCK_STATE,
});
expect(vm.$el.textContent).not.toContain('Ingress IP Address');
@@ -181,17 +149,12 @@ describe('Applications', () => {
it('renders email & allows editing', () => {
vm = mountComponent(Applications, {
applications: {
- helm: { title: 'Helm Tiller', status: 'installed' },
- ingress: { title: 'Ingress', status: 'installed', externalIp: '1.1.1.1' },
+ ...APPLICATIONS_MOCK_STATE,
cert_manager: {
title: 'Cert-Manager',
email: 'before@example.com',
status: 'installable',
},
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
- knative: { title: 'Knative', hostname: '', status: 'installable' },
},
});
@@ -204,17 +167,12 @@ describe('Applications', () => {
it('renders email in readonly', () => {
vm = mountComponent(Applications, {
applications: {
- helm: { title: 'Helm Tiller', status: 'installed' },
- ingress: { title: 'Ingress', status: 'installed', externalIp: '1.1.1.1' },
+ ...APPLICATIONS_MOCK_STATE,
cert_manager: {
title: 'Cert-Manager',
email: 'after@example.com',
status: 'installed',
},
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
- knative: { title: 'Knative', hostname: '', status: 'installable' },
},
});
@@ -229,13 +187,12 @@ describe('Applications', () => {
it('renders hostname active input', () => {
vm = mountComponent(Applications, {
applications: {
- helm: { title: 'Helm Tiller', status: 'installed' },
- ingress: { title: 'Ingress', status: 'installed', externalIp: '1.1.1.1' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
- knative: { title: 'Knative', hostname: '', status: 'installable' },
+ ...APPLICATIONS_MOCK_STATE,
+ ingress: {
+ title: 'Ingress',
+ status: 'installed',
+ externalIp: '1.1.1.1',
+ },
},
});
@@ -247,13 +204,8 @@ describe('Applications', () => {
it('does not render hostname input', () => {
vm = mountComponent(Applications, {
applications: {
- helm: { title: 'Helm Tiller', status: 'installed' },
+ ...APPLICATIONS_MOCK_STATE,
ingress: { title: 'Ingress', status: 'installed' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '', status: 'installable' },
- knative: { title: 'Knative', hostname: '', status: 'installable' },
},
});
@@ -265,13 +217,9 @@ describe('Applications', () => {
it('renders readonly input', () => {
vm = mountComponent(Applications, {
applications: {
- helm: { title: 'Helm Tiller', status: 'installed' },
+ ...APPLICATIONS_MOCK_STATE,
ingress: { title: 'Ingress', status: 'installed', externalIp: '1.1.1.1' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
jupyter: { title: 'JupyterHub', status: 'installed', hostname: '' },
- knative: { title: 'Knative', status: 'installed', hostname: '' },
},
});
@@ -282,15 +230,7 @@ describe('Applications', () => {
describe('without ingress installed', () => {
beforeEach(() => {
vm = mountComponent(Applications, {
- applications: {
- helm: { title: 'Helm Tiller' },
- ingress: { title: 'Ingress' },
- cert_manager: { title: 'Cert-Manager' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', status: 'not_installable' },
- knative: { title: 'Knative' },
- },
+ applications: APPLICATIONS_MOCK_STATE,
});
});
@@ -310,4 +250,77 @@ describe('Applications', () => {
});
});
});
+
+ describe('Knative application', () => {
+ describe('when installed', () => {
+ describe('with ip address', () => {
+ const props = {
+ applications: {
+ ...APPLICATIONS_MOCK_STATE,
+ knative: {
+ title: 'Knative',
+ hostname: 'example.com',
+ status: 'installed',
+ externalIp: '1.1.1.1',
+ },
+ },
+ };
+ it('renders ip address with a clipboard button', () => {
+ vm = mountComponent(Applications, props);
+
+ expect(vm.$el.querySelector('.js-knative-ip-address').value).toEqual('1.1.1.1');
+
+ expect(
+ vm.$el
+ .querySelector('.js-knative-ip-clipboard-btn')
+ .getAttribute('data-clipboard-text'),
+ ).toEqual('1.1.1.1');
+ });
+
+ it('renders domain & allows editing', () => {
+ expect(vm.$el.querySelector('.js-knative-domainname').value).toEqual('example.com');
+ expect(vm.$el.querySelector('.js-knative-domainname').getAttribute('readonly')).toBe(
+ null,
+ );
+ });
+
+ it('renders an update/save Knative domain button', () => {
+ expect(vm.$el.querySelector('.js-knative-save-domain-button')).not.toBe(null);
+ });
+
+ it('emits event when clicking Save changes button', () => {
+ spyOn(eventHub, '$emit');
+ vm = mountComponent(Applications, props);
+
+ const saveButton = vm.$el.querySelector('.js-knative-save-domain-button');
+
+ saveButton.click();
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('saveKnativeDomain', {
+ id: 'knative',
+ params: { hostname: 'example.com' },
+ });
+ });
+ });
+
+ describe('without ip address', () => {
+ it('renders an input text with a question mark and an alert text', () => {
+ vm = mountComponent(Applications, {
+ applications: {
+ ...APPLICATIONS_MOCK_STATE,
+ knative: {
+ title: 'Knative',
+ hostname: 'example.com',
+ status: 'installed',
+ },
+ },
+ });
+
+ expect(vm.$el.querySelector('.js-knative-ip-address').value).toEqual('?');
+
+ expect(vm.$el.querySelector('.js-no-knative-ip-message')).not.toBe(null);
+ });
+ });
+ });
+ });
});
diff --git a/spec/javascripts/clusters/services/mock_data.js b/spec/javascripts/clusters/services/mock_data.js
index 3c3d9977ffb..3ace19c6401 100644
--- a/spec/javascripts/clusters/services/mock_data.js
+++ b/spec/javascripts/clusters/services/mock_data.js
@@ -115,4 +115,14 @@ const DEFAULT_APPLICATION_STATE = {
requestReason: null,
};
-export { CLUSTERS_MOCK_DATA, DEFAULT_APPLICATION_STATE };
+const APPLICATIONS_MOCK_STATE = {
+ helm: { title: 'Helm Tiller', status: 'installable' },
+ ingress: { title: 'Ingress', status: 'installable' },
+ cert_manager: { title: 'Cert-Manager', status: 'installable' },
+ runner: { title: 'GitLab Runner' },
+ prometheus: { title: 'Prometheus' },
+ jupyter: { title: 'JupyterHub', status: 'installable', hostname: '' },
+ knative: { title: 'Knative ', status: 'installable', hostname: '' },
+};
+
+export { CLUSTERS_MOCK_DATA, DEFAULT_APPLICATION_STATE, APPLICATIONS_MOCK_STATE };
diff --git a/spec/javascripts/clusters/stores/clusters_store_spec.js b/spec/javascripts/clusters/stores/clusters_store_spec.js
index 37a4d6614f6..09bcdf91d91 100644
--- a/spec/javascripts/clusters/stores/clusters_store_spec.js
+++ b/spec/javascripts/clusters/stores/clusters_store_spec.js
@@ -111,6 +111,7 @@ describe('Clusters Store', () => {
requestStatus: null,
requestReason: null,
hostname: null,
+ isEditingHostName: false,
externalIp: null,
},
cert_manager: {
diff --git a/spec/javascripts/diffs/components/app_spec.js b/spec/javascripts/diffs/components/app_spec.js
index bce6113f75a..d81c433cca6 100644
--- a/spec/javascripts/diffs/components/app_spec.js
+++ b/spec/javascripts/diffs/components/app_spec.js
@@ -1,11 +1,19 @@
import Vuex from 'vuex';
import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { GlLoadingIcon } from '@gitlab/ui';
import { TEST_HOST } from 'spec/test_constants';
import App from '~/diffs/components/app.vue';
import NoChanges from '~/diffs/components/no_changes.vue';
import DiffFile from '~/diffs/components/diff_file.vue';
import Mousetrap from 'mousetrap';
+import CompareVersions from '~/diffs/components/compare_versions.vue';
+import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
+import CommitWidget from '~/diffs/components/commit_widget.vue';
+import TreeList from '~/diffs/components/tree_list.vue';
import createDiffsStore from '../create_diffs_store';
+import diffsMockData from '../mock_data/merge_request_diffs';
+
+const mergeRequestDiff = { version_index: 1 };
describe('diffs/components/app', () => {
const oldMrTabs = window.mrTabs;
@@ -49,6 +57,21 @@ describe('diffs/components/app', () => {
wrapper.destroy();
});
+ it('displays loading icon on loading', () => {
+ createComponent({}, ({ state }) => {
+ state.diffs.isLoading = true;
+ });
+
+ expect(wrapper.contains(GlLoadingIcon)).toBe(true);
+ });
+
+ it('displays diffs container when not loading', () => {
+ createComponent();
+
+ expect(wrapper.contains(GlLoadingIcon)).toBe(false);
+ expect(wrapper.contains('#diffs')).toBe(true);
+ });
+
it('does not show commit info', () => {
createComponent();
@@ -134,8 +157,8 @@ describe('diffs/components/app', () => {
});
it('does not render empty state when diff files exist', () => {
- createComponent({}, () => {
- store.state.diffs.diffFiles.push({
+ createComponent({}, ({ state }) => {
+ state.diffs.diffFiles.push({
id: 1,
});
});
@@ -145,9 +168,9 @@ describe('diffs/components/app', () => {
});
it('does not render empty state when versions match', () => {
- createComponent({}, () => {
- store.state.diffs.startVersion = { version_index: 1 };
- store.state.diffs.mergeRequestDiff = { version_index: 1 };
+ createComponent({}, ({ state }) => {
+ state.diffs.startVersion = mergeRequestDiff;
+ state.diffs.mergeRequestDiff = mergeRequestDiff;
});
expect(wrapper.contains(NoChanges)).toBe(false);
@@ -307,4 +330,71 @@ describe('diffs/components/app', () => {
.catch(done.fail);
});
});
+
+ describe('diffs', () => {
+ it('should render compare versions component', () => {
+ createComponent({}, ({ state }) => {
+ state.diffs.mergeRequestDiffs = diffsMockData;
+ state.diffs.targetBranchName = 'target-branch';
+ state.diffs.mergeRequestDiff = mergeRequestDiff;
+ });
+
+ expect(wrapper.contains(CompareVersions)).toBe(true);
+ expect(wrapper.find(CompareVersions).props()).toEqual(
+ jasmine.objectContaining({
+ targetBranch: {
+ branchName: 'target-branch',
+ versionIndex: -1,
+ path: '',
+ },
+ mergeRequestDiffs: diffsMockData,
+ mergeRequestDiff,
+ }),
+ );
+ });
+
+ it('should render hidden files warning if render overflow warning is present', () => {
+ createComponent({}, ({ state }) => {
+ state.diffs.renderOverflowWarning = true;
+ state.diffs.realSize = '5';
+ state.diffs.plainDiffPath = 'plain diff path';
+ state.diffs.emailPatchPath = 'email patch path';
+ state.diffs.size = 1;
+ });
+
+ expect(wrapper.contains(HiddenFilesWarning)).toBe(true);
+ expect(wrapper.find(HiddenFilesWarning).props()).toEqual(
+ jasmine.objectContaining({
+ total: '5',
+ plainDiffPath: 'plain diff path',
+ emailPatchPath: 'email patch path',
+ visible: 1,
+ }),
+ );
+ });
+
+ it('should display commit widget if store has a commit', () => {
+ createComponent({}, () => {
+ store.state.diffs.commit = {
+ author: 'John Doe',
+ };
+ });
+
+ expect(wrapper.contains(CommitWidget)).toBe(true);
+ });
+
+ it('should display diff file if there are diff files', () => {
+ createComponent({}, ({ state }) => {
+ state.diffs.diffFiles.push({ sha: '123' });
+ });
+
+ expect(wrapper.contains(DiffFile)).toBe(true);
+ });
+
+ it('should render tree list', () => {
+ createComponent();
+
+ expect(wrapper.find(TreeList).exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/javascripts/diffs/components/changed_files_dropdown_spec.js b/spec/javascripts/diffs/components/changed_files_dropdown_spec.js
deleted file mode 100644
index 7237274eb43..00000000000
--- a/spec/javascripts/diffs/components/changed_files_dropdown_spec.js
+++ /dev/null
@@ -1 +0,0 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
diff --git a/spec/javascripts/diffs/components/compare_versions_dropdown_spec.js b/spec/javascripts/diffs/components/compare_versions_dropdown_spec.js
index 53b9ac22fc0..8a3834d542f 100644
--- a/spec/javascripts/diffs/components/compare_versions_dropdown_spec.js
+++ b/spec/javascripts/diffs/components/compare_versions_dropdown_spec.js
@@ -1,34 +1,161 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
import { shallowMount, createLocalVue } from '@vue/test-utils';
import CompareVersionsDropdown from '~/diffs/components/compare_versions_dropdown.vue';
import diffsMockData from '../mock_data/merge_request_diffs';
+import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+
+const localVue = createLocalVue();
+const targetBranch = { branchName: 'tmp-wine-dev', versionIndex: -1 };
+const startVersion = { version_index: 4 };
+const mergeRequestVersion = {
+ version_path: '123',
+};
+const baseVersionPath = '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37';
describe('CompareVersionsDropdown', () => {
let wrapper;
- const targetBranch = { branchName: 'tmp-wine-dev', versionIndex: -1 };
- const factory = (options = {}) => {
- const localVue = createLocalVue();
+ const findSelectedVersion = () => wrapper.find('.dropdown-menu-toggle');
+ const findVersionsListElements = () => wrapper.findAll('li');
+ const findLinkElement = index =>
+ findVersionsListElements()
+ .at(index)
+ .find('a');
+ const findLastLink = () => findLinkElement(findVersionsListElements().length - 1);
- wrapper = shallowMount(CompareVersionsDropdown, { localVue, ...options });
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(localVue.extend(CompareVersionsDropdown), {
+ localVue,
+ sync: false,
+ propsData: { ...props },
+ });
};
afterEach(() => {
wrapper.destroy();
});
- it('should render a correct base version link', () => {
- factory({
- propsData: {
- baseVersionPath: '/gnuwget/wget2/merge_requests/6/diffs?diff_id=37',
+ describe('selected version name', () => {
+ it('shows latest version when latest is selected', () => {
+ createComponent({
+ mergeRequestVersion,
+ startVersion,
+ otherVersions: diffsMockData,
+ });
+
+ expect(findSelectedVersion().text()).toBe('latest version');
+ });
+
+ it('shows target branch name for base branch', () => {
+ createComponent({
+ targetBranch,
+ });
+
+ expect(findSelectedVersion().text()).toBe('tmp-wine-dev');
+ });
+
+ it('shows correct version for non-base and non-latest branches', () => {
+ createComponent({
+ startVersion,
+ targetBranch,
+ });
+
+ expect(findSelectedVersion().text()).toBe(`version ${startVersion.version_index}`);
+ });
+ });
+
+ describe('target versions list', () => {
+ it('should have the same length as otherVersions if merge request version is present', () => {
+ createComponent({
+ mergeRequestVersion,
+ otherVersions: diffsMockData,
+ });
+
+ expect(findVersionsListElements().length).toEqual(diffsMockData.length);
+ });
+
+ it('should have an otherVersions length plus 1 if no merge request version is present', () => {
+ createComponent({
+ targetBranch,
+ otherVersions: diffsMockData,
+ });
+
+ expect(findVersionsListElements().length).toEqual(diffsMockData.length + 1);
+ });
+
+ it('should have base branch link as active on base branch', () => {
+ createComponent({
+ targetBranch,
+ otherVersions: diffsMockData,
+ });
+
+ expect(findLastLink().classes()).toContain('is-active');
+ });
+
+ it('should have correct branch link as active if start version present', () => {
+ createComponent({
+ targetBranch,
+ startVersion,
+ otherVersions: diffsMockData,
+ });
+
+ expect(findLinkElement(0).classes()).toContain('is-active');
+ });
+
+ it('should render a correct base version link', () => {
+ createComponent({
+ baseVersionPath,
otherVersions: diffsMockData.slice(1),
targetBranch,
- },
+ });
+
+ expect(findLastLink().attributes('href')).toEqual(baseVersionPath);
+ expect(findLastLink().text()).toContain('(base)');
+ });
+
+ it('should not render commits count if no showCommitsCount is passed', () => {
+ createComponent({
+ otherVersions: diffsMockData,
+ targetBranch,
+ });
+
+ const commitsCount = diffsMockData[0].commits_count;
+
+ expect(findLinkElement(0).text()).not.toContain(`${commitsCount} commit`);
+ });
+
+ it('should render correct commits count if showCommitsCount is passed', () => {
+ createComponent({
+ otherVersions: diffsMockData,
+ targetBranch,
+ showCommitCount: true,
+ });
+
+ const commitsCount = diffsMockData[0].commits_count;
+
+ expect(findLinkElement(0).text()).toContain(`${commitsCount} commit`);
+ });
+
+ it('should render correct commit sha', () => {
+ createComponent({
+ otherVersions: diffsMockData,
+ targetBranch,
+ });
+
+ const commitShaElement = findLinkElement(0).find('.commit-sha');
+
+ expect(commitShaElement.text()).toBe(diffsMockData[0].short_commit_sha);
});
- const links = wrapper.findAll('a');
- const lastLink = links.wrappers[links.length - 1];
+ it('should render correct time-ago ', () => {
+ createComponent({
+ otherVersions: diffsMockData,
+ targetBranch,
+ });
+
+ const timeAgoElement = findLinkElement(0).find(TimeAgo);
- expect(lastLink.attributes('href')).toEqual(wrapper.props('baseVersionPath'));
+ expect(timeAgoElement.exists()).toBe(true);
+ expect(timeAgoElement.props('time')).toBe(diffsMockData[0].created_at);
+ });
});
});
diff --git a/spec/javascripts/diffs/components/diff_content_spec.js b/spec/javascripts/diffs/components/diff_content_spec.js
index a1bb51963d6..bc9288e4150 100644
--- a/spec/javascripts/diffs/components/diff_content_spec.js
+++ b/spec/javascripts/diffs/components/diff_content_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import DiffContentComponent from '~/diffs/components/diff_content.vue';
-import { createStore } from '~/mr_notes/stores';
+import { createStore } from 'ee_else_ce/mr_notes/stores';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import { GREEN_BOX_IMAGE_URL, RED_BOX_IMAGE_URL } from 'spec/test_constants';
import '~/behaviors/markdown/render_gfm';
diff --git a/spec/javascripts/diffs/components/diff_file_header_spec.js b/spec/javascripts/diffs/components/diff_file_header_spec.js
index 005a4751ea1..66c5b17b825 100644
--- a/spec/javascripts/diffs/components/diff_file_header_spec.js
+++ b/spec/javascripts/diffs/components/diff_file_header_spec.js
@@ -23,6 +23,9 @@ describe('diff_file_header', () => {
});
beforeEach(() => {
+ gon.features = {
+ expandDiffFullFile: true,
+ };
const diffFile = diffDiscussionMock.diff_file;
diffFile.added_lines = 2;
@@ -382,7 +385,7 @@ describe('diff_file_header', () => {
props.diffFile.edit_path = '/';
vm = mountComponentWithStore(Component, { props, store });
- expect(vm.$el.querySelector('.js-edit-blob')).toContainText('Edit');
+ expect(vm.$el.querySelector('.js-edit-blob')).not.toBe(null);
});
it('should not show edit button when file is deleted', () => {
@@ -491,5 +494,151 @@ describe('diff_file_header', () => {
});
});
});
+
+ describe('file actions', () => {
+ it('should not render if diff file has a submodule', () => {
+ props.diffFile.submodule = 'submodule';
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.file-actions')).toEqual(null);
+ });
+
+ it('should not render if add merge request buttons is false', () => {
+ props.addMergeRequestButtons = false;
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.file-actions')).toEqual(null);
+ });
+
+ describe('with add merge request buttons enabled', () => {
+ beforeEach(() => {
+ props.addMergeRequestButtons = true;
+ props.diffFile.edit_path = 'edit-path';
+ });
+
+ const viewReplacedFileButton = () => vm.$el.querySelector('.js-view-replaced-file');
+ const viewFileButton = () => vm.$el.querySelector('.js-view-file-button');
+ const externalUrl = () => vm.$el.querySelector('.js-external-url');
+
+ it('should render if add merge request buttons is true and diff file does not have a submodule', () => {
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.file-actions')).not.toEqual(null);
+ });
+
+ it('should not render view replaced file button if no replaced view path is present', () => {
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(viewReplacedFileButton()).toEqual(null);
+ });
+
+ it('should render view replaced file button if replaced view path is present', () => {
+ props.diffFile.replaced_view_path = 'replaced-view-path';
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(viewReplacedFileButton()).not.toEqual(null);
+ expect(viewReplacedFileButton().getAttribute('href')).toBe('replaced-view-path');
+ });
+
+ it('should render correct file view button path', () => {
+ props.diffFile.view_path = 'view-path';
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(viewFileButton().getAttribute('href')).toBe('view-path');
+ });
+
+ it('should not render external url view link if diff file has no external url', () => {
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(externalUrl()).toEqual(null);
+ });
+
+ it('should render external url view link if diff file has external url', () => {
+ props.diffFile.external_url = 'external_url';
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(externalUrl()).not.toEqual(null);
+ expect(externalUrl().getAttribute('href')).toBe('external_url');
+ });
+ });
+
+ describe('without file blob', () => {
+ beforeEach(() => {
+ props.diffFile.blob = null;
+ props.addMergeRequestButtons = true;
+ vm = mountComponentWithStore(Component, { props, store });
+ });
+
+ it('should not render toggle discussions button', () => {
+ expect(vm.$el.querySelector('.js-btn-vue-toggle-comments')).toEqual(null);
+ });
+
+ it('should not render edit button', () => {
+ expect(vm.$el.querySelector('.js-edit-blob')).toEqual(null);
+ });
+ });
+ });
+ });
+
+ describe('expand full file button', () => {
+ beforeEach(() => {
+ props.addMergeRequestButtons = true;
+ props.diffFile.edit_path = '/';
+ });
+
+ it('does not render button', () => {
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.js-expand-file')).toBe(null);
+ });
+
+ it('renders button', () => {
+ props.diffFile.is_fully_expanded = false;
+
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.js-expand-file')).not.toBe(null);
+ });
+
+ it('shows fully expanded text', () => {
+ props.diffFile.is_fully_expanded = false;
+ props.diffFile.isShowingFullFile = true;
+
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.js-expand-file').textContent).toContain('Show changes only');
+ });
+
+ it('shows expand text', () => {
+ props.diffFile.is_fully_expanded = false;
+
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.js-expand-file').textContent).toContain('Show full file');
+ });
+
+ it('renders loading icon', () => {
+ props.diffFile.is_fully_expanded = false;
+ props.diffFile.isLoadingFullFile = true;
+
+ vm = mountComponentWithStore(Component, { props, store });
+
+ expect(vm.$el.querySelector('.js-expand-file .loading-container')).not.toBe(null);
+ });
+
+ it('calls toggleFullDiff on click', () => {
+ props.diffFile.is_fully_expanded = false;
+
+ vm = mountComponentWithStore(Component, { props, store });
+
+ spyOn(vm.$store, 'dispatch').and.stub();
+
+ vm.$el.querySelector('.js-expand-file').click();
+
+ expect(vm.$store.dispatch).toHaveBeenCalledWith(
+ 'diffs/toggleFullDiff',
+ props.diffFile.file_path,
+ );
+ });
});
});
diff --git a/spec/javascripts/diffs/components/diff_file_spec.js b/spec/javascripts/diffs/components/diff_file_spec.js
index 65a1c9b8f15..ba04c8c4a4c 100644
--- a/spec/javascripts/diffs/components/diff_file_spec.js
+++ b/spec/javascripts/diffs/components/diff_file_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import DiffFileComponent from '~/diffs/components/diff_file.vue';
import { diffViewerModes, diffViewerErrors } from '~/ide/constants';
-import store from '~/mr_notes/stores';
+import store from 'ee_else_ce/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import diffFileMockData from '../mock_data/diff_file';
diff --git a/spec/javascripts/diffs/components/edit_button_spec.js b/spec/javascripts/diffs/components/edit_button_spec.js
index 7237274eb43..ccdae4cb312 100644
--- a/spec/javascripts/diffs/components/edit_button_spec.js
+++ b/spec/javascripts/diffs/components/edit_button_spec.js
@@ -1 +1,61 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import EditButton from '~/diffs/components/edit_button.vue';
+
+const localVue = createLocalVue();
+const editPath = 'test-path';
+
+describe('EditButton', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(EditButton, {
+ localVue,
+ sync: false,
+ propsData: { ...props },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('has correct href attribute', () => {
+ createComponent({
+ editPath,
+ canCurrentUserFork: false,
+ });
+
+ expect(wrapper.attributes('href')).toBe(editPath);
+ });
+
+ it('emits a show fork message event if current user can fork', () => {
+ createComponent({
+ editPath,
+ canCurrentUserFork: true,
+ });
+ wrapper.trigger('click');
+
+ expect(wrapper.emitted('showForkMessage')).toBeTruthy();
+ });
+
+ it('doesnt emit a show fork message event if current user cannot fork', () => {
+ createComponent({
+ editPath,
+ canCurrentUserFork: false,
+ });
+ wrapper.trigger('click');
+
+ expect(wrapper.emitted('showForkMessage')).toBeFalsy();
+ });
+
+ it('doesnt emit a show fork message event if current user can modify blob', () => {
+ createComponent({
+ editPath,
+ canCurrentUserFork: true,
+ canModifyBlob: true,
+ });
+ wrapper.trigger('click');
+
+ expect(wrapper.emitted('showForkMessage')).toBeFalsy();
+ });
+});
diff --git a/spec/javascripts/diffs/components/hidden_files_warning_spec.js b/spec/javascripts/diffs/components/hidden_files_warning_spec.js
index 7237274eb43..5bf5ddd27bd 100644
--- a/spec/javascripts/diffs/components/hidden_files_warning_spec.js
+++ b/spec/javascripts/diffs/components/hidden_files_warning_spec.js
@@ -1 +1,48 @@
-// TODO: https://gitlab.com/gitlab-org/gitlab-ce/issues/48034
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
+
+const localVue = createLocalVue();
+const propsData = {
+ total: '10',
+ visible: 5,
+ plainDiffPath: 'plain-diff-path',
+ emailPatchPath: 'email-patch-path',
+};
+
+describe('HiddenFilesWarning', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(HiddenFilesWarning, {
+ localVue,
+ sync: false,
+ propsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('has a correct plain diff URL', () => {
+ const plainDiffLink = wrapper.findAll('a').wrappers.filter(x => x.text() === 'Plain diff')[0];
+
+ expect(plainDiffLink.attributes('href')).toBe(propsData.plainDiffPath);
+ });
+
+ it('has a correct email patch URL', () => {
+ const emailPatchLink = wrapper.findAll('a').wrappers.filter(x => x.text() === 'Email patch')[0];
+
+ expect(emailPatchLink.attributes('href')).toBe(propsData.emailPatchPath);
+ });
+
+ it('has a correct visible/total files text', () => {
+ const filesText = wrapper.find('strong');
+
+ expect(filesText.text()).toBe('5 of 10');
+ });
+});
diff --git a/spec/javascripts/diffs/components/inline_diff_view_spec.js b/spec/javascripts/diffs/components/inline_diff_view_spec.js
index 2316ee29106..4452106580a 100644
--- a/spec/javascripts/diffs/components/inline_diff_view_spec.js
+++ b/spec/javascripts/diffs/components/inline_diff_view_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import '~/behaviors/markdown/render_gfm';
import InlineDiffView from '~/diffs/components/inline_diff_view.vue';
-import store from '~/mr_notes/stores';
+import store from 'ee_else_ce/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import diffFileMockData from '../mock_data/diff_file';
import discussionsMockData from '../mock_data/diff_discussions';
diff --git a/spec/javascripts/diffs/components/parallel_diff_view_spec.js b/spec/javascripts/diffs/components/parallel_diff_view_spec.js
index 6f6b1c41915..236bda96145 100644
--- a/spec/javascripts/diffs/components/parallel_diff_view_spec.js
+++ b/spec/javascripts/diffs/components/parallel_diff_view_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import ParallelDiffView from '~/diffs/components/parallel_diff_view.vue';
-import store from '~/mr_notes/stores';
+import store from 'ee_else_ce/mr_notes/stores';
import * as constants from '~/diffs/constants';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import diffFileMockData from '../mock_data/diff_file';
@@ -18,6 +18,10 @@ describe('ParallelDiffView', () => {
}).$mount();
});
+ afterEach(() => {
+ component.$destroy();
+ });
+
describe('assigned', () => {
describe('diffLines', () => {
it('should normalize lines for empty cells', () => {
diff --git a/spec/javascripts/diffs/mock_data/diff_discussions.js b/spec/javascripts/diffs/mock_data/diff_discussions.js
index 4a091b4580b..fd5dd611383 100644
--- a/spec/javascripts/diffs/mock_data/diff_discussions.js
+++ b/spec/javascripts/diffs/mock_data/diff_discussions.js
@@ -288,6 +288,7 @@ export default {
external_storage: null,
old_path_html: 'CHANGELOG_OLD',
new_path_html: 'CHANGELOG',
+ is_fully_expanded: true,
context_lines_path:
'/gitlab-org/gitlab-test/blob/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG/diff',
highlighted_diff_lines: [
diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js
index e47c7906fcb..070bfb2ccd0 100644
--- a/spec/javascripts/diffs/store/actions_spec.js
+++ b/spec/javascripts/diffs/store/actions_spec.js
@@ -30,6 +30,11 @@ import actions, {
setRenderTreeList,
setShowWhitespace,
setRenderIt,
+ requestFullDiff,
+ receiveFullDiffSucess,
+ receiveFullDiffError,
+ fetchFullDiff,
+ toggleFullDiff,
} from '~/diffs/store/actions';
import eventHub from '~/notes/event_hub';
import * as types from '~/diffs/store/mutation_types';
@@ -847,4 +852,129 @@ describe('DiffsStoreActions', () => {
testAction(setRenderIt, 'file', {}, [{ type: types.RENDER_FILE, payload: 'file' }], [], done);
});
});
+
+ describe('requestFullDiff', () => {
+ it('commits REQUEST_FULL_DIFF', done => {
+ testAction(
+ requestFullDiff,
+ 'file',
+ {},
+ [{ type: types.REQUEST_FULL_DIFF, payload: 'file' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveFullDiffSucess', () => {
+ it('commits REQUEST_FULL_DIFF', done => {
+ testAction(
+ receiveFullDiffSucess,
+ { filePath: 'test', data: 'test' },
+ {},
+ [{ type: types.RECEIVE_FULL_DIFF_SUCCESS, payload: { filePath: 'test', data: 'test' } }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('receiveFullDiffError', () => {
+ it('commits REQUEST_FULL_DIFF', done => {
+ testAction(
+ receiveFullDiffError,
+ 'file',
+ {},
+ [{ type: types.RECEIVE_FULL_DIFF_ERROR, payload: 'file' }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('fetchFullDiff', () => {
+ let mock;
+ let scrollToElementSpy;
+
+ beforeEach(() => {
+ scrollToElementSpy = spyOnDependency(actions, 'scrollToElement').and.stub();
+
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('success', () => {
+ beforeEach(() => {
+ mock.onGet(`${gl.TEST_HOST}/context`).replyOnce(200, ['test']);
+ });
+
+ it('dispatches receiveFullDiffSucess', done => {
+ testAction(
+ fetchFullDiff,
+ { context_lines_path: `${gl.TEST_HOST}/context`, file_path: 'test', file_hash: 'test' },
+ null,
+ [],
+ [{ type: 'receiveFullDiffSucess', payload: { filePath: 'test', data: ['test'] } }],
+ done,
+ );
+ });
+
+ it('scrolls to element', done => {
+ fetchFullDiff(
+ { dispatch() {} },
+ { context_lines_path: `${gl.TEST_HOST}/context`, file_path: 'test', file_hash: 'test' },
+ )
+ .then(() => {
+ expect(scrollToElementSpy).toHaveBeenCalledWith('#test');
+
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(`${gl.TEST_HOST}/context`).replyOnce(500);
+ });
+
+ it('dispatches receiveFullDiffError', done => {
+ testAction(
+ fetchFullDiff,
+ { context_lines_path: `${gl.TEST_HOST}/context`, file_path: 'test', file_hash: 'test' },
+ null,
+ [],
+ [{ type: 'receiveFullDiffError', payload: 'test' }],
+ done,
+ );
+ });
+ });
+ });
+
+ describe('toggleFullDiff', () => {
+ let state;
+
+ beforeEach(() => {
+ state = {
+ diffFiles: [{ file_path: 'test', isShowingFullFile: false }],
+ };
+ });
+
+ it('dispatches fetchFullDiff when file is not expanded', done => {
+ testAction(
+ toggleFullDiff,
+ 'test',
+ state,
+ [],
+ [
+ { type: 'requestFullDiff', payload: 'test' },
+ { type: 'fetchFullDiff', payload: state.diffFiles[0] },
+ ],
+ done,
+ );
+ });
+ });
});
diff --git a/spec/javascripts/diffs/store/mutations_spec.js b/spec/javascripts/diffs/store/mutations_spec.js
index 09ee691b602..270e7d75666 100644
--- a/spec/javascripts/diffs/store/mutations_spec.js
+++ b/spec/javascripts/diffs/store/mutations_spec.js
@@ -680,4 +680,66 @@ describe('DiffsStoreMutations', () => {
expect(state.showWhitespace).toBe(false);
});
});
+
+ describe('REQUEST_FULL_DIFF', () => {
+ it('sets isLoadingFullFile to true', () => {
+ const state = {
+ diffFiles: [{ file_path: 'test', isLoadingFullFile: false }],
+ };
+
+ mutations[types.REQUEST_FULL_DIFF](state, 'test');
+
+ expect(state.diffFiles[0].isLoadingFullFile).toBe(true);
+ });
+ });
+
+ describe('RECEIVE_FULL_DIFF_ERROR', () => {
+ it('sets isLoadingFullFile to false', () => {
+ const state = {
+ diffFiles: [{ file_path: 'test', isLoadingFullFile: true }],
+ };
+
+ mutations[types.RECEIVE_FULL_DIFF_ERROR](state, 'test');
+
+ expect(state.diffFiles[0].isLoadingFullFile).toBe(false);
+ });
+ });
+
+ describe('RECEIVE_FULL_DIFF_SUCCESS', () => {
+ it('sets isLoadingFullFile to false', () => {
+ const state = {
+ diffFiles: [
+ {
+ file_path: 'test',
+ isLoadingFullFile: true,
+ isShowingFullFile: false,
+ highlighted_diff_lines: [],
+ parallel_diff_lines: [],
+ },
+ ],
+ };
+
+ mutations[types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath: 'test', data: [] });
+
+ expect(state.diffFiles[0].isLoadingFullFile).toBe(false);
+ });
+
+ it('sets isShowingFullFile to true', () => {
+ const state = {
+ diffFiles: [
+ {
+ file_path: 'test',
+ isLoadingFullFile: true,
+ isShowingFullFile: false,
+ highlighted_diff_lines: [],
+ parallel_diff_lines: [],
+ },
+ ],
+ };
+
+ mutations[types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath: 'test', data: [] });
+
+ expect(state.diffFiles[0].isShowingFullFile).toBe(true);
+ });
+ });
});
diff --git a/spec/javascripts/diffs/store/utils_spec.js b/spec/javascripts/diffs/store/utils_spec.js
index 599ea9cd420..1f877910125 100644
--- a/spec/javascripts/diffs/store/utils_spec.js
+++ b/spec/javascripts/diffs/store/utils_spec.js
@@ -781,4 +781,49 @@ describe('DiffsStoreUtils', () => {
]);
});
});
+
+ describe('convertExpandLines', () => {
+ it('converts expanded lines to normal lines', () => {
+ const diffLines = [
+ {
+ type: 'match',
+ old_line: 1,
+ new_line: 1,
+ },
+ {
+ type: '',
+ old_line: 2,
+ new_line: 2,
+ },
+ ];
+
+ const lines = utils.convertExpandLines({
+ diffLines,
+ data: [{ text: 'expanded' }],
+ typeKey: 'type',
+ oldLineKey: 'old_line',
+ newLineKey: 'new_line',
+ mapLine: ({ line, oldLine, newLine }) => ({
+ ...line,
+ old_line: oldLine,
+ new_line: newLine,
+ }),
+ });
+
+ expect(lines).toEqual([
+ {
+ text: 'expanded',
+ new_line: 1,
+ old_line: 1,
+ discussions: [],
+ hasForm: false,
+ },
+ {
+ type: '',
+ old_line: 2,
+ new_line: 2,
+ },
+ ]);
+ });
+ });
});
diff --git a/spec/javascripts/dirty_submit/dirty_submit_form_spec.js b/spec/javascripts/dirty_submit/dirty_submit_form_spec.js
index ae2a785de52..95cc90dcb0f 100644
--- a/spec/javascripts/dirty_submit/dirty_submit_form_spec.js
+++ b/spec/javascripts/dirty_submit/dirty_submit_form_spec.js
@@ -13,6 +13,8 @@ function expectToToggleDisableOnDirtyUpdate(submit, input) {
}
describe('DirtySubmitForm', () => {
+ DirtySubmitForm.THROTTLE_DURATION = 0;
+
it('disables submit until there are changes', done => {
const { form, input, submit } = createForm();
diff --git a/spec/javascripts/emoji_spec.js b/spec/javascripts/emoji_spec.js
index 3db4d9800f1..0ac375145be 100644
--- a/spec/javascripts/emoji_spec.js
+++ b/spec/javascripts/emoji_spec.js
@@ -1,4 +1,6 @@
-import { glEmojiTag } from '~/emoji';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import { initEmojiMap, glEmojiTag, EMOJI_VERSION } from '~/emoji';
import isEmojiUnicodeSupported, {
isFlagEmoji,
isRainbowFlagEmoji,
@@ -7,6 +9,7 @@ import isEmojiUnicodeSupported, {
isHorceRacingSkinToneComboEmoji,
isPersonZwjEmoji,
} from '~/emoji/support/is_emoji_unicode_supported';
+import installGlEmojiElement from '~/behaviors/gl_emoji';
const emptySupportMap = {
personZwj: false,
@@ -31,34 +34,35 @@ const emojiFixtureMap = {
bomb: {
name: 'bomb',
moji: '💣',
- unicodeVersion: '6.0',
+ uni: '6.0',
},
construction_worker_tone5: {
name: 'construction_worker_tone5',
moji: '👷ðŸ¿',
- unicodeVersion: '8.0',
+ uni: '8.0',
},
five: {
name: 'five',
moji: '5ï¸âƒ£',
- unicodeVersion: '3.0',
+ uni: '3.0',
},
grey_question: {
name: 'grey_question',
moji: 'â”',
- unicodeVersion: '6.0',
+ uni: '6.0',
},
};
function markupToDomElement(markup) {
const div = document.createElement('div');
div.innerHTML = markup;
+ document.body.appendChild(div);
return div.firstElementChild;
}
-function testGlEmojiImageFallback(element, name, src) {
+function testGlEmojiImageFallback(element, name) {
expect(element.tagName.toLowerCase()).toBe('img');
- expect(element.getAttribute('src')).toBe(src);
+ expect(element.getAttribute('src')).toBe(`/-/emojis/${EMOJI_VERSION}/${name}.png`);
expect(element.getAttribute('title')).toBe(`:${name}:`);
expect(element.getAttribute('alt')).toBe(`:${name}:`);
}
@@ -68,12 +72,11 @@ const defaults = {
sprite: false,
};
-function testGlEmojiElement(element, name, unicodeVersion, unicodeMoji, options = {}) {
+function testGlEmojiElement(element, name, uni, unicodeMoji, options = {}) {
const opts = Object.assign({}, defaults, options);
expect(element.tagName.toLowerCase()).toBe('gl-emoji');
expect(element.dataset.name).toBe(name);
- expect(element.dataset.fallbackSrc.length).toBeGreaterThan(0);
- expect(element.dataset.unicodeVersion).toBe(unicodeVersion);
+ expect(element.dataset.uni).toBe(uni);
const fallbackSpriteClass = `emoji-${name}`;
if (opts.sprite) {
@@ -86,7 +89,7 @@ function testGlEmojiElement(element, name, unicodeVersion, unicodeMoji, options
if (opts.forceFallback && !opts.sprite) {
// Check for image fallback
- testGlEmojiImageFallback(element.firstElementChild, name, element.dataset.fallbackSrc);
+ testGlEmojiImageFallback(element.firstElementChild, name);
} else {
// Otherwise make sure things are still unicode text
expect(element.textContent.trim()).toBe(unicodeMoji);
@@ -94,101 +97,143 @@ function testGlEmojiElement(element, name, unicodeVersion, unicodeMoji, options
}
describe('gl_emoji', () => {
+ beforeAll(() => {
+ installGlEmojiElement();
+ });
+
+ let mock;
+ const emojiData = getJSONFixture('emojis/emojis.json');
+
+ beforeEach(function(done) {
+ mock = new MockAdapter(axios);
+ mock.onGet(`/-/emojis/${EMOJI_VERSION}/emojis.json`).reply(200, emojiData);
+
+ initEmojiMap()
+ .then(() => {
+ done();
+ })
+ .catch(() => {
+ done();
+ });
+ });
+
+ afterEach(function() {
+ mock.restore();
+ });
+
describe('glEmojiTag', () => {
- it('bomb emoji', () => {
+ it('bomb emoji', done => {
const emojiKey = 'bomb';
const markup = glEmojiTag(emojiFixtureMap[emojiKey].name);
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ );
+ done();
+ });
});
- it('bomb emoji with image fallback', () => {
+ it('bomb emoji with image fallback', done => {
const emojiKey = 'bomb';
const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, {
forceFallback: true,
});
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- {
- forceFallback: true,
- },
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ {
+ forceFallback: true,
+ },
+ );
+ done();
+ });
});
- it('bomb emoji with sprite fallback readiness', () => {
+ it('bomb emoji with sprite fallback readiness', done => {
const emojiKey = 'bomb';
const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, {
sprite: true,
});
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- {
- sprite: true,
- },
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ {
+ sprite: true,
+ },
+ );
+ done();
+ });
});
- it('bomb emoji with sprite fallback', () => {
+ it('bomb emoji with sprite fallback', done => {
const emojiKey = 'bomb';
const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, {
forceFallback: true,
sprite: true,
});
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- {
- forceFallback: true,
- sprite: true,
- },
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ {
+ forceFallback: true,
+ sprite: true,
+ },
+ );
+ done();
+ });
});
- it('question mark when invalid emoji name given', () => {
+ it('question mark when invalid emoji name given', done => {
const name = 'invalid_emoji';
const emojiKey = 'grey_question';
const markup = glEmojiTag(name);
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ );
+ done();
+ });
});
- it('question mark with image fallback when invalid emoji name given', () => {
+ it('question mark with image fallback when invalid emoji name given', done => {
const name = 'invalid_emoji';
const emojiKey = 'grey_question';
const markup = glEmojiTag(name, {
forceFallback: true,
});
const glEmojiElement = markupToDomElement(markup);
- testGlEmojiElement(
- glEmojiElement,
- emojiFixtureMap[emojiKey].name,
- emojiFixtureMap[emojiKey].unicodeVersion,
- emojiFixtureMap[emojiKey].moji,
- {
- forceFallback: true,
- },
- );
+ setTimeout(() => {
+ testGlEmojiElement(
+ glEmojiElement,
+ emojiFixtureMap[emojiKey].name,
+ emojiFixtureMap[emojiKey].uni,
+ emojiFixtureMap[emojiKey].moji,
+ {
+ forceFallback: true,
+ },
+ );
+ done();
+ });
});
});
@@ -389,7 +434,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeTruthy();
@@ -401,7 +446,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeFalsy();
@@ -415,7 +460,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeFalsy();
@@ -441,7 +486,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeFalsy();
@@ -459,7 +504,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeTruthy();
@@ -477,7 +522,7 @@ describe('gl_emoji', () => {
const isSupported = isEmojiUnicodeSupported(
unicodeSupportMap,
emojiFixtureMap[emojiKey].moji,
- emojiFixtureMap[emojiKey].unicodeVersion,
+ emojiFixtureMap[emojiKey].uni,
);
expect(isSupported).toBeFalsy();
diff --git a/spec/javascripts/environments/confirm_rollback_modal_spec.js b/spec/javascripts/environments/confirm_rollback_modal_spec.js
new file mode 100644
index 00000000000..05715bce38f
--- /dev/null
+++ b/spec/javascripts/environments/confirm_rollback_modal_spec.js
@@ -0,0 +1,70 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlModal } from '@gitlab/ui';
+import ConfirmRollbackModal from '~/environments/components/confirm_rollback_modal.vue';
+import eventHub from '~/environments/event_hub';
+
+describe('Confirm Rollback Modal Component', () => {
+ let environment;
+
+ beforeEach(() => {
+ environment = {
+ name: 'test',
+ last_deployment: {
+ commit: {
+ short_id: 'abc0123',
+ },
+ },
+ modalId: 'test',
+ };
+ });
+
+ it('should show "Rollback" when isLastDeployment is false', () => {
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment: {
+ ...environment,
+ isLastDeployment: false,
+ },
+ },
+ });
+ const modal = component.find(GlModal);
+
+ expect(modal.attributes('title')).toContain('Rollback');
+ expect(modal.attributes('title')).toContain('test');
+ expect(modal.attributes('ok-title')).toBe('Rollback');
+ expect(modal.text()).toContain('commit abc0123');
+ expect(modal.text()).toContain('Are you sure you want to continue?');
+ });
+
+ it('should show "Re-deploy" when isLastDeployment is true', () => {
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment: {
+ ...environment,
+ isLastDeployment: true,
+ },
+ },
+ });
+ const modal = component.find(GlModal);
+
+ expect(modal.attributes('title')).toContain('Re-deploy');
+ expect(modal.attributes('title')).toContain('test');
+ expect(modal.attributes('ok-title')).toBe('Re-deploy');
+ expect(modal.text()).toContain('commit abc0123');
+ expect(modal.text()).toContain('Are you sure you want to continue?');
+ });
+
+ it('should emit the "rollback" event when "ok" is clicked', () => {
+ environment = { ...environment, isLastDeployment: true };
+ const component = shallowMount(ConfirmRollbackModal, {
+ propsData: {
+ environment,
+ },
+ });
+ const eventHubSpy = spyOn(eventHub, '$emit');
+ const modal = component.find(GlModal);
+ modal.vm.$emit('ok');
+
+ expect(eventHubSpy).toHaveBeenCalledWith('rollbackEnvironment', environment);
+ });
+});
diff --git a/spec/javascripts/environments/environment_rollback_spec.js b/spec/javascripts/environments/environment_rollback_spec.js
index 79f33c5bc8a..8c47f6a12c0 100644
--- a/spec/javascripts/environments/environment_rollback_spec.js
+++ b/spec/javascripts/environments/environment_rollback_spec.js
@@ -1,8 +1,11 @@
import Vue from 'vue';
+import { shallowMount } from '@vue/test-utils';
+import { GlButton } from '@gitlab/ui';
+import eventHub from '~/environments/event_hub';
import rollbackComp from '~/environments/components/environment_rollback.vue';
describe('Rollback Component', () => {
- const retryURL = 'https://gitlab.com/retry';
+ const retryUrl = 'https://gitlab.com/retry';
let RollbackComponent;
beforeEach(() => {
@@ -13,8 +16,9 @@ describe('Rollback Component', () => {
const component = new RollbackComponent({
el: document.querySelector('.test-dom-element'),
propsData: {
- retryUrl: retryURL,
+ retryUrl,
isLastDeployment: true,
+ environment: {},
},
}).$mount();
@@ -25,11 +29,33 @@ describe('Rollback Component', () => {
const component = new RollbackComponent({
el: document.querySelector('.test-dom-element'),
propsData: {
- retryUrl: retryURL,
+ retryUrl,
isLastDeployment: false,
+ environment: {},
},
}).$mount();
expect(component.$el).toHaveSpriteIcon('redo');
});
+
+ it('should emit a "rollback" event on button click', () => {
+ const eventHubSpy = spyOn(eventHub, '$emit');
+ const component = shallowMount(RollbackComponent, {
+ propsData: {
+ retryUrl,
+ environment: {
+ name: 'test',
+ },
+ },
+ });
+ const button = component.find(GlButton);
+
+ button.vm.$emit('click');
+
+ expect(eventHubSpy).toHaveBeenCalledWith('requestRollbackEnvironment', {
+ retryUrl,
+ isLastDeployment: true,
+ name: 'test',
+ });
+ });
});
diff --git a/spec/javascripts/error_tracking/components/error_tracking_list_spec.js b/spec/javascripts/error_tracking/components/error_tracking_list_spec.js
index 08bbb390993..503af3920a8 100644
--- a/spec/javascripts/error_tracking/components/error_tracking_list_spec.js
+++ b/spec/javascripts/error_tracking/components/error_tracking_list_spec.js
@@ -1,7 +1,7 @@
import { createLocalVue, shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
import ErrorTrackingList from '~/error_tracking/components/error_tracking_list.vue';
-import { GlButton, GlEmptyState, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { GlButton, GlEmptyState, GlLoadingIcon, GlTable, GlLink } from '@gitlab/ui';
const localVue = createLocalVue();
localVue.use(Vuex);
@@ -9,6 +9,7 @@ localVue.use(Vuex);
describe('ErrorTrackingList', () => {
let store;
let wrapper;
+ let actions;
function mountComponent({ errorTrackingEnabled = true } = {}) {
wrapper = shallowMount(ErrorTrackingList, {
@@ -20,12 +21,17 @@ describe('ErrorTrackingList', () => {
errorTrackingEnabled,
illustrationPath: 'illustration/path',
},
+ stubs: {
+ 'gl-link': GlLink,
+ },
});
}
beforeEach(() => {
- const actions = {
+ actions = {
getErrorList: () => {},
+ startPolling: () => {},
+ restartPolling: jasmine.createSpy('restartPolling'),
};
const state = {
@@ -83,6 +89,18 @@ describe('ErrorTrackingList', () => {
expect(wrapper.find(GlTable).exists()).toBeTruthy();
expect(wrapper.find(GlButton).exists()).toBeTruthy();
});
+
+ it('shows a message prompting to refresh', () => {
+ const refreshLink = wrapper.vm.$refs.empty.querySelector('a');
+
+ expect(refreshLink.textContent.trim()).toContain('Check again');
+ });
+
+ it('restarts polling', () => {
+ wrapper.find('.js-try-again').trigger('click');
+
+ expect(actions.restartPolling).toHaveBeenCalled();
+ });
});
describe('error tracking feature disabled', () => {
diff --git a/spec/javascripts/error_tracking_settings/components/app_spec.js b/spec/javascripts/error_tracking_settings/components/app_spec.js
new file mode 100644
index 00000000000..2e52a45fd34
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/components/app_spec.js
@@ -0,0 +1,63 @@
+import Vuex from 'vuex';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import ErrorTrackingSettings from '~/error_tracking_settings/components/app.vue';
+import ErrorTrackingForm from '~/error_tracking_settings/components/error_tracking_form.vue';
+import ProjectDropdown from '~/error_tracking_settings/components/project_dropdown.vue';
+import createStore from '~/error_tracking_settings/store';
+import { TEST_HOST } from 'spec/test_constants';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('error tracking settings app', () => {
+ let store;
+ let wrapper;
+
+ function mountComponent() {
+ wrapper = shallowMount(ErrorTrackingSettings, {
+ localVue,
+ store, // Override the imported store
+ propsData: {
+ initialEnabled: 'true',
+ initialApiHost: TEST_HOST,
+ initialToken: 'someToken',
+ initialProject: null,
+ listProjectsEndpoint: TEST_HOST,
+ operationsSettingsEndpoint: TEST_HOST,
+ },
+ });
+ }
+
+ beforeEach(() => {
+ store = createStore();
+
+ mountComponent();
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ }
+ });
+
+ describe('section', () => {
+ it('renders the form and dropdown', () => {
+ expect(wrapper.find(ErrorTrackingForm).exists()).toBeTruthy();
+ expect(wrapper.find(ProjectDropdown).exists()).toBeTruthy();
+ });
+
+ it('renders the Save Changes button', () => {
+ expect(wrapper.find('.js-error-tracking-button').exists()).toBeTruthy();
+ });
+
+ it('enables the button by default', () => {
+ expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeFalsy();
+ });
+
+ it('disables the button when saving', () => {
+ store.state.settingsLoading = true;
+
+ expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeTruthy();
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js b/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js
new file mode 100644
index 00000000000..23e57c4bbf1
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js
@@ -0,0 +1,91 @@
+import Vuex from 'vuex';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { GlButton, GlFormInput } from '@gitlab/ui';
+import ErrorTrackingForm from '~/error_tracking_settings/components/error_tracking_form.vue';
+import { defaultProps } from '../mock';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('error tracking settings form', () => {
+ let wrapper;
+
+ function mountComponent() {
+ wrapper = shallowMount(ErrorTrackingForm, {
+ localVue,
+ propsData: defaultProps,
+ });
+ }
+
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ }
+ });
+
+ describe('an empty form', () => {
+ it('is rendered', () => {
+ expect(wrapper.findAll(GlFormInput).length).toBe(2);
+ expect(wrapper.find(GlFormInput).attributes('id')).toBe('error-tracking-api-host');
+ expect(
+ wrapper
+ .findAll(GlFormInput)
+ .at(1)
+ .attributes('id'),
+ ).toBe('error-tracking-token');
+
+ expect(wrapper.findAll(GlButton).exists()).toBe(true);
+ });
+
+ it('is rendered with labels and placeholders', () => {
+ const pageText = wrapper.text();
+
+ expect(pageText).toContain('Find your hostname in your Sentry account settings page');
+ expect(pageText).toContain(
+ "After adding your Auth Token, use the 'Connect' button to load projects",
+ );
+
+ expect(pageText).not.toContain('Connection has failed. Re-check Auth Token and try again');
+ expect(
+ wrapper
+ .findAll(GlFormInput)
+ .at(0)
+ .attributes('placeholder'),
+ ).toContain('https://mysentryserver.com');
+ });
+ });
+
+ describe('after a successful connection', () => {
+ beforeEach(() => {
+ wrapper.setProps({ connectSuccessful: true });
+ });
+
+ it('shows the success checkmark', () => {
+ expect(wrapper.find('.js-error-tracking-connect-success').isVisible()).toBe(true);
+ });
+
+ it('does not show an error', () => {
+ expect(wrapper.text()).not.toContain(
+ 'Connection has failed. Re-check Auth Token and try again',
+ );
+ });
+ });
+
+ describe('after an unsuccessful connection', () => {
+ beforeEach(() => {
+ wrapper.setProps({ connectError: true });
+ });
+
+ it('does not show the check mark', () => {
+ expect(wrapper.find('.js-error-tracking-connect-success').isVisible()).toBe(false);
+ });
+
+ it('shows an error', () => {
+ expect(wrapper.text()).toContain('Connection has failed. Re-check Auth Token and try again');
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js b/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js
new file mode 100644
index 00000000000..8e5dbe28452
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js
@@ -0,0 +1,109 @@
+import _ from 'underscore';
+import Vuex from 'vuex';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import ProjectDropdown from '~/error_tracking_settings/components/project_dropdown.vue';
+import { defaultProps, projectList, staleProject } from '../mock';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('error tracking settings project dropdown', () => {
+ let wrapper;
+
+ function mountComponent() {
+ wrapper = shallowMount(ProjectDropdown, {
+ localVue,
+ propsData: {
+ ..._.pick(
+ defaultProps,
+ 'dropdownLabel',
+ 'invalidProjectLabel',
+ 'projects',
+ 'projectSelectionLabel',
+ 'selectedProject',
+ 'token',
+ ),
+ hasProjects: false,
+ isProjectInvalid: false,
+ },
+ });
+ }
+
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ }
+ });
+
+ describe('empty project list', () => {
+ it('renders the dropdown', () => {
+ expect(wrapper.find('#project-dropdown').exists()).toBeTruthy();
+ expect(wrapper.find(GlDropdown).exists()).toBeTruthy();
+ });
+
+ it('shows helper text', () => {
+ expect(wrapper.find('.js-project-dropdown-label').exists()).toBeTruthy();
+ expect(wrapper.find('.js-project-dropdown-label').text()).toContain(
+ 'To enable project selection',
+ );
+ });
+
+ it('does not show an error', () => {
+ expect(wrapper.find('.js-project-dropdown-error').exists()).toBeFalsy();
+ });
+
+ it('does not contain any dropdown items', () => {
+ expect(wrapper.find(GlDropdownItem).exists()).toBeFalsy();
+ expect(wrapper.find(GlDropdown).props('text')).toBe('No projects available');
+ });
+ });
+
+ describe('populated project list', () => {
+ beforeEach(() => {
+ wrapper.setProps({ projects: _.clone(projectList), hasProjects: true });
+ });
+
+ it('renders the dropdown', () => {
+ expect(wrapper.find('#project-dropdown').exists()).toBeTruthy();
+ expect(wrapper.find(GlDropdown).exists()).toBeTruthy();
+ });
+
+ it('contains a number of dropdown items', () => {
+ expect(wrapper.find(GlDropdownItem).exists()).toBeTruthy();
+ expect(wrapper.findAll(GlDropdownItem).length).toBe(2);
+ });
+ });
+
+ describe('selected project', () => {
+ const selectedProject = _.clone(projectList[0]);
+
+ beforeEach(() => {
+ wrapper.setProps({ projects: _.clone(projectList), selectedProject, hasProjects: true });
+ });
+
+ it('does not show helper text', () => {
+ expect(wrapper.find('.js-project-dropdown-label').exists()).toBeFalsy();
+ expect(wrapper.find('.js-project-dropdown-error').exists()).toBeFalsy();
+ });
+ });
+
+ describe('invalid project selected', () => {
+ beforeEach(() => {
+ wrapper.setProps({
+ projects: _.clone(projectList),
+ selectedProject: staleProject,
+ isProjectInvalid: true,
+ });
+ });
+
+ it('displays a error', () => {
+ expect(wrapper.find('.js-project-dropdown-label').exists()).toBeFalsy();
+ expect(wrapper.find('.js-project-dropdown-error').exists()).toBeTruthy();
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/mock.js b/spec/javascripts/error_tracking_settings/mock.js
new file mode 100644
index 00000000000..32cdba33c14
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/mock.js
@@ -0,0 +1,92 @@
+import createStore from '~/error_tracking_settings/store';
+import { TEST_HOST } from 'spec/test_constants';
+
+const defaultStore = createStore();
+
+export const projectList = [
+ {
+ name: 'name',
+ slug: 'slug',
+ organizationName: 'organizationName',
+ organizationSlug: 'organizationSlug',
+ },
+ {
+ name: 'name2',
+ slug: 'slug2',
+ organizationName: 'organizationName2',
+ organizationSlug: 'organizationSlug2',
+ },
+];
+
+export const staleProject = {
+ name: 'staleName',
+ slug: 'staleSlug',
+ organizationName: 'staleOrganizationName',
+ organizationSlug: 'staleOrganizationSlug',
+};
+
+export const normalizedProject = {
+ name: 'name',
+ slug: 'slug',
+ organizationName: 'organization_name',
+ organizationSlug: 'organization_slug',
+};
+
+export const sampleBackendProject = {
+ name: normalizedProject.name,
+ slug: normalizedProject.slug,
+ organization_name: normalizedProject.organizationName,
+ organization_slug: normalizedProject.organizationSlug,
+};
+
+export const sampleFrontendSettings = {
+ apiHost: 'apiHost',
+ enabled: false,
+ token: 'token',
+ selectedProject: {
+ slug: normalizedProject.slug,
+ name: normalizedProject.name,
+ organizationName: normalizedProject.organizationName,
+ organizationSlug: normalizedProject.organizationSlug,
+ },
+};
+
+export const transformedSettings = {
+ api_host: 'apiHost',
+ enabled: false,
+ token: 'token',
+ project: {
+ slug: normalizedProject.slug,
+ name: normalizedProject.name,
+ organization_name: normalizedProject.organizationName,
+ organization_slug: normalizedProject.organizationSlug,
+ },
+};
+
+export const defaultProps = {
+ ...defaultStore.state,
+ ...defaultStore.getters,
+};
+
+export const initialEmptyState = {
+ apiHost: '',
+ enabled: false,
+ project: null,
+ token: '',
+ listProjectsEndpoint: TEST_HOST,
+ operationsSettingsEndpoint: TEST_HOST,
+};
+
+export const initialPopulatedState = {
+ apiHost: 'apiHost',
+ enabled: true,
+ project: JSON.stringify(projectList[0]),
+ token: 'token',
+ listProjectsEndpoint: TEST_HOST,
+ operationsSettingsEndpoint: TEST_HOST,
+};
+
+export const projectWithHtmlTemplate = {
+ ...projectList[0],
+ name: '<strong>bold</strong>',
+};
diff --git a/spec/javascripts/error_tracking_settings/store/actions_spec.js b/spec/javascripts/error_tracking_settings/store/actions_spec.js
new file mode 100644
index 00000000000..0255b3a7aa4
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/store/actions_spec.js
@@ -0,0 +1,191 @@
+import MockAdapter from 'axios-mock-adapter';
+import testAction from 'spec/helpers/vuex_action_helper';
+import { TEST_HOST } from 'spec/test_constants';
+import axios from '~/lib/utils/axios_utils';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import actionsDefaultExport, * as actions from '~/error_tracking_settings/store/actions';
+import * as types from '~/error_tracking_settings/store/mutation_types';
+import defaultState from '~/error_tracking_settings/store/state';
+import { projectList } from '../mock';
+
+describe('error tracking settings actions', () => {
+ let state;
+
+ describe('project list actions', () => {
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ state = { ...defaultState(), listProjectsEndpoint: TEST_HOST };
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('should request and transform the project list', done => {
+ mock.onPost(TEST_HOST).reply(() => [200, { projects: projectList }]);
+ testAction(
+ actions.fetchProjects,
+ null,
+ state,
+ [],
+ [
+ { type: 'requestProjects' },
+ {
+ type: 'receiveProjectsSuccess',
+ payload: projectList.map(convertObjectPropsToCamelCase),
+ },
+ ],
+ () => {
+ expect(mock.history.post.length).toBe(1);
+ done();
+ },
+ );
+ });
+
+ it('should handle a server error', done => {
+ mock.onPost(`${TEST_HOST}.json`).reply(() => [400]);
+ testAction(
+ actions.fetchProjects,
+ null,
+ state,
+ [],
+ [
+ { type: 'requestProjects' },
+ {
+ type: 'receiveProjectsError',
+ },
+ ],
+ () => {
+ expect(mock.history.post.length).toBe(1);
+ done();
+ },
+ );
+ });
+
+ it('should request projects correctly', done => {
+ testAction(actions.requestProjects, null, state, [{ type: types.RESET_CONNECT }], [], done);
+ });
+
+ it('should receive projects correctly', done => {
+ const testPayload = [];
+ testAction(
+ actions.receiveProjectsSuccess,
+ testPayload,
+ state,
+ [
+ { type: types.UPDATE_CONNECT_SUCCESS },
+ { type: types.RECEIVE_PROJECTS, payload: testPayload },
+ ],
+ [],
+ done,
+ );
+ });
+
+ it('should handle errors when receiving projects', done => {
+ const testPayload = [];
+ testAction(
+ actions.receiveProjectsError,
+ testPayload,
+ state,
+ [{ type: types.UPDATE_CONNECT_ERROR }, { type: types.CLEAR_PROJECTS }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('save changes actions', () => {
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ state = {
+ operationsSettingsEndpoint: TEST_HOST,
+ };
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('should save the page', done => {
+ const refreshCurrentPage = spyOnDependency(actionsDefaultExport, 'refreshCurrentPage');
+ mock.onPatch(TEST_HOST).reply(200);
+ testAction(actions.updateSettings, null, state, [], [{ type: 'requestSettings' }], () => {
+ expect(mock.history.patch.length).toBe(1);
+ expect(refreshCurrentPage).toHaveBeenCalled();
+ done();
+ });
+ });
+
+ it('should handle a server error', done => {
+ mock.onPatch(TEST_HOST).reply(400);
+ testAction(
+ actions.updateSettings,
+ null,
+ state,
+ [],
+ [
+ { type: 'requestSettings' },
+ {
+ type: 'receiveSettingsError',
+ payload: new Error('Request failed with status code 400'),
+ },
+ ],
+ () => {
+ expect(mock.history.patch.length).toBe(1);
+ done();
+ },
+ );
+ });
+
+ it('should request to save the page', done => {
+ testAction(
+ actions.requestSettings,
+ null,
+ state,
+ [{ type: types.UPDATE_SETTINGS_LOADING, payload: true }],
+ [],
+ done,
+ );
+ });
+
+ it('should handle errors when requesting to save the page', done => {
+ testAction(
+ actions.receiveSettingsError,
+ {},
+ state,
+ [{ type: types.UPDATE_SETTINGS_LOADING, payload: false }],
+ [],
+ done,
+ );
+ });
+ });
+
+ describe('generic actions to update the store', () => {
+ const testData = 'test';
+ it('should reset the `connect success` flag when updating the api host', done => {
+ testAction(
+ actions.updateApiHost,
+ testData,
+ state,
+ [{ type: types.UPDATE_API_HOST, payload: testData }, { type: types.RESET_CONNECT }],
+ [],
+ done,
+ );
+ });
+
+ it('should reset the `connect success` flag when updating the token', done => {
+ testAction(
+ actions.updateToken,
+ testData,
+ state,
+ [{ type: types.UPDATE_TOKEN, payload: testData }, { type: types.RESET_CONNECT }],
+ [],
+ done,
+ );
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/store/getters_spec.js b/spec/javascripts/error_tracking_settings/store/getters_spec.js
new file mode 100644
index 00000000000..2c5ff084b8a
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/store/getters_spec.js
@@ -0,0 +1,93 @@
+import * as getters from '~/error_tracking_settings/store/getters';
+import defaultState from '~/error_tracking_settings/store/state';
+import { projectList, projectWithHtmlTemplate, staleProject } from '../mock';
+
+describe('Error Tracking Settings - Getters', () => {
+ let state;
+
+ beforeEach(() => {
+ state = defaultState();
+ });
+
+ describe('hasProjects', () => {
+ it('should reflect when no projects exist', () => {
+ expect(getters.hasProjects(state)).toEqual(false);
+ });
+
+ it('should reflect when projects exist', () => {
+ state.projects = projectList;
+
+ expect(getters.hasProjects(state)).toEqual(true);
+ });
+ });
+
+ describe('isProjectInvalid', () => {
+ const mockGetters = { hasProjects: true };
+ it('should show when a project is valid', () => {
+ state.projects = projectList;
+ [state.selectedProject] = projectList;
+
+ expect(getters.isProjectInvalid(state, mockGetters)).toEqual(false);
+ });
+
+ it('should show when a project is invalid', () => {
+ state.projects = projectList;
+ state.selectedProject = staleProject;
+
+ expect(getters.isProjectInvalid(state, mockGetters)).toEqual(true);
+ });
+ });
+
+ describe('dropdownLabel', () => {
+ const mockGetters = { hasProjects: false };
+ it('should display correctly when there are no projects available', () => {
+ expect(getters.dropdownLabel(state, mockGetters)).toEqual('No projects available');
+ });
+
+ it('should display correctly when a project is selected', () => {
+ [state.selectedProject] = projectList;
+
+ expect(getters.dropdownLabel(state, mockGetters)).toEqual('organizationName | name');
+ });
+
+ it('should display correctly when no project is selected', () => {
+ state.projects = projectList;
+
+ expect(getters.dropdownLabel(state, { hasProjects: true })).toEqual('Select project');
+ });
+ });
+
+ describe('invalidProjectLabel', () => {
+ it('should display an error containing the project name', () => {
+ [state.selectedProject] = projectList;
+
+ expect(getters.invalidProjectLabel(state)).toEqual(
+ 'Project "name" is no longer available. Select another project to continue.',
+ );
+ });
+
+ it('should properly escape the label text', () => {
+ state.selectedProject = projectWithHtmlTemplate;
+
+ expect(getters.invalidProjectLabel(state)).toEqual(
+ 'Project "&lt;strong&gt;bold&lt;/strong&gt;" is no longer available. Select another project to continue.',
+ );
+ });
+ });
+
+ describe('projectSelectionLabel', () => {
+ it('should show the correct message when the token is empty', () => {
+ expect(getters.projectSelectionLabel(state)).toEqual(
+ 'To enable project selection, enter a valid Auth Token',
+ );
+ });
+
+ it('should show the correct message when token exists', () => {
+ state.token = 'test-token';
+
+ expect(getters.projectSelectionLabel(state)).toEqual(
+ "Click 'Connect' to re-establish the connection to Sentry and activate the dropdown.",
+ );
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/store/mutation_spec.js b/spec/javascripts/error_tracking_settings/store/mutation_spec.js
new file mode 100644
index 00000000000..bb1f1da784e
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/store/mutation_spec.js
@@ -0,0 +1,82 @@
+import { TEST_HOST } from 'spec/test_constants';
+import mutations from '~/error_tracking_settings/store/mutations';
+import defaultState from '~/error_tracking_settings/store/state';
+import * as types from '~/error_tracking_settings/store/mutation_types';
+import {
+ initialEmptyState,
+ initialPopulatedState,
+ projectList,
+ sampleBackendProject,
+ normalizedProject,
+} from '../mock';
+
+describe('error tracking settings mutations', () => {
+ describe('mutations', () => {
+ let state;
+
+ beforeEach(() => {
+ state = defaultState();
+ });
+
+ it('should create an empty initial state correctly', () => {
+ mutations[types.SET_INITIAL_STATE](state, {
+ ...initialEmptyState,
+ });
+
+ expect(state.apiHost).toEqual('');
+ expect(state.enabled).toEqual(false);
+ expect(state.selectedProject).toEqual(null);
+ expect(state.token).toEqual('');
+ expect(state.listProjectsEndpoint).toEqual(TEST_HOST);
+ expect(state.operationsSettingsEndpoint).toEqual(TEST_HOST);
+ });
+
+ it('should populate the initial state correctly', () => {
+ mutations[types.SET_INITIAL_STATE](state, {
+ ...initialPopulatedState,
+ });
+
+ expect(state.apiHost).toEqual('apiHost');
+ expect(state.enabled).toEqual(true);
+ expect(state.selectedProject).toEqual(projectList[0]);
+ expect(state.token).toEqual('token');
+ expect(state.listProjectsEndpoint).toEqual(TEST_HOST);
+ expect(state.operationsSettingsEndpoint).toEqual(TEST_HOST);
+ });
+
+ it('should receive projects successfully', () => {
+ mutations[types.RECEIVE_PROJECTS](state, [sampleBackendProject]);
+
+ expect(state.projects).toEqual([normalizedProject]);
+ });
+
+ it('should strip out unnecessary project properties', () => {
+ mutations[types.RECEIVE_PROJECTS](state, [
+ { ...sampleBackendProject, extra_property: 'extra_property' },
+ ]);
+
+ expect(state.projects).toEqual([normalizedProject]);
+ });
+
+ it('should update state when connect is successful', () => {
+ mutations[types.UPDATE_CONNECT_SUCCESS](state);
+
+ expect(state.connectSuccessful).toBe(true);
+ expect(state.connectError).toBe(false);
+ });
+
+ it('should update state when connect fails', () => {
+ mutations[types.UPDATE_CONNECT_ERROR](state);
+
+ expect(state.connectSuccessful).toBe(false);
+ expect(state.connectError).toBe(true);
+ });
+
+ it('should update state when connect is reset', () => {
+ mutations[types.RESET_CONNECT](state);
+
+ expect(state.connectSuccessful).toBe(false);
+ expect(state.connectError).toBe(false);
+ });
+ });
+});
diff --git a/spec/javascripts/error_tracking_settings/utils_spec.js b/spec/javascripts/error_tracking_settings/utils_spec.js
new file mode 100644
index 00000000000..4b144f7daf1
--- /dev/null
+++ b/spec/javascripts/error_tracking_settings/utils_spec.js
@@ -0,0 +1,29 @@
+import { transformFrontendSettings } from '~/error_tracking_settings/utils';
+import { sampleFrontendSettings, transformedSettings } from './mock';
+
+describe('error tracking settings utils', () => {
+ describe('data transform functions', () => {
+ it('should transform settings successfully for the backend', () => {
+ expect(transformFrontendSettings(sampleFrontendSettings)).toEqual(transformedSettings);
+ });
+
+ it('should transform empty values in the settings object to null', () => {
+ const emptyFrontendSettingsObject = {
+ apiHost: '',
+ enabled: false,
+ token: '',
+ selectedProject: null,
+ };
+ const transformedEmptySettingsObject = {
+ api_host: null,
+ enabled: false,
+ token: null,
+ project: null,
+ };
+
+ expect(transformFrontendSettings(emptyFrontendSettingsObject)).toEqual(
+ transformedEmptySettingsObject,
+ );
+ });
+ });
+});
diff --git a/spec/javascripts/fixtures/autocomplete_sources.rb b/spec/javascripts/fixtures/autocomplete_sources.rb
deleted file mode 100644
index c117fb7cd24..00000000000
--- a/spec/javascripts/fixtures/autocomplete_sources.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe Projects::AutocompleteSourcesController, '(JavaScript fixtures)', type: :controller do
- include JavaScriptFixturesHelpers
-
- set(:admin) { create(:admin) }
- set(:group) { create(:group, name: 'frontend-fixtures') }
- set(:project) { create(:project, namespace: group, path: 'autocomplete-sources-project') }
- set(:issue) { create(:issue, project: project) }
-
- before(:all) do
- clean_frontend_fixtures('autocomplete_sources/')
- end
-
- before do
- sign_in(admin)
- end
-
- it 'autocomplete_sources/labels.json' do |example|
- issue.labels << create(:label, project: project, title: 'bug')
- issue.labels << create(:label, project: project, title: 'critical')
-
- create(:label, project: project, title: 'feature')
- create(:label, project: project, title: 'documentation')
-
- get :labels,
- format: :json,
- params: {
- namespace_id: group.path,
- project_id: project.path,
- type: issue.class.name,
- type_id: issue.id
- }
-
- expect(response).to be_success
- store_frontend_fixture(response, example.description)
- end
-end
diff --git a/spec/javascripts/fixtures/emojis.rb b/spec/javascripts/fixtures/emojis.rb
new file mode 100644
index 00000000000..0e7257ee681
--- /dev/null
+++ b/spec/javascripts/fixtures/emojis.rb
@@ -0,0 +1,16 @@
+require 'spec_helper'
+
+describe 'Emojis (JavaScript fixtures)' do
+ include JavaScriptFixturesHelpers
+
+ before(:all) do
+ clean_frontend_fixtures('emojis/')
+ end
+
+ it 'emojis/emojis.json' do |example|
+ # Copying the emojis.json from the public folder
+ fixture_file_name = File.expand_path('emojis/emojis.json', JavaScriptFixturesHelpers::FIXTURE_PATH)
+ FileUtils.mkdir_p(File.dirname(fixture_file_name))
+ FileUtils.cp(Rails.root.join('public/-/emojis/1/emojis.json'), fixture_file_name)
+ end
+end
diff --git a/spec/javascripts/fixtures/static_fixtures.rb b/spec/javascripts/fixtures/static_fixtures.rb
index 4569f16f0ca..852a82587b9 100644
--- a/spec/javascripts/fixtures/static_fixtures.rb
+++ b/spec/javascripts/fixtures/static_fixtures.rb
@@ -7,23 +7,23 @@ describe ApplicationController, '(Static JavaScript fixtures)', type: :controlle
clean_frontend_fixtures('static/')
end
- fixtures_path = File.expand_path(JavaScriptFixturesHelpers::FIXTURE_PATH, Rails.root)
- haml_fixtures = Dir.glob(File.expand_path('**/*.haml', fixtures_path)).map do |file_path|
- file_path.sub(/\A#{fixtures_path}#{File::SEPARATOR}/, '')
- end
+ JavaScriptFixturesHelpers::FIXTURE_PATHS.each do |fixture_path|
+ fixtures_path = File.expand_path(fixture_path, Rails.root)
+
+ Dir.glob(File.expand_path('**/*.haml', fixtures_path)).map do |file_path|
+ template_file_name = file_path.sub(/\A#{fixtures_path}#{File::SEPARATOR}/, '')
- haml_fixtures.each do |template_file_name|
- it "static/#{template_file_name.sub(/\.haml\z/, '.raw')}" do |example|
- fixture_file_name = example.description
- rendered = render_template(template_file_name)
- store_frontend_fixture(rendered, fixture_file_name)
+ it "static/#{template_file_name.sub(/\.haml\z/, '.raw')}" do |example|
+ fixture_file_name = example.description
+ rendered = render_template(fixture_path, template_file_name)
+ store_frontend_fixture(rendered, fixture_file_name)
+ end
end
end
private
- def render_template(template_file_name)
- fixture_path = JavaScriptFixturesHelpers::FIXTURE_PATH
+ def render_template(fixture_path, template_file_name)
controller = ApplicationController.new
controller.prepend_view_path(fixture_path)
controller.render_to_string(template: template_file_name, layout: false)
diff --git a/spec/javascripts/ide/components/new_dropdown/modal_spec.js b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
index d94cc1a8faa..d1a0964ccdd 100644
--- a/spec/javascripts/ide/components/new_dropdown/modal_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
@@ -18,6 +18,9 @@ describe('new file modal component', () => {
store.state.entryModal = {
type,
path: '',
+ entry: {
+ path: '',
+ },
};
vm = createComponentWithStore(Component, store).$mount();
@@ -74,6 +77,7 @@ describe('new file modal component', () => {
entry: {
name: 'test',
type: 'blob',
+ path: 'test-path',
},
};
@@ -97,7 +101,7 @@ describe('new file modal component', () => {
describe('entryName', () => {
it('returns entries name', () => {
- expect(vm.entryName).toBe('test');
+ expect(vm.entryName).toBe('test-path');
});
it('updated name', () => {
@@ -107,4 +111,53 @@ describe('new file modal component', () => {
});
});
});
+
+ describe('submitForm', () => {
+ it('throws an error when target entry exists', () => {
+ const store = createStore();
+ store.state.entryModal = {
+ type: 'rename',
+ path: 'test-path/test',
+ entry: {
+ name: 'test',
+ type: 'blob',
+ path: 'test-path/test',
+ },
+ };
+ store.state.entries = {
+ 'test-path/test': {
+ name: 'test',
+ deleted: false,
+ },
+ };
+
+ vm = createComponentWithStore(Component, store).$mount();
+ const flashSpy = spyOnDependency(modal, 'flash');
+ vm.submitForm();
+
+ expect(flashSpy).toHaveBeenCalled();
+ });
+
+ it('calls createTempEntry when target path does not exist', () => {
+ const store = createStore();
+ store.state.entryModal = {
+ type: 'rename',
+ path: 'test-path/test',
+ entry: {
+ name: 'test',
+ type: 'blob',
+ path: 'test-path1/test',
+ },
+ };
+
+ vm = createComponentWithStore(Component, store).$mount();
+ spyOn(vm, 'createTempEntry').and.callFake(() => Promise.resolve());
+ vm.submitForm();
+
+ expect(vm.createTempEntry).toHaveBeenCalledWith({
+ name: 'test-path1',
+ type: 'tree',
+ });
+ });
+ });
});
diff --git a/spec/javascripts/ide/lib/files_spec.js b/spec/javascripts/ide/lib/files_spec.js
new file mode 100644
index 00000000000..fe791aa2b74
--- /dev/null
+++ b/spec/javascripts/ide/lib/files_spec.js
@@ -0,0 +1,77 @@
+import { viewerInformationForPath } from '~/vue_shared/components/content_viewer/lib/viewer_utils';
+import { decorateFiles, splitParent } from '~/ide/lib/files';
+import { decorateData } from '~/ide/stores/utils';
+
+const TEST_BRANCH_ID = 'lorem-ipsum';
+const TEST_PROJECT_ID = 10;
+
+const createEntries = paths => {
+ const createEntry = (acc, { path, type, children }) => {
+ // Sometimes we need to end the url with a '/'
+ const createUrl = base => (type === 'tree' ? `${base}/` : base);
+
+ const { name, parent } = splitParent(path);
+ const parentEntry = acc[parent];
+
+ acc[path] = {
+ ...decorateData({
+ projectId: TEST_PROJECT_ID,
+ branchId: TEST_BRANCH_ID,
+ id: path,
+ name,
+ path,
+ url: createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}/-/${path}`),
+ type,
+ previewMode: viewerInformationForPath(path),
+ parentPath: parent,
+ parentTreeUrl: parentEntry
+ ? parentEntry.url
+ : createUrl(`/${TEST_PROJECT_ID}/${type}/${TEST_BRANCH_ID}`),
+ }),
+ tree: children.map(childName => jasmine.objectContaining({ name: childName })),
+ };
+
+ return acc;
+ };
+
+ const entries = paths.reduce(createEntry, {});
+
+ // Wrap entries in jasmine.objectContaining.
+ // We couldn't do this earlier because we still need to select properties from parent entries.
+ return Object.keys(entries).reduce((acc, key) => {
+ acc[key] = jasmine.objectContaining(entries[key]);
+
+ return acc;
+ }, {});
+};
+
+describe('IDE lib decorate files', () => {
+ it('creates entries and treeList', () => {
+ const data = ['app/assets/apples/foo.js', 'app/bugs.js', 'README.md'];
+ const expectedEntries = createEntries([
+ { path: 'app', type: 'tree', children: ['assets', 'bugs.js'] },
+ { path: 'app/assets', type: 'tree', children: ['apples'] },
+ { path: 'app/assets/apples', type: 'tree', children: ['foo.js'] },
+ { path: 'app/assets/apples/foo.js', type: 'blob', children: [] },
+ { path: 'app/bugs.js', type: 'blob', children: [] },
+ { path: 'README.md', type: 'blob', children: [] },
+ ]);
+
+ const { entries, treeList } = decorateFiles({
+ data,
+ branchId: TEST_BRANCH_ID,
+ projectId: TEST_PROJECT_ID,
+ });
+
+ // Here we test the keys and then each key/value individually because `expect(entries).toEqual(expectedEntries)`
+ // was taking a very long time for some reason. Probably due to large objects and nested `jasmine.objectContaining`.
+ const entryKeys = Object.keys(entries);
+
+ expect(entryKeys).toEqual(Object.keys(expectedEntries));
+ entryKeys.forEach(key => {
+ expect(entries[key]).toEqual(expectedEntries[key]);
+ });
+
+ expect(treeList).toEqual([expectedEntries.app, expectedEntries['README.md']]);
+ });
+});
diff --git a/spec/javascripts/ide/stores/actions/merge_request_spec.js b/spec/javascripts/ide/stores/actions/merge_request_spec.js
index 9bfc7c397b8..a5839630657 100644
--- a/spec/javascripts/ide/stores/actions/merge_request_spec.js
+++ b/spec/javascripts/ide/stores/actions/merge_request_spec.js
@@ -2,6 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import store from '~/ide/stores';
import actions, {
+ getMergeRequestsForBranch,
getMergeRequestData,
getMergeRequestChanges,
getMergeRequestVersions,
@@ -27,6 +28,98 @@ describe('IDE store merge request actions', () => {
resetStore(store);
});
+ describe('getMergeRequestsForBranch', () => {
+ describe('success', () => {
+ const mrData = { iid: 2, source_branch: 'bar' };
+ const mockData = [mrData];
+
+ describe('base case', () => {
+ beforeEach(() => {
+ spyOn(service, 'getProjectMergeRequests').and.callThrough();
+ mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).reply(200, mockData);
+ });
+
+ it('calls getProjectMergeRequests service method', done => {
+ store
+ .dispatch('getMergeRequestsForBranch', { projectId: 'abcproject', branchId: 'bar' })
+ .then(() => {
+ expect(service.getProjectMergeRequests).toHaveBeenCalledWith('abcproject', {
+ source_branch: 'bar',
+ order_by: 'created_at',
+ per_page: 1,
+ });
+
+ done();
+ })
+ .catch(done.fail);
+ });
+
+ it('sets the "Merge Request" Object', done => {
+ store
+ .dispatch('getMergeRequestsForBranch', { projectId: 'abcproject', branchId: 'bar' })
+ .then(() => {
+ expect(Object.keys(store.state.projects.abcproject.mergeRequests).length).toEqual(1);
+ expect(Object.keys(store.state.projects.abcproject.mergeRequests)[0]).toEqual('2');
+ expect(store.state.projects.abcproject.mergeRequests[2]).toEqual(
+ jasmine.objectContaining(mrData),
+ );
+ done();
+ })
+ .catch(done.fail);
+ });
+
+ it('sets "Current Merge Request" object to the most recent MR', done => {
+ store
+ .dispatch('getMergeRequestsForBranch', { projectId: 'abcproject', branchId: 'bar' })
+ .then(() => {
+ expect(store.state.currentMergeRequestId).toEqual('2');
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+
+ describe('no merge requests for branch available case', () => {
+ beforeEach(() => {
+ spyOn(service, 'getProjectMergeRequests').and.callThrough();
+ mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).reply(200, []);
+ });
+
+ it('does not fail if there are no merge requests for current branch', done => {
+ store
+ .dispatch('getMergeRequestsForBranch', { projectId: 'abcproject', branchId: 'foo' })
+ .then(() => {
+ expect(Object.keys(store.state.projects.abcproject.mergeRequests).length).toEqual(0);
+ expect(store.state.currentMergeRequestId).toEqual('');
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+ });
+
+ describe('error', () => {
+ beforeEach(() => {
+ mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).networkError();
+ });
+
+ it('flashes message, if error', done => {
+ const flashSpy = spyOnDependency(actions, 'flash');
+
+ getMergeRequestsForBranch({ commit() {} }, { projectId: 'abcproject', branchId: 'bar' })
+ .then(() => {
+ fail('Expected getMergeRequestsForBranch to throw an error');
+ })
+ .catch(() => {
+ expect(flashSpy).toHaveBeenCalled();
+ expect(flashSpy.calls.argsFor(0)[0]).toEqual('Error fetching merge requests for bar');
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+ });
+
describe('getMergeRequestData', () => {
describe('success', () => {
beforeEach(() => {
diff --git a/spec/javascripts/ide/stores/actions/project_spec.js b/spec/javascripts/ide/stores/actions/project_spec.js
index 7d8c9edd965..7b0963713fb 100644
--- a/spec/javascripts/ide/stores/actions/project_spec.js
+++ b/spec/javascripts/ide/stores/actions/project_spec.js
@@ -249,6 +249,7 @@ describe('IDE store project actions', () => {
['setCurrentBranchId', branch.branchId],
['getBranchData', branch],
['getFiles', branch],
+ ['getMergeRequestsForBranch', branch],
]);
})
.then(done)
diff --git a/spec/javascripts/ide/stores/actions/tree_spec.js b/spec/javascripts/ide/stores/actions/tree_spec.js
index bd41e87bf0e..fbb676aab33 100644
--- a/spec/javascripts/ide/stores/actions/tree_spec.js
+++ b/spec/javascripts/ide/stores/actions/tree_spec.js
@@ -20,6 +20,7 @@ describe('Multi-file store tree actions', () => {
};
beforeEach(() => {
+ jasmine.clock().install();
spyOn(router, 'push');
mock = new MockAdapter(axios);
@@ -37,6 +38,7 @@ describe('Multi-file store tree actions', () => {
});
afterEach(() => {
+ jasmine.clock().uninstall();
mock.restore();
resetStore(store);
});
@@ -70,6 +72,11 @@ describe('Multi-file store tree actions', () => {
store
.dispatch('getFiles', basicCallParameters)
.then(() => {
+ // The populating of the tree is deferred for performance reasons.
+ // See this merge request for details: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/25700
+ jasmine.clock().tick(1);
+ })
+ .then(() => {
projectTree = store.state.trees['abcproject/master'];
expect(projectTree.tree.length).toBe(2);
diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js
index df291ade3f7..0b5587d02ae 100644
--- a/spec/javascripts/ide/stores/actions_spec.js
+++ b/spec/javascripts/ide/stores/actions_spec.js
@@ -499,12 +499,12 @@ describe('Multi-file store actions', () => {
testAction(
renameEntry,
- { path: 'test', name: 'new-name' },
+ { path: 'test', name: 'new-name', entryPath: null, parentPath: 'parent-path' },
store.state,
[
{
type: types.RENAME_ENTRY,
- payload: { path: 'test', name: 'new-name', entryPath: null },
+ payload: { path: 'test', name: 'new-name', entryPath: null, parentPath: 'parent-path' },
},
],
[{ type: 'deleteEntry', payload: 'test' }],
@@ -527,17 +527,33 @@ describe('Multi-file store actions', () => {
testAction(
renameEntry,
- { path: 'test', name: 'new-name' },
+ { path: 'test', name: 'new-name', parentPath: 'parent-path' },
store.state,
[
{
type: types.RENAME_ENTRY,
- payload: { path: 'test', name: 'new-name', entryPath: null },
+ payload: { path: 'test', name: 'new-name', entryPath: null, parentPath: 'parent-path' },
},
],
[
- { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-1' } },
- { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-2' } },
+ {
+ type: 'renameEntry',
+ payload: {
+ path: 'test',
+ name: 'new-name',
+ entryPath: 'tree-1',
+ parentPath: 'parent-path/new-name',
+ },
+ },
+ {
+ type: 'renameEntry',
+ payload: {
+ path: 'test',
+ name: 'new-name',
+ entryPath: 'tree-2',
+ parentPath: 'parent-path/new-name',
+ },
+ },
{ type: 'deleteEntry', payload: 'test' },
],
done,
diff --git a/spec/javascripts/ide/stores/mutations_spec.js b/spec/javascripts/ide/stores/mutations_spec.js
index 41dd3d3c67f..5ee098bf17f 100644
--- a/spec/javascripts/ide/stores/mutations_spec.js
+++ b/spec/javascripts/ide/stores/mutations_spec.js
@@ -298,7 +298,12 @@ describe('Multi-file store mutations', () => {
});
it('creates new renamed entry', () => {
- mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+ mutations.RENAME_ENTRY(localState, {
+ path: 'oldPath',
+ name: 'newPath',
+ entryPath: null,
+ parentPath: '',
+ });
expect(localState.entries.newPath).toEqual({
...localState.entries.oldPath,
@@ -335,7 +340,12 @@ describe('Multi-file store mutations', () => {
...file(),
};
- mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+ mutations.RENAME_ENTRY(localState, {
+ path: 'oldPath',
+ name: 'newPath',
+ entryPath: null,
+ parentPath: 'parentPath',
+ });
expect(localState.entries.parentPath.tree.length).toBe(1);
});
diff --git a/spec/javascripts/import_projects/components/import_projects_table_spec.js b/spec/javascripts/import_projects/components/import_projects_table_spec.js
index a1ff84ce259..ab8642bf0dd 100644
--- a/spec/javascripts/import_projects/components/import_projects_table_spec.js
+++ b/spec/javascripts/import_projects/components/import_projects_table_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
-import store from '~/import_projects/store';
+import createStore from '~/import_projects/store';
import importProjectsTable from '~/import_projects/components/import_projects_table.vue';
import STATUS_MAP from '~/import_projects/constants';
import setTimeoutPromise from '../../helpers/set_timeout_promise_helper';
@@ -9,6 +9,7 @@ import setTimeoutPromise from '../../helpers/set_timeout_promise_helper';
describe('ImportProjectsTable', () => {
let vm;
let mock;
+ let store;
const reposPath = '/repos-path';
const jobsPath = '/jobs-path';
const providerTitle = 'THE PROVIDER';
@@ -31,12 +32,13 @@ describe('ImportProjectsTable', () => {
},
}).$mount();
- component.$store.dispatch('stopJobsPolling');
+ store.dispatch('stopJobsPolling');
return component;
}
beforeEach(() => {
+ store = createStore();
store.dispatch('setInitialData', { reposPath });
mock = new MockAdapter(axios);
});
@@ -167,7 +169,7 @@ describe('ImportProjectsTable', () => {
expect(vm.$el.querySelector(`.ic-status_${statusObject.icon}`)).not.toBeNull();
mock.onGet(jobsPath).replyOnce(200, updatedProjects);
- return vm.$store.dispatch('restartJobsPolling');
+ return store.dispatch('restartJobsPolling');
})
.then(() => setTimeoutPromise())
.then(() => {
diff --git a/spec/javascripts/import_projects/components/imported_project_table_row_spec.js b/spec/javascripts/import_projects/components/imported_project_table_row_spec.js
index 8af3b5954a9..7dac7e9ccc1 100644
--- a/spec/javascripts/import_projects/components/imported_project_table_row_spec.js
+++ b/spec/javascripts/import_projects/components/imported_project_table_row_spec.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import store from '~/import_projects/store';
+import createStore from '~/import_projects/store';
import importedProjectTableRow from '~/import_projects/components/imported_project_table_row.vue';
import STATUS_MAP from '~/import_projects/constants';
@@ -16,6 +16,7 @@ describe('ImportedProjectTableRow', () => {
function createComponent() {
const ImportedProjectTableRow = Vue.extend(importedProjectTableRow);
+ const store = createStore();
return new ImportedProjectTableRow({
store,
propsData: {
diff --git a/spec/javascripts/import_projects/components/provider_repo_table_row_spec.js b/spec/javascripts/import_projects/components/provider_repo_table_row_spec.js
index 69377f8d685..4d2bacd2ad0 100644
--- a/spec/javascripts/import_projects/components/provider_repo_table_row_spec.js
+++ b/spec/javascripts/import_projects/components/provider_repo_table_row_spec.js
@@ -1,12 +1,13 @@
import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
-import store from '~/import_projects/store';
+import createStore from '~/import_projects/store';
import providerRepoTableRow from '~/import_projects/components/provider_repo_table_row.vue';
import STATUS_MAP, { STATUSES } from '~/import_projects/constants';
import setTimeoutPromise from '../../helpers/set_timeout_promise_helper';
describe('ProviderRepoTableRow', () => {
+ let store;
let vm;
const repo = {
id: 10,
@@ -28,6 +29,10 @@ describe('ProviderRepoTableRow', () => {
}).$mount();
}
+ beforeEach(() => {
+ store = createStore();
+ });
+
afterEach(() => {
vm.$destroy();
});
diff --git a/spec/javascripts/jobs/store/getters_spec.js b/spec/javascripts/jobs/store/getters_spec.js
index 7931b2af79f..379114c3737 100644
--- a/spec/javascripts/jobs/store/getters_spec.js
+++ b/spec/javascripts/jobs/store/getters_spec.js
@@ -151,6 +151,61 @@ describe('Job Store Getters', () => {
});
});
+ describe('shouldRenderSharedRunnerLimitWarning', () => {
+ describe('without runners information', () => {
+ it('returns false', () => {
+ expect(getters.shouldRenderSharedRunnerLimitWarning(localState)).toEqual(false);
+ });
+ });
+
+ describe('with runners information', () => {
+ describe('when used quota is less than limit', () => {
+ it('returns false', () => {
+ localState.job.runners = {
+ quota: {
+ used: 33,
+ limit: 2000,
+ },
+ available: true,
+ online: true,
+ };
+
+ expect(getters.shouldRenderSharedRunnerLimitWarning(localState)).toEqual(false);
+ });
+ });
+
+ describe('when used quota is equal to limit', () => {
+ it('returns true', () => {
+ localState.job.runners = {
+ quota: {
+ used: 2000,
+ limit: 2000,
+ },
+ available: true,
+ online: true,
+ };
+
+ expect(getters.shouldRenderSharedRunnerLimitWarning(localState)).toEqual(true);
+ });
+ });
+
+ describe('when used quota is bigger than limit', () => {
+ it('returns true', () => {
+ localState.job.runners = {
+ quota: {
+ used: 2002,
+ limit: 2000,
+ },
+ available: true,
+ online: true,
+ };
+
+ expect(getters.shouldRenderSharedRunnerLimitWarning(localState)).toEqual(true);
+ });
+ });
+ });
+ });
+
describe('hasRunnersForProject', () => {
describe('with available and offline runners', () => {
it('returns true', () => {
diff --git a/spec/javascripts/lib/utils/number_utility_spec.js b/spec/javascripts/lib/utils/number_utility_spec.js
index 94c6214c86a..818404bad81 100644
--- a/spec/javascripts/lib/utils/number_utility_spec.js
+++ b/spec/javascripts/lib/utils/number_utility_spec.js
@@ -4,6 +4,7 @@ import {
bytesToMiB,
bytesToGiB,
numberToHumanSize,
+ sum,
} from '~/lib/utils/number_utils';
describe('Number Utils', () => {
@@ -87,4 +88,14 @@ describe('Number Utils', () => {
expect(numberToHumanSize(10737418240)).toEqual('10.00 GiB');
});
});
+
+ describe('sum', () => {
+ it('should add up two values', () => {
+ expect(sum(1, 2)).toEqual(3);
+ });
+
+ it('should add up all the values in an array when passed to a reducer', () => {
+ expect([1, 2, 3, 4, 5].reduce(sum)).toEqual(15);
+ });
+ });
});
diff --git a/spec/javascripts/monitoring/charts/area_spec.js b/spec/javascripts/monitoring/charts/area_spec.js
index d334ef7ba4f..fb49290be19 100644
--- a/spec/javascripts/monitoring/charts/area_spec.js
+++ b/spec/javascripts/monitoring/charts/area_spec.js
@@ -7,6 +7,7 @@ import MonitoringMock, { deploymentData } from '../mock_data';
describe('Area component', () => {
const mockWidgets = 'mockWidgets';
+ const mockSvgPathContent = 'mockSvgPathContent';
let mockGraphData;
let areaChart;
let spriteSpy;
@@ -30,7 +31,7 @@ describe('Area component', () => {
});
spriteSpy = spyOnDependency(Area, 'getSvgIconPathContent').and.callFake(
- () => new Promise(resolve => resolve()),
+ () => new Promise(resolve => resolve(mockSvgPathContent)),
);
});
@@ -74,15 +75,6 @@ describe('Area component', () => {
expect(shallowWrapperContainsSlotText(glAreaChart, 'tooltipTitle', mockTitle)).toBe(true);
});
- it('recieves tooltip content', () => {
- const mockContent = 'mockContent';
- areaChart.vm.tooltip.content = mockContent;
-
- expect(shallowWrapperContainsSlotText(glAreaChart, 'tooltipContent', mockContent)).toBe(
- true,
- );
- });
-
describe('when tooltip is showing deployment data', () => {
beforeEach(() => {
areaChart.vm.tooltip.isDeployment = true;
@@ -110,6 +102,7 @@ describe('Area component', () => {
const generateSeriesData = type => ({
seriesData: [
{
+ seriesName: areaChart.vm.chartData[0].name,
componentSubType: type,
value: [mockDate, 5.55555],
},
@@ -127,7 +120,14 @@ describe('Area component', () => {
});
it('formats tooltip content', () => {
- expect(areaChart.vm.tooltip.content).toBe('CPU 5.556');
+ expect(areaChart.vm.tooltip.content).toEqual([{ name: 'Core Usage', value: '5.556' }]);
+ expect(
+ shallowWrapperContainsSlotText(
+ areaChart.find(GlAreaChart),
+ 'tooltipContent',
+ 'Core Usage 5.556',
+ ),
+ ).toBe(true);
});
});
@@ -146,24 +146,31 @@ describe('Area component', () => {
});
});
- describe('getScatterSymbol', () => {
+ describe('setSvg', () => {
+ const mockSvgName = 'mockSvgName';
+
beforeEach(() => {
- areaChart.vm.getScatterSymbol();
+ areaChart.vm.setSvg(mockSvgName);
});
- it('gets rocket svg path content for use as deployment data symbol', () => {
- expect(spriteSpy).toHaveBeenCalledWith('rocket');
+ it('gets svg path content', () => {
+ expect(spriteSpy).toHaveBeenCalledWith(mockSvgName);
+ });
+
+ it('sets svg path content', done => {
+ areaChart.vm.$nextTick(() => {
+ expect(areaChart.vm.svgs[mockSvgName]).toBe(`path://${mockSvgPathContent}`);
+ done();
+ });
});
});
describe('onResize', () => {
const mockWidth = 233;
- const mockHeight = 144;
beforeEach(() => {
spyOn(Element.prototype, 'getBoundingClientRect').and.callFake(() => ({
width: mockWidth,
- height: mockHeight,
}));
areaChart.vm.onResize();
});
@@ -171,22 +178,25 @@ describe('Area component', () => {
it('sets area chart width', () => {
expect(areaChart.vm.width).toBe(mockWidth);
});
-
- it('sets area chart height', () => {
- expect(areaChart.vm.height).toBe(mockHeight);
- });
});
});
describe('computed', () => {
describe('chartData', () => {
+ let chartData;
+ const seriesData = () => chartData[0];
+
+ beforeEach(() => {
+ ({ chartData } = areaChart.vm);
+ });
+
it('utilizes all data points', () => {
- expect(Object.keys(areaChart.vm.chartData)).toEqual(['Cores']);
- expect(areaChart.vm.chartData.Cores.length).toBe(297);
+ expect(chartData.length).toBe(1);
+ expect(seriesData().data.length).toBe(297);
});
it('creates valid data', () => {
- const data = areaChart.vm.chartData.Cores;
+ const { data } = seriesData();
expect(
data.filter(([time, value]) => new Date(time).getTime() > 0 && typeof value === 'number')
@@ -205,12 +215,6 @@ describe('Area component', () => {
});
});
- describe('xAxisLabel', () => {
- it('constructs a label for the chart x-axis', () => {
- expect(areaChart.vm.xAxisLabel).toBe('Core Usage');
- });
- });
-
describe('yAxisLabel', () => {
it('constructs a label for the chart y-axis', () => {
expect(areaChart.vm.yAxisLabel).toBe('CPU');
diff --git a/spec/javascripts/notes/components/note_form_spec.js b/spec/javascripts/notes/components/note_form_spec.js
index 5db20fd285f..7cc324cfe44 100644
--- a/spec/javascripts/notes/components/note_form_spec.js
+++ b/spec/javascripts/notes/components/note_form_spec.js
@@ -1,17 +1,15 @@
-import Vue from 'vue';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
import createStore from '~/notes/stores';
-import issueNoteForm from '~/notes/components/note_form.vue';
+import NoteForm from '~/notes/components/note_form.vue';
+import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import { noteableDataMock, notesDataMock } from '../mock_data';
-import { keyboardDownEvent } from '../../issue_show/helpers';
describe('issue_note_form component', () => {
let store;
- let vm;
+ let wrapper;
let props;
beforeEach(() => {
- const Component = Vue.extend(issueNoteForm);
-
store = createStore();
store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock);
@@ -22,26 +20,35 @@ describe('issue_note_form component', () => {
noteId: '545',
};
- vm = new Component({
+ const localVue = createLocalVue();
+ wrapper = shallowMount(NoteForm, {
store,
propsData: props,
- }).$mount();
+ // see https://gitlab.com/gitlab-org/gitlab-ce/issues/56317 for the following
+ localVue,
+ sync: false,
+ });
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
describe('noteHash', () => {
it('returns note hash string based on `noteId`', () => {
- expect(vm.noteHash).toBe(`#note_${props.noteId}`);
+ expect(wrapper.vm.noteHash).toBe(`#note_${props.noteId}`);
});
it('return note hash as `#` when `noteId` is empty', done => {
- vm.noteId = '';
- Vue.nextTick()
+ wrapper.setProps({
+ ...props,
+ noteId: '',
+ });
+
+ wrapper.vm
+ .$nextTick()
.then(() => {
- expect(vm.noteHash).toBe('#');
+ expect(wrapper.vm.noteHash).toBe('#');
})
.then(done)
.catch(done.fail);
@@ -50,95 +57,127 @@ describe('issue_note_form component', () => {
describe('conflicts editing', () => {
it('should show conflict message if note changes outside the component', done => {
- vm.isEditing = true;
- vm.noteBody = 'Foo';
+ wrapper.setProps({
+ ...props,
+ isEditing: true,
+ noteBody: 'Foo',
+ });
+
const message =
'This comment has changed since you started editing, please review the updated comment to ensure information is not lost.';
- Vue.nextTick(() => {
- expect(
- vm.$el
- .querySelector('.js-conflict-edit-warning')
- .textContent.replace(/\s+/g, ' ')
- .trim(),
- ).toEqual(message);
- done();
- });
+ wrapper.vm
+ .$nextTick()
+ .then(() => {
+ const conflictWarning = wrapper.find('.js-conflict-edit-warning');
+
+ expect(conflictWarning.exists()).toBe(true);
+ expect(
+ conflictWarning
+ .text()
+ .replace(/\s+/g, ' ')
+ .trim(),
+ ).toBe(message);
+ })
+ .then(done)
+ .catch(done.fail);
});
});
describe('form', () => {
it('should render text area with placeholder', () => {
- expect(vm.$el.querySelector('textarea').getAttribute('placeholder')).toEqual(
+ const textarea = wrapper.find('textarea');
+
+ expect(textarea.attributes('placeholder')).toEqual(
'Write a comment or drag your files here…',
);
});
it('should link to markdown docs', () => {
const { markdownDocsPath } = notesDataMock;
+ const markdownField = wrapper.find(MarkdownField);
+ const markdownFieldProps = markdownField.props();
- expect(vm.$el.querySelector(`a[href="${markdownDocsPath}"]`).textContent.trim()).toEqual(
- 'Markdown',
- );
+ expect(markdownFieldProps.markdownDocsPath).toBe(markdownDocsPath);
});
describe('keyboard events', () => {
+ let textarea;
+
+ beforeEach(() => {
+ textarea = wrapper.find('textarea');
+ textarea.setValue('Foo');
+ });
+
describe('up', () => {
it('should ender edit mode', () => {
- spyOn(vm, 'editMyLastNote').and.callThrough();
- vm.$el.querySelector('textarea').value = 'Foo';
- vm.$el.querySelector('textarea').dispatchEvent(keyboardDownEvent(38, true));
+ // TODO: do not spy on vm
+ spyOn(wrapper.vm, 'editMyLastNote').and.callThrough();
+
+ textarea.trigger('keydown.up');
- expect(vm.editMyLastNote).toHaveBeenCalled();
+ expect(wrapper.vm.editMyLastNote).toHaveBeenCalled();
});
});
describe('enter', () => {
it('should save note when cmd+enter is pressed', () => {
- spyOn(vm, 'handleUpdate').and.callThrough();
- vm.$el.querySelector('textarea').value = 'Foo';
- vm.$el.querySelector('textarea').dispatchEvent(keyboardDownEvent(13, true));
+ textarea.trigger('keydown.enter', { metaKey: true });
+
+ const { handleFormUpdate } = wrapper.emitted();
- expect(vm.handleUpdate).toHaveBeenCalled();
+ expect(handleFormUpdate.length).toBe(1);
});
it('should save note when ctrl+enter is pressed', () => {
- spyOn(vm, 'handleUpdate').and.callThrough();
- vm.$el.querySelector('textarea').value = 'Foo';
- vm.$el.querySelector('textarea').dispatchEvent(keyboardDownEvent(13, false, true));
+ textarea.trigger('keydown.enter', { ctrlKey: true });
- expect(vm.handleUpdate).toHaveBeenCalled();
+ const { handleFormUpdate } = wrapper.emitted();
+
+ expect(handleFormUpdate.length).toBe(1);
});
});
});
describe('actions', () => {
it('should be possible to cancel', done => {
- spyOn(vm, 'cancelHandler').and.callThrough();
- vm.isEditing = true;
+ // TODO: do not spy on vm
+ spyOn(wrapper.vm, 'cancelHandler').and.callThrough();
+ wrapper.setProps({
+ ...props,
+ isEditing: true,
+ });
- Vue.nextTick(() => {
- vm.$el.querySelector('.note-edit-cancel').click();
+ wrapper.vm
+ .$nextTick()
+ .then(() => {
+ const cancelButton = wrapper.find('.note-edit-cancel');
+ cancelButton.trigger('click');
- Vue.nextTick(() => {
- expect(vm.cancelHandler).toHaveBeenCalled();
- done();
- });
- });
+ expect(wrapper.vm.cancelHandler).toHaveBeenCalled();
+ })
+ .then(done)
+ .catch(done.fail);
});
it('should be possible to update the note', done => {
- vm.isEditing = true;
-
- Vue.nextTick(() => {
- vm.$el.querySelector('textarea').value = 'Foo';
- vm.$el.querySelector('.js-vue-issue-save').click();
-
- Vue.nextTick(() => {
- expect(vm.isSubmitting).toEqual(true);
- done();
- });
+ wrapper.setProps({
+ ...props,
+ isEditing: true,
});
+
+ wrapper.vm
+ .$nextTick()
+ .then(() => {
+ const textarea = wrapper.find('textarea');
+ textarea.setValue('Foo');
+ const saveButton = wrapper.find('.js-vue-issue-save');
+ saveButton.trigger('click');
+
+ expect(wrapper.vm.isSubmitting).toEqual(true);
+ })
+ .then(done)
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/notes/stores/getters_spec.js b/spec/javascripts/notes/stores/getters_spec.js
index c066975a43b..8f3c493dd4c 100644
--- a/spec/javascripts/notes/stores/getters_spec.js
+++ b/spec/javascripts/notes/stores/getters_spec.js
@@ -261,4 +261,12 @@ describe('Getters Notes Store', () => {
expect(getters.firstUnresolvedDiscussionId(state, localGettersFalsy)(false)).toBeFalsy();
});
});
+
+ describe('getDiscussion', () => {
+ it('returns discussion by ID', () => {
+ state.discussions.push({ id: '1' });
+
+ expect(getters.getDiscussion(state)('1')).toEqual({ id: '1' });
+ });
+ });
});
diff --git a/spec/javascripts/notes/stores/mutation_spec.js b/spec/javascripts/notes/stores/mutation_spec.js
index fcad1f245b6..4a640d589fb 100644
--- a/spec/javascripts/notes/stores/mutation_spec.js
+++ b/spec/javascripts/notes/stores/mutation_spec.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import mutations from '~/notes/stores/mutations';
+import { DISCUSSION_NOTE } from '~/notes/constants';
import {
note,
discussionMock,
@@ -326,6 +327,18 @@ describe('Notes Store mutations', () => {
expect(state.discussions[0].notes[0].note).toEqual('Foo');
});
+
+ it('transforms an individual note to discussion', () => {
+ const state = {
+ discussions: [individualNote],
+ };
+
+ const transformedNote = { ...individualNote.notes[0], type: DISCUSSION_NOTE };
+
+ mutations.UPDATE_NOTE(state, transformedNote);
+
+ expect(state.discussions[0].individual_note).toEqual(false);
+ });
});
describe('CLOSE_ISSUE', () => {
@@ -530,7 +543,7 @@ describe('Notes Store mutations', () => {
state = { convertedDisscussionIds: [] };
});
- it('adds a disucssion to convertedDisscussionIds', () => {
+ it('adds a discussion to convertedDisscussionIds', () => {
mutations.CONVERT_TO_DISCUSSION(state, discussion.id);
expect(state.convertedDisscussionIds).toContain(discussion.id);
@@ -549,7 +562,7 @@ describe('Notes Store mutations', () => {
state = { convertedDisscussionIds: [41, 42] };
});
- it('removes a disucssion from convertedDisscussionIds', () => {
+ it('removes a discussion from convertedDisscussionIds', () => {
mutations.REMOVE_CONVERTED_DISCUSSION(state, discussion.id);
expect(state.convertedDisscussionIds).not.toContain(discussion.id);
diff --git a/spec/javascripts/persistent_user_callout_spec.js b/spec/javascripts/persistent_user_callout_spec.js
new file mode 100644
index 00000000000..2fdfff3db03
--- /dev/null
+++ b/spec/javascripts/persistent_user_callout_spec.js
@@ -0,0 +1,88 @@
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import PersistentUserCallout from '~/persistent_user_callout';
+import setTimeoutPromise from 'spec/helpers/set_timeout_promise_helper';
+
+describe('PersistentUserCallout', () => {
+ const dismissEndpoint = '/dismiss';
+ const featureName = 'feature';
+
+ function createFixture() {
+ const fixture = document.createElement('div');
+ fixture.innerHTML = `
+ <div
+ class="container"
+ data-dismiss-endpoint="${dismissEndpoint}"
+ data-feature-id="${featureName}"
+ >
+ <button type="button" class="js-close"></button>
+ </div>
+ `;
+
+ return fixture;
+ }
+
+ describe('dismiss', () => {
+ let button;
+ let mockAxios;
+ let persistentUserCallout;
+
+ beforeEach(() => {
+ const fixture = createFixture();
+ const container = fixture.querySelector('.container');
+ button = fixture.querySelector('.js-close');
+ mockAxios = new MockAdapter(axios);
+ persistentUserCallout = new PersistentUserCallout(container);
+ spyOn(persistentUserCallout.container, 'remove');
+ });
+
+ afterEach(() => {
+ mockAxios.restore();
+ });
+
+ it('POSTs endpoint and removes container when clicking close', done => {
+ mockAxios.onPost(dismissEndpoint).replyOnce(200);
+
+ button.click();
+
+ setTimeoutPromise()
+ .then(() => {
+ expect(persistentUserCallout.container.remove).toHaveBeenCalled();
+ expect(mockAxios.history.post[0].data).toBe(
+ JSON.stringify({ feature_name: featureName }),
+ );
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('invokes Flash when the dismiss request fails', done => {
+ const Flash = spyOnDependency(PersistentUserCallout, 'Flash');
+ mockAxios.onPost(dismissEndpoint).replyOnce(500);
+
+ button.click();
+
+ setTimeoutPromise()
+ .then(() => {
+ expect(persistentUserCallout.container.remove).not.toHaveBeenCalled();
+ expect(Flash).toHaveBeenCalledWith(
+ 'An error occurred while dismissing the alert. Refresh the page and try again.',
+ );
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+
+ describe('factory', () => {
+ it('returns an instance of PersistentUserCallout with the provided container property', () => {
+ const fixture = createFixture();
+
+ expect(PersistentUserCallout.factory(fixture) instanceof PersistentUserCallout).toBe(true);
+ });
+
+ it('returns undefined if container is falsey', () => {
+ expect(PersistentUserCallout.factory()).toBe(undefined);
+ });
+ });
+});
diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js
index b2b0a50911d..5eef5682bbd 100644
--- a/spec/javascripts/test_bundle.js
+++ b/spec/javascripts/test_bundle.js
@@ -8,6 +8,7 @@ import '~/commons';
import Vue from 'vue';
import VueResource from 'vue-resource';
import Translate from '~/vue_shared/translate';
+import CheckEE from '~/vue_shared/mixins/is_ee';
import jasmineDiff from 'jasmine-diff';
import { getDefaultAdapter } from '~/lib/utils/axios_utils';
@@ -43,6 +44,7 @@ Vue.config.errorHandler = function(err) {
Vue.use(VueResource);
Vue.use(Translate);
+Vue.use(CheckEE);
// enable test fixtures
jasmine.getFixtures().fixturesPath = FIXTURES_PATH;
@@ -67,6 +69,7 @@ window.gl = window.gl || {};
window.gl.TEST_HOST = TEST_HOST;
window.gon = window.gon || {};
window.gon.test_env = true;
+window.gon.ee = false;
gon.relative_url_root = '';
let hasUnhandledPromiseRejections = false;
diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
index 631da202d1d..08e173b0a10 100644
--- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -673,7 +673,7 @@ describe('ReadyToMerge', () => {
.at(0)
.props('label');
- it('should have two edit components when squash is enabled', () => {
+ it('should have two edit components when squash is enabled and there is more than 1 commit', () => {
createLocalComponent({
mr: {
commitsCount: 2,
@@ -685,6 +685,18 @@ describe('ReadyToMerge', () => {
expect(findCommitEditElements().length).toBe(2);
});
+ it('should have one edit components when squash is enabled and there is 1 commit only', () => {
+ createLocalComponent({
+ mr: {
+ commitsCount: 1,
+ squash: true,
+ enableSquashBeforeMerge: true,
+ },
+ });
+
+ expect(findCommitEditElements().length).toBe(1);
+ });
+
it('should have correct edit merge commit label', () => {
createLocalComponent();
@@ -711,8 +723,10 @@ describe('ReadyToMerge', () => {
expect(findCommitDropdownElement().exists()).toBeFalsy();
});
- it('should be rendered if squash is enabled', () => {
- createLocalComponent({ mr: { squash: true } });
+ it('should be rendered if squash is enabled and there is more than 1 commit', () => {
+ createLocalComponent({
+ mr: { enableSquashBeforeMerge: true, squash: true, commitsCount: 2 },
+ });
expect(findCommitDropdownElement().exists()).toBeTruthy();
});
diff --git a/spec/javascripts/vue_shared/components/issue/related_issuable_item_spec.js b/spec/javascripts/vue_shared/components/issue/related_issuable_item_spec.js
new file mode 100644
index 00000000000..42198e92eea
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/issue/related_issuable_item_spec.js
@@ -0,0 +1,194 @@
+import Vue from 'vue';
+import { mount, createLocalVue } from '@vue/test-utils';
+import RelatedIssuableItem from '~/vue_shared/components/issue/related_issuable_item.vue';
+import { defaultMilestone, defaultAssignees } from './related_issuable_mock_data';
+
+describe('RelatedIssuableItem', () => {
+ let wrapper;
+ const props = {
+ idKey: 1,
+ displayReference: 'gitlab-org/gitlab-test#1',
+ pathIdSeparator: '#',
+ path: `${gl.TEST_HOST}/path`,
+ title: 'title',
+ confidential: true,
+ dueDate: '1990-12-31',
+ weight: 10,
+ createdAt: '2018-12-01T00:00:00.00Z',
+ milestone: defaultMilestone,
+ assignees: defaultAssignees,
+ eventNamespace: 'relatedIssue',
+ };
+ const slots = {
+ dueDate: '<div class="js-due-date-slot"></div>',
+ weight: '<div class="js-weight-slot"></div>',
+ };
+
+ beforeEach(() => {
+ const localVue = createLocalVue();
+
+ wrapper = mount(localVue.extend(RelatedIssuableItem), {
+ localVue,
+ slots,
+ sync: false,
+ propsData: props,
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains issuable-info-container class when canReorder is false', () => {
+ expect(wrapper.props('canReorder')).toBe(false);
+ expect(wrapper.find('.issuable-info-container').exists()).toBe(true);
+ });
+
+ it('does not render token state', () => {
+ expect(wrapper.find('.text-secondary svg').exists()).toBe(false);
+ });
+
+ it('does not render remove button', () => {
+ expect(wrapper.find({ ref: 'removeButton' }).exists()).toBe(false);
+ });
+
+ describe('token title', () => {
+ it('links to computedPath', () => {
+ expect(wrapper.find('.item-title a').attributes('href')).toEqual(wrapper.props('path'));
+ });
+
+ it('renders confidential icon', () => {
+ expect(wrapper.find('.confidential-icon').exists()).toBe(true);
+ });
+
+ it('renders title', () => {
+ expect(wrapper.find('.item-title a').text()).toEqual(props.title);
+ });
+ });
+
+ describe('token state', () => {
+ let tokenState;
+
+ beforeEach(done => {
+ wrapper.setProps({ state: 'opened' });
+
+ Vue.nextTick(() => {
+ tokenState = wrapper.find('.issue-token-state-icon-open');
+
+ done();
+ });
+ });
+
+ it('renders if hasState', () => {
+ expect(tokenState.exists()).toBe(true);
+ });
+
+ it('renders state title', () => {
+ const stateTitle = tokenState.attributes('data-original-title');
+
+ expect(stateTitle).toContain('<span class="bold">Opened</span>');
+ expect(stateTitle).toContain(
+ '<span class="text-tertiary">Dec 1, 2018 12:00am GMT+0000</span>',
+ );
+ });
+
+ it('renders aria label', () => {
+ expect(tokenState.attributes('aria-label')).toEqual('opened');
+ });
+
+ it('renders open icon when open state', () => {
+ expect(tokenState.classes('issue-token-state-icon-open')).toBe(true);
+ });
+
+ it('renders close icon when close state', done => {
+ wrapper.setProps({
+ state: 'closed',
+ closedAt: '2018-12-01T00:00:00.00Z',
+ });
+
+ Vue.nextTick(() => {
+ expect(tokenState.classes('issue-token-state-icon-closed')).toBe(true);
+
+ done();
+ });
+ });
+ });
+
+ describe('token metadata', () => {
+ let tokenMetadata;
+
+ beforeEach(done => {
+ Vue.nextTick(() => {
+ tokenMetadata = wrapper.find('.item-meta');
+
+ done();
+ });
+ });
+
+ it('renders item path and ID', () => {
+ const pathAndID = tokenMetadata.find('.item-path-id').text();
+
+ expect(pathAndID).toContain('gitlab-org/gitlab-test');
+ expect(pathAndID).toContain('#1');
+ });
+
+ it('renders milestone icon and name', () => {
+ const milestoneIcon = tokenMetadata.find('.item-milestone svg use');
+ const milestoneTitle = tokenMetadata.find('.item-milestone .milestone-title');
+
+ expect(milestoneIcon.attributes('href')).toContain('clock');
+ expect(milestoneTitle.text()).toContain('Milestone title');
+ });
+
+ it('renders due date component', () => {
+ expect(tokenMetadata.find('.js-due-date-slot').exists()).toBe(true);
+ });
+
+ it('renders weight component', () => {
+ expect(tokenMetadata.find('.js-weight-slot').exists()).toBe(true);
+ });
+ });
+
+ describe('token assignees', () => {
+ it('renders assignees avatars', () => {
+ expect(wrapper.findAll('.item-assignees .user-avatar-link').length).toBe(2);
+ expect(wrapper.find('.item-assignees .avatar-counter').text()).toContain('+2');
+ });
+ });
+
+ describe('remove button', () => {
+ let removeBtn;
+
+ beforeEach(done => {
+ wrapper.setProps({ canRemove: true });
+ Vue.nextTick(() => {
+ removeBtn = wrapper.find({ ref: 'removeButton' });
+
+ done();
+ });
+ });
+
+ it('renders if canRemove', () => {
+ expect(removeBtn.exists()).toBe(true);
+ });
+
+ it('renders disabled button when removeDisabled', done => {
+ wrapper.vm.removeDisabled = true;
+
+ Vue.nextTick(() => {
+ expect(removeBtn.attributes('disabled')).toEqual('disabled');
+
+ done();
+ });
+ });
+
+ it('triggers onRemoveRequest when clicked', () => {
+ removeBtn.trigger('click');
+
+ const { relatedIssueRemoveRequest } = wrapper.emitted();
+
+ expect(relatedIssueRemoveRequest.length).toBe(1);
+ expect(relatedIssueRemoveRequest[0]).toEqual([props.idKey]);
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/issue/related_issuable_mock_data.js b/spec/javascripts/vue_shared/components/issue/related_issuable_mock_data.js
new file mode 100644
index 00000000000..26bfdd7551e
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/issue/related_issuable_mock_data.js
@@ -0,0 +1,111 @@
+export const defaultProps = {
+ endpoint: '/foo/bar/issues/1/related_issues',
+ currentNamespacePath: 'foo',
+ currentProjectPath: 'bar',
+};
+
+export const issuable1 = {
+ id: 200,
+ epic_issue_id: 1,
+ confidential: false,
+ reference: 'foo/bar#123',
+ displayReference: '#123',
+ title: 'some title',
+ path: '/foo/bar/issues/123',
+ state: 'opened',
+};
+
+export const issuable2 = {
+ id: 201,
+ epic_issue_id: 2,
+ confidential: false,
+ reference: 'foo/bar#124',
+ displayReference: '#124',
+ title: 'some other thing',
+ path: '/foo/bar/issues/124',
+ state: 'opened',
+};
+
+export const issuable3 = {
+ id: 202,
+ epic_issue_id: 3,
+ confidential: false,
+ reference: 'foo/bar#125',
+ displayReference: '#125',
+ title: 'some other other thing',
+ path: '/foo/bar/issues/125',
+ state: 'opened',
+};
+
+export const issuable4 = {
+ id: 203,
+ epic_issue_id: 4,
+ confidential: false,
+ reference: 'foo/bar#126',
+ displayReference: '#126',
+ title: 'some other other other thing',
+ path: '/foo/bar/issues/126',
+ state: 'opened',
+};
+
+export const issuable5 = {
+ id: 204,
+ epic_issue_id: 5,
+ confidential: false,
+ reference: 'foo/bar#127',
+ displayReference: '#127',
+ title: 'some other other other thing',
+ path: '/foo/bar/issues/127',
+ state: 'opened',
+};
+
+export const defaultMilestone = {
+ id: 1,
+ state: 'active',
+ title: 'Milestone title',
+ start_date: '2018-01-01',
+ due_date: '2019-12-31',
+};
+
+export const defaultAssignees = [
+ {
+ id: 1,
+ name: 'Administrator',
+ username: 'root',
+ state: 'active',
+ avatar_url: `${gl.TEST_HOST}`,
+ web_url: `${gl.TEST_HOST}/root`,
+ status_tooltip_html: null,
+ path: '/root',
+ },
+ {
+ id: 13,
+ name: 'Brooks Beatty',
+ username: 'brynn_champlin',
+ state: 'active',
+ avatar_url: `${gl.TEST_HOST}`,
+ web_url: `${gl.TEST_HOST}/brynn_champlin`,
+ status_tooltip_html: null,
+ path: '/brynn_champlin',
+ },
+ {
+ id: 6,
+ name: 'Bryce Turcotte',
+ username: 'melynda',
+ state: 'active',
+ avatar_url: `${gl.TEST_HOST}`,
+ web_url: `${gl.TEST_HOST}/melynda`,
+ status_tooltip_html: null,
+ path: '/melynda',
+ },
+ {
+ id: 20,
+ name: 'Conchita Eichmann',
+ username: 'juliana_gulgowski',
+ state: 'active',
+ avatar_url: `${gl.TEST_HOST}`,
+ web_url: `${gl.TEST_HOST}/juliana_gulgowski`,
+ status_tooltip_html: null,
+ path: '/juliana_gulgowski',
+ },
+];
diff --git a/spec/javascripts/vue_shared/components/table_pagination_spec.js b/spec/javascripts/vue_shared/components/table_pagination_spec.js
index 407d1d59f83..42cd41381dc 100644
--- a/spec/javascripts/vue_shared/components/table_pagination_spec.js
+++ b/spec/javascripts/vue_shared/components/table_pagination_spec.js
@@ -22,10 +22,10 @@ describe('Pagination component', () => {
it('should not render anything', () => {
component = mountComponent({
pageInfo: {
- nextPage: 1,
+ nextPage: NaN,
page: 1,
perPage: 20,
- previousPage: null,
+ previousPage: NaN,
total: 15,
totalPages: 1,
},
@@ -58,6 +58,28 @@ describe('Pagination component', () => {
expect(spy).not.toHaveBeenCalled();
});
+ it('should be disabled and non clickable when total and totalPages are NaN', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 2,
+ page: 1,
+ perPage: 20,
+ previousPage: NaN,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ expect(
+ component.$el.querySelector('.js-previous-button').classList.contains('disabled'),
+ ).toEqual(true);
+
+ component.$el.querySelector('.js-previous-button .page-link').click();
+
+ expect(spy).not.toHaveBeenCalled();
+ });
+
it('should be enabled and clickable', () => {
component = mountComponent({
pageInfo: {
@@ -75,6 +97,24 @@ describe('Pagination component', () => {
expect(spy).toHaveBeenCalledWith(1);
});
+
+ it('should be enabled and clickable when total and totalPages are NaN', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 3,
+ page: 2,
+ perPage: 20,
+ previousPage: 1,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ component.$el.querySelector('.js-previous-button .page-link').click();
+
+ expect(spy).toHaveBeenCalledWith(1);
+ });
});
describe('first button', () => {
@@ -99,6 +139,28 @@ describe('Pagination component', () => {
expect(spy).toHaveBeenCalledWith(1);
});
+
+ it('should call the change callback with the first page when total and totalPages are NaN', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 3,
+ page: 2,
+ perPage: 20,
+ previousPage: 1,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ const button = component.$el.querySelector('.js-first-button .page-link');
+
+ expect(button.textContent.trim()).toEqual('« First');
+
+ button.click();
+
+ expect(spy).toHaveBeenCalledWith(1);
+ });
});
describe('last button', () => {
@@ -123,16 +185,32 @@ describe('Pagination component', () => {
expect(spy).toHaveBeenCalledWith(5);
});
+
+ it('should not render', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 3,
+ page: 2,
+ perPage: 20,
+ previousPage: 1,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ expect(component.$el.querySelector('.js-last-button .page-link')).toBeNull();
+ });
});
describe('next button', () => {
it('should be disabled and non clickable', () => {
component = mountComponent({
pageInfo: {
- nextPage: 5,
+ nextPage: NaN,
page: 5,
perPage: 20,
- previousPage: 1,
+ previousPage: 4,
total: 84,
totalPages: 5,
},
@@ -146,6 +224,26 @@ describe('Pagination component', () => {
expect(spy).not.toHaveBeenCalled();
});
+ it('should be disabled and non clickable when total and totalPages are NaN', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: NaN,
+ page: 5,
+ perPage: 20,
+ previousPage: 4,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ expect(component.$el.querySelector('.js-next-button').textContent.trim()).toEqual('Next');
+
+ component.$el.querySelector('.js-next-button .page-link').click();
+
+ expect(spy).not.toHaveBeenCalled();
+ });
+
it('should be enabled and clickable', () => {
component = mountComponent({
pageInfo: {
@@ -163,6 +261,24 @@ describe('Pagination component', () => {
expect(spy).toHaveBeenCalledWith(4);
});
+
+ it('should be enabled and clickable when total and totalPages are NaN', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 4,
+ page: 3,
+ perPage: 20,
+ previousPage: 2,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ component.$el.querySelector('.js-next-button .page-link').click();
+
+ expect(spy).toHaveBeenCalledWith(4);
+ });
});
describe('numbered buttons', () => {
@@ -181,22 +297,56 @@ describe('Pagination component', () => {
expect(component.$el.querySelectorAll('.page').length).toEqual(5);
});
+
+ it('should not render any page', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 4,
+ page: 3,
+ perPage: 20,
+ previousPage: 2,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ expect(component.$el.querySelectorAll('.page').length).toEqual(0);
+ });
});
- it('should render the spread operator', () => {
- component = mountComponent({
- pageInfo: {
- nextPage: 4,
- page: 3,
- perPage: 20,
- previousPage: 2,
- total: 84,
- totalPages: 10,
- },
- change: spy,
+ describe('spread operator', () => {
+ it('should render', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 4,
+ page: 3,
+ perPage: 20,
+ previousPage: 2,
+ total: 84,
+ totalPages: 10,
+ },
+ change: spy,
+ });
+
+ expect(component.$el.querySelector('.separator').textContent.trim()).toEqual('...');
});
- expect(component.$el.querySelector('.separator').textContent.trim()).toEqual('...');
+ it('should not render', () => {
+ component = mountComponent({
+ pageInfo: {
+ nextPage: 4,
+ page: 3,
+ perPage: 20,
+ previousPage: 2,
+ total: NaN,
+ totalPages: NaN,
+ },
+ change: spy,
+ });
+
+ expect(component.$el.querySelector('.separator')).toBeNull();
+ });
});
});
});
diff --git a/spec/lib/constraints/project_url_constrainer_spec.rb b/spec/lib/constraints/project_url_constrainer_spec.rb
index c96e7ab8495..3496b01ebcc 100644
--- a/spec/lib/constraints/project_url_constrainer_spec.rb
+++ b/spec/lib/constraints/project_url_constrainer_spec.rb
@@ -16,6 +16,10 @@ describe Constraints::ProjectUrlConstrainer do
let(:request) { build_request('foo', 'bar') }
it { expect(subject.matches?(request)).to be_falsey }
+
+ context 'existence_check is false' do
+ it { expect(subject.matches?(request, existence_check: false)).to be_truthy }
+ end
end
context "project id ending with .git" do
diff --git a/spec/lib/event_filter_spec.rb b/spec/lib/event_filter_spec.rb
index 30016da6828..6648e141b7a 100644
--- a/spec/lib/event_filter_spec.rb
+++ b/spec/lib/event_filter_spec.rb
@@ -26,10 +26,10 @@ describe EventFilter do
set(:push_event) { create(:push_event, project: public_project) }
set(:merged_event) { create(:event, :merged, project: public_project, target: public_project) }
- set(:created_event) { create(:event, :created, project: public_project, target: public_project) }
- set(:updated_event) { create(:event, :updated, project: public_project, target: public_project) }
- set(:closed_event) { create(:event, :closed, project: public_project, target: public_project) }
- set(:reopened_event) { create(:event, :reopened, project: public_project, target: public_project) }
+ set(:created_event) { create(:event, :created, project: public_project, target: create(:issue, project: public_project)) }
+ set(:updated_event) { create(:event, :updated, project: public_project, target: create(:issue, project: public_project)) }
+ set(:closed_event) { create(:event, :closed, project: public_project, target: create(:issue, project: public_project)) }
+ set(:reopened_event) { create(:event, :reopened, project: public_project, target: create(:issue, project: public_project)) }
set(:comments_event) { create(:event, :commented, project: public_project, target: public_project) }
set(:joined_event) { create(:event, :joined, project: public_project, target: public_project) }
set(:left_event) { create(:event, :left, project: public_project, target: public_project) }
diff --git a/spec/lib/gitlab/auth/ldap/config_spec.rb b/spec/lib/gitlab/auth/ldap/config_spec.rb
index d3ab599d5a0..b91a09e3137 100644
--- a/spec/lib/gitlab/auth/ldap/config_spec.rb
+++ b/spec/lib/gitlab/auth/ldap/config_spec.rb
@@ -5,6 +5,65 @@ describe Gitlab::Auth::LDAP::Config do
let(:config) { described_class.new('ldapmain') }
+ def raw_cert
+ <<-EOS
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk4CCQDX+u/9fICksDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV
+UzEMMAoGA1UECAwDRm9vMQwwCgYDVQQHDANCYXIxDDAKBgNVBAoMA0JhejEMMAoG
+A1UECwwDUXV4MQ0wCwYDVQQDDARsZGFwMR8wHQYJKoZIhvcNAQkBFhBsZGFwQGV4
+YW1wbGUuY29tMB4XDTE5MDIyNzE1NTUxNFoXDTE5MDMyOTE1NTUxNFowdTELMAkG
+A1UEBhMCVVMxDDAKBgNVBAgMA0ZvbzEMMAoGA1UEBwwDQmFyMQwwCgYDVQQKDANC
+YXoxDDAKBgNVBAsMA1F1eDENMAsGA1UEAwwEbGRhcDEfMB0GCSqGSIb3DQEJARYQ
+bGRhcEBleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+APuDB/4/AUmTEmhYzN13no4Kt8hkRbLQuENRHlOeQw05/MVdoB1AWLOPzIXn4kex
+GD9tHkoJl8S0QPmAAcPHn5O97e+gd0ze5dRQZl/cSd2/j5zeaMvZ1mCrPN/dOluM
+94Oj+wQU4bEcOlrqIMSh0ezJw10R3IHXCQFeGtIZU57WmKcrryQX4kP7KTOgRw/t
+CYp+NivQHtLbBEj1MU0l10qMS2+w8Qpqov4MdW4gx4wTgId2j1ZZ56+n6Jsc9qoI
+wBWBNL4XU5a3kwhYZDOJoOvI9po33KLdT1dXS81uOFXClp3LGmKDgLTwQ1w+RmQG
++JG4EvTfDIShdcTDXEaOfCECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAJM9Btu5g
+k8qDiz5TilvpyoGuI4viCwusARFAFmOB/my/cHlVvkuq4bbfV1KJoWWGJg8GcklL
+cnIdxc35uYM5icr6xXQyrW0GqAO+LEXyUxVQqYETxrQ/LJ03xhBnuF7hvZJIBiky
+GwUy0clJxGfaCeEM8zXwePawLgGjuUawDDQOwigysoWqoMu3VFW8zl8UPa84bow9
+Kn2QmPAkLw4EcqYSCNSSvnyzu5SM64jwLWRXFsmlqD7773oT29vTkqM1EQANFEfT
+7gQomLyPqoPBoFph5oSNn6Rf31QX1Sie92EAKVnZ1XmD68hKzjv6ChCtzTv4jABg
+XrDwnLkORIAF/Q==
+-----END CERTIFICATE-----
+ EOS
+ end
+
+ def raw_key
+ <<-EOS
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQD7gwf+PwFJkxJo
+WMzdd56OCrfIZEWy0LhDUR5TnkMNOfzFXaAdQFizj8yF5+JHsRg/bR5KCZfEtED5
+gAHDx5+Tve3voHdM3uXUUGZf3Endv4+c3mjL2dZgqzzf3TpbjPeDo/sEFOGxHDpa
+6iDEodHsycNdEdyB1wkBXhrSGVOe1pinK68kF+JD+ykzoEcP7QmKfjYr0B7S2wRI
+9TFNJddKjEtvsPEKaqL+DHVuIMeME4CHdo9WWeevp+ibHPaqCMAVgTS+F1OWt5MI
+WGQziaDryPaaN9yi3U9XV0vNbjhVwpadyxpig4C08ENcPkZkBviRuBL03wyEoXXE
+w1xGjnwhAgMBAAECggEAbw82GVui6uUpjLAhjm3CssAi1TcJ2+L0aq1IMe5Bd3ay
+mkg0apY+VNPboQl6zuNxbJh3doPz42UhB8sxfE0Ktwd4KIb4Bxap7+2stwmkCGoN
+NVy0c8d2NWuHzuZ2XXTK2vMu5Wd/HWD0l66o14sJEoEpZlB7yU216UevmjSayxjh
+aBTSaYyyrf24haTaCuqwph/V73ZlMpFdSALGny0uiP/5inxciMCkMpHfX6BflSb4
+EGKsIYt9BJ0kY4GNG5bCP7971UCxp2eEJhU2fV8HuFGCOD12IqSpUqPxHxjsWpfx
+T7FZ3V2kM/58Ca+5LB2y3atcPIdY0/g7/43V4VD+7QKBgQD/PO4/0cmZuuLU1LPT
+C/C596kPK0JLlvvRqhbz4byRAkW/n7uQFG7TMtFNle3UmT7rk7pjtbHnByqzEd+9
+jMhBysjHOMg0+DWm7fEtSg/tJ3qLVO3nbdA4qmXYobLcLoG+PCYRLskEHHqTG/Bv
+QZLbavOU6rrTqckNr1TMpNBmXwKBgQD8Q0C2YTOpwgjRUe8i6Chnc3o4x8a1i98y
+9la6c7y7acWHSbEczMkNfEBrbM73rTb+bBA0Zqw+Z1gkv8bGpvGxX8kbSfJJ2YKW
+9koxpLNTVNVapqBa9ImiaozV285dz9Ukx8bnMOJlTELpOl7RRV7iF0smYjfHIl3D
+Yxyda/MtfwKBgHb9l/Dmw77IkqE4PFFimqqIHCe3OiP1UpavXh36midcUNoCBLYp
+4HTTlyI9iG/5tYysBVQgy7xx6eUrqww6Ss3pVOsTvLp9EL4u5aYAhiZApm+4e2TO
+HCmevvZcg/8EK3Zdoj2Wex5QjJBykQe9IVLrrH07ZTfySon3uGfjWkivAoGAGvqS
+VC8HGHOw/7n0ilYr5Ax8mM/813OzFj80PVKdb6m7P2HJOFxKcE/Gj/aeF+0FgaZL
+AV+tsirZSWzdNGesV5z35Bw/dlh11/FVNAP6TcI34y8I3VFj2uPsVf7hDjVpBTr8
+ccNPoyfJzCm69ESoBiQZnGxKrNhnELtr1wYxhr8CgYApWwf4hVrTWV1zs+pEJenh
+AtlErSqafbECNDSwS5BX8yDpu5yRBJ4xegO/rNlmb8ICRYkuJapD1xXicFOsmfUK
+0Ff8afd2Q/OfBeUdq9KA4JO9fNqzEwOWvv8Ryn4ZSYcAuLP7IVJKjjI6R7rYaO/G
+3OWJdizbykGOi0BFDu+3dw==
+-----END PRIVATE KEY-----
+ EOS
+ end
+
describe '.servers' do
it 'returns empty array if no server information is available' do
allow(Gitlab.config).to receive(:ldap).and_return('enabled' => false)
@@ -89,6 +148,42 @@ describe Gitlab::Auth::LDAP::Config do
expect(config.adapter_options[:encryption]).to include({ method: :start_tls })
end
+ it 'transforms SSL cert and key to OpenSSL objects' do
+ stub_ldap_config(
+ options: {
+ 'host' => 'ldap.example.com',
+ 'port' => 686,
+ 'encryption' => 'start_tls',
+ 'tls_options' => {
+ 'cert' => raw_cert,
+ 'key' => raw_key
+ }
+ }
+ )
+
+ expect(config.adapter_options[:encryption][:tls_options][:cert]).to be_a(OpenSSL::X509::Certificate)
+ expect(config.adapter_options[:encryption][:tls_options][:key]).to be_a(OpenSSL::PKey::RSA)
+ end
+
+ it 'logs an error when an invalid key or cert are configured' do
+ allow(Rails.logger).to receive(:error)
+ stub_ldap_config(
+ options: {
+ 'host' => 'ldap.example.com',
+ 'port' => 686,
+ 'encryption' => 'start_tls',
+ 'tls_options' => {
+ 'cert' => 'invalid cert',
+ 'key' => 'invalid_key'
+ }
+ }
+ )
+
+ config.adapter_options
+
+ expect(Rails.logger).to have_received(:error).with(/LDAP TLS Options/).twice
+ end
+
context 'when verify_certificates is enabled' do
it 'sets tls_options to OpenSSL defaults' do
stub_ldap_config(
@@ -130,7 +225,9 @@ describe Gitlab::Auth::LDAP::Config do
'host' => 'ldap.example.com',
'port' => 686,
'encryption' => 'simple_tls',
- 'ca_file' => '/etc/ca.pem'
+ 'tls_options' => {
+ 'ca_file' => '/etc/ca.pem'
+ }
}
)
@@ -145,7 +242,9 @@ describe Gitlab::Auth::LDAP::Config do
'host' => 'ldap.example.com',
'port' => 686,
'encryption' => 'simple_tls',
- 'ca_file' => ' '
+ 'tls_options' => {
+ 'ca_file' => ' '
+ }
}
)
@@ -160,7 +259,9 @@ describe Gitlab::Auth::LDAP::Config do
'host' => 'ldap.example.com',
'port' => 686,
'encryption' => 'simple_tls',
- 'ssl_version' => 'TLSv1_2'
+ 'tls_options' => {
+ 'ssl_version' => 'TLSv1_2'
+ }
}
)
@@ -175,7 +276,9 @@ describe Gitlab::Auth::LDAP::Config do
'host' => 'ldap.example.com',
'port' => 686,
'encryption' => 'simple_tls',
- 'ssl_version' => ' '
+ 'tls_options' => {
+ 'ssl_version' => ' '
+ }
}
)
@@ -223,6 +326,23 @@ describe Gitlab::Auth::LDAP::Config do
)
end
+ it 'transforms SSL cert and key to OpenSSL objects' do
+ stub_ldap_config(
+ options: {
+ 'host' => 'ldap.example.com',
+ 'port' => 686,
+ 'encryption' => 'start_tls',
+ 'tls_options' => {
+ 'cert' => raw_cert,
+ 'key' => raw_key
+ }
+ }
+ )
+
+ expect(config.omniauth_options[:tls_options][:cert]).to be_a(OpenSSL::X509::Certificate)
+ expect(config.omniauth_options[:tls_options][:key]).to be_a(OpenSSL::PKey::RSA)
+ end
+
context 'when verify_certificates is enabled' do
it 'specifies disable_verify_certificates as false' do
stub_ldap_config(
@@ -261,11 +381,13 @@ describe Gitlab::Auth::LDAP::Config do
'port' => 686,
'encryption' => 'simple_tls',
'verify_certificates' => true,
- 'ca_file' => '/etc/ca.pem'
+ 'tls_options' => {
+ 'ca_file' => '/etc/ca.pem'
+ }
}
)
- expect(config.omniauth_options).to include({ ca_file: '/etc/ca.pem' })
+ expect(config.omniauth_options[:tls_options]).to include({ ca_file: '/etc/ca.pem' })
end
end
@@ -277,11 +399,13 @@ describe Gitlab::Auth::LDAP::Config do
'port' => 686,
'encryption' => 'simple_tls',
'verify_certificates' => true,
- 'ca_file' => ' '
+ 'tls_options' => {
+ 'ca_file' => ' '
+ }
}
)
- expect(config.omniauth_options).not_to have_key(:ca_file)
+ expect(config.omniauth_options[:tls_options]).not_to have_key(:ca_file)
end
end
@@ -293,11 +417,13 @@ describe Gitlab::Auth::LDAP::Config do
'port' => 686,
'encryption' => 'simple_tls',
'verify_certificates' => true,
- 'ssl_version' => 'TLSv1_2'
+ 'tls_options' => {
+ 'ssl_version' => 'TLSv1_2'
+ }
}
)
- expect(config.omniauth_options).to include({ ssl_version: 'TLSv1_2' })
+ expect(config.omniauth_options[:tls_options]).to include({ ssl_version: 'TLSv1_2' })
end
end
@@ -309,11 +435,14 @@ describe Gitlab::Auth::LDAP::Config do
'port' => 686,
'encryption' => 'simple_tls',
'verify_certificates' => true,
- 'ssl_version' => ' '
+ 'tls_options' => {
+ 'ssl_version' => ' '
+ }
}
)
- expect(config.omniauth_options).not_to have_key(:ssl_version)
+ # OpenSSL default params includes `ssl_version` so we just check that it's not blank
+ expect(config.omniauth_options[:tls_options]).not_to include({ ssl_version: ' ' })
end
end
end
diff --git a/spec/lib/gitlab/checks/branch_check_spec.rb b/spec/lib/gitlab/checks/branch_check_spec.rb
index 77366e91dca..12beeecd470 100644
--- a/spec/lib/gitlab/checks/branch_check_spec.rb
+++ b/spec/lib/gitlab/checks/branch_check_spec.rb
@@ -48,10 +48,128 @@ describe Gitlab::Checks::BranchCheck do
context 'when project repository is empty' do
let(:project) { create(:project) }
- it 'raises an error if the user is not allowed to push to protected branches' do
- expect(user_access).to receive(:can_push_to_branch?).and_return(false)
+ context 'user is not allowed to push to protected branches' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(false)
+ end
+
+ it 'raises an error' do
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /Ask a project Owner or Maintainer to create a default branch/)
+ end
+ end
+
+ context 'user is allowed to push to protected branches' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(true)
+ end
+
+ it 'allows branch creation' do
+ expect { subject.validate! }.not_to raise_error
+ end
+ end
+ end
+
+ context 'branch creation' do
+ let(:oldrev) { '0000000000000000000000000000000000000000' }
+ let(:ref) { 'refs/heads/feature' }
- expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /Ask a project Owner or Maintainer to create a default branch/)
+ context 'protected branch creation feature is disabled' do
+ before do
+ stub_feature_flags(protected_branch_creation: false)
+ end
+
+ context 'user is not allowed to push to protected branch' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(false)
+ end
+
+ it 'raises an error' do
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to protected branches on this project.')
+ end
+ end
+
+ context 'user is allowed to push to protected branch' do
+ before do
+ allow(user_access)
+ .to receive(:can_push_to_branch?)
+ .and_return(true)
+ end
+
+ it 'does not raise an error' do
+ expect { subject.validate! }.not_to raise_error
+ end
+ end
+ end
+
+ context 'protected branch creation feature is enabled' do
+ context 'user is not allowed to create protected branches' do
+ before do
+ allow(user_access)
+ .to receive(:can_merge_to_branch?)
+ .with('feature')
+ .and_return(false)
+ end
+
+ it 'raises an error' do
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to create protected branches on this project.')
+ end
+ end
+
+ context 'user is allowed to create protected branches' do
+ before do
+ allow(user_access)
+ .to receive(:can_merge_to_branch?)
+ .with('feature')
+ .and_return(true)
+
+ allow(project.repository)
+ .to receive(:branch_names_contains_sha)
+ .with(newrev)
+ .and_return(['branch'])
+ end
+
+ context "newrev isn't in any protected branches" do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:any_protected?)
+ .with(project, ['branch'])
+ .and_return(false)
+ end
+
+ it 'raises an error' do
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only use an existing protected branch ref as the basis of a new protected branch.')
+ end
+ end
+
+ context 'newrev is included in a protected branch' do
+ before do
+ allow(ProtectedBranch)
+ .to receive(:any_protected?)
+ .with(project, ['branch'])
+ .and_return(true)
+ end
+
+ context 'via web interface' do
+ let(:protocol) { 'web' }
+
+ it 'allows branch creation' do
+ expect { subject.validate! }.not_to raise_error
+ end
+ end
+
+ context 'via SSH' do
+ it 'raises an error' do
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only create protected branches using the web interface and API.')
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/build/policy/changes_spec.rb b/spec/lib/gitlab/ci/build/policy/changes_spec.rb
index dc3329061d1..92cf0376c02 100644
--- a/spec/lib/gitlab/ci/build/policy/changes_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/changes_spec.rb
@@ -133,7 +133,7 @@ describe Gitlab::Ci::Build::Policy::Changes do
let(:seed) { double('build seed', to_resource: ci_build) }
context 'when source is merge request' do
- let(:source) { :merge_request }
+ let(:source) { :merge_request_event }
let(:merge_request) do
create(:merge_request,
diff --git a/spec/lib/gitlab/ci/build/policy/refs_spec.rb b/spec/lib/gitlab/ci/build/policy/refs_spec.rb
index 553fc0fb9bf..b4ddbf89b70 100644
--- a/spec/lib/gitlab/ci/build/policy/refs_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/refs_spec.rb
@@ -68,6 +68,20 @@ describe Gitlab::Ci::Build::Policy::Refs do
expect(described_class.new(%w[triggers]))
.not_to be_satisfied_by(pipeline)
end
+
+ context 'when source is merge_request_event' do
+ let(:pipeline) { build_stubbed(:ci_pipeline, source: :merge_request_event) }
+
+ it 'is satisfied with only: merge_request' do
+ expect(described_class.new(%w[merge_requests]))
+ .to be_satisfied_by(pipeline)
+ end
+
+ it 'is not satisfied with only: merge_request_event' do
+ expect(described_class.new(%w[merge_request_events]))
+ .not_to be_satisfied_by(pipeline)
+ end
+ end
end
context 'when matching a ref by a regular expression' do
diff --git a/spec/lib/gitlab/ci/build/policy/variables_spec.rb b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
index c2c0742efc3..9b016901a20 100644
--- a/spec/lib/gitlab/ci/build/policy/variables_spec.rb
+++ b/spec/lib/gitlab/ci/build/policy/variables_spec.rb
@@ -15,6 +15,7 @@ describe Gitlab::Ci::Build::Policy::Variables do
before do
pipeline.variables.build(key: 'CI_PROJECT_NAME', value: '')
+ pipeline.variables.build(key: 'MY_VARIABLE', value: 'my-var')
end
describe '#satisfied_by?' do
@@ -24,6 +25,12 @@ describe Gitlab::Ci::Build::Policy::Variables do
expect(policy).to be_satisfied_by(pipeline, seed)
end
+ it 'is satisfied by a matching pipeline variable' do
+ policy = described_class.new(['$MY_VARIABLE'])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+
it 'is not satisfied by an overridden empty variable' do
policy = described_class.new(['$CI_PROJECT_NAME'])
@@ -68,5 +75,19 @@ describe Gitlab::Ci::Build::Policy::Variables do
expect(pipeline).not_to be_persisted
expect(seed.to_resource).not_to be_persisted
end
+
+ context 'when a bridge job is used' do
+ let(:bridge) do
+ build(:ci_bridge, pipeline: pipeline, project: project, ref: 'master')
+ end
+
+ let(:seed) { double('bridge seed', to_resource: bridge) }
+
+ it 'is satisfied by a matching expression for a bridge job' do
+ policy = described_class.new(['$MY_VARIABLE'])
+
+ expect(policy).to be_satisfied_by(pipeline, seed)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/base_spec.rb b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
index 1a6b3587599..fa39b32d7ab 100644
--- a/spec/lib/gitlab/ci/config/external/file/base_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
@@ -3,7 +3,7 @@
require 'fast_spec_helper'
describe Gitlab::Ci::Config::External::File::Base do
- let(:context) { described_class::Context.new(nil, 'HEAD', nil) }
+ let(:context) { described_class::Context.new(nil, 'HEAD', nil, Set.new) }
let(:test_class) do
Class.new(described_class) do
@@ -79,4 +79,20 @@ describe Gitlab::Ci::Config::External::File::Base do
end
end
end
+
+ describe '#to_hash' do
+ context 'with includes' do
+ let(:location) { 'some/file/config.yml' }
+ let(:content) { 'include: { template: Bash.gitlab-ci.yml }'}
+
+ before do
+ allow_any_instance_of(test_class)
+ .to receive(:content).and_return(content)
+ end
+
+ it 'does expand hash to include the template' do
+ expect(subject.to_hash).to include(:before_script)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/local_spec.rb b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
index ff67a765da0..dc14b07287e 100644
--- a/spec/lib/gitlab/ci/config/external/file/local_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
@@ -4,8 +4,10 @@ require 'spec_helper'
describe Gitlab::Ci::Config::External::File::Local do
set(:project) { create(:project, :repository) }
+ set(:user) { create(:user) }
- let(:context) { described_class::Context.new(project, '12345', nil) }
+ let(:sha) { '12345' }
+ let(:context) { described_class::Context.new(project, sha, user, Set.new) }
let(:params) { { local: location } }
let(:local_file) { described_class.new(params, context) }
@@ -103,4 +105,36 @@ describe Gitlab::Ci::Config::External::File::Local do
expect(local_file.error_message).to eq("Local file `#{location}` does not exist!")
end
end
+
+ describe '#expand_context' do
+ let(:location) { 'location.yml' }
+
+ subject { local_file.send(:expand_context) }
+
+ it 'inherits project, user and sha' do
+ is_expected.to include(user: user, project: project, sha: sha)
+ end
+ end
+
+ describe '#to_hash' do
+ context 'properly includes another local file in the same repository' do
+ let(:location) { 'some/file/config.yml' }
+ let(:content) { 'include: { local: another-config.yml }'}
+
+ let(:another_location) { 'another-config.yml' }
+ let(:another_content) { 'rspec: JOB' }
+
+ before do
+ allow(project.repository).to receive(:blob_data_at).with(sha, location)
+ .and_return(content)
+
+ allow(project.repository).to receive(:blob_data_at).with(sha, another_location)
+ .and_return(another_content)
+ end
+
+ it 'does expand hash to include the template' do
+ expect(local_file.to_hash).to include(:rspec)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/project_spec.rb b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
index 11809adcaf6..6e89bb1b30f 100644
--- a/spec/lib/gitlab/ci/config/external/file/project_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
@@ -3,12 +3,13 @@
require 'spec_helper'
describe Gitlab::Ci::Config::External::File::Project do
+ set(:context_project) { create(:project) }
set(:project) { create(:project, :repository) }
set(:user) { create(:user) }
let(:context_user) { user }
- let(:context) { described_class::Context.new(nil, '12345', context_user) }
- let(:subject) { described_class.new(params, context) }
+ let(:context) { described_class::Context.new(context_project, '12345', context_user, Set.new) }
+ let(:project_file) { described_class.new(params, context) }
before do
project.add_developer(user)
@@ -19,7 +20,7 @@ describe Gitlab::Ci::Config::External::File::Project do
let(:params) { { file: 'file.yml', project: 'project' } }
it 'should return true' do
- expect(subject).to be_matching
+ expect(project_file).to be_matching
end
end
@@ -27,7 +28,7 @@ describe Gitlab::Ci::Config::External::File::Project do
let(:params) { { file: 'file.yml' } }
it 'should return false' do
- expect(subject).not_to be_matching
+ expect(project_file).not_to be_matching
end
end
@@ -35,7 +36,7 @@ describe Gitlab::Ci::Config::External::File::Project do
let(:params) { { project: 'project' } }
it 'should return false' do
- expect(subject).not_to be_matching
+ expect(project_file).not_to be_matching
end
end
@@ -43,7 +44,7 @@ describe Gitlab::Ci::Config::External::File::Project do
let(:params) { {} }
it 'should return false' do
- expect(subject).not_to be_matching
+ expect(project_file).not_to be_matching
end
end
end
@@ -61,15 +62,15 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return true' do
- expect(subject).to be_valid
+ expect(project_file).to be_valid
end
context 'when user does not have permission to access file' do
let(:context_user) { create(:user) }
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include("Project `#{project.full_path}` not found or access denied!")
+ expect(project_file).not_to be_valid
+ expect(project_file.error_message).to include("Project `#{project.full_path}` not found or access denied!")
end
end
end
@@ -86,7 +87,7 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return true' do
- expect(subject).to be_valid
+ expect(project_file).to be_valid
end
end
@@ -102,8 +103,8 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include("Project `#{project.full_path}` file `/file.yml` is empty!")
+ expect(project_file).not_to be_valid
+ expect(project_file.error_message).to include("Project `#{project.full_path}` file `/file.yml` is empty!")
end
end
@@ -113,8 +114,8 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include("Project `#{project.full_path}` reference `I-Do-Not-Exist` does not exist!")
+ expect(project_file).not_to be_valid
+ expect(project_file.error_message).to include("Project `#{project.full_path}` reference `I-Do-Not-Exist` does not exist!")
end
end
@@ -124,8 +125,8 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include("Project `#{project.full_path}` file `/invalid-file.yml` does not exist!")
+ expect(project_file).not_to be_valid
+ expect(project_file.error_message).to include("Project `#{project.full_path}` file `/invalid-file.yml` does not exist!")
end
end
@@ -135,12 +136,22 @@ describe Gitlab::Ci::Config::External::File::Project do
end
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include('Included file `/invalid-file` does not have YAML extension!')
+ expect(project_file).not_to be_valid
+ expect(project_file.error_message).to include('Included file `/invalid-file` does not have YAML extension!')
end
end
end
+ describe '#expand_context' do
+ let(:params) { { file: 'file.yml', project: project.full_path, ref: 'master' } }
+
+ subject { project_file.send(:expand_context) }
+
+ it 'inherits user, and target project and sha' do
+ is_expected.to include(user: user, project: project, sha: project.commit('master').id)
+ end
+ end
+
private
def stub_project_blob(ref, path)
diff --git a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
index 3e0fda9c308..c5b32c29759 100644
--- a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
describe Gitlab::Ci::Config::External::File::Remote do
- let(:context) { described_class::Context.new(nil, '12345', nil) }
+ let(:context) { described_class::Context.new(nil, '12345', nil, Set.new) }
let(:params) { { remote: location } }
let(:remote_file) { described_class.new(params, context) }
let(:location) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
@@ -181,4 +181,14 @@ describe Gitlab::Ci::Config::External::File::Remote do
end
end
end
+
+ describe '#expand_context' do
+ let(:params) { { remote: 'http://remote' } }
+
+ subject { remote_file.send(:expand_context) }
+
+ it 'drops all parameters' do
+ is_expected.to include(user: nil, project: nil, sha: nil)
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/template_spec.rb b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
index 1fb5655309a..8ecaf4800f8 100644
--- a/spec/lib/gitlab/ci/config/external/file/template_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
@@ -3,18 +3,21 @@
require 'spec_helper'
describe Gitlab::Ci::Config::External::File::Template do
- let(:context) { described_class::Context.new(nil, '12345') }
+ set(:project) { create(:project) }
+ set(:user) { create(:user) }
+
+ let(:context) { described_class::Context.new(project, '12345', user, Set.new) }
let(:template) { 'Auto-DevOps.gitlab-ci.yml' }
let(:params) { { template: template } }
- subject { described_class.new(params, context) }
+ let(:template_file) { described_class.new(params, context) }
describe '#matching?' do
context 'when a template is specified' do
let(:params) { { template: 'some-template' } }
it 'should return true' do
- expect(subject).to be_matching
+ expect(template_file).to be_matching
end
end
@@ -22,7 +25,7 @@ describe Gitlab::Ci::Config::External::File::Template do
let(:params) { { template: nil } }
it 'should return false' do
- expect(subject).not_to be_matching
+ expect(template_file).not_to be_matching
end
end
@@ -30,7 +33,7 @@ describe Gitlab::Ci::Config::External::File::Template do
let(:params) { {} }
it 'should return false' do
- expect(subject).not_to be_matching
+ expect(template_file).not_to be_matching
end
end
end
@@ -40,7 +43,7 @@ describe Gitlab::Ci::Config::External::File::Template do
let(:template) { 'Auto-DevOps.gitlab-ci.yml' }
it 'should return true' do
- expect(subject).to be_valid
+ expect(template_file).to be_valid
end
end
@@ -48,8 +51,8 @@ describe Gitlab::Ci::Config::External::File::Template do
let(:template) { 'Template.yml' }
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include('Template file `Template.yml` is not a valid location!')
+ expect(template_file).not_to be_valid
+ expect(template_file.error_message).to include('Template file `Template.yml` is not a valid location!')
end
end
@@ -57,14 +60,14 @@ describe Gitlab::Ci::Config::External::File::Template do
let(:template) { 'I-Do-Not-Have-This-Template.gitlab-ci.yml' }
it 'should return false' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to include('Included file `I-Do-Not-Have-This-Template.gitlab-ci.yml` is empty or does not exist!')
+ expect(template_file).not_to be_valid
+ expect(template_file.error_message).to include('Included file `I-Do-Not-Have-This-Template.gitlab-ci.yml` is empty or does not exist!')
end
end
end
describe '#template_name' do
- let(:template_name) { subject.send(:template_name) }
+ let(:template_name) { template_file.send(:template_name) }
context 'when template does end with .gitlab-ci.yml' do
let(:template) { 'my-template.gitlab-ci.yml' }
@@ -90,4 +93,14 @@ describe Gitlab::Ci::Config::External::File::Template do
end
end
end
+
+ describe '#expand_context' do
+ let(:location) { 'location.yml' }
+
+ subject { template_file.send(:expand_context) }
+
+ it 'drops all parameters' do
+ is_expected.to include(user: nil, project: nil, sha: nil)
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
index 4cab4961b0f..136974569de 100644
--- a/spec/lib/gitlab/ci/config/external/mapper_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -9,6 +9,7 @@ describe Gitlab::Ci::Config::External::Mapper do
let(:local_file) { '/lib/gitlab/ci/templates/non-existent-file.yml' }
let(:remote_url) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
let(:template_file) { 'Auto-DevOps.gitlab-ci.yml' }
+ let(:expandset) { Set.new }
let(:file_content) do
<<~HEREDOC
@@ -21,7 +22,7 @@ describe Gitlab::Ci::Config::External::Mapper do
end
describe '#process' do
- subject { described_class.new(values, project: project, sha: '123456', user: user).process }
+ subject { described_class.new(values, project: project, sha: '123456', user: user, expandset: expandset).process }
context "when single 'include' keyword is defined" do
context 'when the string is a local file' do
@@ -141,5 +142,37 @@ describe Gitlab::Ci::Config::External::Mapper do
expect(subject).to be_empty
end
end
+
+ context "when duplicate 'include' is defined" do
+ let(:values) do
+ { include: [
+ { 'local' => local_file },
+ { 'local' => local_file }
+ ],
+ image: 'ruby:2.2' }
+ end
+
+ it 'raises an exception' do
+ expect { subject }.to raise_error(described_class::DuplicateIncludesError)
+ end
+ end
+
+ context "when too many 'includes' are defined" do
+ let(:values) do
+ { include: [
+ { 'local' => local_file },
+ { 'remote' => remote_url }
+ ],
+ image: 'ruby:2.2' }
+ end
+
+ before do
+ stub_const("#{described_class}::MAX_INCLUDES", 1)
+ end
+
+ it 'raises an exception' do
+ expect { subject }.to raise_error(described_class::TooManyIncludesError)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
index 1ac58139b25..3f6f6d7c5d9 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -4,15 +4,20 @@ require 'spec_helper'
describe Gitlab::Ci::Config::External::Processor do
set(:project) { create(:project, :repository) }
+ set(:another_project) { create(:project, :repository) }
set(:user) { create(:user) }
- let(:processor) { described_class.new(values, project: project, sha: '12345', user: user) }
+ let(:expandset) { Set.new }
+ let(:sha) { '12345' }
+ let(:processor) { described_class.new(values, project: project, sha: '12345', user: user, expandset: expandset) }
before do
project.add_developer(user)
end
describe "#perform" do
+ subject { processor.perform }
+
context 'when no external files defined' do
let(:values) { { image: 'ruby:2.2' } }
@@ -190,5 +195,80 @@ describe Gitlab::Ci::Config::External::Processor do
expect(processor.perform[:image]).to eq('ruby:2.2')
end
end
+
+ context "when a nested includes are defined" do
+ let(:values) do
+ {
+ include: [
+ { local: '/local/file.yml' }
+ ],
+ image: 'ruby:2.2'
+ }
+ end
+
+ before do
+ allow(project.repository).to receive(:blob_data_at).with('12345', '/local/file.yml') do
+ <<~HEREDOC
+ include:
+ - template: Ruby.gitlab-ci.yml
+ - remote: http://my.domain.com/config.yml
+ - project: #{another_project.full_path}
+ file: /templates/my-workflow.yml
+ HEREDOC
+ end
+
+ allow_any_instance_of(Repository).to receive(:blob_data_at).with(another_project.commit.id, '/templates/my-workflow.yml') do
+ <<~HEREDOC
+ include:
+ - local: /templates/my-build.yml
+ HEREDOC
+ end
+
+ allow_any_instance_of(Repository).to receive(:blob_data_at).with(another_project.commit.id, '/templates/my-build.yml') do
+ <<~HEREDOC
+ my_build:
+ script: echo Hello World
+ HEREDOC
+ end
+
+ WebMock.stub_request(:get, 'http://my.domain.com/config.yml').to_return(body: 'remote_build: { script: echo Hello World }')
+ end
+
+ context 'when project is public' do
+ before do
+ another_project.update!(visibility: 'public')
+ end
+
+ it 'properly expands all includes' do
+ is_expected.to include(:my_build, :remote_build, :rspec)
+ end
+ end
+
+ context 'when user is reporter of another project' do
+ before do
+ another_project.add_reporter(user)
+ end
+
+ it 'properly expands all includes' do
+ is_expected.to include(:my_build, :remote_build, :rspec)
+ end
+ end
+
+ context 'when user is not allowed' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Ci::Config::External::Processor::IncludeError, /not found or access denied/)
+ end
+ end
+
+ context 'when too many includes is included' do
+ before do
+ stub_const('Gitlab::Ci::Config::External::Mapper::MAX_INCLUDES', 1)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Ci::Config::External::Processor::IncludeError, /Maximum of 1 nested/)
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
index c9d1d09a938..3debd42ac65 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
@@ -96,7 +96,7 @@ describe Gitlab::Ci::Pipeline::Chain::Build do
context 'when pipeline is running for a merge request' do
let(:command) do
Gitlab::Ci::Pipeline::Chain::Command.new(
- source: :merge_request,
+ source: :merge_request_event,
origin_ref: 'feature',
checkout_sha: project.commit.id,
after_sha: nil,
@@ -117,7 +117,7 @@ describe Gitlab::Ci::Pipeline::Chain::Build do
end
it 'correctly indicated that this is a merge request pipeline' do
- expect(pipeline).to be_merge_request
+ expect(pipeline).to be_merge_request_event
expect(pipeline.merge_request).to eq(merge_request)
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
index 053bc421649..e6c6a82b463 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/validate/config_spec.rb
@@ -115,7 +115,7 @@ describe Gitlab::Ci::Pipeline::Chain::Validate::Config do
let(:pipeline) { build_stubbed(:ci_pipeline, project: project) }
let(:merge_request_pipeline) do
- build(:ci_pipeline, source: :merge_request, project: project)
+ build(:ci_pipeline, source: :merge_request_event, project: project)
end
let(:chain) { described_class.new(merge_request_pipeline, command).tap(&:perform!) }
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index 0dd74399a47..fbbd58280a9 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -3,9 +3,40 @@
require 'spec_helper'
describe "CI YML Templates" do
- Gitlab::Template::GitlabCiYmlTemplate.all.each do |template|
- it "#{template.name} should be valid" do
- expect { Gitlab::Ci::YamlProcessor.new(template.content) }.not_to raise_error
+ ABSTRACT_TEMPLATES = %w[Serverless].freeze
+
+ def self.concrete_templates
+ Gitlab::Template::GitlabCiYmlTemplate.all.reject do |template|
+ ABSTRACT_TEMPLATES.include?(template.name)
+ end
+ end
+
+ def self.abstract_templates
+ Gitlab::Template::GitlabCiYmlTemplate.all.select do |template|
+ ABSTRACT_TEMPLATES.include?(template.name)
+ end
+ end
+
+ describe 'concrete templates with CI/CD jobs' do
+ concrete_templates.each do |template|
+ it "#{template.name} template should be valid" do
+ expect { Gitlab::Ci::YamlProcessor.new(template.content) }
+ .not_to raise_error
+ end
+ end
+ end
+
+ describe 'abstract templates without concrete jobs defined' do
+ abstract_templates.each do |template|
+ it "#{template.name} template should be valid after being implemented" do
+ content = template.content + <<~EOS
+ concrete_build_implemented_by_a_user:
+ stage: build
+ script: do something
+ EOS
+
+ expect { Gitlab::Ci::YamlProcessor.new(content) }.not_to raise_error
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/variables/collection/item_spec.rb b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
index 8bf44acb228..3ff2fe18c15 100644
--- a/spec/lib/gitlab/ci/variables/collection/item_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection/item_spec.rb
@@ -6,7 +6,7 @@ describe Gitlab::Ci::Variables::Collection::Item do
let(:expected_value) { variable_value }
let(:variable) do
- { key: variable_key, value: variable_value, public: true }
+ { key: variable_key, value: variable_value, public: true, masked: false }
end
describe '.new' do
@@ -88,7 +88,7 @@ describe Gitlab::Ci::Variables::Collection::Item do
resource = described_class.fabricate(variable)
expect(resource).to be_a(described_class)
- expect(resource).to eq(key: 'CI_VAR', value: '123', public: false)
+ expect(resource).to eq(key: 'CI_VAR', value: '123', public: false, masked: false)
end
it 'supports using another collection item' do
@@ -134,7 +134,21 @@ describe Gitlab::Ci::Variables::Collection::Item do
.to_runner_variable
expect(runner_variable)
- .to eq(key: 'VAR', value: 'value', public: true, file: true)
+ .to eq(key: 'VAR', value: 'value', public: true, file: true, masked: false)
+ end
+ end
+
+ context 'when variable masking is disabled' do
+ before do
+ stub_feature_flags(variable_masking: false)
+ end
+
+ it 'does not expose the masked field to the runner' do
+ runner_variable = described_class
+ .new(key: 'VAR', value: 'value', masked: true)
+ .to_runner_variable
+
+ expect(runner_variable).to eq(key: 'VAR', value: 'value', public: true)
end
end
end
diff --git a/spec/lib/gitlab/ci/variables/collection_spec.rb b/spec/lib/gitlab/ci/variables/collection_spec.rb
index 5c91816a586..8e732d44d5d 100644
--- a/spec/lib/gitlab/ci/variables/collection_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe Gitlab::Ci::Variables::Collection do
describe '.new' do
it 'can be initialized with an array' do
- variable = { key: 'VAR', value: 'value', public: true }
+ variable = { key: 'VAR', value: 'value', public: true, masked: false }
collection = described_class.new([variable])
@@ -66,6 +66,14 @@ describe Gitlab::Ci::Variables::Collection do
expect(collection).to include(key: 'VAR_3', value: '3', public: true)
end
+ it 'does not concatenate resource if it undefined' do
+ collection = described_class.new([{ key: 'VAR_1', value: '1' }])
+
+ collection.concat(nil)
+
+ expect(collection).to be_one
+ end
+
it 'returns self' do
expect(subject.concat([key: 'VAR', value: 'test']))
.to eq subject
@@ -93,7 +101,7 @@ describe Gitlab::Ci::Variables::Collection do
collection = described_class.new([{ key: 'TEST', value: '1' }])
expect(collection.to_runner_variables)
- .to eq [{ key: 'TEST', value: '1', public: true }]
+ .to eq [{ key: 'TEST', value: '1', public: true, masked: false }]
end
end
diff --git a/spec/lib/gitlab/current_settings_spec.rb b/spec/lib/gitlab/current_settings_spec.rb
index caf9fc5442c..17d5eae24f5 100644
--- a/spec/lib/gitlab/current_settings_spec.rb
+++ b/spec/lib/gitlab/current_settings_spec.rb
@@ -143,7 +143,7 @@ describe Gitlab::CurrentSettings do
it_behaves_like 'a non-persisted ApplicationSetting object'
- it 'uses the value from the DB attribute if present and not overriden by an accessor' do
+ it 'uses the value from the DB attribute if present and not overridden by an accessor' do
expect(current_settings.home_page_url).to eq(db_settings.home_page_url)
end
end
diff --git a/spec/lib/gitlab/danger/helper_spec.rb b/spec/lib/gitlab/danger/helper_spec.rb
index 00cb1e6446a..66cd8171c12 100644
--- a/spec/lib/gitlab/danger/helper_spec.rb
+++ b/spec/lib/gitlab/danger/helper_spec.rb
@@ -265,6 +265,7 @@ describe Gitlab::Danger::Helper do
'changelogs/foo' | :none
'ee/changelogs/foo' | :none
+ 'locale/gitlab.pot' | :none
'FOO' | :unknown
'foo' | :unknown
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 248cca25a2c..81419e51635 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
@@ -19,7 +19,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameBase, :delete
Project.find(project.id)
end
- describe "#remove_last_ocurrence" do
+ describe "#remove_last_occurrence" do
it "removes only the last occurrence of a string" do
input = "this/is/a-word-to-replace/namespace/with/a-word-to-replace"
diff --git a/spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb b/spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb
index 4d222564fd0..0ebd8994636 100644
--- a/spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb
@@ -50,8 +50,8 @@ describe Gitlab::DependencyLinker::ComposerJsonLinker do
%{<a href="#{url}" rel="nofollow noreferrer noopener" target="_blank">#{name}</a>}
end
- it 'links the module name' do
- expect(subject).to include(link('laravel/laravel', 'https://packagist.org/packages/laravel/laravel'))
+ it 'does not link the module name' do
+ expect(subject).not_to include(link('laravel/laravel', 'https://packagist.org/packages/laravel/laravel'))
end
it 'links the homepage' do
diff --git a/spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb b/spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb
index a97803b119e..f00f6b47b94 100644
--- a/spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb
@@ -41,13 +41,16 @@ describe Gitlab::DependencyLinker::GemfileLinker do
end
it 'links dependencies' do
- expect(subject).to include(link('rails', 'https://rubygems.org/gems/rails'))
expect(subject).to include(link('rails-deprecated_sanitizer', 'https://rubygems.org/gems/rails-deprecated_sanitizer'))
- expect(subject).to include(link('responders', 'https://rubygems.org/gems/responders'))
- expect(subject).to include(link('sprockets', 'https://rubygems.org/gems/sprockets'))
expect(subject).to include(link('default_value_for', 'https://rubygems.org/gems/default_value_for'))
end
+ it 'links to external dependencies' do
+ expect(subject).to include(link('rails', 'https://github.com/rails/rails'))
+ expect(subject).to include(link('responders', 'https://github.com/rails/responders'))
+ expect(subject).to include(link('sprockets', 'https://gitlab.example.com/gems/sprockets'))
+ end
+
it 'links GitHub repos' do
expect(subject).to include(link('rails/rails', 'https://github.com/rails/rails'))
expect(subject).to include(link('rails/responders', 'https://github.com/rails/responders'))
diff --git a/spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb b/spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb
index 24ad7d12f4c..6c6a5d70576 100644
--- a/spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb
@@ -43,8 +43,8 @@ describe Gitlab::DependencyLinker::GemspecLinker do
%{<a href="#{url}" rel="nofollow noreferrer noopener" target="_blank">#{name}</a>}
end
- it 'links the gem name' do
- expect(subject).to include(link('gitlab_git', 'https://rubygems.org/gems/gitlab_git'))
+ it 'does not link the gem name' do
+ expect(subject).not_to include(link('gitlab_git', 'https://rubygems.org/gems/gitlab_git'))
end
it 'links the license' do
diff --git a/spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb b/spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb
index 1e8b72afb7b..9050127af7f 100644
--- a/spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb
@@ -33,7 +33,8 @@ describe Gitlab::DependencyLinker::PackageJsonLinker do
"express": "4.2.x",
"bigpipe": "bigpipe/pagelet",
"plates": "https://github.com/flatiron/plates/tarball/master",
- "karma": "^1.4.1"
+ "karma": "^1.4.1",
+ "random": "git+https://EdOverflow@github.com/example/example.git"
},
"devDependencies": {
"vows": "^0.7.0",
@@ -51,8 +52,8 @@ describe Gitlab::DependencyLinker::PackageJsonLinker do
%{<a href="#{url}" rel="nofollow noreferrer noopener" target="_blank">#{name}</a>}
end
- it 'links the module name' do
- expect(subject).to include(link('module-name', 'https://npmjs.com/package/module-name'))
+ it 'does not link the module name' do
+ expect(subject).not_to include(link('module-name', 'https://npmjs.com/package/module-name'))
end
it 'links the homepage' do
@@ -71,14 +72,21 @@ describe Gitlab::DependencyLinker::PackageJsonLinker do
expect(subject).to include(link('primus', 'https://npmjs.com/package/primus'))
expect(subject).to include(link('async', 'https://npmjs.com/package/async'))
expect(subject).to include(link('express', 'https://npmjs.com/package/express'))
- expect(subject).to include(link('bigpipe', 'https://npmjs.com/package/bigpipe'))
- expect(subject).to include(link('plates', 'https://npmjs.com/package/plates'))
expect(subject).to include(link('karma', 'https://npmjs.com/package/karma'))
expect(subject).to include(link('vows', 'https://npmjs.com/package/vows'))
expect(subject).to include(link('assume', 'https://npmjs.com/package/assume'))
expect(subject).to include(link('pre-commit', 'https://npmjs.com/package/pre-commit'))
end
+ it 'links dependencies to URL detected on value' do
+ expect(subject).to include(link('bigpipe', 'https://github.com/bigpipe/pagelet'))
+ expect(subject).to include(link('plates', 'https://github.com/flatiron/plates/tarball/master'))
+ end
+
+ it 'does not link to NPM when invalid git URL' do
+ expect(subject).not_to include(link('random', 'https://npmjs.com/package/random'))
+ end
+
it 'links GitHub repos' do
expect(subject).to include(link('bigpipe/pagelet', 'https://github.com/bigpipe/pagelet'))
end
diff --git a/spec/lib/gitlab/dependency_linker/parser/gemfile_spec.rb b/spec/lib/gitlab/dependency_linker/parser/gemfile_spec.rb
new file mode 100644
index 00000000000..9bfb1b13a2b
--- /dev/null
+++ b/spec/lib/gitlab/dependency_linker/parser/gemfile_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Gitlab::DependencyLinker::Parser::Gemfile do
+ describe '#parse' do
+ let(:file_content) do
+ <<-CONTENT.strip_heredoc
+ source 'https://rubygems.org'
+
+ gem "rails", '4.2.6', github: "rails/rails"
+ gem 'rails-deprecated_sanitizer', '~> 1.0.3'
+ gem 'responders', '~> 2.0', :github => 'rails/responders'
+ gem 'sprockets', '~> 3.6.0', git: 'https://gitlab.example.com/gems/sprockets'
+ gem 'default_value_for', '~> 3.0.0'
+ CONTENT
+ end
+
+ subject { described_class.new(file_content).parse(keyword: 'gem') }
+
+ def fetch_package(name)
+ subject.find { |package| package.name == name }
+ end
+
+ it 'returns parsed packages' do
+ expect(subject.size).to eq(5)
+ expect(subject).to all(be_a(Gitlab::DependencyLinker::Package))
+ end
+
+ it 'packages respond to name and external_ref accordingly' do
+ expect(fetch_package('rails')).to have_attributes(name: 'rails',
+ github_ref: 'rails/rails',
+ git_ref: nil)
+
+ expect(fetch_package('sprockets')).to have_attributes(name: 'sprockets',
+ github_ref: nil,
+ git_ref: 'https://gitlab.example.com/gems/sprockets')
+
+ expect(fetch_package('default_value_for')).to have_attributes(name: 'default_value_for',
+ github_ref: nil,
+ git_ref: nil)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb b/spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb
index cdfd7ad9826..8f1b523653e 100644
--- a/spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb
@@ -43,7 +43,10 @@ describe Gitlab::DependencyLinker::PodfileLinker do
it 'links packages' do
expect(subject).to include(link('AFNetworking', 'https://cocoapods.org/pods/AFNetworking'))
- expect(subject).to include(link('Interstellar/Core', 'https://cocoapods.org/pods/Interstellar'))
+ end
+
+ it 'links external packages' do
+ expect(subject).to include(link('Interstellar/Core', 'https://github.com/ashfurrow/Interstellar.git'))
end
it 'links Git repos' do
diff --git a/spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb b/spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb
index ed60ab45955..bacec830103 100644
--- a/spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb
+++ b/spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb
@@ -42,8 +42,8 @@ describe Gitlab::DependencyLinker::PodspecLinker do
%{<a href="#{url}" rel="nofollow noreferrer noopener" target="_blank">#{name}</a>}
end
- it 'links the gem name' do
- expect(subject).to include(link('Reachability', 'https://cocoapods.org/pods/Reachability'))
+ it 'does not link the pod name' do
+ expect(subject).not_to include(link('Reachability', 'https://cocoapods.org/pods/Reachability'))
end
it 'links the license' do
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
index 862590268ca..611c3e946ed 100644
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -8,6 +8,47 @@ describe Gitlab::Diff::File do
let(:diff) { commit.raw_diffs.first }
let(:diff_file) { described_class.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
+ def create_file(file_name, content)
+ Files::CreateService.new(
+ project,
+ project.owner,
+ commit_message: 'Update',
+ start_branch: branch_name,
+ branch_name: branch_name,
+ file_path: file_name,
+ file_content: content
+ ).execute
+
+ project.commit(branch_name).diffs.diff_files.first
+ end
+
+ def update_file(file_name, content)
+ Files::UpdateService.new(
+ project,
+ project.owner,
+ commit_message: 'Update',
+ start_branch: branch_name,
+ branch_name: branch_name,
+ file_path: file_name,
+ file_content: content
+ ).execute
+
+ project.commit(branch_name).diffs.diff_files.first
+ end
+
+ def delete_file(file_name)
+ Files::DeleteService.new(
+ project,
+ project.owner,
+ commit_message: 'Update',
+ start_branch: branch_name,
+ branch_name: branch_name,
+ file_path: file_name
+ ).execute
+
+ project.commit(branch_name).diffs.diff_files.first
+ end
+
describe '#diff_lines' do
let(:diff_lines) { diff_file.diff_lines }
@@ -675,47 +716,6 @@ describe Gitlab::Diff::File do
end
let(:branch_name) { 'master' }
- def create_file(file_name, content)
- Files::CreateService.new(
- project,
- project.owner,
- commit_message: 'Update',
- start_branch: branch_name,
- branch_name: branch_name,
- file_path: file_name,
- file_content: content
- ).execute
-
- project.commit(branch_name).diffs.diff_files.first
- end
-
- def update_file(file_name, content)
- Files::UpdateService.new(
- project,
- project.owner,
- commit_message: 'Update',
- start_branch: branch_name,
- branch_name: branch_name,
- file_path: file_name,
- file_content: content
- ).execute
-
- project.commit(branch_name).diffs.diff_files.first
- end
-
- def delete_file(file_name)
- Files::DeleteService.new(
- project,
- project.owner,
- commit_message: 'Update',
- start_branch: branch_name,
- branch_name: branch_name,
- file_path: file_name
- ).execute
-
- project.commit(branch_name).diffs.diff_files.first
- end
-
context 'when empty file is created' do
it 'returns true' do
diff_file = create_file('empty.md', '')
@@ -751,4 +751,123 @@ describe Gitlab::Diff::File do
end
end
end
+
+ describe '#fully_expanded?' do
+ let(:project) do
+ create(:project, :custom_repo, files: {})
+ end
+ let(:branch_name) { 'master' }
+
+ context 'when empty file is created' do
+ it 'returns true' do
+ diff_file = create_file('empty.md', '')
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when empty file is deleted' do
+ it 'returns true' do
+ create_file('empty.md', '')
+ diff_file = delete_file('empty.md')
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when short file with last line removed' do
+ it 'returns true' do
+ create_file('with-content.md', (1..3).to_a.join("\n"))
+ diff_file = update_file('with-content.md', (1..2).to_a.join("\n"))
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when a single line is added to empty file' do
+ it 'returns true' do
+ create_file('empty.md', '')
+ diff_file = update_file('empty.md', 'new content')
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when single line file is changed' do
+ it 'returns true' do
+ create_file('file.md', 'foo')
+ diff_file = update_file('file.md', 'bar')
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when long file is changed' do
+ before do
+ create_file('file.md', (1..999).to_a.join("\n"))
+ end
+
+ context 'when first line is removed' do
+ it 'returns true' do
+ diff_file = update_file('file.md', (2..999).to_a.join("\n"))
+
+ expect(diff_file.fully_expanded?).to be_falsey
+ end
+ end
+
+ context 'when last line is removed' do
+ it 'returns true' do
+ diff_file = update_file('file.md', (1..998).to_a.join("\n"))
+
+ expect(diff_file.fully_expanded?).to be_falsey
+ end
+ end
+
+ context 'when first and last lines are removed' do
+ it 'returns false' do
+ diff_file = update_file('file.md', (2..998).to_a.join("\n"))
+
+ expect(diff_file.fully_expanded?).to be_falsey
+ end
+ end
+
+ context 'when first and last lines are changed' do
+ it 'returns false' do
+ content = (2..998).to_a
+ content.prepend('a')
+ content.append('z')
+ content = content.join("\n")
+
+ diff_file = update_file('file.md', content)
+
+ expect(diff_file.fully_expanded?).to be_falsey
+ end
+ end
+
+ context 'when every line are changed' do
+ it 'returns true' do
+ diff_file = update_file('file.md', "hi\n" * 999)
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when all contents are cleared' do
+ it 'returns true' do
+ diff_file = update_file('file.md', "")
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+
+ context 'when file is binary' do
+ it 'returns true' do
+ diff_file = update_file('file.md', (1..998).to_a.join("\n"))
+ allow(diff_file).to receive(:binary?).and_return(true)
+
+ expect(diff_file.fully_expanded?).to be_truthy
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb
index a1b5cea88c0..10bc82e24d1 100644
--- a/spec/lib/gitlab/git/blob_spec.rb
+++ b/spec/lib/gitlab/git/blob_spec.rb
@@ -18,7 +18,7 @@ describe Gitlab::Git::Blob, :seed_helper do
end
end
- describe '.find' do
+ shared_examples '.find' do
context 'nil path' do
let(:blob) { Gitlab::Git::Blob.find(repository, SeedRepo::Commit::ID, nil) }
@@ -128,6 +128,20 @@ describe Gitlab::Git::Blob, :seed_helper do
end
end
+ describe '.find with Gitaly enabled' do
+ it_behaves_like '.find'
+ end
+
+ describe '.find with Rugged enabled', :enable_rugged do
+ it 'calls out to the Rugged implementation' do
+ allow_any_instance_of(Rugged).to receive(:rev_parse).with(SeedRepo::Commit::ID).and_call_original
+
+ described_class.find(repository, SeedRepo::Commit::ID, 'files/images/6049019_460s.jpg')
+ end
+
+ it_behaves_like '.find'
+ end
+
describe '.raw' do
let(:raw_blob) { Gitlab::Git::Blob.raw(repository, SeedRepo::RubyBlob::ID) }
let(:bad_blob) { Gitlab::Git::Blob.raw(repository, SeedRepo::BigCommit::ID) }
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index 2611ebed25b..3fb41a626b2 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -112,7 +112,7 @@ describe Gitlab::Git::Commit, :seed_helper do
end
context 'Class methods' do
- describe '.find' do
+ shared_examples '.find' do
it "should return first head commit if without params" do
expect(described_class.last(repository).id).to eq(
rugged_repo.head.target.oid
@@ -154,6 +154,20 @@ describe Gitlab::Git::Commit, :seed_helper do
end
end
+ describe '.find with Gitaly enabled' do
+ it_should_behave_like '.find'
+ end
+
+ describe '.find with Rugged enabled', :enable_rugged do
+ it 'calls out to the Rugged implementation' do
+ allow_any_instance_of(Rugged).to receive(:rev_parse).with(SeedRepo::Commit::ID).and_call_original
+
+ described_class.find(repository, SeedRepo::Commit::ID)
+ end
+
+ it_should_behave_like '.find'
+ end
+
describe '.last_for_path' do
context 'no path' do
subject { described_class.last_for_path(repository, 'master') }
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index e3dd02f1478..7e6dfa30e37 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -619,16 +619,6 @@ describe Gitlab::Git::Repository, :seed_helper do
repository.search_files_by_content('search-files-by-content', 'search-files-by-content-branch')
end
end
-
- it_should_behave_like 'search files by content' do
- let(:search_results) do
- repository.gitaly_repository_client.search_files_by_content(
- 'search-files-by-content-branch',
- 'search-files-by-content',
- chunked_response: false
- )
- end
- end
end
describe '#find_remote_root_ref' do
diff --git a/spec/lib/gitlab/git/tree_spec.rb b/spec/lib/gitlab/git/tree_spec.rb
index 4a4d69490a3..60060c41616 100644
--- a/spec/lib/gitlab/git/tree_spec.rb
+++ b/spec/lib/gitlab/git/tree_spec.rb
@@ -3,7 +3,7 @@ require "spec_helper"
describe Gitlab::Git::Tree, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
- context :repo do
+ shared_examples :repo do
let(:tree) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID) }
it { expect(tree).to be_kind_of Array }
@@ -12,6 +12,17 @@ describe Gitlab::Git::Tree, :seed_helper do
it { expect(tree.select(&:file?).size).to eq(10) }
it { expect(tree.select(&:submodule?).size).to eq(2) }
+ it 'returns an empty array when called with an invalid ref' do
+ expect(described_class.where(repository, 'foobar-does-not-exist')).to eq([])
+ end
+
+ it 'returns a list of tree objects' do
+ entries = described_class.where(repository, SeedRepo::Commit::ID, 'files', true)
+
+ expect(entries.count).to be > 10
+ expect(entries).to all(be_a(Gitlab::Git::Tree))
+ end
+
describe '#dir?' do
let(:dir) { tree.select(&:dir?).first }
@@ -20,8 +31,8 @@ describe Gitlab::Git::Tree, :seed_helper do
it { expect(dir.commit_id).to eq(SeedRepo::Commit::ID) }
it { expect(dir.name).to eq('encoding') }
it { expect(dir.path).to eq('encoding') }
- it { expect(dir.flat_path).to eq('encoding') }
it { expect(dir.mode).to eq('40000') }
+ it { expect(dir.flat_path).to eq('encoding') }
context :subdir do
let(:subdir) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID, 'files').first }
@@ -44,6 +55,51 @@ describe Gitlab::Git::Tree, :seed_helper do
it { expect(subdir_file.path).to eq('files/ruby/popen.rb') }
it { expect(subdir_file.flat_path).to eq('files/ruby/popen.rb') }
end
+
+ context :flat_path do
+ let(:filename) { 'files/flat/path/correct/content.txt' }
+ let(:oid) { create_file(filename) }
+ let(:subdir_file) { Gitlab::Git::Tree.where(repository, oid, 'files/flat').first }
+ let(:repository_rugged) { Rugged::Repository.new(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH)) }
+
+ it { expect(subdir_file.flat_path).to eq('files/flat/path/correct') }
+ end
+
+ def create_file(path)
+ oid = repository_rugged.write('test', :blob)
+ index = repository_rugged.index
+ index.add(path: filename, oid: oid, mode: 0100644)
+
+ options = commit_options(
+ repository_rugged,
+ index,
+ repository_rugged.head.target,
+ 'HEAD',
+ 'Add new file')
+
+ Rugged::Commit.create(repository_rugged, options)
+ end
+
+ # Build the options hash that's passed to Rugged::Commit#create
+ def commit_options(repo, index, target, ref, message)
+ options = {}
+ options[:tree] = index.write_tree(repo)
+ options[:author] = {
+ email: "test@example.com",
+ name: "Test Author",
+ time: Time.gm(2014, "mar", 3, 20, 15, 1)
+ }
+ options[:committer] = {
+ email: "test@example.com",
+ name: "Test Author",
+ time: Time.gm(2014, "mar", 3, 20, 15, 1)
+ }
+ options[:message] ||= message
+ options[:parents] = repo.empty? ? [] : [target].compact
+ options[:update_ref] = ref
+
+ options
+ end
end
describe '#file?' do
@@ -79,9 +135,17 @@ describe Gitlab::Git::Tree, :seed_helper do
end
end
- describe '#where' do
- it 'returns an empty array when called with an invalid ref' do
- expect(described_class.where(repository, 'foobar-does-not-exist')).to eq([])
+ describe '.where with Gitaly enabled' do
+ it_behaves_like :repo
+ end
+
+ describe '.where with Rugged enabled', :enable_rugged do
+ it 'calls out to the Rugged implementation' do
+ allow_any_instance_of(Rugged).to receive(:lookup).with(SeedRepo::Commit::ID)
+
+ described_class.where(repository, SeedRepo::Commit::ID, 'files', false)
end
+
+ it_behaves_like :repo
end
end
diff --git a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
index c89913ec8e9..bb10be2a4dc 100644
--- a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
@@ -26,4 +26,14 @@ describe Gitlab::GitalyClient::StorageSettings do
end
end
end
+
+ describe '.disk_access_denied?' do
+ it 'return false when Rugged is enabled', :enable_rugged do
+ expect(described_class.disk_access_denied?).to be_falsey
+ end
+
+ it 'returns true' do
+ expect(described_class.disk_access_denied?).to be_truthy
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
index b1cac3b6e46..120a07ff2b3 100644
--- a/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
@@ -4,6 +4,7 @@ describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis
let(:project) { create(:project, import_source: 'foo/bar') }
let(:client) { double(:client) }
let(:importer) { described_class.new(project, client) }
+ let(:due_on) { Time.new(2017, 2, 1, 12, 00) }
let(:created_at) { Time.new(2017, 1, 1, 12, 00) }
let(:updated_at) { Time.new(2017, 1, 1, 12, 15) }
@@ -14,6 +15,20 @@ describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis
title: '1.0',
description: 'The first release',
state: 'open',
+ due_on: due_on,
+ created_at: created_at,
+ updated_at: updated_at
+ )
+ end
+
+ let(:milestone2) do
+ double(
+ :milestone,
+ number: 1,
+ title: '1.0',
+ description: 'The first release',
+ state: 'open',
+ due_on: nil,
created_at: created_at,
updated_at: updated_at
)
@@ -72,6 +87,7 @@ describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis
describe '#build' do
let(:milestone_hash) { importer.build(milestone) }
+ let(:milestone_hash2) { importer.build(milestone2) }
it 'returns the attributes of the milestone as a Hash' do
expect(milestone_hash).to be_an_instance_of(Hash)
@@ -98,6 +114,14 @@ describe Gitlab::GithubImport::Importer::MilestonesImporter, :clean_gitlab_redis
expect(milestone_hash[:state]).to eq(:active)
end
+ it 'includes the due date' do
+ expect(milestone_hash[:due_date]).to eq(due_on.to_date)
+ end
+
+ it 'responds correctly to no due date value' do
+ expect(milestone_hash2[:due_date]).to be nil
+ end
+
it 'includes the created timestamp' do
expect(milestone_hash[:created_at]).to eq(created_at)
end
diff --git a/spec/lib/gitlab/hashed_storage/migrator_spec.rb b/spec/lib/gitlab/hashed_storage/migrator_spec.rb
index 3942f168ceb..6154b3e2f76 100644
--- a/spec/lib/gitlab/hashed_storage/migrator_spec.rb
+++ b/spec/lib/gitlab/hashed_storage/migrator_spec.rb
@@ -1,21 +1,29 @@
require 'spec_helper'
describe Gitlab::HashedStorage::Migrator do
- describe '#bulk_schedule' do
- it 'schedules job to StorageMigratorWorker' do
+ describe '#bulk_schedule_migration' do
+ it 'schedules job to HashedStorage::MigratorWorker' do
Sidekiq::Testing.fake! do
- expect { subject.bulk_schedule(start: 1, finish: 5) }.to change(HashedStorage::MigratorWorker.jobs, :size).by(1)
+ expect { subject.bulk_schedule_migration(start: 1, finish: 5) }.to change(HashedStorage::MigratorWorker.jobs, :size).by(1)
+ end
+ end
+ end
+
+ describe '#bulk_schedule_rollback' do
+ it 'schedules job to HashedStorage::RollbackerWorker' do
+ Sidekiq::Testing.fake! do
+ expect { subject.bulk_schedule_rollback(start: 1, finish: 5) }.to change(HashedStorage::RollbackerWorker.jobs, :size).by(1)
end
end
end
describe '#bulk_migrate' do
- let(:projects) { create_list(:project, 2, :legacy_storage) }
+ let(:projects) { create_list(:project, 2, :legacy_storage, :empty_repo) }
let(:ids) { projects.map(&:id) }
- it 'enqueue jobs to ProjectMigrateHashedStorageWorker' do
+ it 'enqueue jobs to HashedStorage::ProjectMigrateWorker' do
Sidekiq::Testing.fake! do
- expect { subject.bulk_migrate(start: ids.min, finish: ids.max) }.to change(ProjectMigrateHashedStorageWorker.jobs, :size).by(2)
+ expect { subject.bulk_migrate(start: ids.min, finish: ids.max) }.to change(HashedStorage::ProjectMigrateWorker.jobs, :size).by(2)
end
end
@@ -32,13 +40,53 @@ describe Gitlab::HashedStorage::Migrator do
subject.bulk_migrate(start: ids.min, finish: ids.max)
end
- it 'has migrated projects set as writable' do
+ it 'has all projects migrated and set as writable' do
perform_enqueued_jobs do
subject.bulk_migrate(start: ids.min, finish: ids.max)
end
projects.each do |project|
- expect(project.reload.repository_read_only?).to be_falsey
+ project.reload
+
+ expect(project.hashed_storage?(:repository)).to be_truthy
+ expect(project.repository_read_only?).to be_falsey
+ end
+ end
+ end
+
+ describe '#bulk_rollback' do
+ let(:projects) { create_list(:project, 2, :empty_repo) }
+ let(:ids) { projects.map(&:id) }
+
+ it 'enqueue jobs to HashedStorage::ProjectRollbackWorker' do
+ Sidekiq::Testing.fake! do
+ expect { subject.bulk_rollback(start: ids.min, finish: ids.max) }.to change(HashedStorage::ProjectRollbackWorker.jobs, :size).by(2)
+ end
+ end
+
+ it 'rescues and log exceptions' do
+ allow_any_instance_of(Project).to receive(:rollback_to_legacy_storage!).and_raise(StandardError)
+ expect { subject.bulk_rollback(start: ids.min, finish: ids.max) }.not_to raise_error
+ end
+
+ it 'delegates each project in specified range to #rollback' do
+ projects.each do |project|
+ expect(subject).to receive(:rollback).with(project)
+ end
+
+ subject.bulk_rollback(start: ids.min, finish: ids.max)
+ end
+
+ it 'has all projects rolledback and set as writable' do
+ perform_enqueued_jobs do
+ subject.bulk_rollback(start: ids.min, finish: ids.max)
+ end
+
+ projects.each do |project|
+ project.reload
+
+ expect(project.legacy_storage?).to be_truthy
+ expect(project.repository_read_only?).to be_falsey
end
end
end
@@ -48,7 +96,7 @@ describe Gitlab::HashedStorage::Migrator do
it 'enqueues project migration job' do
Sidekiq::Testing.fake! do
- expect { subject.migrate(project) }.to change(ProjectMigrateHashedStorageWorker.jobs, :size).by(1)
+ expect { subject.migrate(project) }.to change(HashedStorage::ProjectMigrateWorker.jobs, :size).by(1)
end
end
@@ -79,7 +127,7 @@ describe Gitlab::HashedStorage::Migrator do
it 'doesnt enqueue any migration job' do
Sidekiq::Testing.fake! do
- expect { subject.migrate(project) }.not_to change(ProjectMigrateHashedStorageWorker.jobs, :size)
+ expect { subject.migrate(project) }.not_to change(HashedStorage::ProjectMigrateWorker.jobs, :size)
end
end
@@ -88,4 +136,50 @@ describe Gitlab::HashedStorage::Migrator do
end
end
end
+
+ describe '#rollback' do
+ let(:project) { create(:project, :empty_repo) }
+
+ it 'enqueues project rollback job' do
+ Sidekiq::Testing.fake! do
+ expect { subject.rollback(project) }.to change(HashedStorage::ProjectRollbackWorker.jobs, :size).by(1)
+ end
+ end
+
+ it 'rescues and log exceptions' do
+ allow(project).to receive(:rollback_to_hashed_storage!).and_raise(StandardError)
+
+ expect { subject.rollback(project) }.not_to raise_error
+ end
+
+ it 'rolls-back project storage' do
+ perform_enqueued_jobs do
+ subject.rollback(project)
+ end
+
+ expect(project.reload.legacy_storage?).to be_truthy
+ end
+
+ it 'has rolled-back project set as writable' do
+ perform_enqueued_jobs do
+ subject.rollback(project)
+ end
+
+ expect(project.reload.repository_read_only?).to be_falsey
+ end
+
+ context 'when project is already on legacy storage' do
+ let(:project) { create(:project, :legacy_storage, :empty_repo) }
+
+ it 'doesnt enqueue any rollback job' do
+ Sidekiq::Testing.fake! do
+ expect { subject.rollback(project) }.not_to change(HashedStorage::ProjectRollbackWorker.jobs, :size)
+ end
+ end
+
+ it 'returns false' do
+ expect(subject.rollback(project)).to be_falsey
+ 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 018a5d3dd3d..01da3ea7081 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -127,7 +127,7 @@ ci_pipelines:
- scheduled_actions
- artifacts
- pipeline_schedule
-- merge_requests
+- merge_requests_as_head_pipeline
- merge_request
- deployments
- environments
diff --git a/spec/lib/gitlab/import_export/merge_request_parser_spec.rb b/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
index 68eaa70e6b6..4b234411a44 100644
--- a/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
+++ b/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
@@ -41,4 +41,20 @@ describe Gitlab::ImportExport::MergeRequestParser do
expect(parsed_merge_request).to eq(merge_request)
end
+
+ context 'when the merge request has diffs' do
+ let(:merge_request) do
+ build(:merge_request, source_project: forked_project, target_project: project)
+ end
+
+ context 'when the diff is invalid' do
+ let(:merge_request_diff) { build(:merge_request_diff, merge_request: merge_request, base_commit_sha: 'foobar') }
+
+ it 'sets the diff to nil' do
+ expect(merge_request_diff).to be_invalid
+ expect(merge_request_diff.merge_request).to eq merge_request
+ expect(parsed_merge_request.merge_request_diff).to be_nil
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/json_cache_spec.rb b/spec/lib/gitlab/json_cache_spec.rb
index b52078e8556..2cae8ec031a 100644
--- a/spec/lib/gitlab/json_cache_spec.rb
+++ b/spec/lib/gitlab/json_cache_spec.rb
@@ -297,13 +297,39 @@ describe Gitlab::JsonCache do
expect(result).to eq(broadcast_message)
end
+ context 'when the cached value is an instance of ActiveRecord::Base' do
+ it 'returns a persisted record when id is set' do
+ backend.write(expanded_key, broadcast_message.to_json)
+
+ result = cache.fetch(key, as: BroadcastMessage) { 'block result' }
+
+ expect(result).to be_persisted
+ end
+
+ it 'returns a new record when id is nil' do
+ backend.write(expanded_key, build(:broadcast_message).to_json)
+
+ result = cache.fetch(key, as: BroadcastMessage) { 'block result' }
+
+ expect(result).to be_new_record
+ end
+
+ it 'returns a new record when id is missing' do
+ backend.write(expanded_key, build(:broadcast_message).attributes.except('id').to_json)
+
+ result = cache.fetch(key, as: BroadcastMessage) { 'block result' }
+
+ expect(result).to be_new_record
+ end
+ end
+
it "returns the result of the block when 'as' option is nil" do
result = cache.fetch(key, as: nil) { 'block result' }
expect(result).to eq('block result')
end
- it "returns the result of the block when 'as' option is not informed" do
+ it "returns the result of the block when 'as' option is missing" do
result = cache.fetch(key) { 'block result' }
expect(result).to eq('block result')
diff --git a/spec/lib/gitlab/kubernetes/kube_client_spec.rb b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
index 02364e92149..978e64c4407 100644
--- a/spec/lib/gitlab/kubernetes/kube_client_spec.rb
+++ b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
@@ -50,6 +50,36 @@ describe Gitlab::Kubernetes::KubeClient do
end
end
+ describe '#initialize' do
+ shared_examples 'local address' do
+ it 'blocks local addresses' do
+ expect { client }.to raise_error(Gitlab::UrlBlocker::BlockedUrlError)
+ end
+
+ context 'when local requests are allowed' do
+ before do
+ stub_application_setting(allow_local_requests_from_hooks_and_services: true)
+ end
+
+ it 'allows local addresses' do
+ expect { client }.not_to raise_error
+ end
+ end
+ end
+
+ context 'localhost address' do
+ let(:api_url) { 'http://localhost:22' }
+
+ it_behaves_like 'local address'
+ end
+
+ context 'private network address' do
+ let(:api_url) { 'http://192.168.1.2:3003' }
+
+ it_behaves_like 'local address'
+ end
+ end
+
describe '#core_client' do
subject { client.core_client }
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index e90e0aba0a4..312e5e55af8 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -107,7 +107,7 @@ describe Gitlab::PathRegex do
git = Gitlab.config.git.bin_path
tracked = `cd #{Rails.root} && #{git} ls-files public`
.split("\n")
- .map { |entry| entry.gsub('public/', '') }
+ .map { |entry| entry.start_with?('public/-/') ? '-' : entry.gsub('public/', '') }
.uniq
tracked + %w(assets uploads)
end
diff --git a/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb
index 420218a695a..936447b8474 100644
--- a/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb
+++ b/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb
@@ -15,7 +15,7 @@ describe Gitlab::Prometheus::Queries::MatchedMetricQuery do
[{ '__name__' => 'metric_a' },
{ '__name__' => 'metric_b' }]
end
- let(:partialy_empty_series_info) { [{ '__name__' => 'metric_a', 'environment' => '' }] }
+ let(:partially_empty_series_info) { [{ '__name__' => 'metric_a', 'environment' => '' }] }
let(:empty_series_info) { [] }
let(:client) { double('prometheus_client') }
@@ -60,7 +60,7 @@ describe Gitlab::Prometheus::Queries::MatchedMetricQuery do
context 'one of the series info was not found' do
before do
- allow(client).to receive(:series).and_return(partialy_empty_series_info)
+ allow(client).to receive(:series).and_return(partially_empty_series_info)
end
it 'responds with one active and one missing metric' do
expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 1, metrics_missing_requirements: 1 }])
diff --git a/spec/lib/gitlab/quick_actions/command_definition_spec.rb b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
index 5dae82a63b4..136cfb5bcc5 100644
--- a/spec/lib/gitlab/quick_actions/command_definition_spec.rb
+++ b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
@@ -72,7 +72,7 @@ describe Gitlab::QuickActions::CommandDefinition do
end
describe "#execute" do
- let(:context) { OpenStruct.new(run: false) }
+ let(:context) { OpenStruct.new(run: false, commands_executed_count: nil) }
context "when the command is a noop" do
it "doesn't execute the command" do
@@ -80,6 +80,7 @@ describe Gitlab::QuickActions::CommandDefinition do
subject.execute(context, nil)
+ expect(context.commands_executed_count).to be_nil
expect(context.run).to be false
end
end
@@ -97,6 +98,7 @@ describe Gitlab::QuickActions::CommandDefinition do
it "doesn't execute the command" do
subject.execute(context, nil)
+ expect(context.commands_executed_count).to be_nil
expect(context.run).to be false
end
end
@@ -112,6 +114,7 @@ describe Gitlab::QuickActions::CommandDefinition do
subject.execute(context, true)
expect(context.run).to be true
+ expect(context.commands_executed_count).to eq(1)
end
end
@@ -120,6 +123,7 @@ describe Gitlab::QuickActions::CommandDefinition do
subject.execute(context, nil)
expect(context.run).to be true
+ expect(context.commands_executed_count).to eq(1)
end
end
end
@@ -134,6 +138,7 @@ describe Gitlab::QuickActions::CommandDefinition do
subject.execute(context, true)
expect(context.run).to be true
+ expect(context.commands_executed_count).to eq(1)
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb b/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
new file mode 100644
index 00000000000..ff8c0825ee4
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
@@ -0,0 +1,74 @@
+require 'spec_helper'
+
+describe Gitlab::SidekiqMiddleware::MemoryKiller do
+ subject { described_class.new }
+ let(:pid) { 999 }
+
+ let(:worker) { double(:worker, class: 'TestWorker') }
+ let(:job) { { 'jid' => 123 } }
+ let(:queue) { 'test_queue' }
+
+ def run
+ thread = subject.call(worker, job, queue) { nil }
+ thread&.join
+ end
+
+ before do
+ allow(subject).to receive(:get_rss).and_return(10.kilobytes)
+ allow(subject).to receive(:pid).and_return(pid)
+ end
+
+ context 'when MAX_RSS is set to 0' do
+ before do
+ stub_const("#{described_class}::MAX_RSS", 0)
+ end
+
+ it 'does nothing' do
+ expect(subject).not_to receive(:sleep)
+
+ run
+ end
+ end
+
+ context 'when MAX_RSS is exceeded' do
+ before do
+ stub_const("#{described_class}::MAX_RSS", 5.kilobytes)
+ end
+
+ it 'sends the TSTP, TERM and KILL signals at expected times' do
+ expect(subject).to receive(:sleep).with(15 * 60).ordered
+ expect(Process).to receive(:kill).with('SIGTSTP', pid).ordered
+
+ expect(subject).to receive(:sleep).with(30).ordered
+ expect(Process).to receive(:kill).with('SIGTERM', pid).ordered
+
+ expect(subject).to receive(:sleep).with(10).ordered
+ expect(Process).to receive(:kill).with('SIGKILL', pid).ordered
+
+ run
+ end
+
+ it 'sends TSTP and TERM to the pid, but KILL to the pgroup, when running as process leader' do
+ allow(Process).to receive(:getpgrp) { pid }
+ allow(subject).to receive(:sleep)
+
+ expect(Process).to receive(:kill).with('SIGTSTP', pid).ordered
+ expect(Process).to receive(:kill).with('SIGTERM', pid).ordered
+ expect(Process).to receive(:kill).with('SIGKILL', "-#{pid}").ordered
+
+ run
+ end
+ end
+
+ context 'when MAX_RSS is not exceeded' do
+ before do
+ stub_const("#{described_class}::MAX_RSS", 15.kilobytes)
+ end
+
+ it 'does nothing' do
+ expect(subject).not_to receive(:sleep)
+
+ run
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_middleware/shutdown_spec.rb b/spec/lib/gitlab/sidekiq_middleware/shutdown_spec.rb
deleted file mode 100644
index 0001795c3f0..00000000000
--- a/spec/lib/gitlab/sidekiq_middleware/shutdown_spec.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::SidekiqMiddleware::Shutdown do
- subject { described_class.new }
-
- let(:pid) { Process.pid }
- let(:worker) { double(:worker, class: 'TestWorker') }
- let(:job) { { 'jid' => 123 } }
- let(:queue) { 'test_queue' }
- let(:block) { proc { nil } }
-
- def run
- subject.call(worker, job, queue) { block.call }
- described_class.shutdown_thread&.join
- end
-
- def pop_trace
- subject.trace.pop(true)
- end
-
- before do
- allow(subject).to receive(:get_rss).and_return(10.kilobytes)
- described_class.clear_shutdown_thread
- end
-
- context 'when MAX_RSS is set to 0' do
- before do
- stub_const("#{described_class}::MAX_RSS", 0)
- end
-
- it 'does nothing' do
- expect(subject).not_to receive(:sleep)
-
- run
- end
- end
-
- def expect_shutdown_sequence
- expect(pop_trace).to eq([:sleep, 15 * 60])
- expect(pop_trace).to eq([:kill, 'SIGTSTP', pid])
-
- expect(pop_trace).to eq([:sleep, 30])
- expect(pop_trace).to eq([:kill, 'SIGTERM', pid])
-
- expect(pop_trace).to eq([:sleep, 10])
- expect(pop_trace).to eq([:kill, 'SIGKILL', pid])
- end
-
- context 'when MAX_RSS is exceeded' do
- before do
- stub_const("#{described_class}::MAX_RSS", 5.kilobytes)
- end
-
- it 'sends the TSTP, TERM and KILL signals at expected times' do
- run
-
- expect_shutdown_sequence
- end
- end
-
- context 'when MAX_RSS is not exceeded' do
- before do
- stub_const("#{described_class}::MAX_RSS", 15.kilobytes)
- end
-
- it 'does nothing' do
- expect(subject).not_to receive(:sleep)
-
- run
- end
- end
-
- context 'when WantShutdown is raised' do
- let(:block) { proc { raise described_class::WantShutdown } }
-
- it 'starts the shutdown sequence and re-raises the exception' do
- expect { run }.to raise_exception(described_class::WantShutdown)
-
- # We can't expect 'run' to have joined on the shutdown thread, because
- # it hit an exception.
- shutdown_thread = described_class.shutdown_thread
- expect(shutdown_thread).not_to be_nil
- shutdown_thread.join
-
- expect_shutdown_sequence
- end
- end
-end
diff --git a/spec/lib/gitlab/sidekiq_signals_spec.rb b/spec/lib/gitlab/sidekiq_signals_spec.rb
new file mode 100644
index 00000000000..77ecd1840d2
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_signals_spec.rb
@@ -0,0 +1,69 @@
+require 'spec_helper'
+
+describe Gitlab::SidekiqSignals do
+ describe '.install' do
+ let(:result) { Hash.new { |h, k| h[k] = 0 } }
+ let(:int_handler) { -> (_) { result['INT'] += 1 } }
+ let(:term_handler) { -> (_) { result['TERM'] += 1 } }
+ let(:other_handler) { -> (_) { result['OTHER'] += 1 } }
+ let(:signals) { { 'INT' => int_handler, 'TERM' => term_handler, 'OTHER' => other_handler } }
+
+ context 'not a process group leader' do
+ before do
+ allow(Process).to receive(:getpgrp) { Process.pid * 2 }
+ end
+
+ it 'does nothing' do
+ expect { described_class.install!(signals) }
+ .not_to change { signals }
+ end
+ end
+
+ context 'as a process group leader' do
+ before do
+ allow(Process).to receive(:getpgrp) { Process.pid }
+ end
+
+ it 'installs its own signal handlers for TERM and INT only' do
+ described_class.install!(signals)
+
+ expect(signals['INT']).not_to eq(int_handler)
+ expect(signals['TERM']).not_to eq(term_handler)
+ expect(signals['OTHER']).to eq(other_handler)
+ end
+
+ %w[INT TERM].each do |signal|
+ it "installs a forwarding signal handler for #{signal}" do
+ described_class.install!(signals)
+
+ expect(described_class)
+ .to receive(:trap)
+ .with(signal, 'IGNORE')
+ .and_return(:original_trap)
+ .ordered
+
+ expect(Process)
+ .to receive(:kill)
+ .with(signal, 0)
+ .ordered
+
+ expect(described_class)
+ .to receive(:trap)
+ .with(signal, :original_trap)
+ .ordered
+
+ signals[signal].call(:cli)
+
+ expect(result[signal]).to eq(1)
+ end
+
+ it "raises if sidekiq no longer traps SIG#{signal}" do
+ signals.delete(signal)
+
+ expect { described_class.install!(signals) }
+ .to raise_error(/Sidekiq should have registered/)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab_spec.rb b/spec/lib/gitlab_spec.rb
index 5f7a0cca351..8232715d00e 100644
--- a/spec/lib/gitlab_spec.rb
+++ b/spec/lib/gitlab_spec.rb
@@ -95,4 +95,18 @@ describe Gitlab do
expect(described_class.com?).to eq false
end
end
+
+ describe '.ee?' do
+ it 'returns true when using Enterprise Edition' do
+ stub_const('License', Class.new)
+
+ expect(described_class.ee?).to eq(true)
+ end
+
+ it 'returns false when using Community Edition' do
+ hide_const('License')
+
+ expect(described_class.ee?).to eq(false)
+ end
+ end
end
diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb
index 1024e1a25ea..8ccbd90ddb8 100644
--- a/spec/lib/object_storage/direct_upload_spec.rb
+++ b/spec/lib/object_storage/direct_upload_spec.rb
@@ -121,7 +121,7 @@ describe ObjectStorage::DirectUpload do
expect(subject[:MultipartUpload][:PartURLs].length).to eq(2)
end
- it 'part size is mimimum, 5MB' do
+ it 'part size is minimum, 5MB' do
expect(subject[:MultipartUpload][:PartSize]).to eq(5.megabyte)
end
end
diff --git a/spec/mailers/abuse_report_mailer_spec.rb b/spec/mailers/abuse_report_mailer_spec.rb
index bda892083b3..f96870cc112 100644
--- a/spec/mailers/abuse_report_mailer_spec.rb
+++ b/spec/mailers/abuse_report_mailer_spec.rb
@@ -4,25 +4,24 @@ describe AbuseReportMailer do
include EmailSpec::Matchers
describe '.notify' do
- context 'with admin_notification_email set' do
- before do
- stub_application_setting(admin_notification_email: 'admin@example.com')
- end
+ before do
+ stub_application_setting(admin_notification_email: 'admin@example.com')
+ end
- it 'sends to the admin_notification_email' do
- report = create(:abuse_report)
+ let(:report) { create(:abuse_report) }
+
+ subject { described_class.notify(report.id) }
- mail = described_class.notify(report.id)
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
- expect(mail).to deliver_to 'admin@example.com'
+ context 'with admin_notification_email set' do
+ it 'sends to the admin_notification_email' do
+ is_expected.to deliver_to 'admin@example.com'
end
it 'includes the user in the subject' do
- report = create(:abuse_report)
-
- mail = described_class.notify(report.id)
-
- expect(mail).to have_subject "#{report.user.name} (#{report.user.username}) was reported for abuse"
+ is_expected.to have_subject "#{report.user.name} (#{report.user.username}) was reported for abuse"
end
end
diff --git a/spec/mailers/email_rejection_mailer_spec.rb b/spec/mailers/email_rejection_mailer_spec.rb
new file mode 100644
index 00000000000..bbe0a50ae8e
--- /dev/null
+++ b/spec/mailers/email_rejection_mailer_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe EmailRejectionMailer do
+ include EmailSpec::Matchers
+
+ describe '#rejection' do
+ let(:raw_email) { 'From: someone@example.com\nraw email here' }
+
+ subject { described_class.rejection('some rejection reason', raw_email) }
+
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+ end
+end
diff --git a/spec/mailers/emails/auto_devops_spec.rb b/spec/mailers/emails/auto_devops_spec.rb
index 839caf3f50e..dd7c12c3143 100644
--- a/spec/mailers/emails/auto_devops_spec.rb
+++ b/spec/mailers/emails/auto_devops_spec.rb
@@ -13,6 +13,9 @@ describe Emails::AutoDevops do
subject { Notify.autodevops_disabled_email(pipeline, owner.email) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'sents email with correct subject' do
is_expected.to have_subject("#{project.name} | Auto DevOps pipeline was disabled for #{project.name}")
end
diff --git a/spec/mailers/emails/issues_spec.rb b/spec/mailers/emails/issues_spec.rb
index 09253cf8003..5b5bd6f4308 100644
--- a/spec/mailers/emails/issues_spec.rb
+++ b/spec/mailers/emails/issues_spec.rb
@@ -29,5 +29,14 @@ describe Emails::Issues do
expect(subject).to have_body_text "23, 34, 58"
end
+
+ context 'with header and footer' do
+ let(:results) { { success: 165, error_lines: [], parse_error: false } }
+
+ subject { Notify.import_issues_csv_email(user.id, project.id, results) }
+
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+ end
end
end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 4f578c48d5b..3c8897ed37c 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -53,6 +53,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Issue 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 'has the correct subject and body' do
aggregate_failures do
@@ -72,6 +74,9 @@ describe Notify do
context 'when sent with a reason' do
subject { described_class.new_issue_email(issue.assignees.first.id, issue.id, NotificationReason::ASSIGNED) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'includes the reason in a header' do
is_expected.to have_header('X-GitLab-NotificationReason', NotificationReason::ASSIGNED)
end
@@ -99,6 +104,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Issue 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]
@@ -118,6 +125,9 @@ describe Notify do
context 'when sent with a reason' do
subject { described_class.reassigned_issue_email(recipient.id, issue.id, [previous_assignee.id], current_user.id, NotificationReason::ASSIGNED) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'includes the reason in a header' do
is_expected.to have_header('X-GitLab-NotificationReason', NotificationReason::ASSIGNED)
end
@@ -134,6 +144,8 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Issue link'
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with a labels subscriptions link in its footer'
+ 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]
@@ -173,6 +185,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Issue 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]
@@ -194,23 +208,53 @@ describe Notify do
let(:new_issue) { create(:issue) }
subject { described_class.issue_moved_email(recipient, issue, new_issue, current_user) }
- it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
- let(:model) { issue }
- end
- it_behaves_like 'it should show Gmail Actions View Issue link'
- it_behaves_like 'an unsubscribeable thread'
+ context 'when a user has permissions to access the new issue' do
+ before do
+ new_issue.project.add_developer(recipient)
+ end
+
+ it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
+ let(:model) { issue }
+ end
+ it_behaves_like 'it should show Gmail Actions View Issue link'
+ it_behaves_like 'an unsubscribeable thread'
+
+ it 'contains description about action taken' do
+ is_expected.to have_body_text 'Issue was moved to another project'
+ end
+
+ it 'has the correct subject and body' do
+ new_issue_url = project_issue_path(new_issue.project, new_issue)
+
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.to have_body_text(new_issue_url)
+ is_expected.to have_body_text(project_issue_path(project, issue))
+ end
+ end
- it 'contains description about action taken' do
- is_expected.to have_body_text 'Issue was moved to another project'
+ it 'contains the issue title' do
+ is_expected.to have_body_text new_issue.title
+ end
end
- it 'has the correct subject and body' do
- new_issue_url = project_issue_path(new_issue.project, new_issue)
+ context 'when a user does not permissions to access the new issue' do
+ it 'has the correct subject and body' do
+ new_issue_url = project_issue_path(new_issue.project, new_issue)
- aggregate_failures do
- is_expected.to have_referable_subject(issue, reply: true)
- is_expected.to have_body_text(new_issue_url)
- is_expected.to have_body_text(project_issue_path(project, issue))
+ aggregate_failures do
+ is_expected.to have_referable_subject(issue, reply: true)
+ is_expected.not_to have_body_text(new_issue_url)
+ is_expected.to have_body_text(project_issue_path(project, issue))
+ end
+ end
+
+ it 'does not contain the issue title' do
+ is_expected.not_to have_body_text new_issue.title
+ end
+
+ it 'contains information about missing permissions' do
+ is_expected.to have_body_text "You don't have access to the project."
end
end
end
@@ -226,6 +270,8 @@ describe Notify do
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 'has the correct subject and body' do
aggregate_failures do
@@ -243,6 +289,9 @@ describe Notify do
context 'when sent with a reason' do
subject { described_class.new_merge_request_email(merge_request.assignee_id, merge_request.id, NotificationReason::ASSIGNED) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'includes the reason in a header' do
is_expected.to have_header('X-GitLab-NotificationReason', NotificationReason::ASSIGNED)
end
@@ -270,6 +319,8 @@ describe Notify do
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]
@@ -289,6 +340,9 @@ describe Notify do
context 'when sent with a reason' do
subject { described_class.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id, NotificationReason::ASSIGNED) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'includes the reason in a header' do
is_expected.to have_header('X-GitLab-NotificationReason', NotificationReason::ASSIGNED)
end
@@ -313,6 +367,8 @@ describe Notify do
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 'contains the description' do
is_expected.to have_body_text(merge_request.description)
@@ -329,6 +385,8 @@ describe Notify do
it_behaves_like 'it should show Gmail Actions View Merge request link'
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with a labels subscriptions link in its footer'
+ 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]
@@ -352,6 +410,8 @@ describe Notify do
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]
@@ -379,6 +439,8 @@ describe Notify do
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]
@@ -413,6 +475,8 @@ describe Notify do
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]
@@ -442,6 +506,8 @@ describe Notify do
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 push user' do
sender = subject.header[:from].addrs[0]
@@ -482,6 +548,9 @@ describe Notify do
subject { described_class.note_issue_email(recipient.id, third_note.id) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'has In-Reply-To header pointing to previous note in discussion' do
expect(subject.header['In-Reply-To'].message_ids).to eq(["note_#{second_note.id}@#{host}"])
end
@@ -502,6 +571,9 @@ describe Notify do
subject { described_class.note_issue_email(recipient.id, note.id) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it 'has In-Reply-To header pointing to the issue' do
expect(subject.header['In-Reply-To'].message_ids).to eq(["issue_#{note.noteable.id}@#{host}"])
end
@@ -518,6 +590,9 @@ describe Notify do
subject { described_class.note_project_snippet_email(project_snippet_note.author_id, project_snippet_note.id) }
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
let(:model) { project_snippet }
end
@@ -535,6 +610,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'has the correct subject and body' do
is_expected.to have_subject("#{project.name} | Project was moved")
@@ -559,6 +636,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
to_emails = subject.header[:to].addrs.map(&:address)
@@ -582,6 +661,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{project.full_name} project was denied"
@@ -599,6 +680,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{project.full_name} project was granted"
@@ -629,6 +712,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Invitation to join the #{project.full_name} project"
@@ -653,6 +738,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation accepted'
@@ -676,6 +763,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation declined'
@@ -708,6 +797,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Commit link'
it_behaves_like 'a user cannot unsubscribe through footer link'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'has the correct subject and body' do
aggregate_failures do
@@ -732,6 +823,8 @@ describe Notify do
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 'has the correct subject and body' do
aggregate_failures do
@@ -756,6 +849,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Issue 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 'has the correct subject and body' do
aggregate_failures do
@@ -819,6 +914,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Commit link'
it_behaves_like 'a user cannot unsubscribe through footer link'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'has the correct subject' do
is_expected.to have_subject "Re: #{project.name} | #{commit.title} (#{commit.short_id})"
@@ -845,6 +942,8 @@ describe Notify do
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 'has the correct subject' do
is_expected.to have_referable_subject(merge_request, reply: true)
@@ -871,6 +970,8 @@ describe Notify do
end
it_behaves_like 'it should show Gmail Actions View Issue 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 'has the correct subject' do
is_expected.to have_referable_subject(issue, reply: true)
@@ -948,6 +1049,8 @@ describe Notify do
it_behaves_like 'an email for a note on a diff discussion', :diff_note_on_commit
it_behaves_like 'it should show Gmail Actions View Commit link'
it_behaves_like 'a user cannot unsubscribe through footer link'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
end
describe 'on a merge request' do
@@ -958,6 +1061,8 @@ describe Notify do
it_behaves_like 'an email for a note on a diff discussion', :diff_note_on_merge_request
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'
end
end
end
@@ -976,6 +1081,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
to_emails = subject.header[:to].addrs.map(&:address)
@@ -998,6 +1105,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{group.name} group was denied"
@@ -1014,6 +1123,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Access to the #{group.name} group was granted"
@@ -1044,6 +1155,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject "Invitation to join the #{group.name} group"
@@ -1068,6 +1181,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation accepted'
@@ -1091,6 +1206,8 @@ describe Notify do
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
it_behaves_like "a user cannot unsubscribe through footer link"
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'contains all the useful information' do
is_expected.to have_subject 'Invitation declined'
@@ -1140,6 +1257,8 @@ describe Notify do
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1165,6 +1284,8 @@ describe Notify do
it_behaves_like "a user cannot unsubscribe through footer link"
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1189,6 +1310,8 @@ describe Notify do
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1210,6 +1333,8 @@ describe Notify do
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1237,6 +1362,8 @@ describe Notify do
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1328,6 +1455,8 @@ describe Notify do
it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'an email with X-GitLab headers containing project details'
it_behaves_like 'an email that contains a header with author username'
+ 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]
@@ -1348,6 +1477,11 @@ describe Notify do
describe 'HTML emails setting' do
let(:multipart_mail) { described_class.project_was_moved_email(project.id, user.id, "gitlab/gitlab") }
+ subject { multipart_mail }
+
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
context 'when disabled' do
it 'only sends the text template' do
stub_application_setting(html_emails_enabled: false)
@@ -1386,6 +1520,8 @@ describe Notify do
subject { described_class.note_personal_snippet_email(personal_snippet_note.author_id, personal_snippet_note.id) }
it_behaves_like 'a user cannot unsubscribe through footer link'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
it 'has the correct subject and body' do
is_expected.to have_referable_subject(personal_snippet, reply: true)
diff --git a/spec/mailers/repository_check_mailer_spec.rb b/spec/mailers/repository_check_mailer_spec.rb
index 00613c7b671..384660f7221 100644
--- a/spec/mailers/repository_check_mailer_spec.rb
+++ b/spec/mailers/repository_check_mailer_spec.rb
@@ -17,5 +17,12 @@ describe RepositoryCheckMailer do
expect(mail).to have_subject 'GitLab Admin | 3 projects failed their last repository check'
end
+
+ context 'with footer and header' do
+ subject { described_class.notify(1) }
+
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+ end
end
end
diff --git a/spec/models/active_session_spec.rb b/spec/models/active_session_spec.rb
index 129b2f92683..e128fe8a4b7 100644
--- a/spec/models/active_session_spec.rb
+++ b/spec/models/active_session_spec.rb
@@ -7,7 +7,10 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_shared_state do
end
end
- let(:session) { double(:session, id: '6919a6f1bb119dd7396fadc38fd18d0d') }
+ let(:session) do
+ double(:session, { id: '6919a6f1bb119dd7396fadc38fd18d0d',
+ '[]': {} })
+ end
let(:request) do
double(:request, {
diff --git a/spec/models/appearance_spec.rb b/spec/models/appearance_spec.rb
index 28d482adebf..3e95aa2b5dd 100644
--- a/spec/models/appearance_spec.rb
+++ b/spec/models/appearance_spec.rb
@@ -78,4 +78,22 @@ describe Appearance do
it { is_expected.to allow_value(hex).for(:message_font_color) }
it { is_expected.not_to allow_value('000').for(:message_font_color) }
end
+
+ describe 'email_header_and_footer_enabled' do
+ context 'default email_header_and_footer_enabled flag value' do
+ it 'returns email_header_and_footer_enabled as true' do
+ appearance = build(:appearance)
+
+ expect(appearance.email_header_and_footer_enabled?).to eq(false)
+ end
+ end
+
+ context 'when setting email_header_and_footer_enabled flag value' do
+ it 'returns email_header_and_footer_enabled as true' do
+ appearance = build(:appearance, email_header_and_footer_enabled: true)
+
+ expect(appearance.email_header_and_footer_enabled?).to eq(true)
+ end
+ end
+ end
end
diff --git a/spec/models/board_group_recent_visit_spec.rb b/spec/models/board_group_recent_visit_spec.rb
index 59ad4e5417e..558be61824f 100644
--- a/spec/models/board_group_recent_visit_spec.rb
+++ b/spec/models/board_group_recent_visit_spec.rb
@@ -50,15 +50,25 @@ describe BoardGroupRecentVisit do
end
describe '#latest' do
- it 'returns the most recent visited' do
- board2 = create(:board, group: group)
- board3 = create(:board, group: group)
+ def create_visit(time)
+ create :board_group_recent_visit, group: group, user: user, updated_at: time
+ end
- create :board_group_recent_visit, group: board.group, board: board, user: user, updated_at: 7.days.ago
- create :board_group_recent_visit, group: board2.group, board: board2, user: user, updated_at: 5.days.ago
- recent = create :board_group_recent_visit, group: board3.group, board: board3, user: user, updated_at: 1.day.ago
+ it 'returns the most recent visited' do
+ create_visit(7.days.ago)
+ create_visit(5.days.ago)
+ recent = create_visit(1.day.ago)
expect(described_class.latest(user, group)).to eq recent
end
+
+ it 'returns last 3 visited boards' do
+ create_visit(7.days.ago)
+ visit1 = create_visit(3.days.ago)
+ visit2 = create_visit(2.days.ago)
+ visit3 = create_visit(5.days.ago)
+
+ expect(described_class.latest(user, group, count: 3)).to eq([visit2, visit1, visit3])
+ end
end
end
diff --git a/spec/models/board_project_recent_visit_spec.rb b/spec/models/board_project_recent_visit_spec.rb
index 275581945fa..e404fb3bbdb 100644
--- a/spec/models/board_project_recent_visit_spec.rb
+++ b/spec/models/board_project_recent_visit_spec.rb
@@ -50,15 +50,25 @@ describe BoardProjectRecentVisit do
end
describe '#latest' do
- it 'returns the most recent visited' do
- board2 = create(:board, project: project)
- board3 = create(:board, project: project)
+ def create_visit(time)
+ create :board_project_recent_visit, project: project, user: user, updated_at: time
+ end
- create :board_project_recent_visit, project: board.project, board: board, user: user, updated_at: 7.days.ago
- create :board_project_recent_visit, project: board2.project, board: board2, user: user, updated_at: 5.days.ago
- recent = create :board_project_recent_visit, project: board3.project, board: board3, user: user, updated_at: 1.day.ago
+ it 'returns the most recent visited' do
+ create_visit(7.days.ago)
+ create_visit(5.days.ago)
+ recent = create_visit(1.day.ago)
expect(described_class.latest(user, project)).to eq recent
end
+
+ it 'returns last 3 visited boards' do
+ create_visit(7.days.ago)
+ visit1 = create_visit(3.days.ago)
+ visit2 = create_visit(2.days.ago)
+ visit3 = create_visit(5.days.ago)
+
+ expect(described_class.latest(user, project, count: 3)).to eq([visit2, visit1, visit3])
+ end
end
end
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index 741cdfef1a5..b5ec8991720 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -22,4 +22,19 @@ describe Ci::Bridge do
expect(status).to be_a Gitlab::Ci::Status::Success
end
end
+
+ describe '#scoped_variables_hash' do
+ it 'returns a hash representing variables' do
+ variables = %w[
+ CI_JOB_NAME CI_JOB_STAGE CI_COMMIT_SHA CI_COMMIT_SHORT_SHA
+ CI_COMMIT_BEFORE_SHA CI_COMMIT_REF_NAME CI_COMMIT_REF_SLUG
+ CI_PROJECT_ID CI_PROJECT_NAME CI_PROJECT_PATH
+ CI_PROJECT_PATH_SLUG CI_PROJECT_NAMESPACE CI_PIPELINE_IID
+ CI_CONFIG_PATH CI_PIPELINE_SOURCE CI_COMMIT_MESSAGE
+ CI_COMMIT_TITLE CI_COMMIT_DESCRIPTION
+ ]
+
+ expect(bridge.scoped_variables_hash.keys).to include(*variables)
+ end
+ end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 17540443688..fc75d3e23fb 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -23,7 +23,7 @@ describe Ci::Build do
it { is_expected.to validate_presence_of(:ref) }
it { is_expected.to respond_to(:has_trace?) }
it { is_expected.to respond_to(:trace) }
- it { is_expected.to delegate_method(:merge_request?).to(:pipeline) }
+ it { is_expected.to delegate_method(:merge_request_event?).to(:pipeline) }
it { is_expected.to be_a(ArtifactMigratable) }
@@ -2114,55 +2114,55 @@ describe Ci::Build do
context 'returns variables' do
let(:predefined_variables) do
[
- { key: 'CI_PIPELINE_ID', value: pipeline.id.to_s, public: true },
- { key: 'CI_PIPELINE_URL', value: project.web_url + "/pipelines/#{pipeline.id}", public: true },
- { key: 'CI_JOB_ID', value: build.id.to_s, public: true },
- { key: 'CI_JOB_URL', value: project.web_url + "/-/jobs/#{build.id}", public: true },
- { key: 'CI_JOB_TOKEN', value: 'my-token', public: false },
- { key: 'CI_BUILD_ID', value: build.id.to_s, public: true },
- { key: 'CI_BUILD_TOKEN', value: 'my-token', public: false },
- { key: 'CI_REGISTRY_USER', value: 'gitlab-ci-token', public: true },
- { key: 'CI_REGISTRY_PASSWORD', value: 'my-token', public: false },
- { key: 'CI_REPOSITORY_URL', value: build.repo_url, public: false },
- { key: 'CI', value: 'true', public: true },
- { key: 'GITLAB_CI', value: 'true', public: true },
- { key: 'GITLAB_FEATURES', value: project.licensed_features.join(','), public: true },
- { key: 'CI_SERVER_NAME', value: 'GitLab', public: true },
- { key: 'CI_SERVER_VERSION', value: Gitlab::VERSION, public: true },
- { key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s, public: true },
- { key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s, public: true },
- { key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s, public: true },
- { key: 'CI_SERVER_REVISION', value: Gitlab.revision, public: true },
- { key: 'CI_JOB_NAME', value: 'test', public: true },
- { key: 'CI_JOB_STAGE', value: 'test', public: true },
- { key: 'CI_COMMIT_SHA', value: build.sha, public: true },
- { key: 'CI_COMMIT_SHORT_SHA', value: build.short_sha, public: true },
- { key: 'CI_COMMIT_BEFORE_SHA', value: build.before_sha, public: true },
- { key: 'CI_COMMIT_REF_NAME', value: build.ref, public: true },
- { key: 'CI_COMMIT_REF_SLUG', value: build.ref_slug, public: true },
- { key: 'CI_NODE_TOTAL', value: '1', public: true },
- { key: 'CI_BUILD_REF', value: build.sha, public: true },
- { key: 'CI_BUILD_BEFORE_SHA', value: build.before_sha, public: true },
- { key: 'CI_BUILD_REF_NAME', value: build.ref, public: true },
- { key: 'CI_BUILD_REF_SLUG', value: build.ref_slug, public: true },
- { key: 'CI_BUILD_NAME', value: 'test', public: true },
- { key: 'CI_BUILD_STAGE', value: 'test', public: true },
- { key: 'CI_PROJECT_ID', value: project.id.to_s, public: true },
- { key: 'CI_PROJECT_NAME', value: project.path, public: true },
- { key: 'CI_PROJECT_PATH', value: project.full_path, public: true },
- { key: 'CI_PROJECT_PATH_SLUG', value: project.full_path_slug, public: true },
- { key: 'CI_PROJECT_NAMESPACE', value: project.namespace.full_path, public: true },
- { key: 'CI_PROJECT_URL', value: project.web_url, public: true },
- { key: 'CI_PROJECT_VISIBILITY', value: 'private', public: true },
- { key: 'CI_PAGES_DOMAIN', value: Gitlab.config.pages.host, public: true },
- { key: 'CI_PAGES_URL', value: project.pages_url, public: true },
- { key: 'CI_API_V4_URL', value: 'http://localhost/api/v4', public: true },
- { key: 'CI_PIPELINE_IID', value: pipeline.iid.to_s, public: true },
- { key: 'CI_CONFIG_PATH', value: pipeline.ci_yaml_file_path, public: true },
- { key: 'CI_PIPELINE_SOURCE', value: pipeline.source, public: true },
- { key: 'CI_COMMIT_MESSAGE', value: pipeline.git_commit_message, public: true },
- { key: 'CI_COMMIT_TITLE', value: pipeline.git_commit_title, public: true },
- { key: 'CI_COMMIT_DESCRIPTION', value: pipeline.git_commit_description, public: true }
+ { key: 'CI_PIPELINE_ID', value: pipeline.id.to_s, public: true, masked: false },
+ { key: 'CI_PIPELINE_URL', value: project.web_url + "/pipelines/#{pipeline.id}", public: true, masked: false },
+ { 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: false },
+ { key: 'CI_BUILD_ID', value: build.id.to_s, public: true, masked: false },
+ { key: 'CI_BUILD_TOKEN', value: 'my-token', public: false, masked: false },
+ { key: 'CI_REGISTRY_USER', value: 'gitlab-ci-token', public: true, masked: false },
+ { key: 'CI_REGISTRY_PASSWORD', value: 'my-token', public: false, masked: false },
+ { key: 'CI_REPOSITORY_URL', value: build.repo_url, public: false, masked: false },
+ { key: 'CI', value: 'true', public: true, masked: false },
+ { key: 'GITLAB_CI', value: 'true', public: true, masked: false },
+ { key: 'GITLAB_FEATURES', value: project.licensed_features.join(','), public: true, masked: false },
+ { key: 'CI_SERVER_NAME', value: 'GitLab', public: true, masked: false },
+ { key: 'CI_SERVER_VERSION', value: Gitlab::VERSION, public: true, masked: false },
+ { key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s, public: true, masked: false },
+ { key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s, public: true, masked: false },
+ { key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s, public: true, masked: false },
+ { key: 'CI_SERVER_REVISION', value: Gitlab.revision, public: true, masked: false },
+ { key: 'CI_JOB_NAME', value: 'test', public: true, masked: false },
+ { key: 'CI_JOB_STAGE', value: 'test', 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 },
+ { key: 'CI_COMMIT_REF_NAME', value: build.ref, public: true, masked: false },
+ { key: 'CI_COMMIT_REF_SLUG', value: build.ref_slug, public: true, masked: false },
+ { key: 'CI_NODE_TOTAL', value: '1', public: true, masked: false },
+ { key: 'CI_BUILD_REF', value: build.sha, public: true, masked: false },
+ { key: 'CI_BUILD_BEFORE_SHA', value: build.before_sha, public: true, masked: false },
+ { key: 'CI_BUILD_REF_NAME', value: build.ref, public: true, masked: false },
+ { key: 'CI_BUILD_REF_SLUG', value: build.ref_slug, public: true, masked: false },
+ { key: 'CI_BUILD_NAME', value: 'test', public: true, masked: false },
+ { key: 'CI_BUILD_STAGE', value: 'test', public: true, masked: false },
+ { key: 'CI_PROJECT_ID', value: project.id.to_s, public: true, masked: false },
+ { key: 'CI_PROJECT_NAME', value: project.path, public: true, masked: false },
+ { key: 'CI_PROJECT_PATH', value: project.full_path, public: true, masked: false },
+ { key: 'CI_PROJECT_PATH_SLUG', value: project.full_path_slug, public: true, masked: false },
+ { key: 'CI_PROJECT_NAMESPACE', value: project.namespace.full_path, public: true, masked: false },
+ { key: 'CI_PROJECT_URL', value: project.web_url, public: true, masked: false },
+ { key: 'CI_PROJECT_VISIBILITY', value: 'private', 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_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_CONFIG_PATH', value: pipeline.ci_yaml_file_path, public: true, masked: false },
+ { key: 'CI_PIPELINE_SOURCE', value: pipeline.source, public: true, masked: false },
+ { key: 'CI_COMMIT_MESSAGE', value: pipeline.git_commit_message, public: true, masked: false },
+ { key: 'CI_COMMIT_TITLE', value: pipeline.git_commit_title, public: true, masked: false },
+ { key: 'CI_COMMIT_DESCRIPTION', value: pipeline.git_commit_description, public: true, masked: false }
]
end
@@ -2175,10 +2175,10 @@ describe Ci::Build do
describe 'variables ordering' do
context 'when variables hierarchy is stubbed' do
- let(:build_pre_var) { { key: 'build', value: 'value', public: true } }
- let(:project_pre_var) { { key: 'project', value: 'value', public: true } }
- let(:pipeline_pre_var) { { key: 'pipeline', value: 'value', public: true } }
- let(:build_yaml_var) { { key: 'yaml', value: 'value', public: true } }
+ let(:build_pre_var) { { key: 'build', value: 'value', public: true, masked: false } }
+ let(:project_pre_var) { { key: 'project', value: 'value', public: true, masked: false } }
+ let(:pipeline_pre_var) { { key: 'pipeline', value: 'value', public: true, masked: false } }
+ let(:build_yaml_var) { { key: 'yaml', value: 'value', public: true, masked: false } }
before do
allow(build).to receive(:predefined_variables) { [build_pre_var] }
@@ -2200,7 +2200,7 @@ describe Ci::Build do
project_pre_var,
pipeline_pre_var,
build_yaml_var,
- { key: 'secret', value: 'value', public: false }])
+ { key: 'secret', value: 'value', public: false, masked: false }])
end
end
@@ -2233,10 +2233,10 @@ describe Ci::Build do
context 'when build has user' do
let(:user_variables) do
[
- { key: 'GITLAB_USER_ID', value: user.id.to_s, public: true },
- { key: 'GITLAB_USER_EMAIL', value: user.email, public: true },
- { key: 'GITLAB_USER_LOGIN', value: user.username, public: true },
- { key: 'GITLAB_USER_NAME', value: user.name, public: true }
+ { key: 'GITLAB_USER_ID', value: user.id.to_s, public: true, masked: false },
+ { key: 'GITLAB_USER_EMAIL', value: user.email, public: true, masked: false },
+ { key: 'GITLAB_USER_LOGIN', value: user.username, public: true, masked: false },
+ { key: 'GITLAB_USER_NAME', value: user.name, public: true, masked: false }
]
end
@@ -2250,8 +2250,8 @@ describe Ci::Build do
context 'when build has an environment' do
let(:environment_variables) do
[
- { key: 'CI_ENVIRONMENT_NAME', value: 'production', public: true },
- { key: 'CI_ENVIRONMENT_SLUG', value: 'prod-slug', public: true }
+ { key: 'CI_ENVIRONMENT_NAME', value: 'production', public: true, masked: false },
+ { key: 'CI_ENVIRONMENT_SLUG', value: 'prod-slug', public: true, masked: false }
]
end
@@ -2286,7 +2286,7 @@ describe Ci::Build do
before do
environment_variables <<
- { key: 'CI_ENVIRONMENT_URL', value: url, public: true }
+ { key: 'CI_ENVIRONMENT_URL', value: url, public: true, masked: false }
end
context 'when the URL was set from the job' do
@@ -2323,7 +2323,7 @@ describe Ci::Build do
end
let(:manual_variable) do
- { key: 'CI_JOB_MANUAL', value: 'true', public: true }
+ { key: 'CI_JOB_MANUAL', value: 'true', public: true, masked: false }
end
it { is_expected.to include(manual_variable) }
@@ -2331,7 +2331,7 @@ describe Ci::Build do
context 'when build is for tag' do
let(:tag_variable) do
- { key: 'CI_COMMIT_TAG', value: 'master', public: true }
+ { key: 'CI_COMMIT_TAG', value: 'master', public: true, masked: false }
end
before do
@@ -2343,7 +2343,7 @@ describe Ci::Build do
context 'when CI variable is defined' do
let(:ci_variable) do
- { key: 'SECRET_KEY', value: 'secret_value', public: false }
+ { key: 'SECRET_KEY', value: 'secret_value', public: false, masked: false }
end
before do
@@ -2358,7 +2358,7 @@ describe Ci::Build do
let(:ref) { Gitlab::Git::BRANCH_REF_PREFIX + build.ref }
let(:protected_variable) do
- { key: 'PROTECTED_KEY', value: 'protected_value', public: false }
+ { key: 'PROTECTED_KEY', value: 'protected_value', public: false, masked: false }
end
before do
@@ -2390,7 +2390,7 @@ describe Ci::Build do
context 'when group CI variable is defined' do
let(:ci_variable) do
- { key: 'SECRET_KEY', value: 'secret_value', public: false }
+ { key: 'SECRET_KEY', value: 'secret_value', public: false, masked: false }
end
before do
@@ -2405,7 +2405,7 @@ describe Ci::Build do
let(:ref) { Gitlab::Git::BRANCH_REF_PREFIX + build.ref }
let(:protected_variable) do
- { key: 'PROTECTED_KEY', value: 'protected_value', public: false }
+ { key: 'PROTECTED_KEY', value: 'protected_value', public: false, masked: false }
end
before do
@@ -2444,11 +2444,11 @@ describe Ci::Build do
let(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline, trigger: trigger) }
let(:user_trigger_variable) do
- { key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1', public: false }
+ { key: 'TRIGGER_KEY_1', value: 'TRIGGER_VALUE_1', public: false, masked: false }
end
let(:predefined_trigger_variable) do
- { key: 'CI_PIPELINE_TRIGGERED', value: 'true', public: true }
+ { key: 'CI_PIPELINE_TRIGGERED', value: 'true', public: true, masked: false }
end
before do
@@ -2480,7 +2480,7 @@ describe Ci::Build do
context 'when pipeline has a variable' do
let!(:pipeline_variable) { create(:ci_pipeline_variable, pipeline: pipeline) }
- it { is_expected.to include(pipeline_variable.to_runner_variable) }
+ it { is_expected.to include(key: pipeline_variable.key, value: pipeline_variable.value, public: false, masked: false) }
end
context 'when a job was triggered by a pipeline schedule' do
@@ -2497,16 +2497,16 @@ describe Ci::Build do
pipeline_schedule.reload
end
- it { is_expected.to include(pipeline_schedule_variable.to_runner_variable) }
+ it { is_expected.to include(key: pipeline_schedule_variable.key, value: pipeline_schedule_variable.value, public: false, masked: false) }
end
context 'when container registry is enabled' do
let(:container_registry_enabled) { true }
let(:ci_registry) do
- { key: 'CI_REGISTRY', value: 'registry.example.com', public: true }
+ { key: 'CI_REGISTRY', value: 'registry.example.com', public: true, masked: false }
end
let(:ci_registry_image) do
- { key: 'CI_REGISTRY_IMAGE', value: project.container_registry_url, public: true }
+ { key: 'CI_REGISTRY_IMAGE', value: project.container_registry_url, public: true, masked: false }
end
context 'and is disabled for project' do
@@ -2535,13 +2535,13 @@ describe Ci::Build do
build.update(runner: runner)
end
- it { is_expected.to include({ key: 'CI_RUNNER_ID', value: runner.id.to_s, public: true }) }
- it { is_expected.to include({ key: 'CI_RUNNER_DESCRIPTION', value: 'description', public: true }) }
- it { is_expected.to include({ key: 'CI_RUNNER_TAGS', value: 'docker, linux', public: true }) }
+ it { is_expected.to include({ key: 'CI_RUNNER_ID', value: runner.id.to_s, public: true, masked: false }) }
+ it { is_expected.to include({ key: 'CI_RUNNER_DESCRIPTION', value: 'description', public: true, masked: false }) }
+ it { is_expected.to include({ key: 'CI_RUNNER_TAGS', value: 'docker, linux', public: true, masked: false }) }
end
context 'when build is for a deployment' do
- let(:deployment_variable) { { key: 'KUBERNETES_TOKEN', value: 'TOKEN', public: false } }
+ let(:deployment_variable) { { key: 'KUBERNETES_TOKEN', value: 'TOKEN', public: false, masked: false } }
before do
build.environment = 'production'
@@ -2555,7 +2555,7 @@ describe Ci::Build do
end
context 'when project has custom CI config path' do
- let(:ci_config_path) { { key: 'CI_CONFIG_PATH', value: 'custom', public: true } }
+ let(:ci_config_path) { { key: 'CI_CONFIG_PATH', value: 'custom', public: true, masked: false } }
before do
project.update(ci_config_path: 'custom')
@@ -2572,7 +2572,7 @@ describe Ci::Build do
it "includes AUTO_DEVOPS_DOMAIN" do
is_expected.to include(
- { key: 'AUTO_DEVOPS_DOMAIN', value: 'example.com', public: true })
+ { key: 'AUTO_DEVOPS_DOMAIN', value: 'example.com', public: true, masked: false })
end
end
@@ -2583,7 +2583,7 @@ describe Ci::Build do
it "includes AUTO_DEVOPS_DOMAIN" do
is_expected.not_to include(
- { key: 'AUTO_DEVOPS_DOMAIN', value: 'example.com', public: true })
+ { key: 'AUTO_DEVOPS_DOMAIN', value: 'example.com', public: true, masked: false })
end
end
end
@@ -2598,9 +2598,9 @@ describe Ci::Build do
variables = subject.reverse.uniq { |variable| variable[:key] }.reverse
expect(variables)
- .not_to include(key: 'MYVAR', value: 'myvar', public: true)
+ .not_to include(key: 'MYVAR', value: 'myvar', public: true, masked: false)
expect(variables)
- .to include(key: 'MYVAR', value: 'pipeline value', public: false)
+ .to include(key: 'MYVAR', value: 'pipeline value', public: false, masked: false)
end
end
@@ -2616,13 +2616,13 @@ describe Ci::Build do
it 'includes CI_NODE_INDEX' do
is_expected.to include(
- { key: 'CI_NODE_INDEX', value: index.to_s, public: true }
+ { key: 'CI_NODE_INDEX', value: index.to_s, public: true, masked: false }
)
end
it 'includes correct CI_NODE_TOTAL' do
is_expected.to include(
- { key: 'CI_NODE_TOTAL', value: total.to_s, public: true }
+ { key: 'CI_NODE_TOTAL', value: total.to_s, public: true, masked: false }
)
end
end
@@ -2641,7 +2641,7 @@ describe Ci::Build do
it 'returns static predefined variables' do
expect(build.variables.size).to be >= 28
expect(build.variables)
- .to include(key: 'CI_COMMIT_REF_NAME', value: 'feature', public: true)
+ .to include(key: 'CI_COMMIT_REF_NAME', value: 'feature', public: true, masked: false)
expect(build).not_to be_persisted
end
end
@@ -2651,8 +2651,8 @@ describe Ci::Build do
let(:deploy_token_variables) do
[
- { key: 'CI_DEPLOY_USER', value: deploy_token.username, public: true },
- { key: 'CI_DEPLOY_PASSWORD', value: deploy_token.token, public: false }
+ { key: 'CI_DEPLOY_USER', value: deploy_token.username, public: true, masked: false },
+ { key: 'CI_DEPLOY_PASSWORD', value: deploy_token.token, public: false, masked: false }
]
end
@@ -2711,7 +2711,7 @@ describe Ci::Build do
end
expect(variables)
- .to include(key: 'CI_COMMIT_REF_NAME', value: 'feature', public: true)
+ .to include(key: 'CI_COMMIT_REF_NAME', value: 'feature', public: true, masked: false)
end
it 'does not return prohibited variables' do
@@ -2734,6 +2734,122 @@ describe Ci::Build do
end
end
+ describe '#secret_group_variables' do
+ subject { build.secret_group_variables }
+
+ let!(:variable) { create(:ci_group_variable, protected: true, group: group) }
+
+ context 'when ref is branch' do
+ let(:build) { create(:ci_build, ref: 'master', tag: false, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_branch, :developers_can_merge, name: 'master', project: project)
+ end
+
+ it { is_expected.to include(variable) }
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+
+ context 'when ref is tag' do
+ let(:build) { create(:ci_build, ref: 'v1.1.0', tag: true, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_tag, project: project, name: 'v*')
+ end
+
+ it { is_expected.to include(variable) }
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+
+ context 'when ref is merge request' do
+ let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
+ let(:pipeline) { merge_request.merge_request_pipelines.first }
+ let(:build) { create(:ci_build, ref: merge_request.source_branch, tag: false, pipeline: pipeline, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_branch, :developers_can_merge, name: merge_request.source_branch, project: project)
+ end
+
+ it 'does not return protected variables as it is not supported for merge request pipelines' do
+ is_expected.not_to include(variable)
+ end
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+ end
+
+ describe '#secret_project_variables' do
+ subject { build.secret_project_variables }
+
+ let!(:variable) { create(:ci_variable, protected: true, project: project) }
+
+ context 'when ref is branch' do
+ let(:build) { create(:ci_build, ref: 'master', tag: false, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_branch, :developers_can_merge, name: 'master', project: project)
+ end
+
+ it { is_expected.to include(variable) }
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+
+ context 'when ref is tag' do
+ let(:build) { create(:ci_build, ref: 'v1.1.0', tag: true, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_tag, project: project, name: 'v*')
+ end
+
+ it { is_expected.to include(variable) }
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+
+ context 'when ref is merge request' do
+ let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
+ let(:pipeline) { merge_request.merge_request_pipelines.first }
+ let(:build) { create(:ci_build, ref: merge_request.source_branch, tag: false, pipeline: pipeline, project: project) }
+
+ context 'when ref is protected' do
+ before do
+ create(:protected_branch, :developers_can_merge, name: merge_request.source_branch, project: project)
+ end
+
+ it 'does not return protected variables as it is not supported for merge request pipelines' do
+ is_expected.not_to include(variable)
+ end
+ end
+
+ context 'when ref is not protected' do
+ it { is_expected.not_to include(variable) }
+ end
+ end
+ end
+
describe '#scoped_variables_hash' do
context 'when overriding CI variables' do
before do
diff --git a/spec/models/ci/build_trace_chunk_spec.rb b/spec/models/ci/build_trace_chunk_spec.rb
index d214fdf369a..59db347582b 100644
--- a/spec/models/ci/build_trace_chunk_spec.rb
+++ b/spec/models/ci/build_trace_chunk_spec.rb
@@ -171,7 +171,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
shared_examples_for 'Scheduling sidekiq worker to flush data to persist store' do
- context 'when new data fullfilled chunk size' do
+ context 'when new data fulfilled chunk size' do
let(:new_data) { 'a' * described_class::CHUNK_SIZE }
it 'schedules trace chunk flush worker' do
@@ -193,7 +193,7 @@ describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state do
end
shared_examples_for 'Scheduling no sidekiq worker' do
- context 'when new data fullfilled chunk size' do
+ context 'when new data fulfilled chunk size' do
let(:new_data) { 'a' * described_class::CHUNK_SIZE }
it 'does not schedule trace chunk flush worker' do
diff --git a/spec/models/ci/group_variable_spec.rb b/spec/models/ci/group_variable_spec.rb
index 1b10501701c..21d96bf3454 100644
--- a/spec/models/ci/group_variable_spec.rb
+++ b/spec/models/ci/group_variable_spec.rb
@@ -5,6 +5,7 @@ describe Ci::GroupVariable do
it { is_expected.to include_module(HasVariable) }
it { is_expected.to include_module(Presentable) }
+ it { is_expected.to include_module(Maskable) }
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:group_id).with_message(/\(\w+\) has already been taken/) }
describe '.unprotected' do
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index ee400bec04b..d0b42d103a5 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -80,11 +80,11 @@ describe Ci::Pipeline, :mailer do
context 'when merge request pipelines exist' do
let!(:merge_request_pipeline_1) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let!(:merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let(:merge_request) do
@@ -106,11 +106,11 @@ describe Ci::Pipeline, :mailer do
let!(:branch_pipeline_2) { create(:ci_pipeline, source: :push) }
let!(:merge_request_pipeline_1) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let!(:merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let(:merge_request) do
@@ -134,7 +134,7 @@ describe Ci::Pipeline, :mailer do
subject { described_class.detached_merge_request_pipelines(merge_request) }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -157,7 +157,7 @@ describe Ci::Pipeline, :mailer do
subject { pipeline.detached_merge_request_pipeline? }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -176,7 +176,7 @@ describe Ci::Pipeline, :mailer do
subject { described_class.merge_request_pipelines(merge_request) }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -199,7 +199,7 @@ describe Ci::Pipeline, :mailer do
subject { pipeline.merge_request_pipeline? }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -218,7 +218,7 @@ describe Ci::Pipeline, :mailer do
subject { described_class.mergeable_merge_request_pipelines(merge_request) }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -241,7 +241,7 @@ describe Ci::Pipeline, :mailer do
subject { pipeline.mergeable_merge_request_pipeline? }
let!(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request, target_sha: target_sha)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request, target_sha: target_sha)
end
let(:merge_request) { create(:merge_request) }
@@ -256,11 +256,11 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '.merge_request' do
- subject { described_class.merge_request }
+ describe '.merge_request_event' do
+ subject { described_class.merge_request_event }
context 'when there is a merge request pipeline' do
- let!(:pipeline) { create(:ci_pipeline, source: :merge_request, merge_request: merge_request) }
+ let!(:pipeline) { create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request) }
let(:merge_request) { create(:merge_request) }
it 'returns merge request pipeline first' do
@@ -281,7 +281,7 @@ describe Ci::Pipeline, :mailer do
let(:pipeline) { build(:ci_pipeline, source: source, merge_request: merge_request) }
context 'when source is merge request' do
- let(:source) { :merge_request }
+ let(:source) { :merge_request_event }
context 'when merge request is specified' do
let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_project: project, target_branch: 'master') }
@@ -505,7 +505,7 @@ describe Ci::Pipeline, :mailer do
context 'when source is merge request' do
let(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let(:merge_request) do
@@ -513,9 +513,16 @@ describe Ci::Pipeline, :mailer do
source_project: project,
source_branch: 'feature',
target_project: project,
- target_branch: 'master')
+ target_branch: 'master',
+ assignee: assignee,
+ milestone: milestone,
+ labels: labels)
end
+ let(:assignee) { create(:user) }
+ let(:milestone) { create(:milestone, project: project) }
+ let(:labels) { create_list(:label, 2) }
+
it 'exposes merge request pipeline variables' do
expect(subject.to_hash)
.to include(
@@ -531,7 +538,11 @@ describe Ci::Pipeline, :mailer do
'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH' => merge_request.source_project.full_path,
'CI_MERGE_REQUEST_SOURCE_PROJECT_URL' => merge_request.source_project.web_url,
'CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' => merge_request.source_branch.to_s,
- 'CI_MERGE_REQUEST_SOURCE_BRANCH_SHA' => pipeline.source_sha.to_s)
+ 'CI_MERGE_REQUEST_SOURCE_BRANCH_SHA' => pipeline.source_sha.to_s,
+ 'CI_MERGE_REQUEST_TITLE' => merge_request.title,
+ 'CI_MERGE_REQUEST_ASSIGNEES' => assignee.username,
+ 'CI_MERGE_REQUEST_MILESTONE' => milestone.title,
+ 'CI_MERGE_REQUEST_LABELS' => labels.map(&:title).join(','))
end
context 'when source project does not exist' do
@@ -547,6 +558,30 @@ describe Ci::Pipeline, :mailer do
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME])
end
end
+
+ context 'without assignee' do
+ let(:assignee) { nil }
+
+ it 'does not expose assignee variable' do
+ expect(subject.to_hash.keys).not_to include('CI_MERGE_REQUEST_ASSIGNEES')
+ end
+ end
+
+ context 'without milestone' do
+ let(:milestone) { nil }
+
+ it 'does not expose milestone variable' do
+ expect(subject.to_hash.keys).not_to include('CI_MERGE_REQUEST_MILESTONE')
+ end
+ end
+
+ context 'without labels' do
+ let(:labels) { [] }
+
+ it 'does not expose labels variable' do
+ expect(subject.to_hash.keys).not_to include('CI_MERGE_REQUEST_LABELS')
+ end
+ end
end
end
@@ -1097,7 +1132,7 @@ describe Ci::Pipeline, :mailer do
context 'when source is merge request' do
let(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let(:merge_request) do
@@ -1147,7 +1182,7 @@ describe Ci::Pipeline, :mailer do
context 'when ref is merge request' do
let(:pipeline) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
merge_request: merge_request)
end
@@ -1310,7 +1345,7 @@ describe Ci::Pipeline, :mailer do
context 'when source is merge request' do
let(:pipeline) do
- create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
+ create(:ci_pipeline, source: :merge_request_event, merge_request: merge_request)
end
let(:merge_request) do
@@ -2217,7 +2252,7 @@ describe Ci::Pipeline, :mailer do
end
end
- describe "#merge_requests" do
+ describe "#merge_requests_as_head_pipeline" do
let(:project) { create(:project) }
let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: 'a288a022a53a5a944fae87bcec6efc87b7061808') }
@@ -2225,20 +2260,20 @@ describe Ci::Pipeline, :mailer do
allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { 'a288a022a53a5a944fae87bcec6efc87b7061808' }
merge_request = create(:merge_request, source_project: project, head_pipeline: pipeline, source_branch: pipeline.ref)
- expect(pipeline.merge_requests).to eq([merge_request])
+ expect(pipeline.merge_requests_as_head_pipeline).to eq([merge_request])
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')
- expect(pipeline.merge_requests).to be_empty
+ expect(pipeline.merge_requests_as_head_pipeline).to be_empty
end
it "doesn't return merge requests whose `diff_head_sha` doesn't match the pipeline's SHA" do
create(:merge_request, source_project: project, source_branch: pipeline.ref)
allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { '97de212e80737a608d939f648d959671fb0a0142b' }
- expect(pipeline.merge_requests).to be_empty
+ expect(pipeline.merge_requests_as_head_pipeline).to be_empty
end
end
@@ -2266,7 +2301,7 @@ describe Ci::Pipeline, :mailer do
let!(:pipeline) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: pipeline_project,
ref: source_branch,
merge_request: merge_request)
@@ -2289,7 +2324,7 @@ describe Ci::Pipeline, :mailer do
let!(:pipeline_2) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: pipeline_project,
ref: source_branch,
merge_request: merge_request_2)
diff --git a/spec/models/ci/variable_spec.rb b/spec/models/ci/variable_spec.rb
index 875e8b2b682..02c07a2bd83 100644
--- a/spec/models/ci/variable_spec.rb
+++ b/spec/models/ci/variable_spec.rb
@@ -6,6 +6,7 @@ describe Ci::Variable do
describe 'validations' do
it { is_expected.to include_module(HasVariable) }
it { is_expected.to include_module(Presentable) }
+ it { is_expected.to include_module(Maskable) }
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:project_id, :environment_scope).with_message(/\(\w+\) has already been taken/) }
end
diff --git a/spec/models/clusters/applications/jupyter_spec.rb b/spec/models/clusters/applications/jupyter_spec.rb
index 2c22c24c498..6e58f3ad699 100644
--- a/spec/models/clusters/applications/jupyter_spec.rb
+++ b/spec/models/clusters/applications/jupyter_spec.rb
@@ -39,7 +39,7 @@ describe Clusters::Applications::Jupyter do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('jupyter')
expect(subject.chart).to eq('jupyter/jupyterhub')
- expect(subject.version).to eq('v0.6')
+ expect(subject.version).to eq('0.9-174bbd5')
expect(subject).to be_rbac
expect(subject.repository).to eq('https://jupyterhub.github.io/helm-chart/')
expect(subject.files).to eq(jupyter.files)
@@ -57,7 +57,7 @@ describe Clusters::Applications::Jupyter do
let(:jupyter) { create(:clusters_applications_jupyter, :errored, version: '0.0.1') }
it 'should be initialized with the locked version' do
- expect(subject.version).to eq('v0.6')
+ expect(subject.version).to eq('0.9-174bbd5')
end
end
end
@@ -77,6 +77,7 @@ describe Clusters::Applications::Jupyter do
expect(values).to include('singleuser')
expect(values).to match(/clientId: '?#{application.oauth_application.uid}/)
expect(values).to match(/callbackUrl: '?#{application.callback_url}/)
+ expect(values).to include("gitlabProjectIdWhitelist:\n - #{application.cluster.project.id}")
end
context 'when cluster belongs to a project' do
diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb
index 006b922ab27..4884a5927fb 100644
--- a/spec/models/clusters/applications/knative_spec.rb
+++ b/spec/models/clusters/applications/knative_spec.rb
@@ -66,9 +66,7 @@ describe Clusters::Applications::Knative do
end
end
- describe '#install_command' do
- subject { knative.install_command }
-
+ shared_examples 'a command' do
it 'should be an instance of Helm::InstallCommand' do
expect(subject).to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand)
end
@@ -76,7 +74,6 @@ describe Clusters::Applications::Knative do
it 'should be initialized with knative arguments' do
expect(subject.name).to eq('knative')
expect(subject.chart).to eq('knative/knative')
- expect(subject.version).to eq('0.2.2')
expect(subject.files).to eq(knative.files)
end
@@ -98,6 +95,27 @@ describe Clusters::Applications::Knative do
end
end
+ describe '#install_command' do
+ subject { knative.install_command }
+
+ it 'should be initialized with latest version' do
+ expect(subject.version).to eq('0.2.2')
+ end
+
+ it_behaves_like 'a command'
+ end
+
+ describe '#update_command' do
+ let!(:current_installed_version) { knative.version = '0.1.0' }
+ subject { knative.update_command }
+
+ it 'should be initialized with current version' do
+ expect(subject.version).to eq(current_installed_version)
+ end
+
+ it_behaves_like 'a command'
+ end
+
describe '#files' do
let(:application) { knative }
let(:values) { subject[:'values.yaml'] }
diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb
index 4068d98d8f7..3b32ca8df05 100644
--- a/spec/models/clusters/platforms/kubernetes_spec.rb
+++ b/spec/models/clusters/platforms/kubernetes_spec.rb
@@ -98,6 +98,22 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { expect(kubernetes.save).to be_truthy }
end
+
+ context 'when api_url is localhost' do
+ let(:api_url) { 'http://localhost:22' }
+
+ it { expect(kubernetes.save).to be_falsey }
+
+ context 'Application settings allows local requests' do
+ before do
+ allow(ApplicationSetting)
+ .to receive(:current)
+ .and_return(ApplicationSetting.build_from_defaults(allow_local_requests_from_hooks_and_services: true))
+ end
+
+ it { expect(kubernetes.save).to be_truthy }
+ end
+ end
end
context 'when validates token' do
diff --git a/spec/models/concerns/has_ref_spec.rb b/spec/models/concerns/has_ref_spec.rb
index 8aed72d77a4..8aa2fecb18c 100644
--- a/spec/models/concerns/has_ref_spec.rb
+++ b/spec/models/concerns/has_ref_spec.rb
@@ -16,6 +16,16 @@ describe HasRef do
it 'return true when tag is set to false' do
is_expected.to be_truthy
end
+
+ context 'when it was triggered by merge request' do
+ let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
+ let(:pipeline) { merge_request.merge_request_pipelines.first }
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+
+ it 'returns false' do
+ is_expected.to be_falsy
+ end
+ end
end
context 'is not a tag' do
@@ -55,5 +65,15 @@ describe HasRef do
is_expected.to start_with(Gitlab::Git::BRANCH_REF_PREFIX)
end
end
+
+ context 'when it is triggered by a merge request' do
+ let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
+ let(:pipeline) { merge_request.merge_request_pipelines.first }
+ let(:build) { create(:ci_build, tag: false, pipeline: pipeline) }
+
+ it 'returns nil' do
+ is_expected.to be_nil
+ end
+ end
end
end
diff --git a/spec/models/concerns/has_variable_spec.rb b/spec/models/concerns/has_variable_spec.rb
index 3fbe86c5b56..bff96e12ffa 100644
--- a/spec/models/concerns/has_variable_spec.rb
+++ b/spec/models/concerns/has_variable_spec.rb
@@ -57,7 +57,7 @@ describe HasVariable do
describe '#to_runner_variable' do
it 'returns a hash for the runner' do
expect(subject.to_runner_variable)
- .to eq(key: subject.key, value: subject.value, public: false)
+ .to include(key: subject.key, value: subject.value, public: false)
end
end
end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 41159348e04..72c6161424b 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -32,17 +32,56 @@ describe Issuable do
end
describe "Validation" do
- subject { build(:issue) }
+ context 'general validations' do
+ subject { build(:issue) }
- before do
- allow(InternalId).to receive(:generate_next).and_return(nil)
+ before do
+ allow(InternalId).to receive(:generate_next).and_return(nil)
+ end
+
+ it { is_expected.to validate_presence_of(:project) }
+ it { is_expected.to validate_presence_of(:iid) }
+ it { is_expected.to validate_presence_of(:author) }
+ it { is_expected.to validate_presence_of(:title) }
+ it { is_expected.to validate_length_of(:title).is_at_most(255) }
end
- it { is_expected.to validate_presence_of(:project) }
- it { is_expected.to validate_presence_of(:iid) }
- it { is_expected.to validate_presence_of(:author) }
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to validate_length_of(:title).is_at_most(255) }
+ describe 'milestone' do
+ let(:project) { create(:project) }
+ let(:milestone_id) { create(:milestone, project: project).id }
+ let(:params) do
+ {
+ title: 'something',
+ project: project,
+ author: build(:user),
+ milestone_id: milestone_id
+ }
+ end
+
+ subject { issuable_class.new(params) }
+
+ context 'with correct params' do
+ it { is_expected.to be_valid }
+ end
+
+ context 'with empty string milestone' do
+ let(:milestone_id) { '' }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'with nil milestone id' do
+ let(:milestone_id) { nil }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'with a milestone id from another project' do
+ let(:milestone_id) { create(:milestone).id }
+
+ it { is_expected.to be_invalid }
+ end
+ end
end
describe "Scope" do
@@ -66,6 +105,48 @@ describe Issuable do
end
end
+ describe '#milestone_available?' do
+ let(:group) { create(:group) }
+ let(:project) { create(:project, group: group) }
+ let(:issue) { create(:issue, project: project) }
+
+ def build_issuable(milestone_id)
+ issuable_class.new(project: project, milestone_id: milestone_id)
+ end
+
+ it 'returns true with a milestone from the issue project' do
+ milestone = create(:milestone, project: project)
+
+ expect(build_issuable(milestone.id).milestone_available?).to be_truthy
+ end
+
+ it 'returns true with a milestone from the issue project group' do
+ milestone = create(:milestone, group: group)
+
+ expect(build_issuable(milestone.id).milestone_available?).to be_truthy
+ end
+
+ it 'returns true with a milestone from the the parent of the issue project group', :nested_groups do
+ parent = create(:group)
+ group.update(parent: parent)
+ milestone = create(:milestone, group: parent)
+
+ expect(build_issuable(milestone.id).milestone_available?).to be_truthy
+ end
+
+ it 'returns false with a milestone from another project' do
+ milestone = create(:milestone)
+
+ expect(build_issuable(milestone.id).milestone_available?).to be_falsey
+ end
+
+ it 'returns false with a milestone from another group' do
+ milestone = create(:milestone, group: create(:group))
+
+ expect(build_issuable(milestone.id).milestone_available?).to be_falsey
+ end
+ end
+
describe ".search" do
let!(:searchable_issue) { create(:issue, title: "Searchable awesome issue") }
let!(:searchable_issue2) { create(:issue, title: 'Aw') }
diff --git a/spec/models/concerns/maskable_spec.rb b/spec/models/concerns/maskable_spec.rb
new file mode 100644
index 00000000000..aeba7ad862f
--- /dev/null
+++ b/spec/models/concerns/maskable_spec.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Maskable do
+ let(:variable) { build(:ci_variable) }
+
+ describe 'masked value validations' do
+ subject { variable }
+
+ context 'when variable is masked' do
+ before do
+ subject.masked = true
+ end
+
+ it { is_expected.not_to allow_value('hello').for(:value) }
+ it { is_expected.not_to allow_value('hello world').for(:value) }
+ it { is_expected.not_to allow_value('hello$VARIABLEworld').for(:value) }
+ it { is_expected.not_to allow_value('hello\rworld').for(:value) }
+ it { is_expected.to allow_value('helloworld').for(:value) }
+ end
+
+ context 'when variable is not masked' do
+ before do
+ subject.masked = false
+ end
+
+ it { is_expected.to allow_value('hello').for(:value) }
+ it { is_expected.to allow_value('hello world').for(:value) }
+ it { is_expected.to allow_value('hello$VARIABLEworld').for(:value) }
+ it { is_expected.to allow_value('hello\rworld').for(:value) }
+ it { is_expected.to allow_value('helloworld').for(:value) }
+ end
+ end
+
+ describe 'REGEX' do
+ subject { Maskable::REGEX }
+
+ it 'does not match strings shorter than 8 letters' do
+ expect(subject.match?('hello')).to eq(false)
+ end
+
+ it 'does not match strings with spaces' do
+ expect(subject.match?('hello world')).to eq(false)
+ end
+
+ it 'does not match strings with shell variables' do
+ expect(subject.match?('hello$VARIABLEworld')).to eq(false)
+ end
+
+ it 'does not match strings with escape characters' do
+ expect(subject.match?('hello\rworld')).to eq(false)
+ end
+
+ it 'does not match strings that span more than one line' do
+ string = <<~EOS
+ hello
+ world
+ EOS
+
+ expect(subject.match?(string)).to eq(false)
+ end
+
+ it 'matches valid strings' do
+ expect(subject.match?('helloworld')).to eq(true)
+ end
+ end
+
+ describe '#to_runner_variable' do
+ subject { variable.to_runner_variable }
+
+ it 'exposes the masked attribute' do
+ expect(subject).to include(:masked)
+ end
+ end
+end
diff --git a/spec/models/concerns/milestoneish_spec.rb b/spec/models/concerns/milestoneish_spec.rb
index 87bf731340f..81ca5b638fe 100644
--- a/spec/models/concerns/milestoneish_spec.rb
+++ b/spec/models/concerns/milestoneish_spec.rb
@@ -9,8 +9,10 @@ describe Milestone, 'Milestoneish' do
let(:admin) { create(:admin) }
let(:project) { create(:project, :public) }
let(:milestone) { create(:milestone, project: project) }
- let!(:issue) { create(:issue, project: project, milestone: milestone) }
- let!(:security_issue_1) { create(:issue, :confidential, project: project, author: author, milestone: milestone) }
+ let(:label1) { create(:label, project: project) }
+ let(:label2) { create(:label, project: project) }
+ let!(:issue) { create(:issue, project: project, milestone: milestone, assignees: [member], labels: [label1]) }
+ let!(:security_issue_1) { create(:issue, :confidential, project: project, author: author, milestone: milestone, labels: [label2]) }
let!(:security_issue_2) { create(:issue, :confidential, project: project, assignees: [assignee], milestone: milestone) }
let!(:closed_issue_1) { create(:issue, :closed, project: project, milestone: milestone) }
let!(:closed_issue_2) { create(:issue, :closed, project: project, milestone: milestone) }
@@ -42,13 +44,102 @@ describe Milestone, 'Milestoneish' do
end
end
+ context 'attributes visibility' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:users) do
+ {
+ anonymous: nil,
+ non_member: non_member,
+ guest: guest,
+ member: member,
+ assignee: assignee
+ }
+ end
+
+ let(:project_visibility_levels) do
+ {
+ public: Gitlab::VisibilityLevel::PUBLIC,
+ internal: Gitlab::VisibilityLevel::INTERNAL,
+ private: Gitlab::VisibilityLevel::PRIVATE
+ }
+ end
+
+ describe '#issue_participants_visible_by_user' do
+ where(:visibility, :user_role, :result) do
+ :public | nil | [:member]
+ :public | :non_member | [:member]
+ :public | :guest | [:member]
+ :public | :member | [:member, :assignee]
+ :internal | nil | []
+ :internal | :non_member | [:member]
+ :internal | :guest | [:member]
+ :internal | :member | [:member, :assignee]
+ :private | nil | []
+ :private | :non_member | []
+ :private | :guest | [:member]
+ :private | :member | [:member, :assignee]
+ end
+
+ with_them do
+ before do
+ project.update(visibility_level: project_visibility_levels[visibility])
+ end
+
+ it 'returns the proper participants' do
+ user = users[user_role]
+ participants = result.map { |role| users[role] }
+
+ expect(milestone.issue_participants_visible_by_user(user)).to match_array(participants)
+ end
+ end
+ end
+
+ describe '#issue_labels_visible_by_user' do
+ let(:labels) do
+ {
+ label1: label1,
+ label2: label2
+ }
+ end
+
+ where(:visibility, :user_role, :result) do
+ :public | nil | [:label1]
+ :public | :non_member | [:label1]
+ :public | :guest | [:label1]
+ :public | :member | [:label1, :label2]
+ :internal | nil | []
+ :internal | :non_member | [:label1]
+ :internal | :guest | [:label1]
+ :internal | :member | [:label1, :label2]
+ :private | nil | []
+ :private | :non_member | []
+ :private | :guest | [:label1]
+ :private | :member | [:label1, :label2]
+ end
+
+ with_them do
+ before do
+ project.update(visibility_level: project_visibility_levels[visibility])
+ end
+
+ it 'returns the proper participants' do
+ user = users[user_role]
+ expected_labels = result.map { |label| labels[label] }
+
+ expect(milestone.issue_labels_visible_by_user(user)).to match_array(expected_labels)
+ end
+ end
+ end
+ end
+
describe '#sorted_merge_requests' do
it 'sorts merge requests by label priority' do
merge_request_1 = create(:labeled_merge_request, labels: [label_2], source_project: project, source_branch: 'branch_1', milestone: milestone)
merge_request_2 = create(:labeled_merge_request, labels: [label_1], source_project: project, source_branch: 'branch_2', milestone: milestone)
merge_request_3 = create(:labeled_merge_request, labels: [label_3], source_project: project, source_branch: 'branch_3', milestone: milestone)
- merge_requests = milestone.sorted_merge_requests
+ merge_requests = milestone.sorted_merge_requests(member)
expect(merge_requests.first).to eq(merge_request_2)
expect(merge_requests.second).to eq(merge_request_1)
@@ -56,6 +147,51 @@ describe Milestone, 'Milestoneish' do
end
end
+ describe '#merge_requests_visible_to_user' do
+ let(:merge_request) { create(:merge_request, source_project: project, milestone: milestone) }
+
+ context 'when project is private' do
+ before do
+ project.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ it 'does not return any merge request for a non member' do
+ merge_requests = milestone.merge_requests_visible_to_user(non_member)
+ expect(merge_requests).to be_empty
+ end
+
+ it 'returns milestone merge requests for a member' do
+ merge_requests = milestone.merge_requests_visible_to_user(member)
+ expect(merge_requests).to contain_exactly(merge_request)
+ end
+ end
+
+ context 'when project is public' do
+ context 'when merge requests are available to anyone' do
+ it 'returns milestone merge requests for a non member' do
+ merge_requests = milestone.merge_requests_visible_to_user(non_member)
+ expect(merge_requests).to contain_exactly(merge_request)
+ end
+ end
+
+ context 'when merge requests are available to project members' do
+ before do
+ project.project_feature.update(merge_requests_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'does not return any merge request for a non member' do
+ merge_requests = milestone.merge_requests_visible_to_user(non_member)
+ expect(merge_requests).to be_empty
+ end
+
+ it 'returns milestone merge requests for a member' do
+ merge_requests = milestone.merge_requests_visible_to_user(member)
+ expect(merge_requests).to contain_exactly(merge_request)
+ end
+ end
+ end
+ end
+
describe '#closed_items_count' do
it 'does not count confidential issues for non project members' do
expect(milestone.closed_items_count(non_member)).to eq 2
diff --git a/spec/models/concerns/sortable_spec.rb b/spec/models/concerns/sortable_spec.rb
index 39c16ae60af..0a9d2021a19 100644
--- a/spec/models/concerns/sortable_spec.rb
+++ b/spec/models/concerns/sortable_spec.rb
@@ -99,7 +99,7 @@ describe Sortable do
expect(ordered_group_names('id_desc')).to eq(%w(bbb BB AAA aa))
end
- it 'sorts groups by name via case-insentitive comparision' do
+ it 'sorts groups by name via case-insensitive comparision' do
expect(ordered_group_names('name_asc')).to eq(%w(aa AAA BB bbb))
expect(ordered_group_names('name_desc')).to eq(%w(bbb BB AAA aa))
end
diff --git a/spec/models/concerns/token_authenticatable_strategies/base_spec.rb b/spec/models/concerns/token_authenticatable_strategies/base_spec.rb
index 6605f1f5a5f..2a0182b4294 100644
--- a/spec/models/concerns/token_authenticatable_strategies/base_spec.rb
+++ b/spec/models/concerns/token_authenticatable_strategies/base_spec.rb
@@ -15,7 +15,7 @@ describe TokenAuthenticatableStrategies::Base do
context 'when encrypted strategy is specified' do
it 'fabricates encrypted strategy object' do
- strategy = described_class.fabricate(instance, field, encrypted: true)
+ strategy = described_class.fabricate(instance, field, encrypted: :required)
expect(strategy).to be_a TokenAuthenticatableStrategies::Encrypted
end
@@ -23,7 +23,7 @@ describe TokenAuthenticatableStrategies::Base do
context 'when no strategy is specified' do
it 'fabricates insecure strategy object' do
- strategy = described_class.fabricate(instance, field, something: true)
+ strategy = described_class.fabricate(instance, field, something: :required)
expect(strategy).to be_a TokenAuthenticatableStrategies::Insecure
end
@@ -31,35 +31,9 @@ describe TokenAuthenticatableStrategies::Base do
context 'when incompatible options are provided' do
it 'raises an error' do
- expect { described_class.fabricate(instance, field, digest: true, encrypted: true) }
+ expect { described_class.fabricate(instance, field, digest: true, encrypted: :required) }
.to raise_error ArgumentError
end
end
end
-
- describe '#fallback?' do
- context 'when fallback is set' do
- it 'recognizes fallback setting' do
- strategy = described_class.new(instance, field, fallback: true)
-
- expect(strategy.fallback?).to be true
- end
- end
-
- context 'when fallback is not a valid value' do
- it 'raises an error' do
- strategy = described_class.new(instance, field, fallback: 'something')
-
- expect { strategy.fallback? }.to raise_error ArgumentError
- end
- end
-
- context 'when fallback is not set' do
- it 'raises an error' do
- strategy = described_class.new(instance, field, {})
-
- expect(strategy.fallback?).to eq false
- end
- end
- end
end
diff --git a/spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb b/spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb
index 93cab80cb1f..ca38f86c5ab 100644
--- a/spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb
+++ b/spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb
@@ -12,19 +12,9 @@ describe TokenAuthenticatableStrategies::Encrypted do
described_class.new(model, 'some_field', options)
end
- describe '.new' do
- context 'when fallback and migration strategies are set' do
- let(:options) { { fallback: true, migrating: true } }
-
- it 'raises an error' do
- expect { subject }.to raise_error ArgumentError, /not compatible/
- end
- end
- end
-
describe '#find_token_authenticatable' do
- context 'when using fallback strategy' do
- let(:options) { { fallback: true } }
+ context 'when using optional strategy' do
+ let(:options) { { encrypted: :optional } }
it 'finds the encrypted resource by cleartext' do
allow(model).to receive(:find_by)
@@ -50,7 +40,7 @@ describe TokenAuthenticatableStrategies::Encrypted do
end
context 'when using migration strategy' do
- let(:options) { { migrating: true } }
+ let(:options) { { encrypted: :migrating } }
it 'finds the cleartext resource by cleartext' do
allow(model).to receive(:find_by)
@@ -73,8 +63,8 @@ describe TokenAuthenticatableStrategies::Encrypted do
end
describe '#get_token' do
- context 'when using fallback strategy' do
- let(:options) { { fallback: true } }
+ context 'when using optional strategy' do
+ let(:options) { { encrypted: :optional } }
it 'returns decrypted token when an encrypted token is present' do
allow(instance).to receive(:read_attribute)
@@ -98,7 +88,7 @@ describe TokenAuthenticatableStrategies::Encrypted do
end
context 'when using migration strategy' do
- let(:options) { { migrating: true } }
+ let(:options) { { encrypted: :migrating } }
it 'returns cleartext token when an encrypted token is present' do
allow(instance).to receive(:read_attribute)
@@ -127,8 +117,8 @@ describe TokenAuthenticatableStrategies::Encrypted do
end
describe '#set_token' do
- context 'when using fallback strategy' do
- let(:options) { { fallback: true } }
+ context 'when using optional strategy' do
+ let(:options) { { encrypted: :optional } }
it 'writes encrypted token and removes plaintext token and returns it' do
expect(instance).to receive(:[]=)
@@ -141,7 +131,7 @@ describe TokenAuthenticatableStrategies::Encrypted do
end
context 'when using migration strategy' do
- let(:options) { { migrating: true } }
+ let(:options) { { encrypted: :migrating } }
it 'writes encrypted token and writes plaintext token' do
expect(instance).to receive(:[]=)
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 076ccc96041..cbde13a2c7a 100644
--- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb
+++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
@@ -62,11 +62,32 @@ describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'URL path' do
- it 'fails validation with wrong path' do
+ it 'fails validation without api/0/projects' do
subject.api_url = 'http://gitlab.com/project1/something'
expect(subject).not_to be_valid
- expect(subject.errors.messages[:api_url]).to include('path needs to start with /api/0/projects')
+ expect(subject.errors.messages[:api_url]).to include('is invalid')
+ end
+
+ it 'fails validation without org and project slugs' do
+ subject.api_url = 'http://gitlab.com/api/0/projects/'
+
+ expect(subject).not_to be_valid
+ expect(subject.errors.messages[:project]).to include('is a required field')
+ end
+
+ it 'fails validation when api_url has extra parts' do
+ subject.api_url = 'http://gitlab.com/api/0/projects/org/proj/something'
+
+ expect(subject).not_to be_valid
+ expect(subject.errors.messages[:api_url]).to include("is invalid")
+ end
+
+ it 'fails validation when api_url has less parts' do
+ subject.api_url = 'http://gitlab.com/api/0/projects/org'
+
+ expect(subject).not_to be_valid
+ expect(subject.errors.messages[:api_url]).to include("is invalid")
end
it 'passes validation with correct path' do
@@ -275,6 +296,16 @@ describe ErrorTracking::ProjectErrorTrackingSetting do
expect(api_url).to eq(':::')
end
+
+ it 'returns nil when api_host is blank' do
+ api_url = described_class.build_api_url_from(
+ api_host: '',
+ organization_slug: 'org-slug',
+ project_slug: 'proj-slug'
+ )
+
+ expect(api_url).to be_nil
+ end
end
describe '#api_host' do
diff --git a/spec/models/issue/metrics_spec.rb b/spec/models/issue/metrics_spec.rb
index 1bf0ecb98ad..b7291eebe64 100644
--- a/spec/models/issue/metrics_spec.rb
+++ b/spec/models/issue/metrics_spec.rb
@@ -9,7 +9,7 @@ describe Issue::Metrics do
context "milestones" do
it "records the first time an issue is associated with a milestone" do
time = Time.now
- Timecop.freeze(time) { subject.update(milestone: create(:milestone)) }
+ Timecop.freeze(time) { subject.update(milestone: create(:milestone, project: project)) }
metrics = subject.metrics
expect(metrics).to be_present
@@ -18,9 +18,9 @@ describe Issue::Metrics do
it "does not record the second time an issue is associated with a milestone" do
time = Time.now
- Timecop.freeze(time) { subject.update(milestone: create(:milestone)) }
+ Timecop.freeze(time) { subject.update(milestone: create(:milestone, project: project)) }
Timecop.freeze(time + 2.hours) { subject.update(milestone: nil) }
- Timecop.freeze(time + 6.hours) { subject.update(milestone: create(:milestone)) }
+ Timecop.freeze(time + 6.hours) { subject.update(milestone: create(:milestone, project: project)) }
metrics = subject.metrics
expect(metrics).to be_present
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index 1849d3bac12..e530e0302f5 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -3,6 +3,18 @@ require 'spec_helper'
describe MergeRequestDiff do
let(:diff_with_commits) { create(:merge_request).merge_request_diff }
+ describe 'validations' do
+ subject { diff_with_commits }
+
+ it 'checks sha format of base_commit_sha, head_commit_sha and start_commit_sha' do
+ subject.base_commit_sha = subject.head_commit_sha = subject.start_commit_sha = 'foobar'
+
+ expect(subject.valid?).to be false
+ expect(subject.errors.count).to eq 3
+ expect(subject.errors).to all(include('is not a valid SHA'))
+ end
+ end
+
describe 'create new record' do
subject { diff_with_commits }
@@ -78,7 +90,7 @@ describe MergeRequestDiff do
it 'returns persisted diffs if cannot compare with diff refs' do
expect(diff).to receive(:load_diffs).and_call_original
- diff.update!(head_commit_sha: 'invalid-sha')
+ diff.update!(head_commit_sha: Digest::SHA1.hexdigest(SecureRandom.hex))
diff.diffs.diff_files
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 82a853a23b9..07cb4c9c1e3 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -1333,7 +1333,7 @@ describe MergeRequest do
let!(:merge_request_pipeline) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: project,
ref: source_ref,
sha: shas.second,
@@ -1372,7 +1372,7 @@ describe MergeRequest do
let!(:merge_request_pipeline_2) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: project,
ref: source_ref,
sha: shas.first,
@@ -1399,7 +1399,7 @@ describe MergeRequest do
let!(:merge_request_pipeline_2) do
create(:ci_pipeline,
- source: :merge_request,
+ source: :merge_request_event,
project: project,
ref: source_ref,
sha: shas.first,
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index af7e3d3a6c9..77b7042424c 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -182,7 +182,7 @@ describe Milestone do
describe '#total_items_count' do
before do
create :closed_issue, milestone: milestone, project: project
- create :merge_request, milestone: milestone
+ create :merge_request, milestone: milestone, source_project: project
end
it 'returns total count of issues and merge requests assigned to milestone' do
@@ -192,10 +192,10 @@ describe Milestone do
describe '#can_be_closed?' do
before do
- milestone = create :milestone
- create :closed_issue, milestone: milestone
+ milestone = create :milestone, project: project
+ create :closed_issue, milestone: milestone, project: project
- create :issue
+ create :issue, project: project
end
it 'returns true if milestone active and all nested issues closed' do
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index 788b3179b01..5428fcb1271 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -177,9 +177,10 @@ describe JiraService do
expect(WebMock).to have_requested(:post, @remote_link_url).with(
body: hash_including(
GlobalID: 'GitLab',
+ relationship: 'mentioned on',
object: {
url: "#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{commit_id}",
- title: "GitLab: Solved by commit #{commit_id}.",
+ title: "Solved by commit #{commit_id}.",
icon: { title: 'GitLab', url16x16: favicon_path },
status: { resolved: true }
}
diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb
index b6cf4c72450..e9c7c94ad70 100644
--- a/spec/models/project_services/prometheus_service_spec.rb
+++ b/spec/models/project_services/prometheus_service_spec.rb
@@ -33,18 +33,38 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
describe 'Validations' do
context 'when manual_configuration is enabled' do
before do
- subject.manual_configuration = true
+ service.manual_configuration = true
end
- it { is_expected.to validate_presence_of(:api_url) }
+ it 'validates presence of api_url' do
+ expect(service).to validate_presence_of(:api_url)
+ end
end
context 'when manual configuration is disabled' do
before do
- subject.manual_configuration = false
+ service.manual_configuration = false
end
- it { is_expected.not_to validate_presence_of(:api_url) }
+ it 'does not validate presence of api_url' do
+ expect(service).not_to validate_presence_of(:api_url)
+ end
+ end
+
+ context 'when the api_url domain points to localhost or local network' do
+ let(:domain) { Addressable::URI.parse(service.api_url).hostname }
+
+ it 'cannot query' do
+ expect(service.can_query?).to be true
+
+ aggregate_failures do
+ ['127.0.0.1', '192.168.2.3'].each do |url|
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
+
+ expect(service.can_query?).to be false
+ end
+ end
+ end
end
end
@@ -74,30 +94,35 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do
end
describe '#prometheus_client' do
+ let(:api_url) { 'http://some_url' }
+
+ before do
+ service.active = true
+ service.api_url = api_url
+ service.manual_configuration = manual_configuration
+ end
+
context 'manual configuration is enabled' do
- let(:api_url) { 'http://some_url' }
+ let(:manual_configuration) { true }
- before do
- subject.active = true
- subject.manual_configuration = true
- subject.api_url = api_url
+ it 'returns rest client from api_url' do
+ expect(service.prometheus_client.url).to eq(api_url)
end
- it 'returns rest client from api_url' do
- expect(subject.prometheus_client.url).to eq(api_url)
+ it 'calls valid?' do
+ allow(service).to receive(:valid?).and_call_original
+
+ expect(service.prometheus_client).not_to be_nil
+
+ expect(service).to have_received(:valid?)
end
end
context 'manual configuration is disabled' do
- let(:api_url) { 'http://some_url' }
-
- before do
- subject.manual_configuration = false
- subject.api_url = api_url
- end
+ let(:manual_configuration) { false }
it 'no client provided' do
- expect(subject.prometheus_client).to be_nil
+ expect(service.prometheus_client).to be_nil
end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 9fb0d04ca9e..b2392f9521f 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -3430,28 +3430,42 @@ describe Project do
project.migrate_to_hashed_storage!
end
- it 'schedules ProjectMigrateHashedStorageWorker with delayed start when the project repo is in use' do
+ it 'schedules HashedStorage::ProjectMigrateWorker with delayed start when the project repo is in use' do
Gitlab::ReferenceCounter.new(project.gl_repository(is_wiki: false)).increase
- expect(ProjectMigrateHashedStorageWorker).to receive(:perform_in)
+ expect(HashedStorage::ProjectMigrateWorker).to receive(:perform_in)
project.migrate_to_hashed_storage!
end
- it 'schedules ProjectMigrateHashedStorageWorker with delayed start when the wiki repo is in use' do
+ it 'schedules HashedStorage::ProjectMigrateWorker with delayed start when the wiki repo is in use' do
Gitlab::ReferenceCounter.new(project.gl_repository(is_wiki: true)).increase
- expect(ProjectMigrateHashedStorageWorker).to receive(:perform_in)
+ expect(HashedStorage::ProjectMigrateWorker).to receive(:perform_in)
project.migrate_to_hashed_storage!
end
- it 'schedules ProjectMigrateHashedStorageWorker' do
- expect(ProjectMigrateHashedStorageWorker).to receive(:perform_async).with(project.id)
+ it 'schedules HashedStorage::ProjectMigrateWorker' do
+ expect(HashedStorage::ProjectMigrateWorker).to receive(:perform_async).with(project.id)
project.migrate_to_hashed_storage!
end
end
+
+ describe '#rollback_to_legacy_storage!' do
+ let(:project) { create(:project, :empty_repo, :legacy_storage) }
+
+ it 'returns nil' do
+ expect(project.rollback_to_legacy_storage!).to be_nil
+ end
+
+ it 'does not run validations' do
+ expect(project).not_to receive(:valid?)
+
+ project.rollback_to_legacy_storage!
+ end
+ end
end
context 'hashed storage' do
@@ -3527,11 +3541,35 @@ describe Project do
project = create(:project, storage_version: 1, skip_disk_validation: true)
Sidekiq::Testing.fake! do
- expect { project.migrate_to_hashed_storage! }.to change(ProjectMigrateHashedStorageWorker.jobs, :size).by(1)
+ expect { project.migrate_to_hashed_storage! }.to change(HashedStorage::ProjectMigrateWorker.jobs, :size).by(1)
end
end
end
end
+
+ describe '#rollback_to_legacy_storage!' do
+ let(:project) { create(:project, :repository, skip_disk_validation: true) }
+
+ it 'returns true' do
+ expect(project.rollback_to_legacy_storage!).to be_truthy
+ end
+
+ it 'does not run validations' do
+ expect(project).not_to receive(:valid?)
+
+ project.rollback_to_legacy_storage!
+ end
+
+ it 'does not flag as read-only' do
+ expect { project.rollback_to_legacy_storage! }.not_to change { project.repository_read_only }
+ end
+
+ it 'enqueues a job' do
+ Sidekiq::Testing.fake! do
+ expect { project.rollback_to_legacy_storage! }.to change(HashedStorage::ProjectRollbackWorker.jobs, :size).by(1)
+ end
+ end
+ end
end
describe '#gl_repository' do
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
index 4c677200ae2..dafe7646366 100644
--- a/spec/models/protected_branch_spec.rb
+++ b/spec/models/protected_branch_spec.rb
@@ -190,4 +190,32 @@ describe ProtectedBranch do
end
end
end
+
+ describe '#any_protected?' do
+ context 'existing project' do
+ let(:project) { create(:project, :repository) }
+
+ it 'returns true when any of the branch names match a protected branch via direct match' do
+ create(:protected_branch, project: project, name: 'foo')
+
+ expect(described_class.any_protected?(project, ['foo', 'production/some-branch'])).to eq(true)
+ end
+
+ it 'returns true when any of the branch matches a protected branch via wildcard match' do
+ create(:protected_branch, project: project, name: 'production/*')
+
+ expect(described_class.any_protected?(project, ['foo', 'production/some-branch'])).to eq(true)
+ end
+
+ it 'returns false when none of branches does not match a protected branch via direct match' do
+ expect(described_class.any_protected?(project, ['foo'])).to eq(false)
+ end
+
+ it 'returns false when none of the branches does not match a protected branch via wildcard match' do
+ create(:protected_branch, project: project, name: 'production/*')
+
+ expect(described_class.any_protected?(project, ['staging/some-branch'])).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 17201d8b90a..70630467d24 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2237,7 +2237,7 @@ describe Repository do
rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
end
- describe '#ancestor?' do
+ shared_examples '#ancestor?' do
let(:commit) { repository.commit }
let(:ancestor) { commit.parents.first }
@@ -2261,6 +2261,20 @@ describe Repository do
end
end
+ describe '#ancestor? with Gitaly enabled' do
+ it_behaves_like "#ancestor?"
+ end
+
+ describe '#ancestor? with Rugged enabled', :enable_rugged do
+ it 'calls out to the Rugged implementation' do
+ allow_any_instance_of(Rugged).to receive(:merge_base).with(repository.commit.id, Gitlab::Git::BLANK_SHA).and_call_original
+
+ repository.ancestor?(repository.commit.id, Gitlab::Git::BLANK_SHA)
+ end
+
+ it_behaves_like '#ancestor?'
+ end
+
describe '#archive_metadata' do
let(:ref) { 'master' }
let(:storage_path) { '/tmp' }
diff --git a/spec/policies/commit_policy_spec.rb b/spec/policies/commit_policy_spec.rb
new file mode 100644
index 00000000000..41f6fb08426
--- /dev/null
+++ b/spec/policies/commit_policy_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe CommitPolicy do
+ describe '#rules' do
+ let(:user) { create(:user) }
+ let(:commit) { project.repository.head_commit }
+ let(:policy) { described_class.new(user, commit) }
+
+ context 'when project is public' do
+ let(:project) { create(:project, :public, :repository) }
+
+ it 'can read commit and create a note' do
+ expect(policy).to be_allowed(:read_commit)
+ end
+
+ context 'when repository access level is private' do
+ let(:project) { create(:project, :public, :repository, :repository_private) }
+
+ it 'can not read commit and create a note' do
+ expect(policy).to be_disallowed(:read_commit)
+ end
+
+ context 'when the user is a project member' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'can read commit and create a note' do
+ expect(policy).to be_allowed(:read_commit)
+ end
+ end
+ end
+ end
+
+ context 'when project is private' do
+ let(:project) { create(:project, :private, :repository) }
+
+ it 'can not read commit and create a note' do
+ expect(policy).to be_disallowed(:read_commit)
+ end
+
+ context 'when the user is a project member' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'can read commit and create a note' do
+ expect(policy).to be_allowed(:read_commit)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index 30d68e7dc9d..12be3927e18 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -181,6 +181,18 @@ describe GlobalPolicy do
end
end
+ describe 'read instance metadata' do
+ context 'regular user' do
+ it { is_expected.to be_allowed(:read_instance_metadata) }
+ end
+
+ context 'anonymous' do
+ let(:current_user) { nil }
+
+ it { is_expected.not_to be_allowed(:read_instance_metadata) }
+ end
+ end
+
describe 'read instance statistics' do
context 'regular user' do
it { is_expected.to be_allowed(:read_instance_statistics) }
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index af6d6f084a9..0ad50c6f91f 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -74,6 +74,38 @@ describe GroupPolicy do
end
end
+ context 'with no user and public project' do
+ let(:project) { create(:project, :public) }
+ let(:user) { create(:user) }
+ let(:current_user) { nil }
+
+ before do
+ Projects::GroupLinks::CreateService.new(
+ project,
+ user,
+ link_group_access: ProjectGroupLink::DEVELOPER
+ ).execute(group)
+ end
+
+ it { expect_disallowed(:read_group) }
+ end
+
+ context 'with foreign user and public project' do
+ let(:project) { create(:project, :public) }
+ let(:user) { create(:user) }
+ let(:current_user) { create(:user) }
+
+ before do
+ Projects::GroupLinks::CreateService.new(
+ project,
+ user,
+ link_group_access: ProjectGroupLink::DEVELOPER
+ ).execute(group)
+ end
+
+ it { expect_disallowed(:read_group) }
+ end
+
context 'has projects' do
let(:current_user) { create(:user) }
let(:project) { create(:project, namespace: group) }
@@ -82,17 +114,13 @@ describe GroupPolicy do
project.add_developer(current_user)
end
- it do
- expect_allowed(:read_group, :read_list, :read_label)
- end
+ it { expect_allowed(:read_label, :read_list) }
context 'in subgroups', :nested_groups do
let(:subgroup) { create(:group, :private, parent: group) }
let(:project) { create(:project, namespace: subgroup) }
- it do
- expect_allowed(:read_group, :read_list, :read_label)
- end
+ it { expect_allowed(:read_label, :read_list) }
end
end
diff --git a/spec/policies/note_policy_spec.rb b/spec/policies/note_policy_spec.rb
index 0e848c74659..4be7a0266d1 100644
--- a/spec/policies/note_policy_spec.rb
+++ b/spec/policies/note_policy_spec.rb
@@ -1,28 +1,15 @@
require 'spec_helper'
-describe NotePolicy, mdoels: true do
+describe NotePolicy do
describe '#rules' do
let(:user) { create(:user) }
let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project) }
-
- def policies(noteable = nil)
- return @policies if @policies
-
- noteable ||= issue
- note = if noteable.is_a?(Commit)
- create(:note_on_commit, commit_id: noteable.id, author: user, project: project)
- else
- create(:note, noteable: noteable, author: user, project: project)
- end
-
- @policies = described_class.new(user, note)
- end
+ let(:noteable) { issue }
+ let(:policy) { described_class.new(user, note) }
+ let(:note) { create(:note, noteable: noteable, author: user, project: project) }
shared_examples_for 'a discussion with a private noteable' do
- let(:noteable) { issue }
- let(:policy) { policies(noteable) }
-
context 'when the note author can no longer see the noteable' do
it 'can not edit nor read the note' do
expect(policy).to be_disallowed(:admin_note)
@@ -46,12 +33,21 @@ describe NotePolicy, mdoels: true do
end
end
- context 'when the project is private' do
- let(:project) { create(:project, :private, :repository) }
+ context 'when the noteable is a commit' do
+ let(:commit) { project.repository.head_commit }
+ let(:note) { create(:note_on_commit, commit_id: commit.id, author: user, project: project) }
+
+ context 'when the project is private' do
+ let(:project) { create(:project, :private, :repository) }
+
+ it_behaves_like 'a discussion with a private noteable'
+ end
- context 'when the noteable is a commit' do
- it_behaves_like 'a discussion with a private noteable' do
- let(:noteable) { project.repository.head_commit }
+ context 'when the project is public' do
+ context 'when repository access level is private' do
+ let(:project) { create(:project, :public, :repository, :repository_private) }
+
+ it_behaves_like 'a discussion with a private noteable'
end
end
end
@@ -59,44 +55,44 @@ describe NotePolicy, mdoels: true do
context 'when the project is public' do
context 'when the note author is not a project member' do
it 'can edit a note' do
- expect(policies).to be_allowed(:admin_note)
- expect(policies).to be_allowed(:resolve_note)
- expect(policies).to be_allowed(:read_note)
+ expect(policy).to be_allowed(:admin_note)
+ expect(policy).to be_allowed(:resolve_note)
+ expect(policy).to be_allowed(:read_note)
end
end
context 'when the noteable is a project snippet' do
- it 'can edit note' do
- policies = policies(create(:project_snippet, :public, project: project))
+ let(:noteable) { create(:project_snippet, :public, project: project) }
- expect(policies).to be_allowed(:admin_note)
- expect(policies).to be_allowed(:resolve_note)
- expect(policies).to be_allowed(:read_note)
+ it 'can edit note' do
+ expect(policy).to be_allowed(:admin_note)
+ expect(policy).to be_allowed(:resolve_note)
+ expect(policy).to be_allowed(:read_note)
end
context 'when it is private' do
- it_behaves_like 'a discussion with a private noteable' do
- let(:noteable) { create(:project_snippet, :private, project: project) }
- end
+ let(:noteable) { create(:project_snippet, :private, project: project) }
+
+ it_behaves_like 'a discussion with a private noteable'
end
end
context 'when the noteable is a personal snippet' do
- it 'can edit note' do
- policies = policies(create(:personal_snippet, :public))
+ let(:noteable) { create(:personal_snippet, :public) }
- expect(policies).to be_allowed(:admin_note)
- expect(policies).to be_allowed(:resolve_note)
- expect(policies).to be_allowed(:read_note)
+ it 'can edit note' do
+ expect(policy).to be_allowed(:admin_note)
+ expect(policy).to be_allowed(:resolve_note)
+ expect(policy).to be_allowed(:read_note)
end
context 'when it is private' do
- it 'can not edit nor read the note' do
- policies = policies(create(:personal_snippet, :private))
+ let(:noteable) { create(:personal_snippet, :private) }
- expect(policies).to be_disallowed(:admin_note)
- expect(policies).to be_disallowed(:resolve_note)
- expect(policies).to be_disallowed(:read_note)
+ it 'can not edit nor read the note' do
+ expect(policy).to be_disallowed(:admin_note)
+ expect(policy).to be_disallowed(:resolve_note)
+ expect(policy).to be_disallowed(:read_note)
end
end
end
@@ -120,20 +116,20 @@ describe NotePolicy, mdoels: true do
end
it 'can edit a note' do
- expect(policies).to be_allowed(:admin_note)
- expect(policies).to be_allowed(:resolve_note)
- expect(policies).to be_allowed(:read_note)
+ expect(policy).to be_allowed(:admin_note)
+ expect(policy).to be_allowed(:resolve_note)
+ expect(policy).to be_allowed(:read_note)
end
end
context 'when the note author is not a project member' do
it 'can not edit a note' do
- expect(policies).to be_disallowed(:admin_note)
- expect(policies).to be_disallowed(:resolve_note)
+ expect(policy).to be_disallowed(:admin_note)
+ expect(policy).to be_disallowed(:resolve_note)
end
it 'can read a note' do
- expect(policies).to be_allowed(:read_note)
+ expect(policy).to be_allowed(:read_note)
end
end
end
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index 997bdc82af6..772d1fbee2b 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -45,8 +45,7 @@ describe ProjectPolicy do
let(:base_maintainer_permissions) do
%i[
push_to_delete_protected_branch update_project_snippet update_environment
- update_deployment admin_project_snippet
- admin_project_member admin_note admin_wiki admin_project
+ update_deployment admin_project_snippet admin_project_member admin_note admin_wiki admin_project
admin_commit_status admin_build admin_container_image
admin_pipeline admin_environment admin_deployment destroy_release add_cluster
daily_statistics
@@ -131,22 +130,26 @@ describe ProjectPolicy do
subject { described_class.new(owner, project) }
context 'when the feature is disabled' do
- it 'does not include the issues permissions' do
+ before do
project.issues_enabled = false
project.save!
+ end
+ it 'does not include the issues permissions' do
expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue
end
- end
- context 'when the feature is disabled and external tracker configured' do
- it 'does not include the issues permissions' do
- create(:jira_service, project: project)
+ it 'disables boards and lists permissions' do
+ expect_disallowed :read_board, :create_board, :update_board, :admin_board
+ expect_disallowed :read_list, :create_list, :update_list, :admin_list
+ end
- project.issues_enabled = false
- project.save!
+ context 'when external tracker configured' do
+ it 'does not include the issues permissions' do
+ create(:jira_service, project: project)
- expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue
+ expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue
+ end
end
end
end
diff --git a/spec/presenters/blobs/unfold_presenter_spec.rb b/spec/presenters/blobs/unfold_presenter_spec.rb
new file mode 100644
index 00000000000..7ece5f623ce
--- /dev/null
+++ b/spec/presenters/blobs/unfold_presenter_spec.rb
@@ -0,0 +1,159 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Blobs::UnfoldPresenter do
+ include FakeBlobHelpers
+
+ let(:project) { create(:project, :repository) }
+ let(:blob) { fake_blob(path: 'foo', data: "1\n2\n3") }
+ let(:subject) { described_class.new(blob, params) }
+
+ describe '#initialize' do
+ context 'when full is false' do
+ let(:params) { { full: false, since: 2, to: 3, bottom: false, offset: 1, indent: 1 } }
+
+ it 'sets attributes' do
+ result = subject
+
+ expect(result.full?).to eq(false)
+ expect(result.since).to eq(2)
+ expect(result.to).to eq(3)
+ expect(result.bottom).to eq(false)
+ expect(result.offset).to eq(1)
+ expect(result.indent).to eq(1)
+ end
+ end
+
+ context 'when full is true' do
+ let(:params) { { full: true, since: 2, to: 3, bottom: false, offset: 1, indent: 1 } }
+
+ it 'sets other attributes' do
+ result = subject
+
+ expect(result.full?).to eq(true)
+ expect(result.since).to eq(1)
+ expect(result.to).to eq(blob.lines.size)
+ expect(result.bottom).to eq(false)
+ expect(result.offset).to eq(0)
+ expect(result.indent).to eq(0)
+ end
+ end
+ end
+
+ describe '#diff_lines' do
+ let(:total_lines) { 50 }
+ let(:blob) { fake_blob(path: 'foo', data: (1..total_lines).to_a.join("\n")) }
+
+ context 'when "full" is true' do
+ let(:params) { { full: true } }
+
+ it 'returns all lines' do
+ lines = subject.diff_lines
+
+ expect(lines.size).to eq(total_lines)
+
+ lines.each.with_index do |line, index|
+ expect(line.text).to include("LC#{index + 1}")
+ expect(line.text).to eq(line.rich_text)
+ expect(line.type).to be_nil
+ end
+ end
+
+ context 'when last line is empty' do
+ let(:blob) { fake_blob(path: 'foo', data: "1\n2\n") }
+
+ it 'disregards last line' do
+ lines = subject.diff_lines
+
+ expect(lines.size).to eq(2)
+ end
+ end
+ end
+
+ context 'when "since" is equal to 1' do
+ let(:params) { { since: 1, to: 10, offset: 10 } }
+
+ it 'does not add top match line' do
+ line = subject.diff_lines.first
+
+ expect(line.type).to be_nil
+ end
+ end
+
+ context 'when since is greater than 1' do
+ let(:params) { { since: 5, to: 10, offset: 10 } }
+
+ it 'adds top match line' do
+ line = subject.diff_lines.first
+
+ expect(line.type).to eq('match')
+ expect(line.old_pos).to eq(5)
+ expect(line.new_pos).to eq(5)
+ end
+ end
+
+ context 'when "to" is less than blob size' do
+ let(:params) { { since: 1, to: 5, offset: 10, bottom: true } }
+
+ it 'adds bottom match line' do
+ line = subject.diff_lines.last
+
+ expect(line.type).to eq('match')
+ expect(line.old_pos).to eq(-5)
+ expect(line.new_pos).to eq(5)
+ end
+ end
+
+ context 'when "to" is equal to blob size' do
+ let(:params) { { since: 1, to: total_lines, offset: 10, bottom: true } }
+
+ it 'does not add bottom match line' do
+ line = subject.diff_lines.last
+
+ expect(line.type).to be_nil
+ end
+ end
+ end
+
+ describe '#lines' do
+ context 'when scope is specified' do
+ let(:params) { { since: 2, to: 3 } }
+
+ it 'returns lines cropped by params' do
+ expect(subject.lines.size).to eq(2)
+ expect(subject.lines[0]).to include('LC2')
+ expect(subject.lines[1]).to include('LC3')
+ end
+ end
+
+ context 'when full is true' do
+ let(:params) { { full: true } }
+
+ it 'returns all lines' do
+ expect(subject.lines.size).to eq(3)
+ expect(subject.lines[0]).to include('LC1')
+ expect(subject.lines[1]).to include('LC2')
+ expect(subject.lines[2]).to include('LC3')
+ end
+ end
+ end
+
+ describe '#match_line_text' do
+ context 'when bottom is true' do
+ let(:params) { { since: 2, to: 3, bottom: true } }
+
+ it 'returns empty string' do
+ expect(subject.match_line_text).to eq('')
+ end
+ end
+
+ context 'when bottom is false' do
+ let(:params) { { since: 2, to: 3, bottom: false } }
+
+ it 'returns match line string' do
+ expect(subject.match_line_text).to eq("@@ -2,1+2,1 @@")
+ end
+ end
+ end
+end
diff --git a/spec/presenters/group_clusterable_presenter_spec.rb b/spec/presenters/group_clusterable_presenter_spec.rb
index 205160742bf..fa77273f6aa 100644
--- a/spec/presenters/group_clusterable_presenter_spec.rb
+++ b/spec/presenters/group_clusterable_presenter_spec.rb
@@ -69,6 +69,14 @@ describe GroupClusterablePresenter do
it { is_expected.to eq(install_applications_group_cluster_path(group, cluster, application)) }
end
+ describe '#update_applications_cluster_path' do
+ let(:application) { :helm }
+
+ subject { presenter.update_applications_cluster_path(cluster, application) }
+
+ it { is_expected.to eq(update_applications_group_cluster_path(group, cluster, application)) }
+ end
+
describe '#cluster_path' do
subject { presenter.cluster_path(cluster) }
diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb
index bafcddebbb7..02cefcbc916 100644
--- a/spec/presenters/merge_request_presenter_spec.rb
+++ b/spec/presenters/merge_request_presenter_spec.rb
@@ -392,6 +392,29 @@ describe MergeRequestPresenter do
end
end
+ describe '#target_branch_path' do
+ subject do
+ described_class.new(resource, current_user: user).target_branch_path
+ end
+
+ context 'when target branch exists' do
+ it 'returns path' do
+ allow(resource).to receive(:target_branch_exists?) { true }
+
+ is_expected
+ .to eq("/#{resource.source_project.full_path}/branches/#{resource.target_branch}")
+ end
+ end
+
+ context 'when target branch does not exist' do
+ it 'returns nil' do
+ allow(resource).to receive(:target_branch_exists?) { false }
+
+ is_expected.to be_nil
+ end
+ end
+ end
+
describe '#source_branch_with_namespace_link' do
subject do
described_class.new(resource, current_user: user).source_branch_with_namespace_link
diff --git a/spec/presenters/project_clusterable_presenter_spec.rb b/spec/presenters/project_clusterable_presenter_spec.rb
index c50d90ae1e8..6786a84243f 100644
--- a/spec/presenters/project_clusterable_presenter_spec.rb
+++ b/spec/presenters/project_clusterable_presenter_spec.rb
@@ -69,6 +69,14 @@ describe ProjectClusterablePresenter do
it { is_expected.to eq(install_applications_project_cluster_path(project, cluster, application)) }
end
+ describe '#update_applications_cluster_path' do
+ let(:application) { :helm }
+
+ subject { presenter.update_applications_cluster_path(cluster, application) }
+
+ it { is_expected.to eq(update_applications_project_cluster_path(project, cluster, application)) }
+ end
+
describe '#cluster_path' do
subject { presenter.cluster_path(cluster) }
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 066f1d6862a..a132b85b878 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -1430,8 +1430,8 @@ describe API::Commits do
end
describe 'GET /projects/:id/repository/commits/:sha/merge_requests' do
- let!(:project) { create(:project, :repository, :private) }
- let!(:merged_mr) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'feature') }
+ let(:project) { create(:project, :repository, :private) }
+ let(:merged_mr) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'feature') }
let(:commit) { merged_mr.merge_request_diff.commits.last }
it 'returns the correct merge request' do
@@ -1456,6 +1456,17 @@ describe API::Commits do
expect(response).to have_gitlab_http_status(404)
end
+
+ context 'public project' do
+ let(:project) { create(:project, :repository, :public, :merge_requests_private) }
+ let(:non_member) { create(:user) }
+
+ it 'responds 403 when only members are allowed to read merge requests' do
+ get api("/projects/#{project.id}/repository/commits/#{commit.id}/merge_requests", non_member)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
end
describe 'GET /projects/:id/repository/commits/:sha/signature' do
diff --git a/spec/requests/api/graphql/metadata_query_spec.rb b/spec/requests/api/graphql/metadata_query_spec.rb
new file mode 100644
index 00000000000..4c56c559cf9
--- /dev/null
+++ b/spec/requests/api/graphql/metadata_query_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'getting project information' do
+ include GraphqlHelpers
+
+ let(:query) { graphql_query_for('metadata', {}, all_graphql_fields_for('Metadata')) }
+
+ context 'logged in' do
+ it 'returns version and revision' do
+ post_graphql(query, current_user: create(:user))
+
+ expect(graphql_errors).to be_nil
+ expect(graphql_data).to eq(
+ 'metadata' => {
+ 'version' => Gitlab::VERSION,
+ 'revision' => Gitlab.revision
+ }
+ )
+ end
+ end
+
+ context 'anonymous user' do
+ it 'returns nothing' do
+ post_graphql(query, current_user: nil)
+
+ expect(graphql_errors).to be_nil
+ expect(graphql_data).to eq('metadata' => nil)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql_spec.rb b/spec/requests/api/graphql_spec.rb
new file mode 100644
index 00000000000..cca87c16f27
--- /dev/null
+++ b/spec/requests/api/graphql_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe 'GraphQL' do
+ include GraphqlHelpers
+
+ let(:query) { graphql_query_for('echo', 'text' => 'Hello world' ) }
+
+ context 'graphql is disabled by feature flag' do
+ before do
+ stub_feature_flags(graphql: false)
+ end
+
+ it 'does not generate a route for GraphQL' do
+ expect { post_graphql(query) }.to raise_error(ActionController::RoutingError)
+ end
+ end
+
+ context 'invalid variables' do
+ it 'returns an error' do
+ post_graphql(query, variables: "This is not JSON")
+
+ expect(response).to have_gitlab_http_status(422)
+ expect(json_response['errors'].first['message']).not_to be_nil
+ end
+ end
+
+ context 'authentication', :allow_forgery_protection do
+ let(:user) { create(:user) }
+
+ it 'allows access to public data without authentication' do
+ post_graphql(query)
+
+ expect(graphql_data['echo']).to eq('nil says: Hello world')
+ end
+
+ it 'does not authenticate a user with an invalid CSRF' do
+ login_as(user)
+
+ post_graphql(query, headers: { 'X-CSRF-Token' => 'invalid' })
+
+ expect(graphql_data['echo']).to eq('nil says: Hello world')
+ end
+
+ it 'authenticates a user with a valid session token' do
+ # Create a session to get a CSRF token from
+ login_as(user)
+ get('/')
+
+ post '/api/graphql', params: { query: query }, headers: { 'X-CSRF-Token' => response.session['_csrf_token'] }
+
+ expect(graphql_data['echo']).to eq("\"#{user.username}\" says: Hello world")
+ end
+
+ context 'token authentication' do
+ let(:token) { create(:personal_access_token) }
+
+ before do
+ stub_authentication_activity_metrics(debug: false)
+ end
+
+ it 'Authenticates users with a PAT' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_sessionless_authentication_counter)
+
+ post_graphql(query, headers: { 'PRIVATE-TOKEN' => token.token })
+
+ expect(graphql_data['echo']).to eq("\"#{token.user.username}\" says: Hello world")
+ end
+
+ context 'when the personal access token has no api scope' do
+ it 'does not log the user in' do
+ token.update(scopes: [:read_user])
+
+ post_graphql(query, headers: { 'PRIVATE-TOKEN' => token.token })
+
+ expect(response).to have_gitlab_http_status(200)
+
+ expect(graphql_data['echo']).to eq('nil says: Hello world')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/group_variables_spec.rb b/spec/requests/api/group_variables_spec.rb
index e52f4c70407..66b9aae4b58 100644
--- a/spec/requests/api/group_variables_spec.rb
+++ b/spec/requests/api/group_variables_spec.rb
@@ -87,12 +87,12 @@ describe API::GroupVariables do
it 'creates variable' do
expect do
- post api("/groups/#{group.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'VALUE_2', protected: true }
+ post api("/groups/#{group.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'PROTECTED_VALUE_2', protected: true }
end.to change {group.variables.count}.by(1)
expect(response).to have_gitlab_http_status(201)
expect(json_response['key']).to eq('TEST_VARIABLE_2')
- expect(json_response['value']).to eq('VALUE_2')
+ expect(json_response['value']).to eq('PROTECTED_VALUE_2')
expect(json_response['protected']).to be_truthy
end
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
index 01bab2a1361..a5434d3ea80 100644
--- a/spec/requests/api/issues_spec.rb
+++ b/spec/requests/api/issues_spec.rb
@@ -49,7 +49,7 @@ describe API::Issues do
create(:label, title: 'label', color: '#FFAABB', project: project)
end
let!(:label_link) { create(:label_link, label: label, target: issue) }
- set(:milestone) { create(:milestone, title: '1.0.0', project: project) }
+ let(:milestone) { create(:milestone, title: '1.0.0', project: project) }
set(:empty_milestone) do
create(:milestone, title: '2.0.0', project: project)
end
@@ -271,7 +271,14 @@ describe API::Issues do
end
it 'returns an array of labeled issues' do
- get api("/issues", user), params: { labels: label.title }
+ get api('/issues', user), params: { labels: label.title }
+
+ expect_paginated_array_response(issue.id)
+ expect(json_response.first['labels']).to eq([label.title])
+ end
+
+ it 'returns an array of labeled issues with labels param as array' do
+ get api('/issues', user), params: { labels: [label.title] }
expect_paginated_array_response(issue.id)
expect(json_response.first['labels']).to eq([label.title])
@@ -284,7 +291,20 @@ describe API::Issues do
create(:label_link, label: label_b, target: issue)
create(:label_link, label: label_c, target: issue)
- get api("/issues", user), params: { labels: "#{label.title},#{label_b.title},#{label_c.title}" }
+ get api('/issues', user), params: { labels: "#{label.title},#{label_b.title},#{label_c.title}" }
+
+ expect_paginated_array_response(issue.id)
+ expect(json_response.first['labels']).to eq([label_c.title, label_b.title, label.title])
+ end
+
+ it 'returns an array of labeled issues when all labels matches with labels param as array' do
+ label_b = create(:label, title: 'foo', project: project)
+ label_c = create(:label, title: 'bar', project: project)
+
+ create(:label_link, label: label_b, target: issue)
+ create(:label_link, label: label_c, target: issue)
+
+ get api('/issues', user), params: { labels: [label.title, label_b.title, label_c.title] }
expect_paginated_array_response(issue.id)
expect(json_response.first['labels']).to eq([label_c.title, label_b.title, label.title])
@@ -296,8 +316,22 @@ describe API::Issues do
expect_paginated_array_response([])
end
+ it 'returns an empty array if no issue matches labels with labels param as array' do
+ get api('/issues', user), params: { labels: %w(foo bar) }
+
+ expect_paginated_array_response([])
+ end
+
it 'returns an array of labeled issues matching given state' do
- get api("/issues", user), params: { labels: label.title, state: :opened }
+ get api('/issues', user), params: { labels: label.title, state: :opened }
+
+ expect_paginated_array_response(issue.id)
+ expect(json_response.first['labels']).to eq([label.title])
+ expect(json_response.first['state']).to eq('opened')
+ end
+
+ it 'returns an array of labeled issues matching given state with labels param as array' do
+ get api('/issues', user), params: { labels: [label.title], state: :opened }
expect_paginated_array_response(issue.id)
expect(json_response.first['labels']).to eq([label.title])
@@ -305,25 +339,43 @@ describe API::Issues do
end
it 'returns an empty array if no issue matches labels and state filters' do
- get api("/issues", user), params: { labels: label.title, state: :closed }
+ get api('/issues', user), params: { labels: label.title, state: :closed }
expect_paginated_array_response([])
end
it 'returns an array of issues with any label' do
- get api("/issues", user), params: { labels: IssuesFinder::FILTER_ANY }
+ get api('/issues', user), params: { labels: IssuesFinder::FILTER_ANY }
+
+ expect_paginated_array_response(issue.id)
+ end
+
+ it 'returns an array of issues with any label with labels param as array' do
+ get api('/issues', user), params: { labels: [IssuesFinder::FILTER_ANY] }
expect_paginated_array_response(issue.id)
end
it 'returns an array of issues with no label' do
- get api("/issues", user), params: { labels: IssuesFinder::FILTER_NONE }
+ get api('/issues', user), params: { labels: IssuesFinder::FILTER_NONE }
+
+ expect_paginated_array_response(closed_issue.id)
+ end
+
+ it 'returns an array of issues with no label with labels param as array' do
+ get api('/issues', user), params: { labels: [IssuesFinder::FILTER_NONE] }
expect_paginated_array_response(closed_issue.id)
end
it 'returns an array of issues with no label when using the legacy No+Label filter' do
- get api("/issues", user), params: { labels: "No Label" }
+ get api('/issues', user), params: { labels: 'No Label' }
+
+ expect_paginated_array_response(closed_issue.id)
+ end
+
+ it 'returns an array of issues with no label when using the legacy No+Label filter with labels param as array' do
+ get api('/issues', user), params: { labels: ['No Label'] }
expect_paginated_array_response(closed_issue.id)
end
@@ -588,12 +640,25 @@ describe API::Issues do
expect(json_response.first['labels']).to eq([group_label.title])
end
+ it 'returns an array of labeled group issues with labels param as array' do
+ get api(base_url, user), params: { labels: [group_label.title] }
+
+ expect_paginated_array_response(group_issue.id)
+ expect(json_response.first['labels']).to eq([group_label.title])
+ end
+
it 'returns an array of labeled group issues where all labels match' do
get api(base_url, user), params: { labels: "#{group_label.title},foo,bar" }
expect_paginated_array_response([])
end
+ it 'returns an array of labeled group issues where all labels match with labels param as array' do
+ get api(base_url, user), params: { labels: [group_label.title, 'foo', 'bar'] }
+
+ expect_paginated_array_response([])
+ end
+
it 'returns issues matching given search string for title' do
get api(base_url, user), params: { search: group_issue.title }
@@ -619,6 +684,19 @@ describe API::Issues do
expect(json_response.first['labels']).to eq([label_c.title, label_b.title, group_label.title])
end
+ it 'returns an array of labeled issues when all labels matches with labels param as array' do
+ label_b = create(:label, title: 'foo', project: group_project)
+ label_c = create(:label, title: 'bar', project: group_project)
+
+ create(:label_link, label: label_b, target: group_issue)
+ create(:label_link, label: label_c, target: group_issue)
+
+ get api(base_url, user), params: { labels: [group_label.title, label_b.title, label_c.title] }
+
+ expect_paginated_array_response(group_issue.id)
+ expect(json_response.first['labels']).to eq([label_c.title, label_b.title, group_label.title])
+ end
+
it 'returns an array of issues found by iids' do
get api(base_url, user), params: { iids: [group_issue.iid] }
@@ -645,12 +723,25 @@ describe API::Issues do
expect(json_response.first['id']).to eq(group_issue.id)
end
+ it 'returns an array of group issues with any label with labels param as array' do
+ get api(base_url, user), params: { labels: [IssuesFinder::FILTER_ANY] }
+
+ expect_paginated_array_response(group_issue.id)
+ expect(json_response.first['id']).to eq(group_issue.id)
+ end
+
it 'returns an array of group issues with no label' do
get api(base_url, user), params: { labels: IssuesFinder::FILTER_NONE }
expect_paginated_array_response([group_closed_issue.id, group_confidential_issue.id])
end
+ it 'returns an array of group issues with no label with labels param as array' do
+ get api(base_url, user), params: { labels: [IssuesFinder::FILTER_NONE] }
+
+ expect_paginated_array_response([group_closed_issue.id, group_confidential_issue.id])
+ end
+
it 'returns an empty array if no issue matches milestone' do
get api(base_url, user), params: { milestone: group_empty_milestone.title }
@@ -842,6 +933,12 @@ describe API::Issues do
expect_paginated_array_response(issue.id)
end
+ it 'returns an array of labeled project issues with labels param as array' do
+ get api("#{base_url}/issues", user), params: { labels: [label.title] }
+
+ expect_paginated_array_response(issue.id)
+ end
+
it 'returns an array of labeled issues when all labels matches' do
label_b = create(:label, title: 'foo', project: project)
label_c = create(:label, title: 'bar', project: project)
@@ -854,6 +951,18 @@ describe API::Issues do
expect_paginated_array_response(issue.id)
end
+ it 'returns an array of labeled issues when all labels matches with labels param as array' do
+ label_b = create(:label, title: 'foo', project: project)
+ label_c = create(:label, title: 'bar', project: project)
+
+ create(:label_link, label: label_b, target: issue)
+ create(:label_link, label: label_c, target: issue)
+
+ get api("#{base_url}/issues", user), params: { labels: [label.title, label_b.title, label_c.title] }
+
+ expect_paginated_array_response(issue.id)
+ end
+
it 'returns issues matching given search string for title' do
get api("#{base_url}/issues?search=#{issue.title}", user)
@@ -890,12 +999,24 @@ describe API::Issues do
expect_paginated_array_response(issue.id)
end
+ it 'returns an array of project issues with any label with labels param as array' do
+ get api("#{base_url}/issues", user), params: { labels: [IssuesFinder::FILTER_ANY] }
+
+ expect_paginated_array_response(issue.id)
+ end
+
it 'returns an array of project issues with no label' do
get api("#{base_url}/issues", user), params: { labels: IssuesFinder::FILTER_NONE }
expect_paginated_array_response([confidential_issue.id, closed_issue.id])
end
+ it 'returns an array of project issues with no label with labels param as array' do
+ get api("#{base_url}/issues", user), params: { labels: [IssuesFinder::FILTER_NONE] }
+
+ expect_paginated_array_response([confidential_issue.id, closed_issue.id])
+ end
+
it 'returns an empty array if no project issue matches labels' do
get api("#{base_url}/issues", user), params: { labels: 'foo,bar' }
@@ -1215,6 +1336,19 @@ describe API::Issues do
expect(json_response['assignees'].first['name']).to eq(user2.name)
end
+ it 'creates a new project issue with labels param as array' do
+ post api("/projects/#{project.id}/issues", user),
+ params: { title: 'new issue', labels: %w(label label2), weight: 3, assignee_ids: [user2.id] }
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['title']).to eq('new issue')
+ expect(json_response['description']).to be_nil
+ expect(json_response['labels']).to eq(%w(label label2))
+ expect(json_response['confidential']).to be_falsy
+ expect(json_response['assignee']['name']).to eq(user2.name)
+ expect(json_response['assignees'].first['name']).to eq(user2.name)
+ end
+
it 'creates a new confidential project issue' do
post api("/projects/#{project.id}/issues", user),
params: { title: 'new issue', confidential: true }
@@ -1269,6 +1403,20 @@ describe API::Issues do
expect(json_response['labels']).to include '&'
end
+ it 'allows special label names with labels param as array' do
+ post api("/projects/#{project.id}/issues", user),
+ params: {
+ title: 'new issue',
+ labels: ['label', 'label?', 'label&foo, ?, &']
+ }
+ expect(response.status).to eq(201)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ end
+
it 'returns 400 if title is too long' do
post api("/projects/#{project.id}/issues", user),
params: { title: 'g' * 256 }
@@ -1377,6 +1525,12 @@ describe API::Issues do
post api("/projects/#{project.id}/issues", non_member), params: { title: 'new issue', labels: 'label, label2' }
end.not_to change { project.labels.count }
end
+
+ it 'cannot create new labels with labels param as array' do
+ expect do
+ post api("/projects/#{project.id}/issues", non_member), params: { title: 'new issue', labels: %w(label label2) }
+ end.not_to change { project.labels.count }
+ end
end
end
@@ -1444,6 +1598,21 @@ describe API::Issues do
expect(json_response['labels']).to include '&'
end
+ it 'allows special label names with labels param as array' do
+ put api("/projects/#{project.id}/issues/#{issue.iid}", user),
+ params: {
+ title: 'updated title',
+ labels: ['label', 'label?', 'label&foo, ?, &']
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ end
+
context 'confidential issues' do
it "returns 403 for non project members" do
put api("/projects/#{project.id}/issues/#{confidential_issue.iid}", non_member),
@@ -1603,6 +1772,16 @@ describe API::Issues do
expect(json_response['updated_at']).to be > Time.now
end
+ it 'removes all labels and touches the record with labels param as array' do
+ Timecop.travel(1.minute.from_now) do
+ put api("/projects/#{project.id}/issues/#{issue.iid}", user), params: { labels: [''] }
+ end
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['labels']).to eq([])
+ expect(json_response['updated_at']).to be > Time.now
+ end
+
it 'updates labels and touches the record' do
Timecop.travel(1.minute.from_now) do
put api("/projects/#{project.id}/issues/#{issue.iid}", user),
@@ -1614,6 +1793,17 @@ describe API::Issues do
expect(json_response['updated_at']).to be > Time.now
end
+ it 'updates labels and touches the record with labels param as array' do
+ Timecop.travel(1.minute.from_now) do
+ put api("/projects/#{project.id}/issues/#{issue.iid}", user),
+ params: { labels: %w(foo bar) }
+ end
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['labels']).to include 'foo'
+ expect(json_response['labels']).to include 'bar'
+ expect(json_response['updated_at']).to be > Time.now
+ end
+
it 'allows special label names' do
put api("/projects/#{project.id}/issues/#{issue.iid}", user),
params: { labels: 'label:foo, label-bar,label_bar,label/bar,label?bar,label&bar,?,&' }
@@ -1628,6 +1818,20 @@ describe API::Issues do
expect(json_response['labels']).to include '&'
end
+ it 'allows special label names with labels param as array' do
+ put api("/projects/#{project.id}/issues/#{issue.iid}", user),
+ params: { labels: ['label:foo', 'label-bar', 'label_bar', 'label/bar,label?bar,label&bar,?,&'] }
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to include 'label:foo'
+ expect(json_response['labels']).to include 'label-bar'
+ expect(json_response['labels']).to include 'label_bar'
+ expect(json_response['labels']).to include 'label/bar'
+ expect(json_response['labels']).to include 'label?bar'
+ expect(json_response['labels']).to include 'label&bar'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ end
+
it 'returns 400 if title is too long' do
put api("/projects/#{project.id}/issues/#{issue.iid}", user),
params: { title: 'g' * 256 }
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index 3defe8bbf51..ed2ef4c730b 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -321,6 +321,49 @@ describe API::Jobs do
end
end
+ describe 'DELETE /projects/:id/jobs/:job_id/artifacts' do
+ let!(:job) { create(:ci_build, :artifacts, pipeline: pipeline, user: api_user) }
+
+ before do
+ delete api("/projects/#{project.id}/jobs/#{job.id}/artifacts", api_user)
+ end
+
+ context 'when user is anonymous' do
+ let(:api_user) { nil }
+
+ it 'does not delete artifacts' do
+ expect(job.job_artifacts.size).to eq 2
+ end
+
+ it 'returns status 401 (unauthorized)' do
+ expect(response).to have_http_status :unauthorized
+ end
+ end
+
+ context 'with developer' do
+ it 'does not delete artifacts' do
+ expect(job.job_artifacts.size).to eq 2
+ end
+
+ it 'returns status 403 (forbidden)' do
+ expect(response).to have_http_status :forbidden
+ end
+ end
+
+ context 'with authorized user' do
+ let(:maintainer) { create(:project_member, :maintainer, project: project).user }
+ let!(:api_user) { maintainer }
+
+ it 'deletes artifacts' do
+ expect(job.job_artifacts.size).to eq 0
+ end
+
+ it 'returns status 204 (no content)' do
+ expect(response).to have_http_status :no_content
+ end
+ end
+ end
+
describe 'GET /projects/:id/jobs/:job_id/artifacts/:artifact_path' do
context 'when job has artifacts' do
let(:job) { create(:ci_build, :artifacts, pipeline: pipeline) }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 6272bb38d59..fee6312a9c7 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -617,26 +617,115 @@ describe API::MergeRequests do
end
end
- describe "POST /projects/:id/merge_requests" do
+ describe 'POST /projects/:id/merge_requests' do
context 'between branches projects' do
- it "returns merge_request" do
- post api("/projects/#{project.id}/merge_requests", user),
- params: {
- title: 'Test merge_request',
- source_branch: 'feature_conflict',
- target_branch: 'master',
- author: user,
- labels: 'label, label2',
- milestone_id: milestone.id,
- squash: true
- }
+ context 'different labels' do
+ let(:params) do
+ {
+ title: 'Test merge_request',
+ source_branch: 'feature_conflict',
+ target_branch: 'master',
+ author_id: user.id,
+ milestone_id: milestone.id,
+ squash: true
+ }
+ end
- expect(response).to have_gitlab_http_status(201)
- expect(json_response['title']).to eq('Test merge_request')
- expect(json_response['labels']).to eq(%w(label label2))
- expect(json_response['milestone']['id']).to eq(milestone.id)
- expect(json_response['squash']).to be_truthy
- expect(json_response['force_remove_source_branch']).to be_falsy
+ shared_examples_for 'creates merge request with labels' do
+ it 'returns merge_request' do
+ params[:labels] = labels
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['title']).to eq('Test merge_request')
+ expect(json_response['labels']).to eq(%w(label label2))
+ expect(json_response['milestone']['id']).to eq(milestone.id)
+ expect(json_response['squash']).to be_truthy
+ expect(json_response['force_remove_source_branch']).to be_falsy
+ end
+ end
+
+ it_behaves_like 'creates merge request with labels' do
+ let(:labels) { 'label, label2' }
+ end
+
+ it_behaves_like 'creates merge request with labels' do
+ let(:labels) { %w(label label2) }
+ end
+
+ it_behaves_like 'creates merge request with labels' do
+ let(:labels) { %w(label label2) }
+ end
+
+ it 'creates merge request with special label names' do
+ params[:labels] = 'label, label?, label&foo, ?, &'
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ end
+
+ it 'creates merge request with special label names as array' do
+ params[:labels] = ['label', 'label?', 'label&foo, ?, &', '1, 2', 3, 4]
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ expect(json_response['labels']).to include '1'
+ expect(json_response['labels']).to include '2'
+ expect(json_response['labels']).to include '3'
+ expect(json_response['labels']).to include '4'
+ end
+
+ it 'empty label param does not add any labels' do
+ params[:labels] = ''
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to eq([])
+ end
+
+ it 'empty label param as array does not add any labels, but only explicitly as json' do
+ params[:labels] = []
+ post api("/projects/#{project.id}/merge_requests", user),
+ params: params.to_json,
+ headers: { 'Content-Type': 'application/json' }
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to eq([])
+ end
+
+ xit 'empty label param as array, does not add any labels' do
+ params[:labels] = []
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to eq([])
+ end
+
+ it 'array with one empty string element does not add labels' do
+ params[:labels] = ['']
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to eq([])
+ end
+
+ it 'array with multiple empty string elements, does not add labels' do
+ params[:labels] = ['', '', '']
+ post api("/projects/#{project.id}/merge_requests", user), params: params
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['labels']).to eq([])
+ end
end
it "returns 422 when source_branch equals target_branch" do
@@ -663,23 +752,6 @@ describe API::MergeRequests do
expect(response).to have_gitlab_http_status(400)
end
- it 'allows special label names' do
- post api("/projects/#{project.id}/merge_requests", user),
- params: {
- title: 'Test merge_request',
- source_branch: 'markdown',
- target_branch: 'master',
- author: user,
- labels: 'label, label?, label&foo, ?, &'
- }
- expect(response).to have_gitlab_http_status(201)
- expect(json_response['labels']).to include 'label'
- expect(json_response['labels']).to include 'label?'
- expect(json_response['labels']).to include 'label&foo'
- expect(json_response['labels']).to include '?'
- expect(json_response['labels']).to include '&'
- end
-
context 'with existing MR' do
before do
post api("/projects/#{project.id}/merge_requests", user),
@@ -1060,18 +1132,6 @@ describe API::MergeRequests do
expect(response).to have_gitlab_http_status(404)
end
-
- it "returns 400 when merge method is not supported" do
- merge_request.project.update!(merge_method: 'ff')
-
- put api(url, user)
-
- expected_error =
- 'Fast-forward to refs/merge-requests/1/merge is currently not supported.'
-
- expect(response).to have_gitlab_http_status(400)
- expect(json_response['message']).to eq(expected_error)
- end
end
describe "PUT /projects/:id/merge_requests/:merge_request_iid" do
@@ -1122,19 +1182,97 @@ describe API::MergeRequests do
expect(json_response['force_remove_source_branch']).to be_truthy
end
- it 'allows special label names' do
- put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
- params: {
- title: 'new issue',
- labels: 'label, label?, label&foo, ?, &'
- }
+ context 'when updating labels' do
+ it 'allows special label names' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: 'label, label?, label&foo, ?, &'
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ end
- expect(response.status).to eq(200)
- expect(json_response['labels']).to include 'label'
- expect(json_response['labels']).to include 'label?'
- expect(json_response['labels']).to include 'label&foo'
- expect(json_response['labels']).to include '?'
- expect(json_response['labels']).to include '&'
+ it 'also accepts labels as an array' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: ['label', 'label?', 'label&foo, ?, &', '1, 2', 3, 4]
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to include 'label'
+ expect(json_response['labels']).to include 'label?'
+ expect(json_response['labels']).to include 'label&foo'
+ expect(json_response['labels']).to include '?'
+ expect(json_response['labels']).to include '&'
+ expect(json_response['labels']).to include '1'
+ expect(json_response['labels']).to include '2'
+ expect(json_response['labels']).to include '3'
+ expect(json_response['labels']).to include '4'
+ end
+
+ it 'empty label param removes labels' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: ''
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to eq []
+ end
+
+ it 'label param as empty array, but only explicitly as json, removes labels' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: []
+ }.to_json,
+ headers: { 'Content-Type' => 'application/json' }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to eq []
+ end
+
+ xit 'empty label as array, removes labels' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: []
+ }
+
+ expect(response.status).to eq(200)
+ # fails, as grape ommits for some reason empty array as optional param value, so nothing it passed along
+ expect(json_response['labels']).to eq []
+ end
+
+ it 'array with one empty string element removes labels' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: ['']
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to eq []
+ end
+
+ it 'array with multiple empty string elements, removes labels' do
+ put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user),
+ params: {
+ title: 'new issue',
+ labels: ['', '', '']
+ }
+
+ expect(response.status).to eq(200)
+ expect(json_response['labels']).to eq []
+ end
end
it 'does not update state when title is empty' do
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 856fe1bbe89..60d9d7fed13 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -136,6 +136,7 @@ describe API::Projects do
end
let!(:public_project) { create(:project, :public, name: 'public_project') }
+
before do
project
project2
@@ -968,8 +969,16 @@ describe API::Projects do
describe 'GET /projects/:id' do
context 'when unauthenticated' do
- it 'returns the public projects' do
- public_project = create(:project, :public)
+ it 'does not return private projects' do
+ private_project = create(:project, :private)
+
+ get api("/projects/#{private_project.id}")
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'returns public projects' do
+ public_project = create(:project, :repository, :public)
get api("/projects/#{public_project.id}")
@@ -977,8 +986,34 @@ describe API::Projects do
expect(json_response['id']).to eq(public_project.id)
expect(json_response['description']).to eq(public_project.description)
expect(json_response['default_branch']).to eq(public_project.default_branch)
+ expect(json_response['ci_config_path']).to eq(public_project.ci_config_path)
expect(json_response.keys).not_to include('permissions')
end
+
+ context 'and the project has a private repository' do
+ let(:project) { create(:project, :repository, :public, :repository_private) }
+ let(:protected_attributes) { %w(default_branch ci_config_path) }
+
+ it 'hides protected attributes of private repositories if user is not a member' do
+ get api("/projects/#{project.id}", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ protected_attributes.each do |attribute|
+ expect(json_response.keys).not_to include(attribute)
+ end
+ end
+
+ it 'exposes protected attributes of private repositories if user is a member' do
+ project.add_developer(user)
+
+ get api("/projects/#{project.id}", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ protected_attributes.each do |attribute|
+ expect(json_response.keys).to include(attribute)
+ end
+ end
+ end
end
context 'when authenticated' do
@@ -1130,6 +1165,26 @@ describe API::Projects do
expect(json_response).to include 'statistics'
end
+ context "and the project has a private repository" do
+ let(:project) { create(:project, :public, :repository, :repository_private) }
+
+ it "does not include statistics if user is not a member" do
+ get api("/projects/#{project.id}", user), params: { statistics: true }
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).not_to include 'statistics'
+ end
+
+ it "includes statistics if user is a member" do
+ project.add_developer(user)
+
+ get api("/projects/#{project.id}", user), params: { statistics: true }
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to include 'statistics'
+ end
+ end
+
it "includes import_error if user can admin project" do
get api("/projects/#{project.id}", user)
@@ -1510,6 +1565,9 @@ describe API::Projects do
describe "POST /projects/:id/share" do
let(:group) { create(:group) }
+ before do
+ group.add_developer(user)
+ end
it "shares project with group" do
expires_at = 10.days.from_now.to_date
@@ -1560,6 +1618,15 @@ describe API::Projects do
expect(response).to have_gitlab_http_status(400)
expect(json_response['error']).to eq 'group_access does not have a valid value'
end
+
+ it "returns a 409 error when link is not saved" do
+ allow(::Projects::GroupLinks::CreateService).to receive_message_chain(:new, :execute)
+ .and_return({ status: :error, http_status: 409, message: 'error' })
+
+ post api("/projects/#{project.id}/share", user), params: { group_id: group.id, group_access: Gitlab::Access::DEVELOPER }
+
+ expect(response).to have_gitlab_http_status(409)
+ end
end
describe 'DELETE /projects/:id/share/:group_id' do
diff --git a/spec/requests/api/release/links_spec.rb b/spec/requests/api/release/links_spec.rb
index ba948e37e2f..3a59052bb29 100644
--- a/spec/requests/api/release/links_spec.rb
+++ b/spec/requests/api/release/links_spec.rb
@@ -73,6 +73,22 @@ describe API::Release::Links do
expect(response).to have_gitlab_http_status(:ok)
end
end
+
+ context 'when project is public and the repository is private' do
+ let(:project) { create(:project, :repository, :public, :repository_private) }
+
+ it_behaves_like '403 response' do
+ let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member) }
+ end
+
+ context 'when the release does not exists' do
+ let!(:release) { }
+
+ it_behaves_like '403 response' do
+ let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member) }
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb
index e6c235ca26e..9087cccb759 100644
--- a/spec/requests/api/runner_spec.rb
+++ b/spec/requests/api/runner_spec.rb
@@ -436,9 +436,9 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
end
let(:expected_variables) do
- [{ 'key' => 'CI_JOB_NAME', 'value' => 'spinach', 'public' => true },
- { 'key' => 'CI_JOB_STAGE', 'value' => 'test', 'public' => true },
- { 'key' => 'DB_NAME', 'value' => 'postgres', 'public' => true }]
+ [{ 'key' => 'CI_JOB_NAME', 'value' => 'spinach', 'public' => true, 'masked' => false },
+ { 'key' => 'CI_JOB_STAGE', 'value' => 'test', 'public' => true, 'masked' => false },
+ { 'key' => 'DB_NAME', 'value' => 'postgres', 'public' => true, 'masked' => false }]
end
let(:expected_artifacts) do
@@ -549,7 +549,7 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
end
context 'when job is made for merge request' do
- let(:pipeline) { create(:ci_pipeline_without_jobs, source: :merge_request, project: project, ref: 'feature', merge_request: merge_request) }
+ let(:pipeline) { create(:ci_pipeline_without_jobs, source: :merge_request_event, project: project, ref: 'feature', merge_request: merge_request) }
let!(:job) { create(:ci_build, pipeline: pipeline, name: 'spinach', ref: 'feature', stage: 'test', stage_idx: 0) }
let(:merge_request) { create(:merge_request) }
@@ -740,12 +740,12 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
context 'when triggered job is available' do
let(:expected_variables) do
- [{ 'key' => 'CI_JOB_NAME', 'value' => 'spinach', 'public' => true },
- { 'key' => 'CI_JOB_STAGE', 'value' => 'test', 'public' => true },
- { 'key' => 'CI_PIPELINE_TRIGGERED', 'value' => 'true', 'public' => true },
- { 'key' => 'DB_NAME', 'value' => 'postgres', 'public' => true },
- { 'key' => 'SECRET_KEY', 'value' => 'secret_value', 'public' => false },
- { 'key' => 'TRIGGER_KEY_1', 'value' => 'TRIGGER_VALUE_1', 'public' => false }]
+ [{ 'key' => 'CI_JOB_NAME', 'value' => 'spinach', 'public' => true, 'masked' => false },
+ { 'key' => 'CI_JOB_STAGE', 'value' => 'test', 'public' => true, 'masked' => false },
+ { 'key' => 'CI_PIPELINE_TRIGGERED', 'value' => 'true', 'public' => true, 'masked' => false },
+ { 'key' => 'DB_NAME', 'value' => 'postgres', 'public' => true, 'masked' => false },
+ { 'key' => 'SECRET_KEY', 'value' => 'secret_value', 'public' => false, 'masked' => false },
+ { 'key' => 'TRIGGER_KEY_1', 'value' => 'TRIGGER_VALUE_1', 'public' => false, 'masked' => false }]
end
let(:trigger) { create(:ci_trigger, project: project) }
diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb
index 5ca442bc448..5548e3fd01a 100644
--- a/spec/requests/api/runners_spec.rb
+++ b/spec/requests/api/runners_spec.rb
@@ -90,6 +90,17 @@ describe API::Runners do
expect(response).to have_gitlab_http_status(400)
end
+
+ it 'filters runners by tag_list' do
+ create(:ci_runner, :project, description: 'Runner tagged with tag1 and tag2', projects: [project], tag_list: %w[tag1 tag2])
+ create(:ci_runner, :project, description: 'Runner tagged with tag2', projects: [project], tag_list: ['tag2'])
+
+ get api('/runners?tag_list=tag1,tag2', user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Runner tagged with tag1 and tag2')
+ ]
+ end
end
context 'unauthorized user' do
@@ -181,6 +192,17 @@ describe API::Runners do
expect(response).to have_gitlab_http_status(400)
end
+
+ it 'filters runners by tag_list' do
+ create(:ci_runner, :project, description: 'Runner tagged with tag1 and tag2', projects: [project], tag_list: %w[tag1 tag2])
+ create(:ci_runner, :project, description: 'Runner tagged with tag2', projects: [project], tag_list: ['tag2'])
+
+ get api('/runners/all?tag_list=tag1,tag2', admin)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Runner tagged with tag1 and tag2')
+ ]
+ end
end
context 'without admin privileges' do
@@ -716,6 +738,17 @@ describe API::Runners do
expect(response).to have_gitlab_http_status(400)
end
+
+ it 'filters runners by tag_list' do
+ create(:ci_runner, :project, description: 'Runner tagged with tag1 and tag2', projects: [project], tag_list: %w[tag1 tag2])
+ create(:ci_runner, :project, description: 'Runner tagged with tag2', projects: [project], tag_list: ['tag2'])
+
+ get api("/projects/#{project.id}/runners?tag_list=tag1,tag2", user)
+
+ expect(json_response).to match_array [
+ a_hash_including('description' => 'Runner tagged with tag1 and tag2')
+ ]
+ end
end
context 'authorized user without maintainer privileges' do
diff --git a/spec/requests/api/snippets_spec.rb b/spec/requests/api/snippets_spec.rb
index 7c8512f7589..d600076e9fb 100644
--- a/spec/requests/api/snippets_spec.rb
+++ b/spec/requests/api/snippets_spec.rb
@@ -84,10 +84,17 @@ describe API::Snippets do
end
describe 'GET /snippets/:id/raw' do
- let(:snippet) { create(:personal_snippet, author: user) }
+ set(:author) { create(:user) }
+ set(:snippet) { create(:personal_snippet, :private, author: author) }
+
+ it 'requires authentication' do
+ get api("/snippets/#{snippet.id}", nil)
+
+ expect(response).to have_gitlab_http_status(401)
+ end
it 'returns raw text' do
- get api("/snippets/#{snippet.id}/raw", user)
+ get api("/snippets/#{snippet.id}/raw", author)
expect(response).to have_gitlab_http_status(200)
expect(response.content_type).to eq 'text/plain'
@@ -95,38 +102,83 @@ describe API::Snippets do
end
it 'forces attachment content disposition' do
- get api("/snippets/#{snippet.id}/raw", user)
+ get api("/snippets/#{snippet.id}/raw", author)
expect(headers['Content-Disposition']).to match(/^attachment/)
end
it 'returns 404 for invalid snippet id' do
- get api("/snippets/1234/raw", user)
+ snippet.destroy
+
+ get api("/snippets/#{snippet.id}/raw", author)
expect(response).to have_gitlab_http_status(404)
expect(json_response['message']).to eq('404 Snippet Not Found')
end
+
+ it 'hides private snippets from ordinary users' do
+ get api("/snippets/#{snippet.id}/raw", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'shows internal snippets to ordinary users' do
+ internal_snippet = create(:personal_snippet, :internal, author: author)
+
+ get api("/snippets/#{internal_snippet.id}/raw", user)
+
+ expect(response).to have_gitlab_http_status(200)
+ end
end
describe 'GET /snippets/:id' do
- let(:snippet) { create(:personal_snippet, author: user) }
+ set(:admin) { create(:user, :admin) }
+ set(:author) { create(:user) }
+ set(:private_snippet) { create(:personal_snippet, :private, author: author) }
+ set(:internal_snippet) { create(:personal_snippet, :internal, author: author) }
+
+ it 'requires authentication' do
+ get api("/snippets/#{private_snippet.id}", nil)
+
+ expect(response).to have_gitlab_http_status(401)
+ end
it 'returns snippet json' do
- get api("/snippets/#{snippet.id}", user)
+ get api("/snippets/#{private_snippet.id}", author)
expect(response).to have_gitlab_http_status(200)
- expect(json_response['title']).to eq(snippet.title)
- expect(json_response['description']).to eq(snippet.description)
- expect(json_response['file_name']).to eq(snippet.file_name)
- expect(json_response['visibility']).to eq(snippet.visibility)
+ expect(json_response['title']).to eq(private_snippet.title)
+ expect(json_response['description']).to eq(private_snippet.description)
+ expect(json_response['file_name']).to eq(private_snippet.file_name)
+ expect(json_response['visibility']).to eq(private_snippet.visibility)
+ end
+
+ it 'shows private snippets to an admin' do
+ get api("/snippets/#{private_snippet.id}", admin)
+
+ expect(response).to have_gitlab_http_status(200)
+ end
+
+ it 'hides private snippets from an ordinary user' do
+ get api("/snippets/#{private_snippet.id}", user)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'shows internal snippets to an ordinary user' do
+ get api("/snippets/#{internal_snippet.id}", user)
+
+ expect(response).to have_gitlab_http_status(200)
end
it 'returns 404 for invalid snippet id' do
- get api("/snippets/1234", user)
+ private_snippet.destroy
+
+ get api("/snippets/#{private_snippet.id}", admin)
expect(response).to have_gitlab_http_status(404)
- expect(json_response['message']).to eq('404 Not found')
+ expect(json_response['message']).to eq('404 Snippet Not Found')
end
end
diff --git a/spec/requests/api/todos_spec.rb b/spec/requests/api/todos_spec.rb
index f121a1d3b78..9f0d5ad5d12 100644
--- a/spec/requests/api/todos_spec.rb
+++ b/spec/requests/api/todos_spec.rb
@@ -8,10 +8,14 @@ describe API::Todos do
let(:author_2) { create(:user) }
let(:john_doe) { create(:user, username: 'john_doe') }
let(:merge_request) { create(:merge_request, source_project: project_1) }
+ let!(:merge_request_todo) { create(:todo, project: project_1, author: author_2, user: john_doe, target: merge_request) }
let!(:pending_1) { create(:todo, :mentioned, project: project_1, author: author_1, user: john_doe) }
let!(:pending_2) { create(:todo, project: project_2, author: author_2, user: john_doe) }
let!(:pending_3) { create(:on_commit_todo, project: project_1, author: author_2, user: john_doe) }
let!(:done) { create(:todo, :done, project: project_1, author: author_1, user: john_doe) }
+ let!(:award_emoji_1) { create(:award_emoji, awardable: merge_request, user: author_1, name: 'thumbsup') }
+ let!(:award_emoji_2) { create(:award_emoji, awardable: pending_1.target, user: author_1, name: 'thumbsup') }
+ let!(:award_emoji_3) { create(:award_emoji, awardable: pending_2.target, user: author_2, name: 'thumbsdown') }
before do
project_1.add_developer(john_doe)
@@ -34,7 +38,7 @@ describe API::Todos do
expect(response.status).to eq(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.length).to eq(3)
+ expect(json_response.length).to eq(4)
expect(json_response[0]['id']).to eq(pending_3.id)
expect(json_response[0]['project']).to be_a Hash
expect(json_response[0]['author']).to be_a Hash
@@ -45,6 +49,23 @@ describe API::Todos do
expect(json_response[0]['state']).to eq('pending')
expect(json_response[0]['action_name']).to eq('assigned')
expect(json_response[0]['created_at']).to be_present
+ expect(json_response[0]['target_type']).to eq('Commit')
+
+ expect(json_response[1]['target_type']).to eq('Issue')
+ expect(json_response[1]['target']['upvotes']).to eq(0)
+ expect(json_response[1]['target']['downvotes']).to eq(1)
+ expect(json_response[1]['target']['merge_requests_count']).to eq(0)
+
+ expect(json_response[2]['target_type']).to eq('Issue')
+ expect(json_response[2]['target']['upvotes']).to eq(1)
+ expect(json_response[2]['target']['downvotes']).to eq(0)
+ expect(json_response[2]['target']['merge_requests_count']).to eq(0)
+
+ expect(json_response[3]['target_type']).to eq('MergeRequest')
+ # Only issues get a merge request count at the moment
+ expect(json_response[3]['target']['merge_requests_count']).to be_nil
+ expect(json_response[3]['target']['upvotes']).to eq(1)
+ expect(json_response[3]['target']['downvotes']).to eq(0)
end
context 'and using the author filter' do
@@ -54,7 +75,7 @@ describe API::Todos do
expect(response.status).to eq(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
+ expect(json_response.length).to eq(3)
end
end
@@ -67,7 +88,7 @@ describe API::Todos do
expect(response.status).to eq(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.length).to eq(1)
+ expect(json_response.length).to eq(2)
end
end
@@ -100,7 +121,7 @@ describe API::Todos do
expect(response.status).to eq(200)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.length).to eq(2)
+ expect(json_response.length).to eq(3)
end
end
@@ -115,6 +136,27 @@ describe API::Todos do
end
end
end
+
+ it 'avoids N+1 queries', :request_store do
+ create(:todo, project: project_1, author: author_2, user: john_doe, target: merge_request)
+
+ get api('/todos', john_doe)
+
+ control = ActiveRecord::QueryRecorder.new { get api('/todos', john_doe) }
+
+ merge_request_2 = create(:merge_request, source_project: project_2)
+ create(:todo, project: project_2, author: author_2, user: john_doe, target: merge_request_2)
+
+ project_3 = create(:project, :repository)
+ project_3.add_developer(john_doe)
+ merge_request_3 = create(:merge_request, source_project: project_3)
+ create(:todo, project: project_3, author: author_2, user: john_doe, target: merge_request_3)
+ create(:todo, :mentioned, project: project_1, author: author_1, user: john_doe)
+ create(:on_commit_todo, project: project_3, author: author_1, user: john_doe)
+
+ expect { get api('/todos', john_doe) }.not_to exceed_query_limit(control)
+ expect(response.status).to eq(200)
+ end
end
describe 'POST /todos/:id/mark_as_done' do
@@ -230,7 +272,7 @@ describe API::Todos do
context 'for a merge request' do
it_behaves_like 'an issuable', 'merge_requests' do
- let(:issuable) { merge_request }
+ let(:issuable) { create(:merge_request, :simple, source_project: project_1) }
end
end
end
diff --git a/spec/requests/api/variables_spec.rb b/spec/requests/api/variables_spec.rb
index cdac5b2f400..5df6baf0ddf 100644
--- a/spec/requests/api/variables_spec.rb
+++ b/spec/requests/api/variables_spec.rb
@@ -73,12 +73,12 @@ describe API::Variables do
context 'authorized user with proper permissions' do
it 'creates variable' do
expect do
- post api("/projects/#{project.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'VALUE_2', protected: true }
+ post api("/projects/#{project.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'PROTECTED_VALUE_2', protected: true }
end.to change {project.variables.count}.by(1)
expect(response).to have_gitlab_http_status(201)
expect(json_response['key']).to eq('TEST_VARIABLE_2')
- expect(json_response['value']).to eq('VALUE_2')
+ expect(json_response['value']).to eq('PROTECTED_VALUE_2')
expect(json_response['protected']).to be_truthy
end
diff --git a/spec/requests/api/version_spec.rb b/spec/requests/api/version_spec.rb
index 38b618191fb..e06f8bbc095 100644
--- a/spec/requests/api/version_spec.rb
+++ b/spec/requests/api/version_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
describe API::Version do
- describe 'GET /version' do
+ shared_examples_for 'GET /version' do
context 'when unauthenticated' do
it 'returns authentication error' do
get api('/version')
@@ -22,4 +22,20 @@ describe API::Version do
end
end
end
+
+ context 'with graphql enabled' do
+ before do
+ stub_feature_flags(graphql: true)
+ end
+
+ include_examples 'GET /version'
+ end
+
+ context 'with graphql disabled' do
+ before do
+ stub_feature_flags(graphql: false)
+ end
+
+ include_examples 'GET /version'
+ end
end
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 5b625fd47be..bfa178f5cae 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -104,6 +104,70 @@ describe 'Git HTTP requests' do
end
end
+ shared_examples_for 'project path without .git suffix' do
+ context "GET info/refs" do
+ let(:path) { "/#{project_path}/info/refs" }
+
+ context "when no params are added" do
+ before do
+ get path
+ end
+
+ it "redirects to the .git suffix version" do
+ expect(response).to redirect_to("/#{project_path}.git/info/refs")
+ end
+ end
+
+ context "when the upload-pack service is requested" do
+ let(:params) { { service: 'git-upload-pack' } }
+
+ before do
+ get path, params: params
+ end
+
+ it "redirects to the .git suffix version" do
+ expect(response).to redirect_to("/#{project_path}.git/info/refs?service=#{params[:service]}")
+ end
+ end
+
+ context "when the receive-pack service is requested" do
+ let(:params) { { service: 'git-receive-pack' } }
+
+ before do
+ get path, params: params
+ end
+
+ it "redirects to the .git suffix version" do
+ expect(response).to redirect_to("/#{project_path}.git/info/refs?service=#{params[:service]}")
+ end
+ end
+
+ context "when the params are anything else" do
+ let(:params) { { service: 'git-implode-pack' } }
+
+ before do
+ get path, params: params
+ end
+
+ it "redirects to the sign-in page" do
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+
+ context "POST git-upload-pack" do
+ it "fails to find a route" do
+ expect { clone_post(project_path) }.to raise_error(ActionController::RoutingError)
+ end
+ end
+
+ context "POST git-receive-pack" do
+ it "fails to find a route" do
+ expect { push_post(project_path) }.to raise_error(ActionController::RoutingError)
+ end
+ end
+ end
+
describe "User with no identities" do
let(:user) { create(:user) }
@@ -143,6 +207,10 @@ describe 'Git HTTP requests' do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
end
+
+ it_behaves_like 'project path without .git suffix' do
+ let(:project_path) { "#{user.namespace.path}/project.git-project" }
+ end
end
end
@@ -706,70 +774,8 @@ describe 'Git HTTP requests' do
end
end
- context "when the project path doesn't end in .git" do
- let(:project) { create(:project, :repository, :public, path: 'project.git-project') }
-
- context "GET info/refs" do
- let(:path) { "/#{project.full_path}/info/refs" }
-
- context "when no params are added" do
- before do
- get path
- end
-
- it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project.full_path}.git/info/refs")
- end
- end
-
- context "when the upload-pack service is requested" do
- let(:params) { { service: 'git-upload-pack' } }
-
- before do
- get path, params: params
- end
-
- it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project.full_path}.git/info/refs?service=#{params[:service]}")
- end
- end
-
- context "when the receive-pack service is requested" do
- let(:params) { { service: 'git-receive-pack' } }
-
- before do
- get path, params: params
- end
-
- it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project.full_path}.git/info/refs?service=#{params[:service]}")
- end
- end
-
- context "when the params are anything else" do
- let(:params) { { service: 'git-implode-pack' } }
-
- before do
- get path, params: params
- end
-
- it "redirects to the sign-in page" do
- expect(response).to redirect_to(new_user_session_path)
- end
- end
- end
-
- context "POST git-upload-pack" do
- it "fails to find a route" do
- expect { clone_post(project.full_path) }.to raise_error(ActionController::RoutingError)
- end
- end
-
- context "POST git-receive-pack" do
- it "fails to find a route" do
- expect { push_post(project.full_path) }.to raise_error(ActionController::RoutingError)
- end
- end
+ it_behaves_like 'project path without .git suffix' do
+ let(:project_path) { create(:project, :repository, :public, path: 'project.git-project').full_path }
end
context "retrieving an info/refs file" do
diff --git a/spec/serializers/merge_request_for_pipeline_entity_spec.rb b/spec/serializers/merge_request_for_pipeline_entity_spec.rb
new file mode 100644
index 00000000000..e49b45bc7d7
--- /dev/null
+++ b/spec/serializers/merge_request_for_pipeline_entity_spec.rb
@@ -0,0 +1,29 @@
+require 'spec_helper'
+
+describe MergeRequestForPipelineEntity do
+ let(:project) { create(:project, :repository) }
+ let(:user) { create(:user) }
+ let(:request) { EntityRequest.new(project: project) }
+ let(:merge_request) { create(:merge_request, target_project: project, source_project: project) }
+ let(:presenter) { MergeRequestPresenter.new(merge_request, current_user: user) }
+
+ let(:entity) do
+ described_class.new(presenter, request: request)
+ end
+
+ before do
+ project.add_developer(user)
+ end
+
+ context 'as json' do
+ subject { entity.as_json }
+
+ it 'exposes needed attributes' do
+ expect(subject).to include(
+ :iid, :path, :title,
+ :source_branch, :source_branch_path,
+ :target_branch, :target_branch_path
+ )
+ end
+ end
+end
diff --git a/spec/serializers/pipeline_entity_spec.rb b/spec/serializers/pipeline_entity_spec.rb
index 774486dcb6d..11040862129 100644
--- a/spec/serializers/pipeline_entity_spec.rb
+++ b/spec/serializers/pipeline_entity_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
describe PipelineEntity do
+ include Gitlab::Routing
+
set(:user) { create(:user) }
let(:request) { double('request') }
@@ -128,5 +130,48 @@ describe PipelineEntity do
.to eq 'CI/CD YAML configuration error!'
end
end
+
+ context 'when pipeline is detached merge request pipeline' do
+ let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
+ let(:project) { merge_request.target_project }
+ let(:pipeline) { merge_request.merge_request_pipelines.first }
+
+ it 'makes detached flag true' do
+ expect(subject[:flags][:detached]).to be_truthy
+ end
+
+ context 'when user is a developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'has merge request information' do
+ expect(subject[:merge_request][:iid]).to eq(merge_request.iid)
+
+ expect(project_merge_request_path(project, merge_request))
+ .to include(subject[:merge_request][:path])
+
+ expect(subject[:merge_request][:title]).to eq(merge_request.title)
+
+ expect(subject[:merge_request][:source_branch])
+ .to eq(merge_request.source_branch)
+
+ expect(project_branch_path(project, merge_request.source_branch))
+ .to include(subject[:merge_request][:source_branch_path])
+
+ expect(subject[:merge_request][:target_branch])
+ .to eq(merge_request.target_branch)
+
+ expect(project_branch_path(project, merge_request.target_branch))
+ .to include(subject[:merge_request][:target_branch_path])
+ end
+ end
+
+ context 'when user is an external user' do
+ it 'has no merge request information' do
+ expect(subject[:merge_request]).to be_nil
+ end
+ end
+ end
end
end
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 2bdcb2a45f6..a21487938a0 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -97,6 +97,44 @@ describe PipelineSerializer do
end
end
+ context 'when there are pipelines for merge requests' do
+ let(:resource) { Ci::Pipeline.all }
+
+ let!(:merge_request_1) do
+ create(:merge_request,
+ :with_merge_request_pipeline,
+ target_project: project,
+ target_branch: 'master',
+ source_project: project,
+ source_branch: 'feature-1')
+ end
+
+ let!(:merge_request_2) do
+ create(:merge_request,
+ :with_merge_request_pipeline,
+ target_project: project,
+ target_branch: 'master',
+ source_project: project,
+ source_branch: 'feature-2')
+ end
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'includes merge requests information' do
+ expect(subject.all? { |entry| entry[:merge_request].present? }).to be_truthy
+ end
+
+ it 'preloads related merge requests', :postgresql do
+ recorded = ActiveRecord::QueryRecorder.new { subject }
+
+ expect(recorded.log)
+ .to include("SELECT \"merge_requests\".* FROM \"merge_requests\" " \
+ "WHERE \"merge_requests\".\"id\" IN (#{merge_request_1.id}, #{merge_request_2.id})")
+ end
+ end
+
describe 'number of queries when preloaded' do
subject { serializer.represent(resource, preload: true) }
let(:resource) { Ci::Pipeline.all }
diff --git a/spec/serializers/provider_repo_entity_spec.rb b/spec/serializers/provider_repo_entity_spec.rb
index b67115bab10..9a1160d16d5 100644
--- a/spec/serializers/provider_repo_entity_spec.rb
+++ b/spec/serializers/provider_repo_entity_spec.rb
@@ -13,7 +13,7 @@ describe ProviderRepoEntity do
describe '#as_json' do
subject { entity.as_json }
- it 'includes requried fields' do
+ it 'includes required fields' do
expect(subject[:id]).to eq(provider_repo[:id])
expect(subject[:full_name]).to eq(provider_repo[:full_name])
expect(subject[:owner_name]).to eq(provider_repo[:owner][:login])
diff --git a/spec/services/boards/visits/latest_service_spec.rb b/spec/services/boards/visits/latest_service_spec.rb
index e55d599e2cc..c8a0a5e4243 100644
--- a/spec/services/boards/visits/latest_service_spec.rb
+++ b/spec/services/boards/visits/latest_service_spec.rb
@@ -23,6 +23,12 @@ describe Boards::Visits::LatestService do
service.execute
end
+
+ it 'queries for last N visits' do
+ expect(BoardProjectRecentVisit).to receive(:latest).with(user, project, count: 5).once
+
+ described_class.new(project_board.parent, user, count: 5).execute
+ end
end
context 'when a group board' do
@@ -42,6 +48,12 @@ describe Boards::Visits::LatestService do
service.execute
end
+
+ it 'queries for last N visits' do
+ expect(BoardGroupRecentVisit).to receive(:latest).with(user, group, count: 5).once
+
+ described_class.new(group_board.parent, user, count: 5).execute
+ end
end
end
end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 93349ba7b5b..24707cd2d41 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -701,7 +701,7 @@ describe Ci::CreatePipelineService do
let(:target_sha) { nil }
context 'when source is merge request' do
- let(:source) { :merge_request }
+ let(:source) { :merge_request_event }
context "when config has merge_requests keywords" do
let(:config) do
@@ -734,7 +734,7 @@ describe Ci::CreatePipelineService do
it 'creates a merge request pipeline' do
expect(pipeline).to be_persisted
- expect(pipeline).to be_merge_request
+ expect(pipeline).to be_merge_request_event
expect(pipeline.merge_request).to eq(merge_request)
expect(pipeline.builds.order(:stage_id).map(&:name)).to eq(%w[test])
end
diff --git a/spec/services/clusters/applications/patch_service_spec.rb b/spec/services/clusters/applications/patch_service_spec.rb
new file mode 100644
index 00000000000..d4ee3243b84
--- /dev/null
+++ b/spec/services/clusters/applications/patch_service_spec.rb
@@ -0,0 +1,128 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Applications::PatchService do
+ describe '#execute' do
+ let(:application) { create(:clusters_applications_knative, :scheduled) }
+ let!(:update_command) { application.update_command }
+ let(:service) { described_class.new(application) }
+ let(:helm_client) { instance_double(Gitlab::Kubernetes::Helm::Api) }
+
+ before do
+ allow(service).to receive(:update_command).and_return(update_command)
+ allow(service).to receive(:helm_api).and_return(helm_client)
+ end
+
+ context 'when there are no errors' do
+ before do
+ expect(helm_client).to receive(:update).with(update_command)
+ allow(ClusterWaitForAppInstallationWorker).to receive(:perform_in).and_return(nil)
+ end
+
+ it 'make the application updating' do
+ expect(application.cluster).not_to be_nil
+ service.execute
+
+ expect(application).to be_updating
+ end
+
+ it 'schedule async installation status check' do
+ expect(ClusterWaitForAppInstallationWorker).to receive(:perform_in).once
+
+ service.execute
+ end
+ end
+
+ context 'when kubernetes cluster communication fails' do
+ let(:error) { Kubeclient::HttpError.new(500, 'system failure', nil) }
+
+ before do
+ expect(helm_client).to receive(:update).with(update_command).and_raise(error)
+ end
+
+ it 'make the application errored' do
+ service.execute
+
+ expect(application).to be_update_errored
+ expect(application.status_reason).to match('Kubernetes error: 500')
+ end
+
+ it 'logs errors' do
+ expect(service.send(:logger)).to receive(:error).with(
+ {
+ exception: 'Kubeclient::HttpError',
+ message: 'system failure',
+ service: 'Clusters::Applications::PatchService',
+ app_id: application.id,
+ project_ids: application.cluster.project_ids,
+ group_ids: [],
+ error_code: 500
+ }
+ )
+
+ expect(Gitlab::Sentry).to receive(:track_acceptable_exception).with(
+ error,
+ extra: {
+ exception: 'Kubeclient::HttpError',
+ message: 'system failure',
+ service: 'Clusters::Applications::PatchService',
+ app_id: application.id,
+ project_ids: application.cluster.project_ids,
+ group_ids: [],
+ error_code: 500
+ }
+ )
+
+ service.execute
+ end
+ end
+
+ context 'a non kubernetes error happens' do
+ let(:application) { create(:clusters_applications_knative, :scheduled) }
+ let(:error) { StandardError.new('something bad happened') }
+
+ before do
+ expect(application).to receive(:make_updating!).once.and_raise(error)
+ end
+
+ it 'make the application errored' do
+ expect(helm_client).not_to receive(:update)
+
+ service.execute
+
+ expect(application).to be_update_errored
+ expect(application.status_reason).to eq("Can't start update process.")
+ end
+
+ it 'logs errors' do
+ expect(service.send(:logger)).to receive(:error).with(
+ {
+ exception: 'StandardError',
+ error_code: nil,
+ message: 'something bad happened',
+ service: 'Clusters::Applications::PatchService',
+ app_id: application.id,
+ project_ids: application.cluster.projects.pluck(:id),
+ group_ids: []
+ }
+ )
+
+ expect(Gitlab::Sentry).to receive(:track_acceptable_exception).with(
+ error,
+ extra: {
+ exception: 'StandardError',
+ error_code: nil,
+ message: 'something bad happened',
+ service: 'Clusters::Applications::PatchService',
+ app_id: application.id,
+ project_ids: application.cluster.projects.pluck(:id),
+ group_ids: []
+ }
+ )
+
+ service.execute
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/applications/update_service_spec.rb b/spec/services/clusters/applications/update_service_spec.rb
new file mode 100644
index 00000000000..2d299882af0
--- /dev/null
+++ b/spec/services/clusters/applications/update_service_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Clusters::Applications::UpdateService do
+ include TestRequestHelpers
+
+ let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+ let(:user) { create(:user) }
+ let(:params) { { application: 'knative', hostname: 'udpate.example.com' } }
+ let(:service) { described_class.new(cluster, user, params) }
+
+ subject { service.execute(test_request) }
+
+ describe '#execute' do
+ before do
+ allow(ClusterPatchAppWorker).to receive(:perform_async)
+ end
+
+ context 'application is not installed' do
+ it 'raises Clusters::Applications::BaseService::InvalidApplicationError' do
+ expect(ClusterPatchAppWorker).not_to receive(:perform_async)
+
+ expect { subject }
+ .to raise_exception { Clusters::Applications::BaseService::InvalidApplicationError }
+ .and not_change { Clusters::Applications::Knative.count }
+ .and not_change { Clusters::Applications::Knative.with_status(:scheduled).count }
+ end
+ end
+
+ context 'application is installed' do
+ context 'application is schedulable' do
+ let!(:application) do
+ create(:clusters_applications_knative, status: 3, cluster: cluster)
+ end
+
+ it 'updates the application data' do
+ expect do
+ subject
+ end.to change { application.reload.hostname }.to(params[:hostname])
+ end
+
+ it 'makes application scheduled!' do
+ subject
+
+ expect(application.reload).to be_scheduled
+ end
+
+ it 'schedules ClusterPatchAppWorker' do
+ expect(ClusterPatchAppWorker).to receive(:perform_async)
+
+ subject
+ end
+ end
+
+ context 'application is not schedulable' do
+ let!(:application) do
+ create(:clusters_applications_knative, status: 4, cluster: cluster)
+ end
+
+ it 'raises StateMachines::InvalidTransition' do
+ expect(ClusterPatchAppWorker).not_to receive(:perform_async)
+
+ expect { subject }
+ .to raise_exception { StateMachines::InvalidTransition }
+ .and not_change { application.reload.hostname }
+ .and not_change { Clusters::Applications::Knative.with_status(:scheduled).count }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/error_tracking/list_projects_service_spec.rb b/spec/services/error_tracking/list_projects_service_spec.rb
index 9f25a633deb..a92d3376f7b 100644
--- a/spec/services/error_tracking/list_projects_service_spec.rb
+++ b/spec/services/error_tracking/list_projects_service_spec.rb
@@ -32,7 +32,7 @@ describe ErrorTracking::ListProjectsService do
end
context 'set model attributes to new values' do
- let(:new_api_url) { new_api_host + 'api/0/projects/' }
+ let(:new_api_url) { new_api_host + 'api/0/projects/org/proj/' }
before do
expect(error_tracking_setting).to receive(:list_sentry_projects)
@@ -121,7 +121,7 @@ describe ErrorTracking::ListProjectsService do
context 'error_tracking_setting is nil' do
let(:error_tracking_setting) { build(:project_error_tracking_setting) }
- let(:new_api_url) { new_api_host + 'api/0/projects/' }
+ let(:new_api_url) { new_api_host + 'api/0/projects/org/proj/' }
before do
expect(project).to receive(:build_error_tracking_setting).once
diff --git a/spec/services/files/multi_service_spec.rb b/spec/services/files/multi_service_spec.rb
index 84c48d63c64..6842fa9f435 100644
--- a/spec/services/files/multi_service_spec.rb
+++ b/spec/services/files/multi_service_spec.rb
@@ -235,6 +235,22 @@ describe Files::MultiService do
expect(blob).to be_present
end
end
+
+ context 'when force is set to true and branch already exists' do
+ let(:commit_params) do
+ {
+ commit_message: commit_message,
+ branch_name: 'feature',
+ start_branch: 'master',
+ actions: actions,
+ force: true
+ }
+ end
+
+ it 'is still a success' do
+ expect(subject.execute[:status]).to eq(:success)
+ end
+ end
end
def update_file(path)
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 6b48c993c57..79d504b9b45 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -410,5 +410,34 @@ describe Groups::TransferService, :postgresql do
end
end
end
+
+ context 'when transferring a subgroup into root group' do
+ let(:group) { create(:group, :public, :nested) }
+ let(:subgroup) { create(:group, :public, parent: group) }
+ let(:transfer_service) { described_class.new(subgroup, user) }
+
+ it 'ensures there is still an owner for the transferred group' do
+ expect(subgroup.owners).to be_empty
+
+ transfer_service.execute(nil)
+ subgroup.reload
+
+ expect(subgroup.owners).to match_array(user)
+ end
+
+ context 'when group has explicit owner' do
+ let(:another_owner) { create(:user) }
+ let!(:another_member) { create(:group_member, :owner, group: subgroup, user: another_owner) }
+
+ it 'does not add additional owner' do
+ expect(subgroup.owners).to match_array(another_owner)
+
+ transfer_service.execute(nil)
+ subgroup.reload
+
+ expect(subgroup.owners).to match_array(another_owner)
+ end
+ end
+ end
end
end
diff --git a/spec/services/issuable/common_system_notes_service_spec.rb b/spec/services/issuable/common_system_notes_service_spec.rb
index fa5d5ebac5c..0edc9016c96 100644
--- a/spec/services/issuable/common_system_notes_service_spec.rb
+++ b/spec/services/issuable/common_system_notes_service_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe Issuable::CommonSystemNotesService do
let(:user) { create(:user) }
let(:project) { create(:project) }
- let(:issuable) { create(:issue) }
+ let(:issuable) { create(:issue, project: project) }
context 'on issuable update' do
it_behaves_like 'system note creation', { title: 'New title' }, 'changed title'
@@ -70,7 +70,7 @@ describe Issuable::CommonSystemNotesService do
end
context 'on issuable create' do
- let(:issuable) { build(:issue) }
+ let(:issuable) { build(:issue, project: project) }
subject { described_class.new(project, user).execute(issuable, old_labels: [], is_update: false) }
diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb
index 248e7d5a389..86e58fe06b9 100644
--- a/spec/services/issues/build_service_spec.rb
+++ b/spec/services/issues/build_service_spec.rb
@@ -8,29 +8,29 @@ describe Issues::BuildService do
project.add_developer(user)
end
+ def build_issue(issue_params = {})
+ described_class.new(project, user, issue_params).execute
+ end
+
context 'for a single discussion' do
describe '#execute' do
let(:merge_request) { create(:merge_request, title: "Hello world", source_project: project) }
let(:discussion) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, note: "Almost done").to_discussion }
- let(:service) { described_class.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid, discussion_to_resolve: discussion.id) }
- it 'references the noteable title in the issue title' do
- issue = service.execute
+ subject { build_issue(merge_request_to_resolve_discussions_of: merge_request.iid, discussion_to_resolve: discussion.id) }
- expect(issue.title).to include('Hello world')
+ it 'references the noteable title in the issue title' do
+ expect(subject.title).to include('Hello world')
end
it 'adds the note content to the description' do
- issue = service.execute
-
- expect(issue.description).to include('Almost done')
+ expect(subject.description).to include('Almost done')
end
end
end
context 'for discussions in a merge request' do
let(:merge_request) { create(:merge_request_with_diff_notes, source_project: project) }
- let(:issue) { described_class.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid).execute }
describe '#items_for_discussions' do
it 'has an item for each discussion' do
@@ -66,28 +66,30 @@ describe Issues::BuildService do
end
describe '#execute' do
- it 'has the merge request reference in the title' do
- expect(issue.title).to include(merge_request.title)
- end
+ let(:base_params) { { merge_request_to_resolve_discussions_of: merge_request.iid } }
- it 'has the reference of the merge request in the description' do
- expect(issue.description).to include(merge_request.to_reference)
+ context 'without additional params' do
+ subject { build_issue(base_params) }
+
+ it 'has the merge request reference in the title' do
+ expect(subject.title).to include(merge_request.title)
+ end
+
+ it 'has the reference of the merge request in the description' do
+ expect(subject.description).to include(merge_request.to_reference)
+ end
end
- it 'does not assign title when a title was given' do
- issue = described_class.new(project, user,
- merge_request_to_resolve_discussions_of: merge_request,
- title: 'What an issue').execute
+ it 'uses provided title if title param given' do
+ issue = build_issue(base_params.merge(title: 'What an issue'))
expect(issue.title).to eq('What an issue')
end
- it 'does not assign description when a description was given' do
- issue = described_class.new(project, user,
- merge_request_to_resolve_discussions_of: merge_request,
- description: 'Fix at your earliest conveignance').execute
+ it 'uses provided description if description param given' do
+ issue = build_issue(base_params.merge(description: 'Fix at your earliest convenience'))
- expect(issue.description).to eq('Fix at your earliest conveignance')
+ expect(issue.description).to eq('Fix at your earliest convenience')
end
describe 'with multiple discussions' do
@@ -96,20 +98,20 @@ describe Issues::BuildService do
it 'mentions all the authors in the description' do
authors = merge_request.resolvable_discussions.map(&:author)
- expect(issue.description).to include(*authors.map(&:to_reference))
+ expect(build_issue(base_params).description).to include(*authors.map(&:to_reference))
end
it 'has a link for each unresolved discussion in the description' do
notes = merge_request.resolvable_discussions.map(&:first_note)
links = notes.map { |note| Gitlab::UrlBuilder.build(note) }
- expect(issue.description).to include(*links)
+ expect(build_issue(base_params).description).to include(*links)
end
it 'mentions additional notes' do
create_list(:diff_note_on_merge_request, 2, noteable: merge_request, project: merge_request.target_project, in_reply_to: diff_note)
- expect(issue.description).to include('(+2 comments)')
+ expect(build_issue(base_params).description).to include('(+2 comments)')
end
end
end
@@ -120,7 +122,7 @@ describe Issues::BuildService do
describe '#execute' do
it 'mentions the merge request in the description' do
- issue = described_class.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid).execute
+ issue = build_issue(merge_request_to_resolve_discussions_of: merge_request.iid)
expect(issue.description).to include("Review the conversation in #{merge_request.to_reference}")
end
@@ -128,20 +130,18 @@ describe Issues::BuildService do
end
describe '#execute' do
- let(:milestone) { create(:milestone, project: project) }
-
it 'builds a new issues with given params' do
- issue = described_class.new(
- project,
- user,
- title: 'Issue #1',
- description: 'Issue description',
- milestone_id: milestone.id
- ).execute
-
- expect(issue.title).to eq('Issue #1')
- expect(issue.description).to eq('Issue description')
+ milestone = create(:milestone, project: project)
+ issue = build_issue(milestone_id: milestone.id)
+
expect(issue.milestone).to eq(milestone)
end
+
+ it 'sets milestone to nil if it is not available for the project' do
+ milestone = create(:milestone, project: create(:project))
+ issue = build_issue(milestone_id: milestone.id)
+
+ expect(issue.milestone).to be_nil
+ end
end
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 931e47d3a77..f1684209729 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -356,7 +356,7 @@ describe Issues::UpdateService, :mailer do
it_behaves_like 'system notes for milestones'
it 'sends notifications for subscribers of changed milestone' do
- issue.milestone = create(:milestone)
+ issue.milestone = create(:milestone, project: project)
issue.save
@@ -380,7 +380,7 @@ describe Issues::UpdateService, :mailer do
end
it 'marks todos as done' do
- update_issue(milestone: create(:milestone))
+ update_issue(milestone: create(:milestone, project: project))
expect(todo.reload.done?).to eq true
end
@@ -389,7 +389,7 @@ describe Issues::UpdateService, :mailer do
it 'sends notifications for subscribers of changed milestone' do
perform_enqueued_jobs do
- update_issue(milestone: create(:milestone))
+ update_issue(milestone: create(:milestone, project: project))
end
should_email(subscriber)
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index 536d0d345a4..057e8137a4e 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -229,6 +229,15 @@ describe MergeRequests::BuildService do
end
end
end
+
+ context 'when a milestone is from another project' do
+ let(:milestone) { create(:milestone, project: create(:project)) }
+ let(:milestone_id) { milestone.id }
+
+ it 'sets milestone to nil' do
+ expect(merge_request.milestone).to be_nil
+ end
+ end
end
end
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index b46aa65818d..a04a4d5fc36 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -194,7 +194,7 @@ describe MergeRequests::CreateService do
merge_request.reload
expect(merge_request.merge_request_pipelines.count).to eq(1)
- expect(merge_request.actual_head_pipeline).to be_merge_request
+ expect(merge_request.actual_head_pipeline).to be_merge_request_event
end
context 'when there are no commits between source branch and target branch' do
@@ -226,7 +226,7 @@ describe MergeRequests::CreateService do
end
it 'sets the latest merge request pipeline as the head pipeline' do
- expect(merge_request.actual_head_pipeline).to be_merge_request
+ expect(merge_request.actual_head_pipeline).to be_merge_request_event
end
end
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index ede79b87bcc..9d674263259 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -244,7 +244,7 @@ describe MergeRequests::MergeService do
service.execute(merge_request)
- expect(merge_request.merge_error).to include('Something went wrong during merge pre-receive hook')
+ expect(merge_request.merge_error).to include("Something went wrong during merge pre-receive hook: #{error_message}")
expect(Rails.logger).to have_received(:error).with(a_string_matching(error_message))
end
diff --git a/spec/services/merge_requests/merge_to_ref_service_spec.rb b/spec/services/merge_requests/merge_to_ref_service_spec.rb
index 96f2fde7117..fabca8f6b4a 100644
--- a/spec/services/merge_requests/merge_to_ref_service_spec.rb
+++ b/spec/services/merge_requests/merge_to_ref_service_spec.rb
@@ -19,27 +19,7 @@ describe MergeRequests::MergeToRefService do
end
end
- set(:user) { create(:user) }
- let(:merge_request) { create(:merge_request, :simple) }
- let(:project) { merge_request.project }
-
- before do
- project.add_maintainer(user)
- end
-
- describe '#execute' do
- let(:service) do
- described_class.new(project, user,
- commit_message: 'Awesome message',
- 'should_remove_source_branch' => true)
- end
-
- def process_merge_to_ref
- perform_enqueued_jobs do
- service.execute(merge_request)
- end
- end
-
+ shared_examples_for 'successfully merges to ref with merge method' do
it 'writes commit to merge ref' do
repository = project.repository
target_ref = merge_request.merge_ref_path
@@ -52,9 +32,31 @@ describe MergeRequests::MergeToRefService do
expect(result[:status]).to eq(:success)
expect(result[:commit_id]).to be_present
+ expect(result[:source_id]).to eq(merge_request.source_branch_sha)
+ expect(result[:target_id]).to eq(merge_request.target_branch_sha)
expect(repository.ref_exists?(target_ref)).to be(true)
expect(ref_head.id).to eq(result[:commit_id])
end
+ end
+
+ shared_examples_for 'successfully evaluates pre-condition checks' do
+ it 'returns error when feature is disabled' do
+ stub_feature_flags(merge_to_tmp_merge_ref_path: false)
+
+ result = service.execute(merge_request)
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Feature is not enabled')
+ end
+
+ it 'returns an error when the failing to process the merge' do
+ allow(project.repository).to receive(:merge_to_ref).and_return(nil)
+
+ result = service.execute(merge_request)
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Conflicts detected during merge')
+ end
it 'does not send any mail' do
expect { process_merge_to_ref }.not_to change { ActionMailer::Base.deliveries.count }
@@ -73,25 +75,31 @@ describe MergeRequests::MergeToRefService do
process_merge_to_ref
end
+ end
- it 'returns error when feature is disabled' do
- stub_feature_flags(merge_to_tmp_merge_ref_path: false)
+ set(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request, :simple) }
+ let(:project) { merge_request.project }
- result = service.execute(merge_request)
+ before do
+ project.add_maintainer(user)
+ end
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Feature is not enabled')
+ describe '#execute' do
+ let(:service) do
+ described_class.new(project, user, commit_message: 'Awesome message',
+ should_remove_source_branch: true)
end
- it 'returns an error when the failing to process the merge' do
- allow(project.repository).to receive(:merge_to_ref).and_return(nil)
-
- result = service.execute(merge_request)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Conflicts detected during merge')
+ def process_merge_to_ref
+ perform_enqueued_jobs do
+ service.execute(merge_request)
+ end
end
+ it_behaves_like 'successfully merges to ref with merge method'
+ it_behaves_like 'successfully evaluates pre-condition checks'
+
context 'commit history comparison with regular MergeService' do
let(:merge_ref_service) do
described_class.new(project, user, {})
@@ -122,29 +130,15 @@ describe MergeRequests::MergeToRefService do
context 'when semi-linear merge method' do
let(:merge_method) { :rebase_merge }
- it 'return error when MR should be able to fast-forward' do
- allow(merge_request).to receive(:should_be_rebased?) { true }
-
- error_message = 'Fast-forward merge is not possible. Please update your source branch.'
-
- result = service.execute(merge_request)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq(error_message)
- end
+ it_behaves_like 'successfully merges to ref with merge method'
+ it_behaves_like 'successfully evaluates pre-condition checks'
end
context 'when fast-forward merge method' do
let(:merge_method) { :ff }
- it 'returns error' do
- error_message = "Fast-forward to #{merge_request.merge_ref_path} is currently not supported."
-
- result = service.execute(merge_request)
-
- expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq(error_message)
- end
+ it_behaves_like 'successfully merges to ref with merge method'
+ it_behaves_like 'successfully evaluates pre-condition checks'
end
context 'when MR is not mergeable to ref' do
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 9e9dc5a576c..43ceb1dcbee 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -173,12 +173,12 @@ describe MergeRequests::RefreshService do
it 'sets the latest merge request pipeline as a head pipeline' do
@merge_request.reload
- expect(@merge_request.actual_head_pipeline).to be_merge_request
+ expect(@merge_request.actual_head_pipeline).to be_merge_request_event
end
it 'returns pipelines in correct order' do
@merge_request.reload
- expect(@merge_request.all_pipelines.first).to be_merge_request
+ expect(@merge_request.all_pipelines.first).to be_merge_request_event
expect(@merge_request.all_pipelines.second).to be_push
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 20580bf14b9..8e367db031c 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -328,7 +328,7 @@ describe MergeRequests::UpdateService, :mailer do
it_behaves_like 'system notes for milestones'
it 'sends notifications for subscribers of changed milestone' do
- merge_request.milestone = create(:milestone)
+ merge_request.milestone = create(:milestone, project: project)
merge_request.save
@@ -352,7 +352,7 @@ describe MergeRequests::UpdateService, :mailer do
end
it 'marks pending todos as done' do
- update_merge_request({ milestone: create(:milestone) })
+ update_merge_request({ milestone: create(:milestone, project: project) })
expect(pending_todo.reload).to be_done
end
@@ -361,7 +361,7 @@ describe MergeRequests::UpdateService, :mailer do
it 'sends notifications for subscribers of changed milestone' do
perform_enqueued_jobs do
- update_merge_request(milestone: create(:milestone))
+ update_merge_request(milestone: create(:milestone, project: project))
end
should_email(subscriber)
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 1645b67c329..8d8e81173ff 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -220,6 +220,19 @@ describe Notes::CreateService do
expect(note.note).to eq "HELLO\nWORLD"
end
end
+
+ context 'when note only have commands' do
+ it 'adds commands applied message to note errors' do
+ note_text = %(/close)
+ service = double(:service)
+ allow(Issues::UpdateService).to receive(:new).and_return(service)
+ expect(service).to receive(:execute)
+
+ note = described_class.new(project, user, opts.merge(note: note_text)).execute
+
+ expect(note.errors[:commands_only]).to be_present
+ end
+ end
end
context 'as a user who cannot update the target' do
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index 14d62763a5b..7d2b6d5b8a7 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -28,8 +28,8 @@ describe Notes::QuickActionsService do
end
it 'closes noteable, sets labels, assigns, and sets milestone to noteable, and leave no note' do
- content, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ content, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(content).to eq ''
expect(note.noteable).to be_closed
@@ -47,8 +47,8 @@ describe Notes::QuickActionsService do
let(:note_text) { '/reopen' }
it 'opens the noteable, and leave no note' do
- content, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ content, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(content).to eq ''
expect(note.noteable).to be_open
@@ -59,8 +59,8 @@ describe Notes::QuickActionsService do
let(:note_text) { '/spend 1h' }
it 'updates the spent time on the noteable' do
- content, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ content, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(content).to eq ''
expect(note.noteable.time_spent).to eq(3600)
@@ -75,8 +75,8 @@ describe Notes::QuickActionsService do
end
it 'closes noteable, sets labels, assigns, and sets milestone to noteable' do
- content, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ content, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(content).to eq "HELLO\nWORLD"
expect(note.noteable).to be_closed
@@ -94,8 +94,8 @@ describe Notes::QuickActionsService do
let(:note_text) { "HELLO\n/reopen\nWORLD" }
it 'opens the noteable' do
- content, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ content, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(content).to eq "HELLO\nWORLD"
expect(note.noteable).to be_open
@@ -190,8 +190,8 @@ describe Notes::QuickActionsService do
end
it 'adds only one assignee from the list' do
- _, command_params = service.extract_commands(note)
- service.execute(command_params, note)
+ _, update_params = service.execute(note)
+ service.apply_updates(update_params, note)
expect(note.noteable.assignees.count).to eq(1)
end
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 6a5a6989607..9ba4a11104a 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -177,7 +177,7 @@ describe NotificationService, :mailer do
end
end
- context 'when recieving a non-existent method' do
+ context 'when receiving a non-existent method' do
it 'raises NoMethodError' do
expect { async.foo(key) }.to raise_error(NoMethodError)
end
diff --git a/spec/services/projects/group_links/create_service_spec.rb b/spec/services/projects/group_links/create_service_spec.rb
index ffb270d277e..68fd82b4cbe 100644
--- a/spec/services/projects/group_links/create_service_spec.rb
+++ b/spec/services/projects/group_links/create_service_spec.rb
@@ -12,6 +12,10 @@ describe Projects::GroupLinks::CreateService, '#execute' do
end
let(:subject) { described_class.new(project, user, opts) }
+ before do
+ group.add_developer(user)
+ end
+
it 'adds group to project' do
expect { subject.execute(group) }.to change { project.project_group_links.count }.from(0).to(1)
end
@@ -19,4 +23,8 @@ describe Projects::GroupLinks::CreateService, '#execute' do
it 'returns false if group is blank' do
expect { subject.execute(nil) }.not_to change { project.project_group_links.count }
end
+
+ it 'returns error if user is not allowed to share with a group' do
+ expect { subject.execute(create :group) }.not_to change { project.project_group_links.count }
+ end
end
diff --git a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
index 61dbb57ec08..639dd930618 100644
--- a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
@@ -70,10 +70,10 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
FileUtils.mkdir_p(base_path(hashed_storage))
end
- it 'raises AttachmentMigrationError' do
+ it 'raises AttachmentCannotMoveError' do
expect(FileUtils).not_to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage))
- expect { service.execute }.to raise_error(Projects::HashedStorage::AttachmentMigrationError)
+ expect { service.execute }.to raise_error(Projects::HashedStorage::AttachmentCannotMoveError)
end
end
end
@@ -86,6 +86,8 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
context '#new_disk_path' do
it 'returns new disk_path for project' do
+ service.execute
+
expect(service.new_disk_path).to eq(project.disk_path)
end
end
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
index 0772dc4b85b..e77e2198439 100644
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
@@ -28,7 +28,17 @@ describe Projects::HashedStorage::MigrateRepositoryService do
it 'fails when a git operation is in progress' do
allow(project).to receive(:repo_reference_count) { 1 }
- expect { service.execute }.to raise_error(Projects::HashedStorage::RepositoryMigrationError)
+ expect { service.execute }.to raise_error(Projects::HashedStorage::RepositoryInUseError)
+ end
+ end
+
+ context 'when repository doesnt exist on disk' do
+ let(:project) { create(:project, :legacy_storage) }
+
+ it 'skips the disk change but increase the version' do
+ service.execute
+
+ expect(project.hashed_storage?(:repository)).to be_truthy
end
end
diff --git a/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb b/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb
new file mode 100644
index 00000000000..6f4154d6011
--- /dev/null
+++ b/spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::HashedStorage::RollbackAttachmentsService do
+ subject(:service) { described_class.new(project, logger: nil) }
+
+ let(:project) { create(:project, :repository, skip_disk_validation: true) }
+ let(:legacy_storage) { Storage::LegacyProject.new(project) }
+ let(:hashed_storage) { Storage::HashedProject.new(project) }
+
+ let!(:upload) { Upload.find_by(path: file_uploader.upload_path) }
+ let(:file_uploader) { build(:file_uploader, project: project) }
+ let(:old_disk_path) { File.join(base_path(hashed_storage), upload.path) }
+ let(:new_disk_path) { File.join(base_path(legacy_storage), upload.path) }
+
+ context '#execute' do
+ context 'when succeeds' do
+ it 'moves attachments to legacy storage layout' do
+ expect(File.file?(old_disk_path)).to be_truthy
+ expect(File.file?(new_disk_path)).to be_falsey
+ expect(File.exist?(base_path(hashed_storage))).to be_truthy
+ expect(File.exist?(base_path(legacy_storage))).to be_falsey
+ expect(FileUtils).to receive(:mv).with(base_path(hashed_storage), base_path(legacy_storage)).and_call_original
+
+ service.execute
+
+ expect(File.exist?(base_path(legacy_storage))).to be_truthy
+ expect(File.exist?(base_path(hashed_storage))).to be_falsey
+ expect(File.file?(old_disk_path)).to be_falsey
+ expect(File.file?(new_disk_path)).to be_truthy
+ end
+
+ it 'returns true' do
+ expect(service.execute).to be_truthy
+ end
+
+ it 'sets skipped to false' do
+ service.execute
+
+ expect(service.skipped?).to be_falsey
+ end
+ end
+
+ context 'when original folder does not exist anymore' do
+ before do
+ FileUtils.rm_rf(base_path(hashed_storage))
+ end
+
+ it 'skips moving folders and go to next' do
+ expect(FileUtils).not_to receive(:mv).with(base_path(hashed_storage), base_path(legacy_storage))
+
+ service.execute
+
+ expect(File.exist?(base_path(legacy_storage))).to be_falsey
+ expect(File.file?(new_disk_path)).to be_falsey
+ end
+
+ it 'returns true' do
+ expect(service.execute).to be_truthy
+ end
+
+ it 'sets skipped to true' do
+ service.execute
+
+ expect(service.skipped?).to be_truthy
+ end
+ end
+
+ context 'when target folder already exists' do
+ before do
+ FileUtils.mkdir_p(base_path(legacy_storage))
+ end
+
+ it 'raises AttachmentCannotMoveError' do
+ expect(FileUtils).not_to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage))
+
+ expect { service.execute }.to raise_error(Projects::HashedStorage::AttachmentCannotMoveError)
+ end
+ end
+ end
+
+ context '#old_disk_path' do
+ it 'returns old disk_path for project' do
+ expect(service.old_disk_path).to eq(project.disk_path)
+ end
+ end
+
+ context '#new_disk_path' do
+ it 'returns new disk_path for project' do
+ service.execute
+
+ expect(service.new_disk_path).to eq(project.full_path)
+ end
+ end
+
+ def base_path(storage)
+ File.join(FileUploader.root, storage.disk_path)
+ end
+end
diff --git a/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb b/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb
new file mode 100644
index 00000000000..41927934501
--- /dev/null
+++ b/spec/services/projects/hashed_storage/rollback_repository_service_spec.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::HashedStorage::RollbackRepositoryService, :clean_gitlab_redis_shared_state do
+ include GitHelpers
+
+ let(:gitlab_shell) { Gitlab::Shell.new }
+ let(:project) { create(:project, :repository, :wiki_repo, storage_version: ::Project::HASHED_STORAGE_FEATURES[:repository]) }
+ let(:legacy_storage) { Storage::LegacyProject.new(project) }
+ let(:hashed_storage) { Storage::HashedProject.new(project) }
+
+ subject(:service) { described_class.new(project, project.disk_path) }
+
+ describe '#execute' do
+ let(:old_disk_path) { hashed_storage.disk_path }
+ let(:new_disk_path) { legacy_storage.disk_path }
+
+ before do
+ allow(service).to receive(:gitlab_shell) { gitlab_shell }
+ end
+
+ context 'repository lock' do
+ it 'tries to lock the repository' do
+ expect(service).to receive(:try_to_set_repository_read_only!)
+
+ service.execute
+ end
+
+ it 'fails when a git operation is in progress' do
+ allow(project).to receive(:repo_reference_count) { 1 }
+
+ expect { service.execute }.to raise_error(Projects::HashedStorage::RepositoryInUseError)
+ end
+ end
+
+ context 'when repository doesnt exist on disk' do
+ let(:project) { create(:project) }
+
+ it 'skips the disk change but decrease the version' do
+ service.execute
+
+ expect(project.legacy_storage?).to be_truthy
+ end
+ end
+
+ context 'when succeeds' do
+ it 'renames project and wiki repositories' do
+ service.execute
+
+ expect(gitlab_shell.exists?(project.repository_storage, "#{new_disk_path}.git")).to be_truthy
+ expect(gitlab_shell.exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_truthy
+ end
+
+ it 'updates project to be legacy and not read-only' do
+ service.execute
+
+ expect(project.legacy_storage?).to be_truthy
+ expect(project.repository_read_only).to be_falsey
+ end
+
+ it 'move operation is called for both repositories' do
+ expect_move_repository(old_disk_path, new_disk_path)
+ expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
+
+ service.execute
+ end
+
+ it 'writes project full path to .git/config' do
+ service.execute
+
+ rugged_config = rugged_repo(project.repository).config['gitlab.fullpath']
+
+ expect(rugged_config).to eq project.full_path
+ end
+ end
+
+ context 'when one move fails' do
+ it 'rolls repositories back to original name' do
+ allow(service).to receive(:move_repository).and_call_original
+ allow(service).to receive(:move_repository).with(old_disk_path, new_disk_path).once { false } # will disable first move only
+
+ expect(service).to receive(:rollback_folder_move).and_call_original
+
+ service.execute
+
+ expect(gitlab_shell.exists?(project.repository_storage, "#{new_disk_path}.git")).to be_falsey
+ expect(gitlab_shell.exists?(project.repository_storage, "#{new_disk_path}.wiki.git")).to be_falsey
+ expect(project.repository_read_only?).to be_falsey
+ end
+
+ context 'when rollback fails' do
+ before do
+ legacy_storage.ensure_storage_path_exists
+ gitlab_shell.mv_repository(project.repository_storage, old_disk_path, new_disk_path)
+ end
+
+ it 'does not try to move nil repository over existing' do
+ expect(gitlab_shell).not_to receive(:mv_repository).with(project.repository_storage, old_disk_path, new_disk_path)
+ expect_move_repository("#{old_disk_path}.wiki", "#{new_disk_path}.wiki")
+
+ service.execute
+ end
+ end
+ end
+
+ def expect_move_repository(from_name, to_name)
+ expect(gitlab_shell).to receive(:mv_repository).with(project.repository_storage, from_name, to_name).and_call_original
+ end
+ end
+end
diff --git a/spec/services/projects/hashed_storage/rollback_service_spec.rb b/spec/services/projects/hashed_storage/rollback_service_spec.rb
new file mode 100644
index 00000000000..427d1535559
--- /dev/null
+++ b/spec/services/projects/hashed_storage/rollback_service_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::HashedStorage::RollbackService do
+ let(:project) { create(:project, :empty_repo, :wiki_repo) }
+ let(:logger) { double }
+
+ subject(:service) { described_class.new(project, project.full_path, logger: logger) }
+
+ describe '#execute' do
+ context 'attachments rollback' do
+ let(:attachments_service_class) { Projects::HashedStorage::RollbackAttachmentsService }
+ let(:attachments_service) { attachments_service_class.new(project, logger: logger) }
+
+ it 'delegates rollback to Projects::HashedStorage::RollbackAttachmentsService' do
+ expect(attachments_service_class).to receive(:new)
+ .with(project, logger: logger)
+ .and_return(attachments_service)
+ expect(attachments_service).to receive(:execute)
+
+ service.execute
+ end
+
+ it 'does not delegate rollback if repository is in legacy storage already' do
+ project.storage_version = nil
+ expect(attachments_service_class).not_to receive(:new)
+
+ service.execute
+ end
+ end
+
+ context 'repository rollback' do
+ let(:repository_service_class) { Projects::HashedStorage::RollbackRepositoryService }
+ let(:repository_service) { repository_service_class.new(project, project.full_path, logger: logger) }
+
+ it 'delegates rollback to RollbackRepositoryService' do
+ project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
+
+ expect(repository_service_class).to receive(:new)
+ .with(project, project.full_path, logger: logger)
+ .and_return(repository_service)
+ expect(repository_service).to receive(:execute)
+
+ service.execute
+ end
+
+ it 'does not delegate rollback if repository is in legacy storage already' do
+ project.storage_version = nil
+
+ expect(repository_service_class).not_to receive(:new)
+
+ service.execute
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb
index 6afae3da80c..86b1ec83f50 100644
--- a/spec/services/projects/operations/update_service_spec.rb
+++ b/spec/services/projects/operations/update_service_spec.rb
@@ -17,8 +17,14 @@ describe Projects::Operations::UpdateService do
{
error_tracking_setting_attributes: {
enabled: false,
- api_url: 'http://gitlab.com/api/0/projects/org/project',
- token: 'token'
+ api_host: 'http://gitlab.com/',
+ token: 'token',
+ project: {
+ slug: 'project',
+ name: 'Project',
+ organization_slug: 'org',
+ organization_name: 'Org'
+ }
}
}
end
@@ -32,8 +38,30 @@ describe Projects::Operations::UpdateService do
project.reload
expect(project.error_tracking_setting).not_to be_enabled
- expect(project.error_tracking_setting.api_url).to eq('http://gitlab.com/api/0/projects/org/project')
+ expect(project.error_tracking_setting.api_url).to eq(
+ 'http://gitlab.com/api/0/projects/org/project/'
+ )
expect(project.error_tracking_setting.token).to eq('token')
+ expect(project.error_tracking_setting[:project_name]).to eq('Project')
+ expect(project.error_tracking_setting[:organization_name]).to eq('Org')
+ end
+
+ context 'disable error tracking' do
+ before do
+ params[:error_tracking_setting_attributes][:api_host] = ''
+ params[:error_tracking_setting_attributes][:enabled] = false
+ end
+
+ it 'can set api_url to nil' do
+ expect(result[:status]).to eq(:success)
+
+ project.reload
+ expect(project.error_tracking_setting).not_to be_enabled
+ expect(project.error_tracking_setting.api_url).to be_nil
+ expect(project.error_tracking_setting.token).to eq('token')
+ expect(project.error_tracking_setting[:project_name]).to eq('Project')
+ expect(project.error_tracking_setting[:organization_name]).to eq('Org')
+ end
end
end
@@ -42,8 +70,14 @@ describe Projects::Operations::UpdateService do
{
error_tracking_setting_attributes: {
enabled: true,
- api_url: 'http://gitlab.com/api/0/projects/org/project',
- token: 'token'
+ api_host: 'http://gitlab.com/',
+ token: 'token',
+ project: {
+ slug: 'project',
+ name: 'Project',
+ organization_slug: 'org',
+ organization_name: 'Org'
+ }
}
}
end
@@ -52,8 +86,12 @@ describe Projects::Operations::UpdateService do
expect(result[:status]).to eq(:success)
expect(project.error_tracking_setting).to be_enabled
- expect(project.error_tracking_setting.api_url).to eq('http://gitlab.com/api/0/projects/org/project')
+ expect(project.error_tracking_setting.api_url).to eq(
+ 'http://gitlab.com/api/0/projects/org/project/'
+ )
expect(project.error_tracking_setting.token).to eq('token')
+ expect(project.error_tracking_setting[:project_name]).to eq('Project')
+ expect(project.error_tracking_setting[:organization_name]).to eq('Org')
end
end
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 938764f40b0..ea33d156c8a 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -1526,5 +1526,15 @@ describe QuickActions::InterpretService do
end
end
end
+
+ context "#commands_executed_count" do
+ it 'counts commands executed' do
+ content = "/close and \n/assign me and \n/title new title"
+
+ service.execute(content, issue)
+
+ expect(service.commands_executed_count).to eq(3)
+ end
+ end
end
end
diff --git a/spec/services/suggestions/apply_service_spec.rb b/spec/services/suggestions/apply_service_spec.rb
index 8e77d582eb4..fe85b5c9065 100644
--- a/spec/services/suggestions/apply_service_spec.rb
+++ b/spec/services/suggestions/apply_service_spec.rb
@@ -362,6 +362,17 @@ describe Suggestions::ApplyService do
project.add_maintainer(user)
end
+ context 'diff file was not found' do
+ it 'returns error message' do
+ expect(suggestion.note).to receive(:latest_diff_file) { nil }
+
+ result = subject.execute(suggestion)
+
+ expect(result).to eq(message: 'The file was not found',
+ status: :error)
+ end
+ end
+
context 'suggestion was already applied' do
it 'returns success status' do
result = subject.execute(suggestion)
diff --git a/spec/services/suggestions/create_service_spec.rb b/spec/services/suggestions/create_service_spec.rb
index f1142c88a69..1b4b15b8eaa 100644
--- a/spec/services/suggestions/create_service_spec.rb
+++ b/spec/services/suggestions/create_service_spec.rb
@@ -9,14 +9,18 @@ describe Suggestions::CreateService do
target_project: project_with_repo)
end
- let(:position) do
- Gitlab::Diff::Position.new(old_path: "files/ruby/popen.rb",
- new_path: "files/ruby/popen.rb",
- old_line: nil,
- new_line: 14,
- diff_refs: merge_request.diff_refs)
+ def build_position(args = {})
+ default_args = { old_path: "files/ruby/popen.rb",
+ new_path: "files/ruby/popen.rb",
+ old_line: nil,
+ new_line: 14,
+ diff_refs: merge_request.diff_refs }
+
+ Gitlab::Diff::Position.new(default_args.merge(args))
end
+ let(:position) { build_position }
+
let(:markdown) do
<<-MARKDOWN.strip_heredoc
```suggestion
@@ -74,6 +78,21 @@ describe Suggestions::CreateService do
end
end
+ context 'should not create suggestions' do
+ let(:note) do
+ create(:diff_note_on_merge_request, project: project_with_repo,
+ noteable: merge_request,
+ position: position,
+ note: markdown)
+ end
+
+ it 'creates no suggestion when diff file is not found' do
+ expect(note).to receive(:latest_diff_file) { nil }
+
+ expect { subject.execute }.not_to change(Suggestion, :count)
+ end
+ end
+
context 'should create suggestions' do
let(:note) do
create(:diff_note_on_merge_request, project: project_with_repo,
@@ -104,6 +123,22 @@ describe Suggestions::CreateService do
expect(suggestion_2).to have_attributes(from_content: " vars = {\n",
to_content: " xpto\n baz\n")
end
+
+ context 'outdated position note' do
+ let!(:outdated_diff) { merge_request.merge_request_diff }
+ let!(:latest_diff) { merge_request.create_merge_request_diff }
+ let(:outdated_position) { build_position(diff_refs: outdated_diff.diff_refs) }
+ let(:position) { build_position(diff_refs: latest_diff.diff_refs) }
+
+ it 'uses the correct position when creating the suggestion' do
+ expect(note.position)
+ .to receive(:diff_file)
+ .with(project_with_repo.repository)
+ .and_call_original
+
+ subject.execute
+ end
+ end
end
end
end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 82544ab0413..b917de14b2e 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -807,9 +807,10 @@ describe SystemNoteService do
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
GlobalID: "GitLab",
+ relationship: 'mentioned on',
object: {
url: project_commit_url(project, commit),
- title: "GitLab: Mentioned on commit - #{commit.title}",
+ title: "Commit - #{commit.title}",
icon: { title: "GitLab", url16x16: favicon_path },
status: { resolved: false }
}
@@ -833,9 +834,10 @@ describe SystemNoteService do
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
GlobalID: "GitLab",
+ relationship: 'mentioned on',
object: {
url: project_issue_url(project, issue),
- title: "GitLab: Mentioned on issue - #{issue.title}",
+ title: "Issue - #{issue.title}",
icon: { title: "GitLab", url16x16: favicon_path },
status: { resolved: false }
}
@@ -859,9 +861,10 @@ describe SystemNoteService do
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
GlobalID: "GitLab",
+ relationship: 'mentioned on',
object: {
url: project_snippet_url(project, snippet),
- title: "GitLab: Mentioned on snippet - #{snippet.title}",
+ title: "Snippet - #{snippet.title}",
icon: { title: "GitLab", url16x16: favicon_path },
status: { resolved: false }
}
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 97e7a019222..e8d7b18bf04 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -115,10 +115,17 @@ RSpec.configure do |config|
TestEnv.clean_test_path
end
- config.before do
+ config.before do |example|
# Enable all features by default for testing
allow(Feature).to receive(:enabled?) { true }
+ enabled = example.metadata[:enable_rugged].present?
+
+ # Disable Rugged features by default
+ Gitlab::Git::RuggedImpl::Repository::FEATURE_FLAGS.each do |flag|
+ allow(Feature).to receive(:enabled?).with(flag).and_return(enabled)
+ end
+
# The following can be removed when we remove the staged rollout strategy
# and we can just enable it using instance wide settings
# (ie. ApplicationSetting#auto_devops_enabled)
diff --git a/spec/support/api/schema_matcher.rb b/spec/support/api/schema_matcher.rb
index 6591d56e473..f7d74df0656 100644
--- a/spec/support/api/schema_matcher.rb
+++ b/spec/support/api/schema_matcher.rb
@@ -1,6 +1,6 @@
module SchemaPath
def self.expand(schema, dir = '')
- Rails.root.join('spec', dir, "fixtures/api/schemas/#{schema}.json").to_s
+ Rails.root.join(dir, 'spec', "fixtures/api/schemas/#{schema}.json").to_s
end
end
diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb
new file mode 100644
index 00000000000..edd7de94203
--- /dev/null
+++ b/spec/support/database_cleaner.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'database_cleaner/active_record/deletion'
+require_relative 'db_cleaner'
+
+module FakeInformationSchema
+ # Work around a bug in DatabaseCleaner when using the deletion strategy:
+ # https://github.com/DatabaseCleaner/database_cleaner/issues/347
+ #
+ # On MySQL, if the information schema is said to exist, we use an inaccurate
+ # row count leading to some tables not being cleaned when they should
+ def information_schema_exists?(_connection)
+ false
+ end
+end
+
+DatabaseCleaner::ActiveRecord::Deletion.prepend(FakeInformationSchema)
+
+RSpec.configure do |config|
+ include DbCleaner
+
+ # Ensure all sequences are reset at the start of the suite run
+ config.before(:suite) do
+ setup_database_cleaner
+ DatabaseCleaner.clean_with(:truncation)
+ end
+
+ config.append_after(:context) do
+ DatabaseCleaner.clean_with(:deletion, cache_tables: false)
+ end
+
+ config.before do
+ setup_database_cleaner
+ DatabaseCleaner.strategy = :transaction
+ end
+
+ config.before(:each, :js) do
+ DatabaseCleaner.strategy = :deletion, { except: deletion_except_tables, cache_tables: false }
+ end
+
+ config.before(:each, :delete) do
+ DatabaseCleaner.strategy = :deletion, { except: deletion_except_tables, cache_tables: false }
+ end
+
+ config.before(:each, :migration) do
+ DatabaseCleaner.strategy = :deletion, { cache_tables: false }
+ end
+
+ config.before do
+ DatabaseCleaner.start
+ end
+
+ config.append_after do
+ DatabaseCleaner.clean
+ end
+end
diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb
index 34b9efaaecd..c69fa322073 100644
--- a/spec/support/db_cleaner.rb
+++ b/spec/support/db_cleaner.rb
@@ -1,49 +1,9 @@
-require 'database_cleaner/active_record/deletion'
-
-module FakeInformationSchema
- # Work around a bug in DatabaseCleaner when using the deletion strategy:
- # https://github.com/DatabaseCleaner/database_cleaner/issues/347
- #
- # On MySQL, if the information schema is said to exist, we use an inaccurate
- # row count leading to some tables not being cleaned when they should
- def information_schema_exists?(_connection)
- false
- end
-end
-
-DatabaseCleaner::ActiveRecord::Deletion.prepend(FakeInformationSchema)
-
-RSpec.configure do |config|
- # Ensure all sequences are reset at the start of the suite run
- config.before(:suite) do
- DatabaseCleaner.clean_with(:truncation)
- end
-
- config.append_after(:context) do
- DatabaseCleaner.clean_with(:deletion, cache_tables: false)
- end
-
- config.before do
- DatabaseCleaner.strategy = :transaction
- end
-
- config.before(:each, :js) do
- DatabaseCleaner.strategy = :deletion, { cache_tables: false }
- end
-
- config.before(:each, :delete) do
- DatabaseCleaner.strategy = :deletion, { cache_tables: false }
- end
-
- config.before(:each, :migration) do
- DatabaseCleaner.strategy = :deletion, { cache_tables: false }
- end
-
- config.before do
- DatabaseCleaner.start
+module DbCleaner
+ def deletion_except_tables
+ []
end
- config.append_after do
- DatabaseCleaner.clean
+ def setup_database_cleaner
+ DatabaseCleaner[:active_record, { connection: ActiveRecord::Base }]
end
end
diff --git a/spec/support/features/reportable_note_shared_examples.rb b/spec/support/features/reportable_note_shared_examples.rb
index 8cfce49da8a..89dfbf931d2 100644
--- a/spec/support/features/reportable_note_shared_examples.rb
+++ b/spec/support/features/reportable_note_shared_examples.rb
@@ -41,7 +41,7 @@ shared_examples 'reportable note' do |type|
def open_dropdown(dropdown)
# make window wide enough that tooltip doesn't trigger horizontal scrollbar
- resize_window(1200, 800)
+ restore_window_size
dropdown.find('.more-actions-toggle').click
dropdown.find('.dropdown-menu li', match: :first)
diff --git a/spec/support/features/variable_list_shared_examples.rb b/spec/support/features/variable_list_shared_examples.rb
index 0a464d77cb7..73156d18c1b 100644
--- a/spec/support/features/variable_list_shared_examples.rb
+++ b/spec/support/features/variable_list_shared_examples.rb
@@ -8,7 +8,7 @@ shared_examples 'variable list' do
it 'adds new CI variable' do
page.within('.js-ci-variable-list-section .js-row:last-child') do
find('.js-ci-variable-input-key').set('key')
- find('.js-ci-variable-input-value').set('key value')
+ find('.js-ci-variable-input-value').set('key_value')
end
click_button('Save variables')
@@ -19,7 +19,7 @@ shared_examples 'variable list' do
# We check the first row because it re-sorts to alphabetical order on refresh
page.within('.js-ci-variable-list-section .js-row:nth-child(1)') do
expect(find('.js-ci-variable-input-key').value).to eq('key')
- expect(find('.js-ci-variable-input-value', visible: false).value).to eq('key value')
+ expect(find('.js-ci-variable-input-value', visible: false).value).to eq('key_value')
end
end
@@ -44,7 +44,7 @@ shared_examples 'variable list' do
it 'adds new protected variable' do
page.within('.js-ci-variable-list-section .js-row:last-child') do
find('.js-ci-variable-input-key').set('key')
- find('.js-ci-variable-input-value').set('key value')
+ find('.js-ci-variable-input-value').set('key_value')
find('.ci-variable-protected-item .js-project-feature-toggle').click
expect(find('.js-ci-variable-input-protected', visible: false).value).to eq('true')
@@ -58,7 +58,7 @@ shared_examples 'variable list' do
# We check the first row because it re-sorts to alphabetical order on refresh
page.within('.js-ci-variable-list-section .js-row:nth-child(1)') do
expect(find('.js-ci-variable-input-key').value).to eq('key')
- expect(find('.js-ci-variable-input-value', visible: false).value).to eq('key value')
+ expect(find('.js-ci-variable-input-value', visible: false).value).to eq('key_value')
expect(find('.js-ci-variable-input-protected', visible: false).value).to eq('true')
end
end
diff --git a/spec/support/helpers/file_mover_helpers.rb b/spec/support/helpers/file_mover_helpers.rb
new file mode 100644
index 00000000000..1ba7cc03354
--- /dev/null
+++ b/spec/support/helpers/file_mover_helpers.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module FileMoverHelpers
+ def stub_file_mover(file_path, stub_real_path: nil)
+ file_name = File.basename(file_path)
+ allow(Pathname).to receive(:new).and_call_original
+
+ expect_next_instance_of(Pathname, a_string_including(file_name)) do |pathname|
+ allow(pathname).to receive(:realpath) { stub_real_path || pathname.cleanpath }
+ end
+ end
+end
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index e468ee4676d..6cdc19ac2e5 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -77,13 +77,23 @@ module GraphqlHelpers
def query_graphql_field(name, attributes = {}, fields = nil)
fields ||= all_graphql_fields_for(name.classify)
attributes = attributes_to_graphql(attributes)
+ attributes = "(#{attributes})" if attributes.present?
<<~QUERY
- #{name}(#{attributes}) {
- #{fields}
- }
+ #{name}#{attributes}
+ #{wrap_fields(fields)}
QUERY
end
+ def wrap_fields(fields)
+ return unless fields.strip.present?
+
+ <<~FIELDS
+ {
+ #{fields}
+ }
+ FIELDS
+ end
+
def all_graphql_fields_for(class_name, parent_types = Set.new)
type = GitlabSchema.types[class_name.to_s]
return "" unless type
@@ -115,8 +125,8 @@ module GraphqlHelpers
end.join(", ")
end
- def post_graphql(query, current_user: nil, variables: nil)
- post api('/', current_user, version: 'graphql'), params: { query: query, variables: variables }
+ def post_graphql(query, current_user: nil, variables: nil, headers: {})
+ post api('/', current_user, version: 'graphql'), params: { query: query, variables: variables }, headers: headers
end
def post_graphql_mutation(mutation, current_user: nil)
diff --git a/spec/support/helpers/javascript_fixtures_helpers.rb b/spec/support/helpers/javascript_fixtures_helpers.rb
index 89c5ec7a718..f525b2f945e 100644
--- a/spec/support/helpers/javascript_fixtures_helpers.rb
+++ b/spec/support/helpers/javascript_fixtures_helpers.rb
@@ -2,11 +2,12 @@ require 'action_dispatch/testing/test_request'
require 'fileutils'
module JavaScriptFixturesHelpers
+ extend ActiveSupport::Concern
include Gitlab::Popen
- FIXTURE_PATH = 'spec/javascripts/fixtures'.freeze
+ FIXTURE_PATHS = %w[spec/javascripts/fixtures ee/spec/javascripts/fixtures].freeze
- def self.included(base)
+ included do |base|
base.around do |example|
# pick an arbitrary date from the past, so tests are not time dependent
Timecop.freeze(Time.utc(2015, 7, 3, 10)) { example.run }
@@ -15,26 +16,30 @@ module JavaScriptFixturesHelpers
# Public: Removes all fixture files from given directory
#
- # directory_name - directory of the fixtures (relative to FIXTURE_PATH)
+ # directory_name - directory of the fixtures (relative to FIXTURE_PATHS)
#
def clean_frontend_fixtures(directory_name)
- directory_name = File.expand_path(directory_name, FIXTURE_PATH)
- Dir[File.expand_path('*.html.raw', directory_name)].each do |file_name|
- FileUtils.rm(file_name)
+ FIXTURE_PATHS.each do |fixture_path|
+ directory_name = File.expand_path(directory_name, fixture_path)
+ Dir[File.expand_path('*.html.raw', directory_name)].each do |file_name|
+ FileUtils.rm(file_name)
+ end
end
end
# Public: Store a response object as fixture file
#
# response - string or response object to store
- # fixture_file_name - file name to store the fixture in (relative to FIXTURE_PATH)
+ # fixture_file_name - file name to store the fixture in (relative to FIXTURE_PATHS)
#
def store_frontend_fixture(response, fixture_file_name)
- fixture_file_name = File.expand_path(fixture_file_name, FIXTURE_PATH)
- fixture = response.respond_to?(:body) ? parse_response(response) : response
+ FIXTURE_PATHS.each do |fixture_path|
+ fixture_file_name = File.expand_path(fixture_file_name, fixture_path)
+ fixture = response.respond_to?(:body) ? parse_response(response) : response
- FileUtils.mkdir_p(File.dirname(fixture_file_name))
- File.write(fixture_file_name, fixture)
+ FileUtils.mkdir_p(File.dirname(fixture_file_name))
+ File.write(fixture_file_name, fixture)
+ end
end
def remove_repository(project)
diff --git a/spec/support/helpers/kubernetes_helpers.rb b/spec/support/helpers/kubernetes_helpers.rb
index 9dc89b483b2..cca11e112c9 100644
--- a/spec/support/helpers/kubernetes_helpers.rb
+++ b/spec/support/helpers/kubernetes_helpers.rb
@@ -9,6 +9,10 @@ module KubernetesHelpers
kube_response(kube_pods_body)
end
+ def kube_logs_response
+ kube_response(kube_logs_body)
+ end
+
def kube_deployments_response
kube_response(kube_deployments_body)
end
@@ -34,6 +38,13 @@ module KubernetesHelpers
WebMock.stub_request(:get, pods_url).to_return(response || kube_pods_response)
end
+ def stub_kubeclient_logs(pod_name, response = nil)
+ stub_kubeclient_discover(service.api_url)
+ logs_url = service.api_url + "/api/v1/namespaces/#{service.actual_namespace}/pods/#{pod_name}/log?tailLines=#{Clusters::Platforms::Kubernetes::LOGS_LIMIT}"
+
+ WebMock.stub_request(:get, logs_url).to_return(response || kube_logs_response)
+ end
+
def stub_kubeclient_deployments(response = nil)
stub_kubeclient_discover(service.api_url)
deployments_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{service.actual_namespace}/deployments"
@@ -212,6 +223,10 @@ module KubernetesHelpers
}
end
+ def kube_logs_body
+ "Log 1\nLog 2\nLog 3"
+ end
+
def kube_deployments_body
{
"kind" => "DeploymentList",
diff --git a/spec/support/helpers/login_helpers.rb b/spec/support/helpers/login_helpers.rb
index 3fee6872498..4a0cf62a661 100644
--- a/spec/support/helpers/login_helpers.rb
+++ b/spec/support/helpers/login_helpers.rb
@@ -47,7 +47,7 @@ module LoginHelpers
end
def gitlab_sign_in_via(provider, user, uid, saml_response = nil)
- mock_auth_hash(provider, uid, user.email, saml_response)
+ mock_auth_hash_with_saml_xml(provider, uid, user.email, saml_response)
visit new_user_session_path
click_link provider
end
@@ -87,7 +87,12 @@ module LoginHelpers
click_link "oauth-login-#{provider}"
end
- def mock_auth_hash(provider, uid, email, saml_response = nil)
+ def mock_auth_hash_with_saml_xml(provider, uid, email, saml_response)
+ response_object = { document: saml_xml(saml_response) }
+ mock_auth_hash(provider, uid, email, response_object: response_object)
+ end
+
+ def mock_auth_hash(provider, uid, email, response_object: nil)
# The mock_auth configuration allows you to set per-provider (or default)
# authentication hashes to return during integration testing.
OmniAuth.config.mock_auth[provider.to_sym] = OmniAuth::AuthHash.new({
@@ -110,9 +115,7 @@ module LoginHelpers
image: 'mock_user_thumbnail_url'
}
},
- response_object: {
- document: saml_xml(saml_response)
- }
+ response_object: response_object
}
})
Rails.application.env_config['omniauth.auth'] = OmniAuth.config.mock_auth[provider.to_sym]
diff --git a/spec/support/import_export/export_file_helper.rb b/spec/support/import_export/export_file_helper.rb
index ac320934f5a..388b88f0331 100644
--- a/spec/support/import_export/export_file_helper.rb
+++ b/spec/support/import_export/export_file_helper.rb
@@ -91,7 +91,7 @@ module ExportFileHelper
loop do
object_with_parent = deep_find_with_parent(sensitive_word, project_hash)
- return nil unless object_with_parent && object_with_parent.object
+ return unless object_with_parent && object_with_parent.object
if is_safe_hash?(object_with_parent.parent, sensitive_word)
# It's in the safe list, remove hash and keep looking
diff --git a/spec/support/matchers/access_matchers.rb b/spec/support/matchers/access_matchers.rb
index 3e4ca8b7ab0..e6899e2d23c 100644
--- a/spec/support/matchers/access_matchers.rb
+++ b/spec/support/matchers/access_matchers.rb
@@ -7,29 +7,28 @@ module AccessMatchers
extend RSpec::Matchers::DSL
include Warden::Test::Helpers
- def emulate_user(user, membership = nil)
- case user
- when :user
- login_as(create(:user))
+ def emulate_user(user_type_or_trait, membership = nil)
+ case user_type_or_trait
+ when :user, :admin
+ login_as(create(user_type_or_trait))
+ when :external, :auditor
+ login_as(create(:user, user_type_or_trait))
when :visitor
logout
- when :admin
- login_as(create(:admin))
- when :external
- login_as(create(:user, external: true))
when User
- login_as(user)
+ login_as(user_type_or_trait)
when *Gitlab::Access.sym_options_with_owner.keys
- raise ArgumentError, "cannot emulate #{user} without membership parent" unless membership
-
- role = user
+ raise ArgumentError, "cannot emulate #{user_type_or_trait} without membership parent" unless membership
- if role == :owner && membership.owner
- user = membership.owner
- else
- user = create(:user)
- membership.public_send(:"add_#{role}", user)
- end
+ role = user_type_or_trait
+ user =
+ if role == :owner && membership.owner
+ membership.owner
+ else
+ create(:user).tap do |new_user|
+ membership.public_send(:"add_#{role}", new_user)
+ end
+ end
login_as(user)
else
diff --git a/spec/support/pg_stat_activity.rb b/spec/support/pg_stat_activity.rb
new file mode 100644
index 00000000000..f93fba08a19
--- /dev/null
+++ b/spec/support/pg_stat_activity.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+RSpec.configure do |config|
+ config.before do
+ if Gitlab::Database.postgresql? && ENV['PG_STAT_WARNING_THRESHOLD']
+ warning_threshold = ENV['PG_STAT_WARNING_THRESHOLD'].to_i
+ results = ActiveRecord::Base.connection.execute('SELECT * FROM pg_stat_activity')
+ ntuples = results.ntuples
+
+ warn("pg_stat_activity count: #{ntuples}")
+
+ if ntuples > warning_threshold
+ results.each do |result|
+ warn result.inspect
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_contexts/services_shared_context.rb b/spec/support/shared_contexts/services_shared_context.rb
index d92e8318fa0..089f1798cd2 100644
--- a/spec/support/shared_contexts/services_shared_context.rb
+++ b/spec/support/shared_contexts/services_shared_context.rb
@@ -26,6 +26,14 @@ Service.available_services_names.each do |service|
end
end
+ before do
+ if service == 'github' && respond_to?(:stub_licensed_features)
+ stub_licensed_features(github_project_service_integration: true)
+ project.clear_memoization(:disabled_services)
+ project.clear_memoization(:licensed_feature_available)
+ end
+ end
+
def initialize_service(service)
service_item = project.find_or_initialize_service(service)
service_item.properties = service_attrs
diff --git a/spec/support/shared_examples/issuable_shared_examples.rb b/spec/support/shared_examples/issuable_shared_examples.rb
index c3d40c5b231..d97b21f71cd 100644
--- a/spec/support/shared_examples/issuable_shared_examples.rb
+++ b/spec/support/shared_examples/issuable_shared_examples.rb
@@ -31,7 +31,7 @@ shared_examples 'system notes for milestones' do
context 'project milestones' do
it 'creates a system note' do
expect do
- update_issuable(milestone: create(:milestone))
+ update_issuable(milestone: create(:milestone, project: project))
end.to change { Note.system.count }.by(1)
end
end
diff --git a/spec/support/shared_examples/notify_shared_examples.rb b/spec/support/shared_examples/notify_shared_examples.rb
index a38354060cf..4fff1c4e228 100644
--- a/spec/support/shared_examples/notify_shared_examples.rb
+++ b/spec/support/shared_examples/notify_shared_examples.rb
@@ -252,3 +252,31 @@ shared_examples 'a note email' do
end
end
end
+
+shared_examples 'appearance header and footer enabled' do
+ it "contains header and footer" do
+ create :appearance, header_message: "Foo", footer_message: "Bar", email_header_and_footer_enabled: true
+
+ aggregate_failures do
+ expect(subject.html_part).to have_body_text("<div class=\"header-message\" style=\"\"><p>Foo</p></div>")
+ expect(subject.html_part).to have_body_text("<div class=\"footer-message\" style=\"\"><p>Bar</p></div>")
+
+ expect(subject.text_part).to have_body_text(/^Foo/)
+ expect(subject.text_part).to have_body_text(/Bar$/)
+ end
+ end
+end
+
+shared_examples 'appearance header and footer not enabled' do
+ it "does not contain header and footer" do
+ create :appearance, header_message: "Foo", footer_message: "Bar", email_header_and_footer_enabled: false
+
+ aggregate_failures do
+ expect(subject.html_part).not_to have_body_text("<div class=\"header-message\" style=\"\"><p>Foo</p></div>")
+ expect(subject.html_part).not_to have_body_text("<div class=\"footer-message\" style=\"\"><p>Bar</p></div>")
+
+ expect(subject.text_part).not_to have_body_text(/^Foo/)
+ expect(subject.text_part).not_to have_body_text(/Bar$/)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/discussions.rb b/spec/support/shared_examples/requests/api/discussions.rb
index e44da4faa5a..eff8e401bad 100644
--- a/spec/support/shared_examples/requests/api/discussions.rb
+++ b/spec/support/shared_examples/requests/api/discussions.rb
@@ -86,6 +86,37 @@ shared_examples 'discussions API' do |parent_type, noteable_type, id_name|
expect(response).to have_gitlab_http_status(404)
end
end
+
+ context 'when a project is public with private repo access' do
+ let!(:parent) { create(:project, :public, :repository, :repository_private, :snippets_private) }
+ let!(:user_without_access) { create(:user) }
+
+ context 'when user is not a team member of private repo' do
+ before do
+ project.team.truncate
+ end
+
+ context "creating a new note" do
+ before do
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/discussions", user_without_access), params: { body: 'hi!' }
+ end
+
+ it 'raises 404 error' do
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context "fetching a discussion" do
+ before do
+ get api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/discussions/#{note.discussion_id}", user_without_access)
+ end
+
+ it 'raises 404 error' do
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+ end
end
describe "POST /#{parent_type}/:id/#{noteable_type}/:noteable_id/discussions/:discussion_id/notes" do
diff --git a/spec/support/shared_examples/requests/api/merge_requests_list.rb b/spec/support/shared_examples/requests/api/merge_requests_list.rb
index 6713ec47ace..32e3b81c3c5 100644
--- a/spec/support/shared_examples/requests/api/merge_requests_list.rb
+++ b/spec/support/shared_examples/requests/api/merge_requests_list.rb
@@ -186,6 +186,37 @@ shared_examples 'merge requests list' do
expect(json_response.length).to eq(0)
end
+ it 'returns an array of labeled merge requests where all labels match' do
+ path = endpoint_path + "?labels[]=#{label.title}&labels[]=#{label2.title}"
+
+ get api(path, user)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(1)
+ expect(json_response.first['labels']).to eq([label2.title, label.title])
+ end
+
+ it 'returns an array of merge requests with any label when filtering by any label' do
+ get api(endpoint_path, user), params: { labels: [" #{label.title} ", " #{label2.title} "] }
+
+ expect_paginated_array_response
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(1)
+ expect(json_response.first['labels']).to eq([label2.title, label.title])
+ expect(json_response.first['id']).to eq(merge_request.id)
+ end
+
+ it 'returns an array of merge requests with any label when filtering by any label' do
+ get api(endpoint_path, user), params: { labels: ["#{label.title} , #{label2.title}"] }
+
+ expect_paginated_array_response
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(1)
+ expect(json_response.first['labels']).to eq([label2.title, label.title])
+ expect(json_response.first['id']).to eq(merge_request.id)
+ end
+
it 'returns an array of merge requests with any label when filtering by any label' do
get api(endpoint_path, user), params: { labels: IssuesFinder::FILTER_ANY }
diff --git a/spec/support/shared_examples/views/nav_sidebar.rb b/spec/support/shared_examples/views/nav_sidebar.rb
new file mode 100644
index 00000000000..6ac5abe275d
--- /dev/null
+++ b/spec/support/shared_examples/views/nav_sidebar.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+shared_examples 'has nav sidebar' do
+ it 'has collapsed nav sidebar on mobile' do
+ render
+
+ expect(rendered).to have_selector('.nav-sidebar')
+ expect(rendered).not_to have_selector('.sidebar-collapsed-desktop')
+ expect(rendered).not_to have_selector('.sidebar-expanded-mobile')
+ end
+end
diff --git a/spec/support/webmock.rb b/spec/support/webmock.rb
index af2906b7568..9ac7e7fc515 100644
--- a/spec/support/webmock.rb
+++ b/spec/support/webmock.rb
@@ -1,4 +1,12 @@
require 'webmock'
require 'webmock/rspec'
-WebMock.disable_net_connect!(allow_localhost: true)
+def webmock_allowed_hosts
+ %w[elasticsearch registry.gitlab.com-gitlab-org-test-elastic-image].tap do |hosts|
+ if ENV.key?('ELASTIC_URL')
+ hosts << URI.parse(ENV['ELASTIC_URL']).host
+ end
+ end.uniq
+end
+
+WebMock.disable_net_connect!(allow_localhost: true, allow: webmock_allowed_hosts)
diff --git a/spec/uploaders/file_mover_spec.rb b/spec/uploaders/file_mover_spec.rb
index de29d0c943f..e474a714b10 100644
--- a/spec/uploaders/file_mover_spec.rb
+++ b/spec/uploaders/file_mover_spec.rb
@@ -1,8 +1,9 @@
require 'spec_helper'
describe FileMover do
+ include FileMoverHelpers
+
let(:filename) { 'banana_sample.gif' }
- let(:file) { fixture_file_upload(File.join('spec', 'fixtures', filename)) }
let(:temp_file_path) { File.join('uploads/-/system/temp', 'secret55', filename) }
let(:temp_description) do
@@ -12,7 +13,7 @@ describe FileMover do
let(:file_path) { File.join('uploads/-/system/personal_snippet', snippet.id.to_s, 'secret55', filename) }
let(:snippet) { create(:personal_snippet, description: temp_description) }
- subject { described_class.new(file_path, snippet).execute }
+ subject { described_class.new(temp_file_path, snippet).execute }
describe '#execute' do
before do
@@ -20,6 +21,8 @@ describe FileMover do
expect(FileUtils).to receive(:move).with(a_string_including(temp_file_path), a_string_including(file_path))
allow_any_instance_of(CarrierWave::SanitizedFile).to receive(:exists?).and_return(true)
allow_any_instance_of(CarrierWave::SanitizedFile).to receive(:size).and_return(10)
+
+ stub_file_mover(temp_file_path)
end
context 'when move and field update successful' do
@@ -66,4 +69,30 @@ describe FileMover do
end
end
end
+
+ context 'security' do
+ context 'when relative path is involved' do
+ let(:temp_file_path) { File.join('uploads/-/system/temp', '..', 'another_subdir_of_temp') }
+
+ it 'does not trigger move if path is outside designated directory' do
+ stub_file_mover('uploads/-/system/another_subdir_of_temp')
+ expect(FileUtils).not_to receive(:move)
+
+ subject
+
+ expect(snippet.reload.description).to eq(temp_description)
+ end
+ end
+
+ context 'when symlink is involved' do
+ it 'does not trigger move if path is outside designated directory' do
+ stub_file_mover(temp_file_path, stub_real_path: Pathname('/etc'))
+ expect(FileUtils).not_to receive(:move)
+
+ subject
+
+ expect(snippet.reload.description).to eq(temp_description)
+ end
+ end
+ end
end
diff --git a/spec/validators/sha_validator_spec.rb b/spec/validators/sha_validator_spec.rb
new file mode 100644
index 00000000000..dc1539cf318
--- /dev/null
+++ b/spec/validators/sha_validator_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ShaValidator do
+ let(:validator) { described_class.new(attributes: [:base_commit_sha]) }
+ let(:merge_diff) { build(:merge_request_diff) }
+
+ subject { validator.validate_each(merge_diff, :base_commit_sha, value) }
+
+ context 'with empty value' do
+ let(:value) { nil }
+
+ it 'does not add any error if value is empty' do
+ subject
+
+ expect(merge_diff.errors).to be_empty
+ end
+ end
+
+ context 'with valid sha' do
+ let(:value) { Digest::SHA1.hexdigest(SecureRandom.hex) }
+
+ it 'does not add any error if value is empty' do
+ subject
+
+ expect(merge_diff.errors).to be_empty
+ end
+ end
+
+ context 'with invalid sha' do
+ let(:value) { 'foo' }
+
+ it 'adds error to the record' do
+ expect(merge_diff.errors).to be_empty
+
+ subject
+
+ expect(merge_diff.errors).not_to be_empty
+ end
+ end
+end
diff --git a/spec/views/ci/status/_icon.html.haml_spec.rb b/spec/views/ci/status/_icon.html.haml_spec.rb
new file mode 100644
index 00000000000..626159fc512
--- /dev/null
+++ b/spec/views/ci/status/_icon.html.haml_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe 'ci/status/_icon' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :private) }
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ context 'when rendering status for build' do
+ let(:build) do
+ create(:ci_build, :success, pipeline: pipeline)
+ end
+
+ context 'when user has ability to see details' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'has link to build details page' do
+ details_path = project_job_path(project, build)
+
+ render_status(build)
+
+ expect(rendered).to have_link(href: details_path)
+ end
+ end
+
+ context 'when user do not have ability to see build details' do
+ before do
+ render_status(build)
+ end
+
+ it 'contains build status text' do
+ expect(rendered).to have_css('.ci-status-icon.ci-status-icon-success')
+ end
+
+ it 'does not contain links' do
+ expect(rendered).not_to have_link
+ end
+ end
+ end
+
+ context 'when rendering status for external job' do
+ context 'when user has ability to see commit status details' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'status has external target url' do
+ before do
+ external_job = create(:generic_commit_status,
+ status: :running,
+ pipeline: pipeline,
+ target_url: 'http://gitlab.com')
+
+ render_status(external_job)
+ end
+
+ it 'contains valid commit status text' do
+ expect(rendered).to have_css('.ci-status-icon.ci-status-icon-running')
+ end
+
+ it 'has link to external status page' do
+ expect(rendered).to have_link(href: 'http://gitlab.com')
+ end
+ end
+
+ context 'status do not have external target url' do
+ before do
+ external_job = create(:generic_commit_status, status: :canceled)
+
+ render_status(external_job)
+ end
+
+ it 'contains valid commit status text' do
+ expect(rendered).to have_css('.ci-status-icon.ci-status-icon-canceled')
+ end
+
+ it 'has link to external status page' do
+ expect(rendered).not_to have_link
+ end
+ end
+ end
+ end
+
+ def render_status(resource)
+ render 'ci/status/icon', status: resource.detailed_status(user)
+ end
+end
diff --git a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
index 05c2f61a606..bf63021a7fa 100644
--- a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
@@ -26,6 +26,8 @@ describe 'layouts/nav/sidebar/_admin' do
it_behaves_like 'page has active tab', 'Overview'
end
+ it_behaves_like 'has nav sidebar'
+
context 'on projects' do
before do
allow(controller).to receive(:controller_name).and_return('projects')
diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
new file mode 100644
index 00000000000..24b66a0e767
--- /dev/null
+++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'layouts/nav/sidebar/_group' do
+ let(:group) { create(:group) }
+
+ before do
+ assign(:group, group)
+ end
+
+ it_behaves_like 'has nav sidebar'
+end
diff --git a/spec/views/layouts/nav/sidebar/_instance_statistics.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_instance_statistics.html.haml_spec.rb
new file mode 100644
index 00000000000..7f7f5637035
--- /dev/null
+++ b/spec/views/layouts/nav/sidebar/_instance_statistics.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'layouts/nav/sidebar/_instance_statistics' do
+ it_behaves_like 'has nav sidebar'
+end
diff --git a/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb
new file mode 100644
index 00000000000..6b820ab0b4c
--- /dev/null
+++ b/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'layouts/nav/sidebar/_profile' do
+ let(:user) { create(:user) }
+
+ before do
+ allow(view).to receive(:current_user).and_return(user)
+ end
+
+ it_behaves_like 'has nav sidebar'
+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 d9f05e5f94f..2c60ccfb754 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -11,6 +11,8 @@ describe 'layouts/nav/sidebar/_project' do
allow(view).to receive(:can?).and_return(true)
end
+ it_behaves_like 'has nav sidebar'
+
describe 'issue boards' do
it 'has board tab' do
render
diff --git a/spec/views/projects/deployments/_confirm_rollback_modal_spec.html.rb b/spec/views/projects/deployments/_confirm_rollback_modal_spec.html.rb
new file mode 100644
index 00000000000..54ec4f32856
--- /dev/null
+++ b/spec/views/projects/deployments/_confirm_rollback_modal_spec.html.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'projects/deployments/_confirm_rollback_modal' do
+ let(:environment) { create(:environment, :with_review_app) }
+ let(:deployments) { environment.deployments }
+ let(:project) { environment.project }
+
+ before do
+ assign(:environment, environment)
+ assign(:deployments, deployments)
+ assign(:project, project)
+ end
+
+ context 'when re-deploying last deployment' do
+ let(:deployment) { deployments.first }
+
+ before do
+ allow(view).to receive(:deployment).and_return(deployment)
+ end
+
+ it 'shows "re-deploy"' do
+ render
+
+ expect(rendered).to have_selector('h4', text: "Re-deploy environment #{environment.name}?")
+ expect(rendered).to have_selector('p', text: "This action will relaunch the job for commit #{deployment.short_sha}, putting the environment in a previous version. Are you sure you want to continue?")
+ expect(rendered).to have_selector('a.btn-danger', text: 'Re-deploy')
+ end
+
+ it 'links to re-deploying the environment' do
+ expected_link = retry_project_job_path(environment.project, deployment.deployable)
+
+ render
+
+ expect(rendered).to have_selector("a[href='#{expected_link}']", text: 'Re-deploy')
+ end
+ end
+
+ context 'when rolling back to previous deployment' do
+ let(:deployment) { create(:deployment, environment: environment) }
+
+ before do
+ allow(view).to receive(:deployment).and_return(deployment)
+ end
+
+ it 'shows "rollback"' do
+ render
+
+ expect(rendered).to have_selector('h4', text: "Rollback environment #{environment.name}?")
+ expect(rendered).to have_selector('p', text: "This action will run the job defined by staging for commit #{deployment.short_sha}, 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?")
+ expect(rendered).to have_selector('a.btn-danger', text: 'Rollback')
+ end
+
+ it 'links to re-deploying the environment' do
+ expected_link = retry_project_job_path(environment.project, deployment.deployable)
+
+ render
+
+ expect(rendered).to have_selector("a[href='#{expected_link}']", text: 'Rollback')
+ end
+ end
+end
diff --git a/spec/views/projects/issues/_merge_requests_status.html.haml_spec.rb b/spec/views/projects/issues/_merge_requests_status.html.haml_spec.rb
index 02c225292ce..9424795749d 100644
--- a/spec/views/projects/issues/_merge_requests_status.html.haml_spec.rb
+++ b/spec/views/projects/issues/_merge_requests_status.html.haml_spec.rb
@@ -2,6 +2,12 @@
require 'spec_helper'
describe 'projects/issues/_merge_requests_status.html.haml' do
+ around do |ex|
+ Timecop.freeze(Date.new(2018, 7, 22)) do
+ ex.run
+ end
+ end
+
it 'shows date of status change in tooltip' do
merge_request = create(:merge_request, created_at: 1.month.ago)
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 8e34521c7c8..1bca8bba940 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -30,7 +30,6 @@ describe 'projects/settings/operations/show' do
expect(rendered).to have_content _('Error Tracking')
expect(rendered).to have_content _('To link Sentry to GitLab, enter your Sentry URL and Auth Token')
- expect(rendered).to have_content _('Active')
end
end
end
diff --git a/spec/workers/hashed_storage/project_migrate_worker_spec.rb b/spec/workers/hashed_storage/project_migrate_worker_spec.rb
new file mode 100644
index 00000000000..340e722aa7e
--- /dev/null
+++ b/spec/workers/hashed_storage/project_migrate_worker_spec.rb
@@ -0,0 +1,48 @@
+require 'spec_helper'
+
+describe HashedStorage::ProjectMigrateWorker, :clean_gitlab_redis_shared_state do
+ include ExclusiveLeaseHelpers
+
+ describe '#perform' do
+ let(:project) { create(:project, :empty_repo, :legacy_storage) }
+ let(:lease_key) { "project_migrate_hashed_storage_worker:#{project.id}" }
+ let(:lease_timeout) { described_class::LEASE_TIMEOUT }
+ let(:migration_service) { ::Projects::HashedStorage::MigrationService }
+
+ it 'skips when project no longer exists' do
+ expect(migration_service).not_to receive(:new)
+
+ subject.perform(-1)
+ end
+
+ it 'skips when project is pending delete' do
+ pending_delete_project = create(:project, :empty_repo, pending_delete: true)
+
+ expect(migration_service).not_to receive(:new)
+
+ subject.perform(pending_delete_project.id)
+ end
+
+ it 'delegates migration to service class when we have exclusive lease' do
+ stub_exclusive_lease(lease_key, 'uuid', timeout: lease_timeout)
+
+ service_spy = spy
+
+ allow(migration_service)
+ .to receive(:new).with(project, project.full_path, logger: subject.logger)
+ .and_return(service_spy)
+
+ subject.perform(project.id)
+
+ expect(service_spy).to have_received(:execute)
+ end
+
+ it 'skips when it cant acquire the exclusive lease' do
+ stub_exclusive_lease_taken(lease_key, timeout: lease_timeout)
+
+ expect(migration_service).not_to receive(:new)
+
+ subject.perform(project.id)
+ end
+ end
+end
diff --git a/spec/workers/hashed_storage/project_rollback_worker_spec.rb b/spec/workers/hashed_storage/project_rollback_worker_spec.rb
new file mode 100644
index 00000000000..d833553c0ec
--- /dev/null
+++ b/spec/workers/hashed_storage/project_rollback_worker_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe HashedStorage::ProjectRollbackWorker, :clean_gitlab_redis_shared_state do
+ include ExclusiveLeaseHelpers
+
+ describe '#perform' do
+ let(:project) { create(:project, :empty_repo) }
+ let(:lease_key) { "project_migrate_hashed_storage_worker:#{project.id}" }
+ let(:lease_timeout) { described_class::LEASE_TIMEOUT }
+ let(:rollback_service) { ::Projects::HashedStorage::RollbackService }
+
+ it 'skips when project no longer exists' do
+ expect(rollback_service).not_to receive(:new)
+
+ subject.perform(-1)
+ end
+
+ it 'skips when project is pending delete' do
+ pending_delete_project = create(:project, :empty_repo, pending_delete: true)
+
+ expect(rollback_service).not_to receive(:new)
+
+ subject.perform(pending_delete_project.id)
+ end
+
+ it 'delegates rollback to service class when have exclusive lease' do
+ stub_exclusive_lease(lease_key, 'uuid', timeout: lease_timeout)
+
+ service_spy = spy
+
+ allow(rollback_service)
+ .to receive(:new).with(project, project.disk_path, logger: subject.logger)
+ .and_return(service_spy)
+
+ subject.perform(project.id)
+
+ expect(service_spy).to have_received(:execute)
+ end
+
+ it 'skips when it cant acquire the exclusive lease' do
+ stub_exclusive_lease_taken(lease_key, timeout: lease_timeout)
+
+ expect(rollback_service).not_to receive(:new)
+
+ subject.perform(project.id)
+ end
+ end
+end
diff --git a/spec/workers/hashed_storage/rollbacker_worker_spec.rb b/spec/workers/hashed_storage/rollbacker_worker_spec.rb
new file mode 100644
index 00000000000..4055f380978
--- /dev/null
+++ b/spec/workers/hashed_storage/rollbacker_worker_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe HashedStorage::RollbackerWorker do
+ subject(:worker) { described_class.new }
+ let(:projects) { create_list(:project, 2, :empty_repo) }
+ let(:ids) { projects.map(&:id) }
+
+ describe '#perform' do
+ it 'delegates to MigratorService' do
+ expect_any_instance_of(Gitlab::HashedStorage::Migrator).to receive(:bulk_rollback).with(start: 5, finish: 10)
+
+ worker.perform(5, 10)
+ end
+
+ it 'rollsback projects in the specified range' do
+ perform_enqueued_jobs do
+ worker.perform(ids.min, ids.max)
+ end
+
+ projects.each do |project|
+ expect(project.reload.legacy_storage?).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/workers/project_migrate_hashed_storage_worker_spec.rb b/spec/workers/project_migrate_hashed_storage_worker_spec.rb
deleted file mode 100644
index 333eb6a0569..00000000000
--- a/spec/workers/project_migrate_hashed_storage_worker_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-require 'spec_helper'
-
-describe ProjectMigrateHashedStorageWorker, :clean_gitlab_redis_shared_state do
- include ExclusiveLeaseHelpers
-
- describe '#perform' do
- let(:project) { create(:project, :empty_repo, :legacy_storage) }
- let(:lease_key) { "project_migrate_hashed_storage_worker:#{project.id}" }
- let(:lease_timeout) { described_class::LEASE_TIMEOUT }
- let(:migration_service) { ::Projects::HashedStorage::MigrationService }
-
- it 'skips when project no longer exists' do
- expect(migration_service).not_to receive(:new)
-
- subject.perform(-1)
- end
-
- it 'skips when project is pending delete' do
- pending_delete_project = create(:project, :empty_repo, pending_delete: true)
-
- expect(migration_service).not_to receive(:new)
-
- subject.perform(pending_delete_project.id)
- end
-
- it 'delegates migration to service class when we have exclusive lease' do
- stub_exclusive_lease(lease_key, 'uuid', timeout: lease_timeout)
-
- service_spy = spy
-
- allow(migration_service)
- .to receive(:new).with(project, project.full_path, logger: subject.logger)
- .and_return(service_spy)
-
- subject.perform(project.id)
-
- expect(service_spy).to have_received(:execute)
- end
-
- it 'skips when it cant acquire the exclusive lease' do
- stub_exclusive_lease_taken(lease_key, timeout: lease_timeout)
-
- expect(migration_service).not_to receive(:new)
-
- subject.perform(project.id)
- end
- end
-end
diff --git a/spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb b/spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb
index 963237ceadf..d20d926f5a0 100644
--- a/spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb
+++ b/spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb
@@ -18,7 +18,7 @@ describe UpdateHeadPipelineForMergeRequestWorker do
context 'when merge request sha does not equal pipeline sha' do
before do
- merge_request.merge_request_diff.update(head_commit_sha: 'different_sha')
+ merge_request.merge_request_diff.update(head_commit_sha: Digest::SHA1.hexdigest(SecureRandom.hex))
end
it 'does not update head pipeline' do
@@ -39,7 +39,7 @@ describe UpdateHeadPipelineForMergeRequestWorker do
let!(:merge_request_pipeline) do
create(:ci_pipeline,
project: project,
- source: :merge_request,
+ source: :merge_request_event,
sha: latest_sha,
merge_request: merge_request)
end
diff --git a/vendor/project_templates/dotnetcore.tar.gz b/vendor/project_templates/dotnetcore.tar.gz
index b5dae407f83..078ea91bbe4 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 fb357639a69..619e8a69695 100644
--- a/vendor/project_templates/express.tar.gz
+++ b/vendor/project_templates/express.tar.gz
Binary files differ
diff --git a/vendor/project_templates/gitbook.tar.gz b/vendor/project_templates/gitbook.tar.gz
index 73062fca038..07037a83db6 100644
--- a/vendor/project_templates/gitbook.tar.gz
+++ b/vendor/project_templates/gitbook.tar.gz
Binary files differ
diff --git a/vendor/project_templates/gomicro.tar.gz b/vendor/project_templates/gomicro.tar.gz
index 54a5afcfb69..c7d8687fdd8 100644
--- a/vendor/project_templates/gomicro.tar.gz
+++ b/vendor/project_templates/gomicro.tar.gz
Binary files differ
diff --git a/vendor/project_templates/hexo.tar.gz b/vendor/project_templates/hexo.tar.gz
index b32c4945366..033f363b8df 100644
--- a/vendor/project_templates/hexo.tar.gz
+++ b/vendor/project_templates/hexo.tar.gz
Binary files differ
diff --git a/vendor/project_templates/hugo.tar.gz b/vendor/project_templates/hugo.tar.gz
index 4bdb03f5b2f..f479ea12900 100644
--- a/vendor/project_templates/hugo.tar.gz
+++ b/vendor/project_templates/hugo.tar.gz
Binary files differ
diff --git a/vendor/project_templates/jekyll.tar.gz b/vendor/project_templates/jekyll.tar.gz
index ab61ddd03ea..c323ce6fac6 100644
--- a/vendor/project_templates/jekyll.tar.gz
+++ b/vendor/project_templates/jekyll.tar.gz
Binary files differ
diff --git a/vendor/project_templates/nfgitbook.tar.gz b/vendor/project_templates/nfgitbook.tar.gz
index e10873e1a9e..71f526ac43d 100644
--- a/vendor/project_templates/nfgitbook.tar.gz
+++ b/vendor/project_templates/nfgitbook.tar.gz
Binary files differ
diff --git a/vendor/project_templates/nfhexo.tar.gz b/vendor/project_templates/nfhexo.tar.gz
index 25632f241cc..79cc74f8d72 100644
--- a/vendor/project_templates/nfhexo.tar.gz
+++ b/vendor/project_templates/nfhexo.tar.gz
Binary files differ
diff --git a/vendor/project_templates/nfhugo.tar.gz b/vendor/project_templates/nfhugo.tar.gz
index 14e6289b841..1a4aab028a8 100644
--- a/vendor/project_templates/nfhugo.tar.gz
+++ b/vendor/project_templates/nfhugo.tar.gz
Binary files differ
diff --git a/vendor/project_templates/nfjekyll.tar.gz b/vendor/project_templates/nfjekyll.tar.gz
index 3b93f8661b5..56bf955afbe 100644
--- a/vendor/project_templates/nfjekyll.tar.gz
+++ b/vendor/project_templates/nfjekyll.tar.gz
Binary files differ
diff --git a/vendor/project_templates/nfplainhtml.tar.gz b/vendor/project_templates/nfplainhtml.tar.gz
index cdf5ea9fe12..3a90983bd06 100644
--- a/vendor/project_templates/nfplainhtml.tar.gz
+++ b/vendor/project_templates/nfplainhtml.tar.gz
Binary files differ
diff --git a/vendor/project_templates/plainhtml.tar.gz b/vendor/project_templates/plainhtml.tar.gz
index 6927ae74de8..1ed17ddc140 100644
--- a/vendor/project_templates/plainhtml.tar.gz
+++ b/vendor/project_templates/plainhtml.tar.gz
Binary files differ
diff --git a/vendor/project_templates/rails.tar.gz b/vendor/project_templates/rails.tar.gz
index 8454d2fc03b..c1f90c3f8f7 100644
--- a/vendor/project_templates/rails.tar.gz
+++ b/vendor/project_templates/rails.tar.gz
Binary files differ
diff --git a/vendor/project_templates/spring.tar.gz b/vendor/project_templates/spring.tar.gz
index 55e25fdbe7c..c1198bf13b7 100644
--- a/vendor/project_templates/spring.tar.gz
+++ b/vendor/project_templates/spring.tar.gz
Binary files differ
diff --git a/yarn.lock b/yarn.lock
index ea822b23113..48bd87e0ee6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,41 +2,41 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35":
+"@babel/code-frame@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==
dependencies:
"@babel/highlight" "^7.0.0"
-"@babel/core@>=7.1.0", "@babel/core@^7.2.2":
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687"
- integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==
+"@babel/core@>=7.1.0", "@babel/core@^7.1.0", "@babel/core@^7.2.2":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b"
+ integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==
dependencies:
"@babel/code-frame" "^7.0.0"
- "@babel/generator" "^7.2.2"
+ "@babel/generator" "^7.3.4"
"@babel/helpers" "^7.2.0"
- "@babel/parser" "^7.2.2"
+ "@babel/parser" "^7.3.4"
"@babel/template" "^7.2.2"
- "@babel/traverse" "^7.2.2"
- "@babel/types" "^7.2.2"
+ "@babel/traverse" "^7.3.4"
+ "@babel/types" "^7.3.4"
convert-source-map "^1.1.0"
debug "^4.1.0"
json5 "^2.1.0"
- lodash "^4.17.10"
+ lodash "^4.17.11"
resolve "^1.3.2"
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.0.0", "@babel/generator@^7.2.2":
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc"
- integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==
+"@babel/generator@^7.0.0", "@babel/generator@^7.3.4":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e"
+ integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==
dependencies:
- "@babel/types" "^7.2.2"
+ "@babel/types" "^7.3.4"
jsesc "^2.5.1"
- lodash "^4.17.10"
+ lodash "^4.17.11"
source-map "^0.5.0"
trim-right "^1.0.1"
@@ -224,10 +224,10 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3":
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489"
- integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==
+"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c"
+ integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==
"@babel/plugin-proposal-async-generator-functions@^7.2.0":
version "7.2.0"
@@ -315,7 +315,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-object-rest-spread@^7.2.0":
+"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
@@ -600,6 +600,11 @@
js-levenshtein "^1.1.3"
semver "^5.3.0"
+"@babel/standalone@^7.0.0":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.3.4.tgz#b622c1e522acef91b2a14f22bdcdd4f935a1a474"
+ integrity sha512-4L9c5i4WlGqbrjOVX0Yp8TIR5cEiw1/tPYYZENW/iuO2uI6viY38U7zALidzNfGdZIwNc+A/AWqMEWKeScWkBg==
+
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2":
version "7.2.2"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907"
@@ -609,28 +614,28 @@
"@babel/parser" "^7.2.2"
"@babel/types" "^7.2.2"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3":
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8"
- integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.3", "@babel/traverse@^7.3.4":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06"
+ integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==
dependencies:
"@babel/code-frame" "^7.0.0"
- "@babel/generator" "^7.2.2"
+ "@babel/generator" "^7.3.4"
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-split-export-declaration" "^7.0.0"
- "@babel/parser" "^7.2.3"
- "@babel/types" "^7.2.2"
+ "@babel/parser" "^7.3.4"
+ "@babel/types" "^7.3.4"
debug "^4.1.0"
globals "^11.1.0"
- lodash "^4.17.10"
+ lodash "^4.17.11"
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2":
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e"
- integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==
+"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4":
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed"
+ integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==
dependencies:
esutils "^2.0.2"
- lodash "^4.17.10"
+ lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@gitlab/csslab@^1.8.0":
@@ -658,12 +663,12 @@
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.54.0.tgz#00320e845efd46716042cde0c348b990d4908daf"
integrity sha512-DR17iy8TM5IbXEacqiDP0p8SuC/J8EL+98xbfVz5BKvRsPHpeZJQNlBF/petIV5d+KWM5A9v3GZTY7uMU7z/JQ==
-"@gitlab/ui@^2.0.4":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-2.0.4.tgz#ba86f6e5868ef7bc7f504cef9ca504c2d2f6bffd"
- integrity sha512-dJ+KKpeqIAPYZtYZeciXhC/whNiGPVRjp5IgjQRddh3zsreqmfwQq58nSH7HepAAIepaqTe0UFuzBgrSWvVM6w==
+"@gitlab/ui@^2.2.2":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-2.2.2.tgz#de8f436d6b52c168c4752b221a88cf7665fe0134"
+ integrity sha512-xVY8lGfDA3D2EtyfZVpJVeNUXLbpn/xJqNF4fleqHJfqrwt+IcVlsQ7yEs/LBukmIw6tXPliD4Mm9uefnQhkXA==
dependencies:
- babel-standalone "^6.26.0"
+ "@babel/standalone" "^7.0.0"
bootstrap-vue "^2.0.0-rc.11"
copy-to-clipboard "^3.0.8"
echarts "^4.2.0-rc.2"
@@ -697,11 +702,6 @@
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.0.tgz#d1d55958d1fccc5527d4aba29fc9c4b942f563ff"
integrity sha512-7WcbyctkE8GTzogDb0ulRAEw7v8oIS54ft9mQTU7PfM0hp5e+8kpa+HeQ7IQrFbKtJXBKcZ4bh+Em9dTw5L6AQ==
-"@types/async@2.0.50":
- version "2.0.50"
- resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.50.tgz#117540e026d64e1846093abbd5adc7e27fda7bcb"
- integrity sha512-VMhZMMQgV1zsR+lX/0IBfAk+8Eb7dPVMWiQGFAt3qjo5x7Ml6b77jUo0e1C3ToD+XRDXqtrfw+6AB0uUsPEr3Q==
-
"@types/events@*":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
@@ -741,16 +741,6 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45"
integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
-"@types/strip-bom@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2"
- integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=
-
-"@types/strip-json-comments@0.0.30":
- version "0.0.30"
- resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
- integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
-
"@types/tapable@*":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370"
@@ -801,20 +791,20 @@
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
-"@vue/component-compiler-utils@^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4"
- integrity sha512-pS4zlcdD7BvedyB+IfiTfrbi6C977UMIfulSk8r6uL0BU46ZE2+fUj/zbSNSfVxeaj9ElmnSni5OMwF9np+b+w==
+"@vue/component-compiler-utils@^2.0.0", "@vue/component-compiler-utils@^2.4.0":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b"
+ integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==
dependencies:
consolidate "^0.15.1"
hash-sum "^1.0.2"
lru-cache "^4.1.2"
merge-source-map "^1.1.0"
- postcss "^6.0.20"
- postcss-selector-parser "^3.1.1"
- prettier "1.13.7"
- source-map "^0.5.6"
- vue-template-es2015-compiler "^1.6.0"
+ postcss "^7.0.14"
+ postcss-selector-parser "^5.0.0"
+ prettier "1.16.3"
+ source-map "~0.6.1"
+ vue-template-es2015-compiler "^1.9.0"
"@vue/test-utils@^1.0.0-beta.25":
version "1.0.0-beta.25"
@@ -1124,50 +1114,54 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
-apollo-boost@^0.1.20:
- version "0.1.20"
- resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.1.20.tgz#cc3e418ebd2bea857656685d32a7a20443493363"
- integrity sha512-n2MiEY5IGpD/cy0RH+pM9vbmobM/JZ5qz38XQAUA41FxxMPlLFQxf0IUMm0tijLOJvJJBub3pDt+Of4TVPBCqA==
+apollo-boost@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.3.1.tgz#b6a896e020a0eab7e415032fe565734a955c65f8"
+ integrity sha512-VdXcTMxLBeNvANW/FtiarEkrRr/cepYKG6wTAURdy8CS33WYpEHtIg9S8tAjxwVzIECpE4lWyDKyPLoESJ072Q==
dependencies:
- apollo-cache "^1.1.20"
- apollo-cache-inmemory "^1.3.9"
- apollo-client "^2.4.5"
+ apollo-cache "^1.2.1"
+ apollo-cache-inmemory "^1.5.1"
+ apollo-client "^2.5.1"
apollo-link "^1.0.6"
apollo-link-error "^1.0.3"
apollo-link-http "^1.3.1"
- apollo-link-state "^0.4.0"
graphql-tag "^2.4.2"
+ ts-invariant "^0.2.1"
+ tslib "^1.9.3"
-apollo-cache-inmemory@^1.3.9:
- version "1.3.9"
- resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.9.tgz#10738ba6a04faaeeb0da21bbcc1f7c0b5902910c"
- integrity sha512-Q2k84p/OqIuMUyeWGc6XbVXXZu0erYOO+wTx9p+CnQUspnNvf7zmvFNgFnmudXzfuG1m1CSzePk6fC/M1ehOqQ==
+apollo-cache-inmemory@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.5.1.tgz#265d1ee67b0bf0aca9c37629d410bfae44e62953"
+ integrity sha512-D3bdpPmWfaKQkWy8lfwUg+K8OBITo3sx0BHLs1B/9vIdOIZ7JNCKq3EUcAgAfInomJUdN0QG1yOfi8M8hxkN1g==
dependencies:
- apollo-cache "^1.1.20"
- apollo-utilities "^1.0.25"
- optimism "^0.6.6"
+ apollo-cache "^1.2.1"
+ apollo-utilities "^1.2.1"
+ optimism "^0.6.9"
+ ts-invariant "^0.2.1"
+ tslib "^1.9.3"
-apollo-cache@1.1.20, apollo-cache@^1.1.20:
- version "1.1.20"
- resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.20.tgz#6152cc4baf6a63e376efee79f75de4f5c84bf90e"
- integrity sha512-+Du0/4kUSuf5PjPx0+pvgMGV12ezbHA8/hubYuqRQoy/4AWb4faa61CgJNI6cKz2mhDd9m94VTNKTX11NntwkQ==
+apollo-cache@1.2.1, apollo-cache@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.2.1.tgz#aae71eb4a11f1f7322adc343f84b1a39b0693644"
+ integrity sha512-nzFmep/oKlbzUuDyz6fS6aYhRmfpcHWqNkkA9Bbxwk18RD6LXC4eZkuE0gXRX0IibVBHNjYVK+Szi0Yied4SpQ==
dependencies:
- apollo-utilities "^1.0.25"
+ apollo-utilities "^1.2.1"
+ tslib "^1.9.3"
-apollo-client@^2.4.5:
- version "2.4.5"
- resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.4.5.tgz#545beda1ef60814943b5622f0feabc9f29ee9822"
- integrity sha512-nUm06EGa4TP/IY68OzmC3lTD32TqkjLOQdb69uYo+lHl8NnwebtrAw3qFtsQtTEz6ueBp/Z/HasNZng4jwafVQ==
+apollo-client@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.5.1.tgz#36126ed1d32edd79c3713c6684546a3bea80e6d1"
+ integrity sha512-MNcQKiqLHdGmNJ0rZ0NXaHrToXapJgS/5kPk0FygXt+/FmDCdzqcujI7OPxEC6e9Yw5S/8dIvOXcRNuOMElHkA==
dependencies:
"@types/zen-observable" "^0.8.0"
- apollo-cache "1.1.20"
+ apollo-cache "1.2.1"
apollo-link "^1.0.0"
apollo-link-dedup "^1.0.0"
- apollo-utilities "1.0.25"
+ apollo-utilities "1.2.1"
symbol-observable "^1.0.2"
+ ts-invariant "^0.2.1"
+ tslib "^1.9.3"
zen-observable "^0.8.0"
- optionalDependencies:
- "@types/async" "2.0.50"
apollo-link-dedup@^1.0.0:
version "1.0.10"
@@ -1198,14 +1192,6 @@ apollo-link-http@^1.3.1:
apollo-link "^1.2.3"
apollo-link-http-common "^0.2.5"
-apollo-link-state@^0.4.0:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.2.tgz#ac00e9be9b0ca89eae0be6ba31fe904b80bbe2e8"
- integrity sha512-xMPcAfuiPVYXaLwC6oJFIZrKgV3GmdO31Ag2eufRoXpvT0AfJZjdaPB4450Nu9TslHRePN9A3quxNueILlQxlw==
- dependencies:
- apollo-utilities "^1.0.8"
- graphql-anywhere "^4.1.0-alpha.0"
-
apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.3.tgz#9bd8d5fe1d88d31dc91dae9ecc22474d451fb70d"
@@ -1214,19 +1200,14 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.3:
apollo-utilities "^1.0.0"
zen-observable-ts "^0.8.10"
-apollo-utilities@1.0.25, apollo-utilities@^1.0.0, apollo-utilities@^1.0.25, apollo-utilities@^1.0.8:
- version "1.0.25"
- resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.25.tgz#899b00f5f990fb451675adf84cb3de82eb6372ea"
- integrity sha512-AXvqkhni3Ir1ffm4SA1QzXn8k8I5BBl4PVKEyak734i4jFdp+xgfUyi2VCqF64TJlFTA/B73TRDUvO2D+tKtZg==
+apollo-utilities@1.2.1, apollo-utilities@^1.0.0, apollo-utilities@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.2.1.tgz#1c3a1ebf5607d7c8efe7636daaf58e7463b41b3c"
+ integrity sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg==
dependencies:
fast-json-stable-stringify "^2.0.0"
-
-append-transform@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
- integrity sha1-126/jKlNJ24keja61EpLdKthGZE=
- dependencies:
- default-require-extensions "^1.0.0"
+ ts-invariant "^0.2.1"
+ tslib "^1.9.3"
append-transform@^1.0.0:
version "1.0.0"
@@ -1255,19 +1236,12 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
-arr-diff@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
- integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
- dependencies:
- arr-flatten "^1.0.1"
-
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+arr-flatten@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
@@ -1392,7 +1366,7 @@ async@1.x, async@^1.5.2:
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
-async@^2.0.0, async@^2.1.4, async@^2.5.0, async@^2.6.1:
+async@^2.0.0, async@^2.5.0, async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
@@ -1460,36 +1434,6 @@ babel-code-frame@^6.26.0:
esutils "^2.0.2"
js-tokens "^3.0.2"
-babel-core@^6.0.0, babel-core@^6.26.0:
- version "6.26.3"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
- integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
- dependencies:
- babel-code-frame "^6.26.0"
- babel-generator "^6.26.0"
- babel-helpers "^6.24.1"
- babel-messages "^6.23.0"
- babel-register "^6.26.0"
- babel-runtime "^6.26.0"
- babel-template "^6.26.0"
- babel-traverse "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- convert-source-map "^1.5.1"
- debug "^2.6.9"
- json5 "^0.5.1"
- lodash "^4.17.4"
- minimatch "^3.0.4"
- path-is-absolute "^1.0.1"
- private "^0.1.8"
- slash "^1.0.0"
- source-map "^0.5.7"
-
-babel-core@^7.0.0-bridge:
- version "7.0.0-bridge.0"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
- integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
-
babel-eslint@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed"
@@ -1502,35 +1446,15 @@ babel-eslint@^10.0.1:
eslint-scope "3.7.1"
eslint-visitor-keys "^1.0.0"
-babel-generator@^6.18.0, babel-generator@^6.26.0:
- version "6.26.1"
- resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
- integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+babel-jest@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190"
+ integrity sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw==
dependencies:
- babel-messages "^6.23.0"
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- detect-indent "^4.0.0"
- jsesc "^1.3.0"
- lodash "^4.17.4"
- source-map "^0.5.7"
- trim-right "^1.0.1"
-
-babel-helpers@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
- integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
- dependencies:
- babel-runtime "^6.22.0"
- babel-template "^6.24.1"
-
-babel-jest@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1"
- integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==
- dependencies:
- babel-plugin-istanbul "^4.1.6"
- babel-preset-jest "^23.2.0"
+ babel-plugin-istanbul "^5.1.0"
+ babel-preset-jest "^24.1.0"
+ chalk "^2.4.2"
+ slash "^2.0.0"
babel-loader@^8.0.5:
version "8.0.5"
@@ -1542,13 +1466,6 @@ babel-loader@^8.0.5:
mkdirp "^0.5.1"
util.promisify "^1.0.0"
-babel-messages@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
- integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
- dependencies:
- babel-runtime "^6.22.0"
-
babel-plugin-dynamic-import-node@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e"
@@ -1556,16 +1473,6 @@ babel-plugin-dynamic-import-node@^2.2.0:
dependencies:
object.assign "^4.1.0"
-babel-plugin-istanbul@^4.1.6:
- version "4.1.6"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
- integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==
- dependencies:
- babel-plugin-syntax-object-rest-spread "^6.13.0"
- find-up "^2.1.0"
- istanbul-lib-instrument "^1.10.1"
- test-exclude "^4.2.1"
-
babel-plugin-istanbul@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30"
@@ -1575,39 +1482,16 @@ babel-plugin-istanbul@^5.1.0:
istanbul-lib-instrument "^3.0.0"
test-exclude "^5.0.0"
-babel-plugin-jest-hoist@^23.2.0:
- version "23.2.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
- integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=
+babel-plugin-jest-hoist@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8"
+ integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw==
babel-plugin-rewire@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz#822562d72ed2c84e47c0f95ee232c920853e9d89"
integrity sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==
-babel-plugin-syntax-object-rest-spread@^6.13.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
- integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
-
-babel-plugin-transform-es2015-modules-commonjs@^6.26.0, babel-plugin-transform-es2015-modules-commonjs@^6.26.2:
- version "6.26.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
- integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
- dependencies:
- babel-plugin-transform-strict-mode "^6.24.1"
- babel-runtime "^6.26.0"
- babel-template "^6.26.0"
- babel-types "^6.26.0"
-
-babel-plugin-transform-strict-mode@^6.24.1:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
- integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
- dependencies:
- babel-runtime "^6.22.0"
- babel-types "^6.24.1"
-
babel-polyfill@6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
@@ -1617,28 +1501,15 @@ babel-polyfill@6.23.0:
core-js "^2.4.0"
regenerator-runtime "^0.10.0"
-babel-preset-jest@^23.2.0:
- version "23.2.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
- integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY=
- dependencies:
- babel-plugin-jest-hoist "^23.2.0"
- babel-plugin-syntax-object-rest-spread "^6.13.0"
-
-babel-register@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
- integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
+babel-preset-jest@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e"
+ integrity sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw==
dependencies:
- babel-core "^6.26.0"
- babel-runtime "^6.26.0"
- core-js "^2.5.0"
- home-or-tmp "^2.0.0"
- lodash "^4.17.4"
- mkdirp "^0.5.1"
- source-map-support "^0.4.15"
+ "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
+ babel-plugin-jest-hoist "^24.1.0"
-babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+babel-runtime@^6.22.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -1646,57 +1517,11 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
-babel-standalone@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-standalone/-/babel-standalone-6.26.0.tgz#15fb3d35f2c456695815ebf1ed96fe7f015b6886"
- integrity sha1-Ffs9NfLEVmlYFevx7Zb+fwFbaIY=
-
-babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
- integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
- dependencies:
- babel-runtime "^6.26.0"
- babel-traverse "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- lodash "^4.17.4"
-
-babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
- integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
- dependencies:
- babel-code-frame "^6.26.0"
- babel-messages "^6.23.0"
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- babylon "^6.18.0"
- debug "^2.6.8"
- globals "^9.18.0"
- invariant "^2.2.2"
- lodash "^4.17.4"
-
-babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
- integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
- dependencies:
- babel-runtime "^6.26.0"
- esutils "^2.0.2"
- lodash "^4.17.4"
- to-fast-properties "^1.0.3"
-
babylon@7.0.0-beta.19:
version "7.0.0-beta.19"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.19.tgz#e928c7e807e970e0536b078ab3e0c48f9e052503"
integrity sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==
-babylon@^6.18.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
- integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
-
backo2@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
@@ -1872,15 +1697,6 @@ braces@^0.1.2:
dependencies:
expand-range "^0.1.0"
-braces@^1.8.2:
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
- integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
- dependencies:
- expand-range "^1.8.1"
- preserve "^0.2.0"
- repeat-element "^1.1.2"
-
braces@^2.3.0, braces@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
@@ -1983,6 +1799,13 @@ browserslist@^4.3.4, browserslist@^4.4.1:
electron-to-chromium "^1.3.103"
node-releases "^1.1.3"
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@@ -1990,10 +1813,10 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
-buffer-from@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
- integrity sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==
+buffer-from@1.x, buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
buffer-indexof@^1.0.0:
version "1.1.0"
@@ -2124,6 +1947,11 @@ callsites@^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"
+ integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==
+
camelcase-keys@^4.0.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
@@ -2297,6 +2125,11 @@ ci-info@^1.5.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@@ -2390,11 +2223,6 @@ clone-response@1.0.2:
dependencies:
mimic-response "^1.0.0"
-clone@2.x:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2629,7 +2457,7 @@ content-type@~1.0.4:
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
-convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
@@ -2670,7 +2498,7 @@ copy-to-clipboard@^3.0.8:
dependencies:
toggle-selection "^1.0.3"
-core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1:
version "2.5.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
@@ -3174,7 +3002,7 @@ debug@^3.1.0, debug@^3.2.5:
dependencies:
ms "^2.1.1"
-debug@^4.0.0, debug@^4.0.1, debug@^4.1.0:
+debug@^4.0.0, 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==
@@ -3248,13 +3076,6 @@ default-gateway@^2.6.0:
execa "^0.10.0"
ip-regex "^2.1.0"
-default-require-extensions@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
- integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=
- dependencies:
- strip-bom "^2.0.0"
-
default-require-extensions@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7"
@@ -3359,13 +3180,6 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-detect-indent@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
- integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
- dependencies:
- repeating "^2.0.0"
-
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
@@ -3386,6 +3200,11 @@ di@^0.0.1:
resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=
+diff-sequences@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013"
+ integrity sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw==
+
diff@^3.2.0, diff@^3.4.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -3876,10 +3695,10 @@ eslint-plugin-jasmine@^2.10.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-2.10.1.tgz#5733b709e751f4bc40e31e1c16989bd2cdfbec97"
integrity sha1-VzO3CedR9LxA4x4cFpib0s377Jc=
-eslint-plugin-jest@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.1.0.tgz#9a4dfa3367563e8301560a7fb92ec309096dbca3"
- integrity sha512-WcQd5LxEoAS20zuWEAd8CX0pVC+gGInZPcsoYvK5w7BrEJNmltyTxYYh1r0ct4GsahD2GvNySlcTcLtK2amFZA==
+eslint-plugin-jest@^22.3.0:
+ version "22.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.3.0.tgz#a10f10dedfc92def774ec9bb5bfbd2fb8e1c96d2"
+ integrity sha512-P1mYVRNlOEoO5T9yTqOfucjOYf1ktmJ26NjwjH8sxpCFQa6IhBGr5TpKl3hcAAT29hOsRJVuMWmTsHoUVo9FoA==
eslint-plugin-promise@^4.0.1:
version "4.0.1"
@@ -4089,6 +3908,19 @@ execa@^0.7.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
execall@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73"
@@ -4110,13 +3942,6 @@ expand-braces@^0.1.1:
array-unique "^0.2.1"
braces "^0.1.2"
-expand-brackets@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
- integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
- dependencies:
- is-posix-bracket "^0.1.0"
-
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@@ -4138,13 +3963,6 @@ expand-range@^0.1.0:
is-number "^0.1.1"
repeat-string "^0.2.2"
-expand-range@^1.8.1:
- version "1.8.2"
- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
- integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
- dependencies:
- fill-range "^2.1.0"
-
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@@ -4152,17 +3970,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
dependencies:
homedir-polyfill "^1.0.1"
-expect@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98"
- integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==
+expect@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-24.1.0.tgz#88e73301c4c785cde5f16da130ab407bdaf8c0f2"
+ integrity sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw==
dependencies:
ansi-styles "^3.2.0"
- jest-diff "^23.6.0"
- jest-get-type "^22.1.0"
- jest-matcher-utils "^23.6.0"
- jest-message-util "^23.4.0"
- jest-regex-util "^23.3.0"
+ jest-get-type "^24.0.0"
+ jest-matcher-utils "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-regex-util "^24.0.0"
exports-loader@^0.7.0:
version "0.7.0"
@@ -4246,13 +4063,6 @@ external-editor@^3.0.0:
iconv-lite "^0.4.22"
tmp "^0.0.33"
-extglob@^0.3.1:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
- integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
- dependencies:
- is-extglob "^1.0.0"
-
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -4296,7 +4106,7 @@ fast-glob@^2.2.6:
merge2 "^1.2.3"
micromatch "^3.1.10"
-fast-json-stable-stringify@^2.0.0:
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
@@ -4374,12 +4184,7 @@ file-loader@^3.0.1:
loader-utils "^1.0.2"
schema-utils "^1.0.0"
-filename-regex@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
- integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
-
-fileset@^2.0.2, fileset@^2.0.3:
+fileset@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=
@@ -4392,17 +4197,6 @@ filesize@^3.6.1:
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
-fill-range@^2.1.0:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
- integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
- dependencies:
- is-number "^2.1.0"
- isobject "^2.0.0"
- randomatic "^3.0.0"
- repeat-element "^1.1.2"
- repeat-string "^1.5.2"
-
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -4439,14 +4233,6 @@ finalhandler@1.1.1:
statuses "~1.4.0"
unpipe "~1.0.0"
-find-babel-config@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355"
- integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=
- dependencies:
- json5 "^0.5.1"
- path-exists "^3.0.0"
-
find-cache-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d"
@@ -4532,18 +4318,11 @@ follow-redirects@^1.2.5:
dependencies:
debug "^3.1.0"
-for-in@^1.0.1, for-in@^1.0.2:
+for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-for-own@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
- integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
- dependencies:
- for-in "^1.0.1"
-
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -4674,6 +4453,13 @@ get-stream@3.0.0, get-stream@^3.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -4708,21 +4494,6 @@ gettext-extractor@^3.3.2:
pofile "^1"
typescript "^2"
-glob-base@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
- integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
- dependencies:
- glob-parent "^2.0.0"
- is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
- integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
- dependencies:
- is-glob "^2.0.0"
-
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -4812,11 +4583,6 @@ globals@^11.1.0, globals@^11.7.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==
-globals@^9.18.0:
- version "9.18.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
- integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
-
globby@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
@@ -4924,13 +4690,6 @@ graphlibrary@^2.2.0:
dependencies:
lodash "^4.17.5"
-graphql-anywhere@^4.1.0-alpha.0:
- version "4.1.22"
- resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.22.tgz#1c831ba3c9e5664a0dd24d10d23a9e9512d92056"
- integrity sha512-qm2/1cKM8nfotxDhm4J0r1znVlK0Yge/yEKt26EVVBgpIhvxjXYFALCGbr7cvfDlvzal1iSPpaYa+8YTtjsxQA==
- dependencies:
- apollo-utilities "^1.0.25"
-
graphql-tag@^2.10.0, graphql-tag@^2.4.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae"
@@ -4961,10 +4720,10 @@ handle-thing@^2.0.0:
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
-handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.3:
- version "4.0.12"
- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
- integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==
+handlebars@^4.0.1, handlebars@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a"
+ integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==
dependencies:
async "^2.5.0"
optimist "^0.6.1"
@@ -5121,14 +4880,6 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
-home-or-tmp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
- integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.1"
-
homedir-polyfill@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
@@ -5321,14 +5072,6 @@ import-lazy@^3.1.0:
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc"
integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==
-import-local@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
- integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==
- dependencies:
- pkg-dir "^2.0.0"
- resolve-cwd "^2.0.0"
-
import-local@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
@@ -5545,6 +5288,13 @@ is-ci@^1.0.10:
dependencies:
ci-info "^1.5.0"
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -5592,18 +5342,6 @@ is-directory@^0.3.1:
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-is-dotfile@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
- integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=
-
-is-equal-shallow@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
- integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
- dependencies:
- is-primitive "^2.0.0"
-
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@@ -5616,23 +5354,11 @@ is-extendable@^1.0.1:
dependencies:
is-plain-object "^2.0.4"
-is-extglob@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
- integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
-
is-extglob@^2.1.0, is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-is-finite@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
- integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
- dependencies:
- number-is-nan "^1.0.0"
-
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
@@ -5645,17 +5371,10 @@ is-fullwidth-code-point@^2.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-is-generator-fn@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
- integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=
-
-is-glob@^2.0.0, is-glob@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
- integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
- dependencies:
- is-extglob "^1.0.0"
+is-generator-fn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e"
+ integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==
is-glob@^3.1.0:
version "3.1.0"
@@ -5694,13 +5413,6 @@ is-number@^0.1.1:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=
-is-number@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
- integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
- dependencies:
- kind-of "^3.0.2"
-
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -5761,16 +5473,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-posix-bracket@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
- integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
-
-is-primitive@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
- integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
-
is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@@ -5825,11 +5527,6 @@ is-typedarray@~1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-is-utf8@^0.2.0:
- version "0.2.1"
- 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"
@@ -5887,145 +5584,76 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-istanbul-api@^1.3.1:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
- integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==
- dependencies:
- async "^2.1.4"
- fileset "^2.0.2"
- istanbul-lib-coverage "^1.2.1"
- istanbul-lib-hook "^1.2.2"
- istanbul-lib-instrument "^1.10.2"
- istanbul-lib-report "^1.1.5"
- istanbul-lib-source-maps "^1.2.6"
- istanbul-reports "^1.5.1"
- js-yaml "^3.7.0"
- mkdirp "^0.5.1"
- once "^1.4.0"
-
-istanbul-api@^2.0.5:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc"
- integrity sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==
+istanbul-api@^2.0.5, istanbul-api@^2.0.8:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0"
+ integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==
dependencies:
async "^2.6.1"
compare-versions "^3.2.1"
fileset "^2.0.3"
- istanbul-lib-coverage "^2.0.1"
- istanbul-lib-hook "^2.0.1"
- istanbul-lib-instrument "^3.0.0"
- istanbul-lib-report "^2.0.2"
- istanbul-lib-source-maps "^2.0.1"
- istanbul-reports "^2.0.1"
+ istanbul-lib-coverage "^2.0.3"
+ istanbul-lib-hook "^2.0.3"
+ istanbul-lib-instrument "^3.1.0"
+ istanbul-lib-report "^2.0.4"
+ istanbul-lib-source-maps "^3.0.2"
+ istanbul-reports "^2.1.1"
js-yaml "^3.12.0"
make-dir "^1.3.0"
+ minimatch "^3.0.4"
once "^1.4.0"
-istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
- integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
-
-istanbul-lib-coverage@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda"
- integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==
-
-istanbul-lib-hook@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
- integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==
- dependencies:
- append-transform "^0.4.0"
+istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba"
+ integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==
-istanbul-lib-hook@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72"
- integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==
+istanbul-lib-hook@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb"
+ integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==
dependencies:
append-transform "^1.0.0"
-istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
- integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
- dependencies:
- babel-generator "^6.18.0"
- babel-template "^6.16.0"
- babel-traverse "^6.18.0"
- babel-types "^6.18.0"
- babylon "^6.18.0"
- istanbul-lib-coverage "^1.2.1"
- semver "^5.3.0"
-
-istanbul-lib-instrument@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9"
- integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==
+istanbul-lib-instrument@^3.0.0, istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971"
+ integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==
dependencies:
"@babel/generator" "^7.0.0"
"@babel/parser" "^7.0.0"
"@babel/template" "^7.0.0"
"@babel/traverse" "^7.0.0"
"@babel/types" "^7.0.0"
- istanbul-lib-coverage "^2.0.1"
+ istanbul-lib-coverage "^2.0.3"
semver "^5.5.0"
-istanbul-lib-report@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
- integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==
- dependencies:
- istanbul-lib-coverage "^1.2.1"
- mkdirp "^0.5.1"
- path-parse "^1.0.5"
- supports-color "^3.1.2"
-
-istanbul-lib-report@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535"
- integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==
+istanbul-lib-report@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4"
+ integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==
dependencies:
- istanbul-lib-coverage "^2.0.1"
+ istanbul-lib-coverage "^2.0.3"
make-dir "^1.3.0"
- supports-color "^5.4.0"
+ supports-color "^6.0.0"
-istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
- integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==
- dependencies:
- debug "^3.1.0"
- istanbul-lib-coverage "^1.2.1"
- mkdirp "^0.5.1"
- rimraf "^2.6.1"
- source-map "^0.5.3"
-
-istanbul-lib-source-maps@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e"
- integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==
+istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156"
+ integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==
dependencies:
- debug "^3.1.0"
- istanbul-lib-coverage "^2.0.1"
+ debug "^4.1.1"
+ istanbul-lib-coverage "^2.0.3"
make-dir "^1.3.0"
rimraf "^2.6.2"
source-map "^0.6.1"
-istanbul-reports@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
- integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==
- dependencies:
- handlebars "^4.0.3"
-
-istanbul-reports@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7"
- integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==
+istanbul-reports@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9"
+ integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==
dependencies:
- handlebars "^4.0.11"
+ handlebars "^4.1.0"
istanbul@^0.4.5:
version "0.4.5"
@@ -6091,284 +5719,292 @@ jed@^1.1.1:
resolved "https://registry.yarnpkg.com/jed/-/jed-1.1.1.tgz#7a549bbd9ffe1585b0cd0a191e203055bee574b4"
integrity sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=
-jest-changed-files@^23.4.2:
- version "23.4.2"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
- integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==
+jest-changed-files@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7"
+ integrity sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ==
dependencies:
+ execa "^1.0.0"
throat "^4.0.0"
-jest-cli@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4"
- integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==
+jest-cli@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.1.0.tgz#f7cc98995f36e7210cce3cbb12974cbf60940843"
+ integrity sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw==
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.1"
exit "^0.1.2"
glob "^7.1.2"
- graceful-fs "^4.1.11"
- import-local "^1.0.0"
- is-ci "^1.0.10"
- istanbul-api "^1.3.1"
- istanbul-lib-coverage "^1.2.0"
- istanbul-lib-instrument "^1.10.1"
- istanbul-lib-source-maps "^1.2.4"
- jest-changed-files "^23.4.2"
- jest-config "^23.6.0"
- jest-environment-jsdom "^23.4.0"
- jest-get-type "^22.1.0"
- jest-haste-map "^23.6.0"
- jest-message-util "^23.4.0"
- jest-regex-util "^23.3.0"
- jest-resolve-dependencies "^23.6.0"
- jest-runner "^23.6.0"
- jest-runtime "^23.6.0"
- jest-snapshot "^23.6.0"
- jest-util "^23.4.0"
- jest-validate "^23.6.0"
- jest-watcher "^23.4.0"
- jest-worker "^23.2.0"
- micromatch "^2.3.11"
+ graceful-fs "^4.1.15"
+ import-local "^2.0.0"
+ is-ci "^2.0.0"
+ istanbul-api "^2.0.8"
+ istanbul-lib-coverage "^2.0.2"
+ istanbul-lib-instrument "^3.0.1"
+ istanbul-lib-source-maps "^3.0.1"
+ jest-changed-files "^24.0.0"
+ jest-config "^24.1.0"
+ jest-environment-jsdom "^24.0.0"
+ jest-get-type "^24.0.0"
+ jest-haste-map "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-regex-util "^24.0.0"
+ jest-resolve-dependencies "^24.1.0"
+ jest-runner "^24.1.0"
+ jest-runtime "^24.1.0"
+ jest-snapshot "^24.1.0"
+ jest-util "^24.0.0"
+ jest-validate "^24.0.0"
+ jest-watcher "^24.0.0"
+ jest-worker "^24.0.0"
+ micromatch "^3.1.10"
node-notifier "^5.2.1"
- prompts "^0.1.9"
+ p-each-series "^1.0.0"
+ pirates "^4.0.0"
+ prompts "^2.0.1"
realpath-native "^1.0.0"
rimraf "^2.5.4"
- slash "^1.0.0"
+ slash "^2.0.0"
string-length "^2.0.0"
- strip-ansi "^4.0.0"
+ strip-ansi "^5.0.0"
which "^1.2.12"
- yargs "^11.0.0"
+ yargs "^12.0.2"
-jest-config@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d"
- integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==
+jest-config@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.1.0.tgz#6ea6881cfdd299bc86cc144ee36d937c97c3850c"
+ integrity sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg==
dependencies:
- babel-core "^6.0.0"
- babel-jest "^23.6.0"
+ "@babel/core" "^7.1.0"
+ babel-jest "^24.1.0"
chalk "^2.0.1"
glob "^7.1.1"
- jest-environment-jsdom "^23.4.0"
- jest-environment-node "^23.4.0"
- jest-get-type "^22.1.0"
- jest-jasmine2 "^23.6.0"
- jest-regex-util "^23.3.0"
- jest-resolve "^23.6.0"
- jest-util "^23.4.0"
- jest-validate "^23.6.0"
- micromatch "^2.3.11"
- pretty-format "^23.6.0"
-
-jest-diff@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d"
- integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==
+ jest-environment-jsdom "^24.0.0"
+ jest-environment-node "^24.0.0"
+ jest-get-type "^24.0.0"
+ jest-jasmine2 "^24.1.0"
+ jest-regex-util "^24.0.0"
+ jest-resolve "^24.1.0"
+ jest-util "^24.0.0"
+ jest-validate "^24.0.0"
+ micromatch "^3.1.10"
+ pretty-format "^24.0.0"
+ realpath-native "^1.0.2"
+
+jest-diff@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0.tgz#a3e5f573dbac482f7d9513ac9cfa21644d3d6b34"
+ integrity sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA==
dependencies:
chalk "^2.0.1"
- diff "^3.2.0"
- jest-get-type "^22.1.0"
- pretty-format "^23.6.0"
+ diff-sequences "^24.0.0"
+ jest-get-type "^24.0.0"
+ pretty-format "^24.0.0"
-jest-docblock@^23.2.0:
- version "23.2.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
- integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=
+jest-docblock@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0.tgz#54d77a188743e37f62181a91a01eb9222289f94e"
+ integrity sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA==
dependencies:
detect-newline "^2.1.0"
-jest-each@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575"
- integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==
+jest-each@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0.tgz#10987a06b21c7ffbfb7706c89d24c52ed864be55"
+ integrity sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA==
dependencies:
chalk "^2.0.1"
- pretty-format "^23.6.0"
+ jest-get-type "^24.0.0"
+ jest-util "^24.0.0"
+ pretty-format "^24.0.0"
-jest-environment-jsdom@^23.4.0:
- version "23.4.0"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
- integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM=
+jest-environment-jsdom@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz#5affa0654d6e44cd798003daa1a8701dbd6e4d11"
+ integrity sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw==
dependencies:
- jest-mock "^23.2.0"
- jest-util "^23.4.0"
+ jest-mock "^24.0.0"
+ jest-util "^24.0.0"
jsdom "^11.5.1"
-jest-environment-node@^23.4.0:
- version "23.4.0"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
- integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=
+jest-environment-node@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0.tgz#330948980656ed8773ce2e04eb597ed91e3c7190"
+ integrity sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg==
dependencies:
- jest-mock "^23.2.0"
- jest-util "^23.4.0"
+ jest-mock "^24.0.0"
+ jest-util "^24.0.0"
-jest-get-type@^22.1.0:
- version "22.4.3"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
- integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==
+jest-get-type@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b"
+ integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w==
-jest-haste-map@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16"
- integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==
+jest-haste-map@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0.tgz#e9ef51b2c9257384b4d6beb83bd48c65b37b5e6e"
+ integrity sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ==
dependencies:
fb-watchman "^2.0.0"
- graceful-fs "^4.1.11"
+ graceful-fs "^4.1.15"
invariant "^2.2.4"
- jest-docblock "^23.2.0"
- jest-serializer "^23.0.1"
- jest-worker "^23.2.0"
- micromatch "^2.3.11"
- sane "^2.0.0"
-
-jest-jasmine2@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0"
- integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==
- dependencies:
- babel-traverse "^6.0.0"
+ jest-serializer "^24.0.0"
+ jest-util "^24.0.0"
+ jest-worker "^24.0.0"
+ micromatch "^3.1.10"
+ sane "^3.0.0"
+
+jest-jasmine2@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz#8377324b967037c440f0a549ee0bbd9912055db6"
+ integrity sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg==
+ dependencies:
+ "@babel/traverse" "^7.1.0"
chalk "^2.0.1"
co "^4.6.0"
- expect "^23.6.0"
- is-generator-fn "^1.0.0"
- jest-diff "^23.6.0"
- jest-each "^23.6.0"
- jest-matcher-utils "^23.6.0"
- jest-message-util "^23.4.0"
- jest-snapshot "^23.6.0"
- jest-util "^23.4.0"
- pretty-format "^23.6.0"
-
-jest-junit@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-5.2.0.tgz#980401db7aa69999cf117c6d740a8135c22ae379"
- integrity sha512-Mdg0Qpdh1Xm/FA1B/mcLlmEmlr3XzH5pZg7MvcAwZhjHijPRd1z/UwYwkwNHmCV7o4ZOWCf77nLu7ZkhHHrtJg==
+ expect "^24.1.0"
+ is-generator-fn "^2.0.0"
+ jest-each "^24.0.0"
+ jest-matcher-utils "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-snapshot "^24.1.0"
+ jest-util "^24.0.0"
+ pretty-format "^24.0.0"
+ throat "^4.0.0"
+
+jest-junit@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-6.3.0.tgz#99e64ebc54eddcb21238f0cc49f5820c89a8c785"
+ integrity sha512-3PH9UkpaomX6CUzqjlnk0m4yBCW/eroxV6v61OM6LkCQFO848P3YUhfIzu8ypZSBKB3vvCbB4WaLTKT0BrIf8A==
dependencies:
- jest-config "^23.6.0"
- jest-validate "^23.0.1"
+ jest-validate "^24.0.0"
mkdirp "^0.5.1"
strip-ansi "^4.0.0"
xml "^1.0.1"
-jest-leak-detector@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de"
- integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==
+jest-leak-detector@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz#78280119fd05ee98317daee62cddb3aa537a31c6"
+ integrity sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg==
dependencies:
- pretty-format "^23.6.0"
+ pretty-format "^24.0.0"
-jest-matcher-utils@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80"
- integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==
+jest-matcher-utils@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz#fc9c41cfc49b2c3ec14e576f53d519c37729d579"
+ integrity sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA==
dependencies:
chalk "^2.0.1"
- jest-get-type "^22.1.0"
- pretty-format "^23.6.0"
+ jest-diff "^24.0.0"
+ jest-get-type "^24.0.0"
+ pretty-format "^24.0.0"
-jest-message-util@^23.4.0:
- version "23.4.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
- integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=
+jest-message-util@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0.tgz#a07a141433b2c992dbaec68d4cbfe470ba289619"
+ integrity sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q==
dependencies:
- "@babel/code-frame" "^7.0.0-beta.35"
+ "@babel/code-frame" "^7.0.0"
chalk "^2.0.1"
- micromatch "^2.3.11"
- slash "^1.0.0"
+ micromatch "^3.1.10"
+ slash "^2.0.0"
stack-utils "^1.0.1"
-jest-mock@^23.2.0:
- version "23.2.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
- integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=
+jest-mock@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0.tgz#9a4b53e01d66a0e780f7d857462d063e024c617d"
+ integrity sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A==
-jest-regex-util@^23.3.0:
- version "23.3.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
- integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=
+jest-regex-util@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0.tgz#4feee8ec4a358f5bee0a654e94eb26163cb9089a"
+ integrity sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q==
-jest-resolve-dependencies@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d"
- integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==
+jest-resolve-dependencies@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz#78f738a2ec59ff4d00751d9da56f176e3f589f6c"
+ integrity sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw==
dependencies:
- jest-regex-util "^23.3.0"
- jest-snapshot "^23.6.0"
+ jest-regex-util "^24.0.0"
+ jest-snapshot "^24.1.0"
-jest-resolve@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae"
- integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==
+jest-resolve@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.1.0.tgz#42ff0169b0ea47bfdbd0c52a0067ca7d022c7688"
+ integrity sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg==
dependencies:
browser-resolve "^1.11.3"
chalk "^2.0.1"
realpath-native "^1.0.0"
-jest-runner@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38"
- integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==
+jest-runner@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b"
+ integrity sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg==
dependencies:
+ chalk "^2.4.2"
exit "^0.1.2"
- graceful-fs "^4.1.11"
- jest-config "^23.6.0"
- jest-docblock "^23.2.0"
- jest-haste-map "^23.6.0"
- jest-jasmine2 "^23.6.0"
- jest-leak-detector "^23.6.0"
- jest-message-util "^23.4.0"
- jest-runtime "^23.6.0"
- jest-util "^23.4.0"
- jest-worker "^23.2.0"
+ graceful-fs "^4.1.15"
+ jest-config "^24.1.0"
+ jest-docblock "^24.0.0"
+ jest-haste-map "^24.0.0"
+ jest-jasmine2 "^24.1.0"
+ jest-leak-detector "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-runtime "^24.1.0"
+ jest-util "^24.0.0"
+ jest-worker "^24.0.0"
source-map-support "^0.5.6"
throat "^4.0.0"
-jest-runtime@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082"
- integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==
+jest-runtime@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.1.0.tgz#7c157a2e776609e8cf552f956a5a19ec9c985214"
+ integrity sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ==
dependencies:
- babel-core "^6.0.0"
- babel-plugin-istanbul "^4.1.6"
+ "@babel/core" "^7.1.0"
+ babel-plugin-istanbul "^5.1.0"
chalk "^2.0.1"
convert-source-map "^1.4.0"
exit "^0.1.2"
fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.1.11"
- jest-config "^23.6.0"
- jest-haste-map "^23.6.0"
- jest-message-util "^23.4.0"
- jest-regex-util "^23.3.0"
- jest-resolve "^23.6.0"
- jest-snapshot "^23.6.0"
- jest-util "^23.4.0"
- jest-validate "^23.6.0"
- micromatch "^2.3.11"
+ glob "^7.1.3"
+ graceful-fs "^4.1.15"
+ jest-config "^24.1.0"
+ jest-haste-map "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-regex-util "^24.0.0"
+ jest-resolve "^24.1.0"
+ jest-snapshot "^24.1.0"
+ jest-util "^24.0.0"
+ jest-validate "^24.0.0"
+ micromatch "^3.1.10"
realpath-native "^1.0.0"
- slash "^1.0.0"
- strip-bom "3.0.0"
- write-file-atomic "^2.1.0"
- yargs "^11.0.0"
-
-jest-serializer@^23.0.1:
- version "23.0.1"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
- integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=
-
-jest-snapshot@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a"
- integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==
- dependencies:
- babel-types "^6.0.0"
+ slash "^2.0.0"
+ strip-bom "^3.0.0"
+ write-file-atomic "2.4.1"
+ yargs "^12.0.2"
+
+jest-serializer@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b"
+ integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw==
+
+jest-snapshot@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.1.0.tgz#85e22f810357aa5994ab61f236617dc2205f2f5b"
+ integrity sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA==
+ dependencies:
+ "@babel/types" "^7.0.0"
chalk "^2.0.1"
- jest-diff "^23.6.0"
- jest-matcher-utils "^23.6.0"
- jest-message-util "^23.4.0"
- jest-resolve "^23.6.0"
+ jest-diff "^24.0.0"
+ jest-matcher-utils "^24.0.0"
+ jest-message-util "^24.0.0"
+ jest-resolve "^24.1.0"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
- pretty-format "^23.6.0"
+ pretty-format "^24.0.0"
semver "^5.5.0"
jest-transform-graphql@^2.1.0:
@@ -6376,53 +6012,56 @@ jest-transform-graphql@^2.1.0:
resolved "https://registry.yarnpkg.com/jest-transform-graphql/-/jest-transform-graphql-2.1.0.tgz#903cb66bb27bc2772fd3e5dd4f7e9b57230f5829"
integrity sha1-kDy2a7J7wncv0+XdT36bVyMPWCk=
-jest-util@^23.4.0:
- version "23.4.0"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
- integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=
+jest-util@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0.tgz#fd38fcafd6dedbd0af2944d7a227c0d91b68f7d6"
+ integrity sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ==
dependencies:
- callsites "^2.0.0"
+ callsites "^3.0.0"
chalk "^2.0.1"
- graceful-fs "^4.1.11"
- is-ci "^1.0.10"
- jest-message-util "^23.4.0"
+ graceful-fs "^4.1.15"
+ is-ci "^2.0.0"
+ jest-message-util "^24.0.0"
mkdirp "^0.5.1"
- slash "^1.0.0"
+ slash "^2.0.0"
source-map "^0.6.0"
-jest-validate@^23.0.1, jest-validate@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474"
- integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==
+jest-validate@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020"
+ integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g==
dependencies:
+ camelcase "^5.0.0"
chalk "^2.0.1"
- jest-get-type "^22.1.0"
+ jest-get-type "^24.0.0"
leven "^2.1.0"
- pretty-format "^23.6.0"
+ pretty-format "^24.0.0"
-jest-watcher@^23.4.0:
- version "23.4.0"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
- integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=
+jest-watcher@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0.tgz#20d44244d10b0b7312410aefd256c1c1eef68890"
+ integrity sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g==
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.1"
+ jest-util "^24.0.0"
string-length "^2.0.0"
-jest-worker@^23.2.0:
- version "23.2.0"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
- integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=
+jest-worker@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d"
+ integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==
dependencies:
merge-stream "^1.0.1"
+ supports-color "^6.1.0"
-jest@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d"
- integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==
+jest@^24.1.0:
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2"
+ integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A==
dependencies:
- import-local "^1.0.0"
- jest-cli "^23.6.0"
+ import-local "^2.0.0"
+ jest-cli "^24.1.0"
jquery-ujs@1.2.2:
version "1.2.2"
@@ -6441,7 +6080,7 @@ jquery.waitforimages@^2.2.0:
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==
-js-beautify@^1.6.14, js-beautify@^1.8.8:
+js-beautify@^1.8.8:
version "1.8.9"
resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.9.tgz#08e3c05ead3ecfbd4f512c3895b1cda76c87d523"
integrity sha512-MwPmLywK9RSX0SPsUJjN7i+RQY9w/yC17Lbrq9ViEefpLRgqAR2BgrMN2AbifkUuhDV8tRauLhLda/9+bE0YQA==
@@ -6472,7 +6111,7 @@ js-tokens@^3.0.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
+js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.9.0:
version "3.12.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600"
integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==
@@ -6547,11 +6186,6 @@ jsdom@^11.5.1:
ws "^5.2.0"
xml-name-validator "^3.0.0"
-jsesc@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
- integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
-
jsesc@^2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
@@ -6597,18 +6231,18 @@ json3@^3.3.2:
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=
-json5@^0.5.0, json5@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
- integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
-
-json5@^2.1.0:
+json5@2.x, json5@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
dependencies:
minimist "^1.2.0"
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -6774,10 +6408,10 @@ klaw@~2.0.0:
dependencies:
graceful-fs "^4.1.9"
-kleur@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300"
- integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==
+kleur@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.2.tgz#83c7ec858a41098b613d5998a7b653962b504f68"
+ integrity sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==
known-css-properties@^0.11.0:
version "0.11.0"
@@ -6849,17 +6483,6 @@ linkify-it@^2.0.0:
dependencies:
uc.micro "^1.0.1"
-load-json-file@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
- integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
- strip-bom "^2.0.0"
-
load-json-file@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
@@ -6970,7 +6593,7 @@ lodash.upperfirst@4.3.1:
resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=
-lodash@4.x, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.0:
+lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.0:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@@ -7063,6 +6686,11 @@ make-dir@^1.0.0, make-dir@^1.3.0:
dependencies:
pify "^3.0.0"
+make-error@1.x:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
+ integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
+
makeerror@1.0.x:
version "1.0.11"
resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
@@ -7125,11 +6753,6 @@ marked@^0.3.12, marked@~0.3.6:
resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
-math-random@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
- integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w=
-
mathml-tag-names@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz#490b70e062ee24636536e3d9481e333733d00f2c"
@@ -7252,25 +6875,6 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-micromatch@^2.3.11:
- version "2.3.11"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
- integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
- dependencies:
- arr-diff "^2.0.0"
- array-unique "^0.2.1"
- braces "^1.8.2"
- expand-brackets "^0.1.4"
- extglob "^0.3.1"
- filename-regex "^2.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.1"
- kind-of "^3.0.2"
- normalize-path "^2.0.1"
- object.omit "^2.0.0"
- parse-glob "^3.0.4"
- regex-cache "^0.4.2"
-
micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.6, micromatch@^3.1.8, micromatch@^3.1.9:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -7409,7 +7013,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
-mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@@ -7530,14 +7134,6 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
integrity sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==
-node-cache@^4.1.1:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.0.tgz#48ac796a874e762582692004a376d26dfa875811"
- integrity sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==
- dependencies:
- clone "2.x"
- lodash "4.x"
-
node-fetch@1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
@@ -7585,6 +7181,11 @@ node-int64@^0.4.0:
util "^0.10.3"
vm-browserify "0.0.4"
+node-modules-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
+ integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
+
node-notifier@^5.2.1:
version "5.3.0"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01"
@@ -7666,7 +7267,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
-normalize-path@^2.0.1, normalize-path@^2.1.1:
+normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
@@ -7752,7 +7353,7 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -7811,14 +7412,6 @@ object.getownpropertydescriptors@^2.0.3:
define-properties "^1.1.2"
es-abstract "^1.5.1"
-object.omit@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
- integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
- dependencies:
- for-own "^0.1.4"
- is-extendable "^0.1.1"
-
object.pick@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
@@ -7889,10 +7482,10 @@ opn@^5.1.0:
dependencies:
is-wsl "^1.1.0"
-optimism@^0.6.6:
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.6.8.tgz#0780b546da8cd0a72e5207e0c3706c990c8673a6"
- integrity sha512-bN5n1KCxSqwBDnmgDnzMtQTHdL+uea2HYFx1smvtE+w2AMl0Uy31g0aXnP/Nt85OINnMJPRpJyfRQLTCqn5Weg==
+optimism@^0.6.9:
+ version "0.6.9"
+ resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.6.9.tgz#19258ff8b3be0cea29ac35f06bff818e026e30bb"
+ integrity sha512-xoQm2lvXbCA9Kd7SCx6y713Y7sZ6fUc5R6VYpoL5M6svKJbTuvtNopexK8sO8K4s0EOUYHuPN2+yAEsNyRggkQ==
dependencies:
immutable-tuple "^0.4.9"
@@ -7956,7 +7549,7 @@ os-locale@^3.0.0:
lcid "^2.0.0"
mem "^4.0.0"
-os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
@@ -7979,6 +7572,13 @@ p-defer@^1.0.0:
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
+p-each-series@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
+ integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=
+ dependencies:
+ p-reduce "^1.0.0"
+
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -8022,6 +7622,11 @@ p-map@^1.1.1:
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a"
integrity sha1-BfXkrpegaDcbwqXMhr+9vBnErno=
+p-reduce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+ integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
+
p-timeout@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
@@ -8086,16 +7691,6 @@ parse-entities@^1.0.2, parse-entities@^1.1.0:
is-decimal "^1.0.0"
is-hexadecimal "^1.0.0"
-parse-glob@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
- integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
- dependencies:
- glob-base "^0.3.0"
- is-dotfile "^1.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.0"
-
parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -8172,7 +7767,7 @@ path-exists@^3.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
-path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
@@ -8187,7 +7782,7 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-path-parse@^1.0.5, path-parse@^1.0.6:
+path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
@@ -8197,15 +7792,6 @@ path-to-regexp@0.1.7:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-path-type@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
- integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
- dependencies:
- graceful-fs "^4.1.2"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
path-type@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
@@ -8270,6 +7856,13 @@ pinkie@^2.0.0:
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+pirates@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+ integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
+ dependencies:
+ node-modules-regexp "^1.0.0"
+
pixelmatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
@@ -8284,13 +7877,6 @@ pkg-dir@^1.0.0:
dependencies:
find-up "^1.0.0"
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -8439,7 +8025,7 @@ postcss-scss@^2.0.0:
dependencies:
postcss "^7.0.0"
-postcss-selector-parser@^3.1.0, postcss-selector-parser@^3.1.1:
+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=
@@ -8467,7 +8053,7 @@ 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@^6.0.1, postcss@^6.0.14, postcss@^6.0.20, postcss@^6.0.23:
+postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.23:
version "6.0.23"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
@@ -8500,27 +8086,22 @@ prepend-http@^2.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-preserve@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
- integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
-
-prettier@1.13.7:
- version "1.13.7"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
- integrity sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==
-
prettier@1.16.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.1.tgz#534c2c9d7853f8845e5e078384e71973bd74089f"
integrity sha512-XXUITwIkGb3CPJ2hforHah/zTINRyie5006Jd2HKy2qz7snEJXl0KLfsJZW/wst9g6R2rFvqba3VpNYdu1hDcA==
-pretty-format@^23.6.0:
- version "23.6.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
- integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
+prettier@1.16.3:
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
+ integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
+
+pretty-format@^24.0.0:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591"
+ integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g==
dependencies:
- ansi-regex "^3.0.0"
+ ansi-regex "^4.0.0"
ansi-styles "^3.2.0"
prismjs@^1.6.0:
@@ -8530,7 +8111,7 @@ prismjs@^1.6.0:
optionalDependencies:
clipboard "^1.5.5"
-private@^0.1.6, private@^0.1.8:
+private@^0.1.6:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
@@ -8560,13 +8141,13 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-prompts@^0.1.9:
- version "0.1.14"
- resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
- integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==
+prompts@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.3.tgz#c5ccb324010b2e8f74752aadceeb57134c1d2522"
+ integrity sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ==
dependencies:
- kleur "^2.0.1"
- sisteransi "^0.1.1"
+ kleur "^3.0.2"
+ sisteransi "^1.0.0"
prosemirror-commands@^1.0.7:
version "1.0.7"
@@ -8812,15 +8393,6 @@ quick-lru@^1.0.0:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
-randomatic@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
- integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
- dependencies:
- is-number "^4.0.0"
- kind-of "^6.0.0"
- math-random "^1.0.1"
-
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
@@ -8881,14 +8453,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-read-pkg-up@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
- integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
- dependencies:
- find-up "^1.0.0"
- read-pkg "^1.0.0"
-
read-pkg-up@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@@ -8913,15 +8477,6 @@ read-pkg-up@^4.0.0:
find-up "^3.0.0"
read-pkg "^3.0.0"
-read-pkg@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
- integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
- dependencies:
- load-json-file "^1.0.0"
- normalize-package-data "^2.3.2"
- path-type "^1.0.0"
-
read-pkg@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
@@ -8984,10 +8539,10 @@ readdirp@^2.0.0:
readable-stream "^2.0.2"
set-immediate-shim "^1.0.1"
-realpath-native@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560"
- integrity sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==
+realpath-native@^1.0.0, realpath-native@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
+ integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
dependencies:
util.promisify "^1.0.0"
@@ -9028,13 +8583,6 @@ regenerator-transform@^0.13.3:
dependencies:
private "^0.1.6"
-regex-cache@^0.4.2:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
- integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
- dependencies:
- is-equal-shallow "^0.1.3"
-
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@@ -9182,18 +8730,11 @@ repeat-string@^0.2.2:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4=
-repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
+repeat-string@^1.5.4, 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=
-repeating@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
- integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
- 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"
@@ -9311,7 +8852,7 @@ resolve@1.1.7, resolve@1.1.x:
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0:
+resolve@1.x, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
@@ -9421,14 +8962,15 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sane@^2.0.0:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
- integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o=
+sane@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6"
+ integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==
dependencies:
anymatch "^2.0.0"
capture-exit "^1.2.0"
exec-sh "^0.2.0"
+ execa "^1.0.0"
fb-watchman "^2.0.0"
micromatch "^3.1.4"
minimist "^1.1.1"
@@ -9510,7 +9052,7 @@ semver-diff@^2.0.0:
dependencies:
semver "^5.0.3"
-"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
@@ -9657,15 +9199,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-sisteransi@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
- integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==
-
-slash@^1.0.0:
+sisteransi@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
- integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c"
+ integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==
slash@^2.0.0:
version "2.0.0"
@@ -9819,13 +9356,6 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@^0.4.15:
- version "0.4.18"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
- integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
- dependencies:
- source-map "^0.5.6"
-
source-map-support@^0.5.6, source-map-support@~0.5.6:
version "0.5.9"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
@@ -9844,7 +9374,7 @@ source-map@0.5.0:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86"
integrity sha1-D+llA6yGpa213mP05BKuSHLNvoY=
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
+source-map@^0.5.0, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -10115,18 +9645,11 @@ strip-ansi@^5.0.0:
dependencies:
ansi-regex "^4.0.0"
-strip-bom@3.0.0, strip-bom@^3.0.0:
+strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-strip-bom@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
- integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
- dependencies:
- is-utf8 "^0.2.0"
-
strip-css-comments@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-css-comments/-/strip-css-comments-3.0.0.tgz#7a5625eff8a2b226cf8947a11254da96e13dae89"
@@ -10144,7 +9667,7 @@ strip-indent@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
-strip-json-comments@^2.0.0, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
+strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@@ -10167,6 +9690,11 @@ stylelint-config-recommended@^2.1.0:
resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz#f526d5c771c6811186d9eaedbed02195fee30858"
integrity sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==
+stylelint-error-string-formatter@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stylelint-error-string-formatter/-/stylelint-error-string-formatter-1.0.1.tgz#366387825d6fb59569e8c5c3f5682398733756f9"
+ integrity sha512-8zy0UsdnQZKVDwjWMQX36b30TaNMGcM2FzBcK9cshpXerpJ3AvF2/zw7FJ3Efm6DFviTBVsxR14F3FnDFhCxJw==
+
stylelint-scss@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.5.3.tgz#e158b3061eeec26d7f6088f346998a797432f3c8"
@@ -10243,7 +9771,7 @@ supports-color@^2.0.0:
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-supports-color@^3.1.0, supports-color@^3.1.2:
+supports-color@^3.1.0:
version "3.2.3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
@@ -10257,7 +9785,7 @@ supports-color@^5.1.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-co
dependencies:
has-flag "^3.0.0"
-supports-color@^6.1.0:
+supports-color@^6.0.0, supports-color@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
@@ -10352,17 +9880,6 @@ terser@^3.8.1:
source-map "~0.6.1"
source-map-support "~0.5.6"
-test-exclude@^4.2.1:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
- integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==
- dependencies:
- arrify "^1.0.1"
- micromatch "^2.3.11"
- object-assign "^4.1.0"
- read-pkg-up "^1.0.1"
- require-main-filename "^1.0.1"
-
test-exclude@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7"
@@ -10523,11 +10040,6 @@ to-arraybuffer@^1.0.0:
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
-to-fast-properties@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
- integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
-
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -10615,17 +10127,29 @@ tryer@^1.0.0:
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7"
integrity sha1-Antp+oIyJeVRys4+8DsR9qs3wdc=
-tsconfig@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
- integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==
- dependencies:
- "@types/strip-bom" "^3.0.0"
- "@types/strip-json-comments" "0.0.30"
- strip-bom "^3.0.0"
- strip-json-comments "^2.0.0"
-
-tslib@^1.9.0:
+ts-invariant@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.2.1.tgz#3d587f9d6e3bded97bf9ec17951dd9814d5a9d3f"
+ integrity sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg==
+ dependencies:
+ tslib "^1.9.3"
+
+ts-jest@24.0.0, ts-jest@^23.10.5:
+ version "24.0.0"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6"
+ integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw==
+ dependencies:
+ bs-logger "0.x"
+ buffer-from "1.x"
+ fast-json-stable-stringify "2.x"
+ json5 "2.x"
+ make-error "1.x"
+ mkdirp "0.x"
+ resolve "1.x"
+ semver "^5.5"
+ yargs-parser "10.x"
+
+tslib@^1.9.0, tslib@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
@@ -11051,10 +10575,10 @@ void-elements@^2.0.0:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
-vue-apollo@^3.0.0-beta.25:
- version "3.0.0-beta.25"
- resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.0-beta.25.tgz#05a9a699b2ba6103639e9bd6c3bb88ca04c4b637"
- integrity sha512-M7/l3h0NlFvaZ/s/wrtRiOt3xXMbaNNuteGaCY+U5D0ABrQqvCgy5mayIZHurQxbloluNkbCt18wRKAgJTAuKA==
+vue-apollo@^3.0.0-beta.28:
+ version "3.0.0-beta.28"
+ resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.0-beta.28.tgz#be6a3a1504be2096cbfb23996537e2fc95c8c239"
+ integrity sha512-ceCc1xTyxpNtiSeJMQgSkfgJue6pnv+TIvp75CwZlwMxRtNZjITj4MGvBWFwnoIEhVrUAw45ff/5udgJ8z9sdQ==
dependencies:
chalk "^2.4.1"
throttle-debounce "^2.0.0"
@@ -11081,21 +10605,17 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
integrity sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA==
-vue-jest@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.2.tgz#c64bf5da9abd0d3ee16071217037696d14b0689c"
- integrity sha512-5XIQ1xQFW0ZnWxHWM7adVA2IqbDsdw1vhgZfGFX4oWd75J38KIS3YT41PtiE7lpMLmNM6+VJ0uprT2mhHjUgkA==
+vue-jest@^4.0.0-beta.2:
+ version "4.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-4.0.0-beta.2.tgz#f2120ea9d24224aad3a100c2010b0760d47ee6fe"
+ integrity sha512-SywBIciuIfqsCb8Eb9UQ02s06+NV8Ry8KnbyhAfnvnyFFulIuh7ujtga9eJYq720nCS4Hz4TpVtS4pD1ZbUILQ==
dependencies:
- babel-plugin-transform-es2015-modules-commonjs "^6.26.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.2.0"
+ "@vue/component-compiler-utils" "^2.4.0"
chalk "^2.1.0"
extract-from-css "^0.4.4"
- find-babel-config "^1.1.0"
- js-beautify "^1.6.14"
- node-cache "^4.1.1"
- object-assign "^4.1.1"
source-map "^0.5.6"
- tsconfig "^7.0.0"
- vue-template-es2015-compiler "^1.6.0"
+ ts-jest "^23.10.5"
vue-loader@^15.4.2:
version "15.4.2"
@@ -11136,10 +10656,10 @@ vue-template-compiler@^2.5.0, vue-template-compiler@^2.5.21:
de-indent "^1.0.2"
he "^1.1.0"
-vue-template-es2015-compiler@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
- integrity sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==
+vue-template-es2015-compiler@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
+ integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue-virtual-scroll-list@^1.2.5:
version "1.2.5"
@@ -11445,10 +10965,10 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^2.0.0, write-file-atomic@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
- integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
+write-file-atomic@2.4.1, write-file-atomic@^2.0.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529"
+ integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==
dependencies:
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
@@ -11566,7 +11086,7 @@ yallist@^3.0.0, yallist@^3.0.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=
-yargs-parser@^10.0.0, yargs-parser@^10.1.0:
+yargs-parser@10.x, yargs-parser@^10.0.0, yargs-parser@^10.1.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==
@@ -11588,13 +11108,6 @@ yargs-parser@^8.1.0:
dependencies:
camelcase "^4.1.0"
-yargs-parser@^9.0.2:
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
- integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
- dependencies:
- camelcase "^4.1.0"
-
yargs@12.0.2:
version "12.0.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc"
@@ -11631,25 +11144,7 @@ yargs@^10.0.3:
y18n "^3.2.1"
yargs-parser "^8.1.0"
-yargs@^11.0.0:
- version "11.1.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
- integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
- dependencies:
- cliui "^4.0.0"
- decamelize "^1.1.1"
- find-up "^2.1.0"
- get-caller-file "^1.0.1"
- os-locale "^2.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1"
- yargs-parser "^9.0.2"
-
-yargs@^12.0.4:
+yargs@^12.0.2, yargs@^12.0.4:
version "12.0.5"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==