diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-12 00:07:59 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-12 00:07:59 +0300 |
commit | e09df167d9b060d9c194a49f3ae9f7ac72632413 (patch) | |
tree | 83a8ce826d315a0e3ace3f85b9bf66d5d852615c | |
parent | c511df8a7e79a3df0b03eb774be53651a1aa465d (diff) |
Add latest changes from gitlab-org/gitlab@master
23 files changed, 309 insertions, 325 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 48bfd867d13..26ce20e976d 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -208,7 +208,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/.markdownlint @marcel.amirault @eread @aqualls @cnorris /doc/ @gl-docsteam /doc/.vale/ @marcel.amirault @eread @aqualls @cnorris -/doc/administration/application_settings_cache.md @marcia + +[Documentation Pages] +/doc/administration/application_settings_cache.md @marcel.amirault /doc/administration/audit_event_streaming.md @eread /doc/administration/audit_events.md @eread /doc/administration/audit_reports.md @eread @@ -226,7 +228,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/auth/oidc.md @eread /doc/administration/auth/smartcard.md @eread /doc/administration/cicd.md @marcel.amirault -/doc/administration/clusters/kas.md @marcia +/doc/administration/clusters/kas.md @sselhorn /doc/administration/compliance.md @eread /doc/administration/configure.md @axil /doc/administration/consul.md @axil @@ -259,17 +261,21 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/maintenance_mode/index.md @axil /doc/administration/merge_request_diffs.md @aqualls /doc/administration/monitoring/ @ngaskill +/doc/administration/monitoring/prometheus/index.md @axil /doc/administration/nfs.md @axil /doc/administration/object_storage.md @axil /doc/administration/operations/ @axil -/doc/administration/operations/sidekiq_memory_killer.md @marcia +/doc/administration/operations/moving_repositories.md @eread +/doc/administration/operations/sidekiq_memory_killer.md @marcel.amirault /doc/administration/package_information/ @axil /doc/administration/packages/ @ngaskill -/doc/administration/pages/ @rdickenson +/doc/administration/pages/index.md @rdickenson +/doc/administration/pages/source.md @rdickenson /doc/administration/polling.md @axil -/doc/administration/postgresql/ @marcia +/doc/administration/postgresql/ @aqualls /doc/administration/pseudonymizer.md @axil /doc/administration/raketasks/ @axil +/doc/administration/raketasks/praefect.md @eread /doc/administration/read_only_gitlab.md @axil /doc/administration/redis/ @axil /doc/administration/reference_architectures/ @axil @@ -280,15 +286,16 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/repository_storage_types.md @eread /doc/administration/restart_gitlab.md @axil /doc/administration/server_hooks.md @eread +/doc/administration/sidekiq_health_check.md @axil /doc/administration/sidekiq.md @axil /doc/administration/smime_signing_email.md @axil /doc/administration/snippets/index.md @aqualls /doc/administration/static_objects_external_storage.md @aqualls -/doc/administration/terraform_state.md @marcia +/doc/administration/terraform_state.md @sselhorn /doc/administration/timezone.md @axil /doc/administration/troubleshooting/ @axil -/doc/administration/troubleshooting/group_saml_scim.md @eread -/doc/administration/troubleshooting/postgresql.md @marcia +/doc/administration/troubleshooting/elasticsearch.md @rdickenson +/doc/administration/troubleshooting/postgresql.md @aqualls /doc/administration/uploads.md @axil /doc/administration/user_settings.md @eread /doc/administration/whats-new.md @kpaizee @@ -336,7 +343,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/group_activity_analytics.md @fneill /doc/api/group_badges.md @eread /doc/api/group_boards.md @msedlakjakubowski -/doc/api/group_clusters.md @marcia +/doc/api/group_clusters.md @sselhorn /doc/api/group_import_export.md @ngaskill /doc/api/group_iterations.md @msedlakjakubowski /doc/api/group_labels.md @msedlakjakubowski @@ -349,7 +356,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/groups.md @eread /doc/api/import.md @ngaskill /doc/api/index.md @kpaizee -/doc/api/instance_clusters.md @marcia +/doc/api/instance_clusters.md @sselhorn /doc/api/instance_level_ci_variables.md @marcel.amirault /doc/api/integrations.md @kpaizee /doc/api/invitations.md @kpaizee @@ -389,7 +396,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/plan_limits.md @eread /doc/api/project_aliases.md @aqualls /doc/api/project_badges.md @aqualls -/doc/api/project_clusters.md @marcia +/doc/api/project_clusters.md @sselhorn /doc/api/project_import_export.md @aqualls /doc/api/project_level_variables.md @marcel.amirault /doc/api/project_relations_export.md @ngaskill @@ -408,7 +415,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/repositories.md @aqualls /doc/api/repository_files.md @aqualls /doc/api/repository_submodules.md @aqualls -/doc/api/resource_access_tokens.md @eread /doc/api/resource_groups.md @rdickenson /doc/api/resource_iteration_events.md @msedlakjakubowski /doc/api/resource_label_events.md @eread @@ -418,6 +424,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/runners.md @sselhorn /doc/api/scim.md @eread /doc/api/search.md @aqualls +/doc/api/secure_files.md @marcel.amirault /doc/api/settings.md @eread /doc/api/sidekiq_metrics.md @axil /doc/api/snippet_repository_storage_moves.md @aqualls @@ -435,7 +442,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/topics.md @fneill /doc/api/usage_data.md @fneill /doc/api/users.md @eread -/doc/api/v3_to_v4.md @kpaizee /doc/api/version.md @kpaizee /doc/api/visual_review_discussions.md @eread /doc/api/vulnerabilities.md @fneill @@ -443,13 +449,14 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/vulnerability_findings.md @fneill /doc/api/wikis.md @aqualls /doc/architecture/blueprints/container_registry_metadata_database/index.md @ngaskill -/doc/architecture/blueprints/database/scalability/patterns/ @marcia -/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @marcia +/doc/architecture/blueprints/database/scalability/patterns/ @aqualls +/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @sselhorn /doc/ci/caching/index.md @marcel.amirault -/doc/ci/chatops/index.md @marcia +/doc/ci/chatops/index.md @sselhorn /doc/ci/ci_cd_for_external_repos/ @marcel.amirault /doc/ci/cloud_deployment/ecs/quick_start_guide.md @rdickenson /doc/ci/cloud_deployment/index.md @rdickenson +/doc/ci/cloud_services/ @marcel.amirault /doc/ci/directed_acyclic_graph/index.md @marcel.amirault /doc/ci/docker/index.md @marcel.amirault /doc/ci/docker/using_docker_build.md @marcel.amirault @@ -457,7 +464,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/docker/using_kaniko.md @marcel.amirault /doc/ci/enable_or_disable_ci.md @marcel.amirault /doc/ci/environments/ @rdickenson -/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @rdickenson +/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @marcel.amirault /doc/ci/examples/deployment/composer-npm-deploy.md @rdickenson /doc/ci/examples/deployment/index.md @rdickenson /doc/ci/examples/end_to_end_testing_webdriverio/index.md @eread @@ -485,7 +492,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/resource_groups/index.md @rdickenson /doc/ci/review_apps/index.md @eread /doc/ci/runners/ @sselhorn -/doc/ci/secrets/index.md @marcia +/doc/ci/secrets/index.md @marcel.amirault /doc/ci/services/ @sselhorn /doc/ci/ssh_keys/index.md @marcel.amirault /doc/ci/test_cases/index.md @msedlakjakubowski @@ -495,104 +502,84 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/variables/ @marcel.amirault /doc/ci/yaml/ @marcel.amirault /doc/ci/yaml/artifacts_reports.md @eread -/doc/development/adding_database_indexes.md @marcia +/doc/development/adding_database_indexes.md @aqualls /doc/development/application_limits.md @axil /doc/development/approval_rules.md @aqualls /doc/development/audit_event_guide/index.md @eread -/doc/development/auto_devops.md @marcia -/doc/development/avoiding_downtime_in_migrations.md @marcia -/doc/development/backend/ruby_style_guide.md @marcia -/doc/development/background_migrations.md @marcia +/doc/development/auto_devops.md @sselhorn +/doc/development/avoiding_downtime_in_migrations.md @aqualls +/doc/development/backend/create_source_code_be/index.md @aqualls /doc/development/build_test_package.md @axil /doc/development/bulk_import.md @ngaskill /doc/development/cascading_settings.md @eread -/doc/development/chatops_on_gitlabcom.md @marcia +/doc/development/chatops_on_gitlabcom.md @sselhorn /doc/development/cicd/cicd_reference_documentation_guide.md @marcel.amirault /doc/development/cicd/index.md @marcel.amirault +/doc/development/cicd/schema.md @marcel.amirault /doc/development/cicd/templates.md @marcel.amirault /doc/development/code_intelligence/index.md @aqualls -/doc/development/contributing/ @marcia -/doc/development/creating_enums.md @marcia -/doc/development/database_debugging.md @marcia -/doc/development/database_query_comments.md @marcia -/doc/development/database_review.md @marcia -/doc/development/database/ @marcia -/doc/development/db_dump.md @marcia +/doc/development/creating_enums.md @aqualls +/doc/development/database_debugging.md @aqualls +/doc/development/database_query_comments.md @aqualls +/doc/development/database_review.md @aqualls +/doc/development/database/ @aqualls +/doc/development/db_dump.md @aqualls /doc/development/developing_with_solargraph.md @aqualls /doc/development/distributed_tracing.md @ngaskill -/doc/development/documentation/feature_flags.md @marcia -/doc/development/documentation/graphql_styleguide.md @marcia +/doc/development/documentation/feature_flags.md @sselhorn +/doc/development/documentation/graphql_styleguide.md @sselhorn /doc/development/documentation/index.md @cnorris /doc/development/documentation/redirects.md @cnorris -/doc/development/documentation/restful_api_styleguide.md @marcia /doc/development/documentation/review_apps.md @cnorris /doc/development/documentation/structure.md @sselhorn -/doc/development/documentation/styleguide/index.md @sselhorn -/doc/development/documentation/styleguide/word_list.md @sselhorn +/doc/development/documentation/styleguide/ @sselhorn /doc/development/documentation/testing.md @cnorris -/doc/development/elasticsearch.md @marcia +/doc/development/elasticsearch.md @rdickenson /doc/development/experiment_guide/ @kpaizee /doc/development/export_csv.md @ngaskill /doc/development/fe_guide/content_editor.md @aqualls -/doc/development/fe_guide/dark_mode.md @marcia -/doc/development/fe_guide/graphql.md @marcia /doc/development/fe_guide/source_editor.md @aqualls -/doc/development/feature_categorization/index.md @marcia -/doc/development/feature_flags/controls.md @marcia -/doc/development/feature_flags/index.md @marcia /doc/development/filtering_by_label.md @msedlakjakubowski -/doc/development/foreign_keys.md @marcia +/doc/development/foreign_keys.md @aqualls /doc/development/geo.md @axil /doc/development/geo/framework.md @axil /doc/development/git_object_deduplication.md @eread /doc/development/gitaly.md @eread -/doc/development/graphql_guide/batchloader.md @marcia -/doc/development/graphql_guide/graphql_pro.md @kpaizee -/doc/development/graphql_guide/index.md @kpaizee -/doc/development/graphql_guide/pagination.md @kpaizee -/doc/development/hash_indexes.md @marcia +/doc/development/graphql_guide/ @kpaizee +/doc/development/graphql_guide/batchloader.md @aqualls +/doc/development/hash_indexes.md @aqualls /doc/development/i18n/ @ngaskill -/doc/development/image_scaling.md @marcia +/doc/development/image_scaling.md @marcel.amirault /doc/development/import_export.md @ngaskill -/doc/development/index.md @marcia -/doc/development/insert_into_tables_in_batches.md @marcia -/doc/development/integrations/codesandbox.md @marcia +/doc/development/insert_into_tables_in_batches.md @aqualls /doc/development/integrations/jenkins.md @kpaizee /doc/development/integrations/jira_connect.md @kpaizee /doc/development/integrations/secure_partner_integration.md @rdickenson /doc/development/integrations/secure.md @ngaskill /doc/development/internal_api/ @aqualls -/doc/development/internal_users.md @marcia /doc/development/issuable-like-models.md @msedlakjakubowski /doc/development/issue_types.md @msedlakjakubowski -/doc/development/iterating_tables_in_batches.md @marcia -/doc/development/kubernetes.md @marcia +/doc/development/iterating_tables_in_batches.md @aqualls +/doc/development/kubernetes.md @sselhorn /doc/development/lfs.md @aqualls /doc/development/licensed_feature_availability.md @sselhorn -/doc/development/logging.md @ngaskill /doc/development/maintenance_mode.md @axil /doc/development/new_fe_guide/modules/widget_extensions.md @aqualls -/doc/development/new_fe_guide/tips.md @marcia /doc/development/omnibus.md @axil -/doc/development/ordering_table_columns.md @marcia +/doc/development/ordering_table_columns.md @aqualls /doc/development/packages.md @ngaskill -/doc/development/permissions.md @eread -/doc/development/policies.md @eread -/doc/development/prometheus_metrics.md @ngaskill -/doc/development/query_performance.md @marcia +/doc/development/product_qualified_lead_guide/index.md @kpaizee +/doc/development/query_performance.md @aqualls /doc/development/real_time.md @msedlakjakubowski -/doc/development/secure_coding_guidelines.md @marcia -/doc/development/serializing_data.md @marcia +/doc/development/serializing_data.md @aqualls /doc/development/service_ping/ @fneill /doc/development/snowplow/ @fneill -/doc/development/sql.md @marcia -/doc/development/stage_group_dashboards.md @marcia -/doc/development/swapping_tables.md @marcia -/doc/development/testing_guide/best_practices.md @marcia -/doc/development/testing_guide/end_to_end/best_practices.md @marcia -/doc/development/understanding_explain_plans.md @marcia +/doc/development/sql.md @aqualls +/doc/development/swapping_tables.md @aqualls +/doc/development/understanding_explain_plans.md @aqualls /doc/development/value_stream_analytics.md @fneill -/doc/development/verifying_database_capabilities.md @marcia +/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md @fneill +/doc/development/verifying_database_capabilities.md @aqualls /doc/development/wikis.md @aqualls /doc/development/work_items.md @msedlakjakubowski /doc/development/work_items_widgets.md @msedlakjakubowski @@ -605,7 +592,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/gitlab-basics/start-using-git.md @aqualls /doc/install/ @axil /doc/integration/ @kpaizee -/doc/integration/elasticsearch.md @marcia +/doc/integration/elasticsearch.md @rdickenson /doc/integration/gitpod.md @aqualls /doc/integration/kerberos.md @eread /doc/integration/mattermost/index.md @axil @@ -613,7 +600,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/integration/saml.md @eread /doc/integration/security_partners/index.md @rdickenson /doc/integration/sourcegraph.md @aqualls -/doc/integration/vault.md @rdickenson +/doc/integration/vault.md @sselhorn /doc/operations/ @ngaskill /doc/operations/feature_flags.md @rdickenson /doc/operations/product_analytics.md @fneill @@ -629,15 +616,14 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/subscriptions/ @fneill /doc/system_hooks/system_hooks.md @kpaizee /doc/topics/authentication/index.md @eread -/doc/topics/autodevops/customize.md @marcia -/doc/topics/autodevops/ @marcia +/doc/topics/autodevops/ @sselhorn /doc/topics/git/ @aqualls /doc/topics/gitlab_flow.md @aqualls /doc/topics/offline/ @axil /doc/topics/plan_and_track.md @msedlakjakubowski /doc/update/ @axil -/doc/update/mysql_to_postgresql.md @marcia -/doc/update/upgrading_postgresql_using_slony.md @marcia +/doc/update/mysql_to_postgresql.md @aqualls +/doc/update/upgrading_postgresql_using_slony.md @aqualls /doc/user/admin_area/analytics/ @fneill /doc/user/admin_area/broadcast_messages.md @kpaizee /doc/user/admin_area/credentials_inventory.md @eread @@ -648,8 +634,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/admin_area/license.md @kpaizee /doc/user/admin_area/merge_requests_approvals.md @aqualls /doc/user/admin_area/moderate_users.md @eread -/doc/user/admin_area/monitoring/background_migrations.md @marcia +/doc/user/admin_area/monitoring/background_migrations.md @aqualls /doc/user/admin_area/monitoring/health_check.md @ngaskill +/doc/user/admin_area/reporting/spamcheck.md @axil /doc/user/admin_area/review_abuse_reports.md @eread /doc/user/admin_area/settings/account_and_limit_settings.md @aqualls /doc/user/admin_area/settings/continuous_integration.md @marcel.amirault @@ -667,6 +654,8 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/admin_area/settings/push_event_activities_limit.md @aqualls /doc/user/admin_area/settings/rate_limit_on_issues_creation.md @msedlakjakubowski /doc/user/admin_area/settings/rate_limit_on_notes_creation.md @msedlakjakubowski +/doc/user/admin_area/settings/rate_limit_on_users_api.md @eread +/doc/user/admin_area/settings/third_party_offers.md @fneill /doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls /doc/user/analytics/ci_cd_analytics.md @rdickenson /doc/user/analytics/ @fneill @@ -674,20 +663,20 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/application_security/cluster_image_scanning/index.md @ngaskill /doc/user/application_security/container_scanning/index.md @ngaskill /doc/user/application_security/cve_id_request.md @fneill -/doc/user/application_security/policies/index.md @ngaskill +/doc/user/application_security/policies/ @ngaskill /doc/user/application_security/security_dashboard/index.md @fneill /doc/user/application_security/threat_monitoring/index.md @ngaskill /doc/user/application_security/vulnerabilities/ @fneill /doc/user/application_security/vulnerability_report/index.md @fneill /doc/user/asciidoc.md @aqualls /doc/user/award_emojis.md @msedlakjakubowski -/doc/user/clusters/ @marcia +/doc/user/clusters/ @sselhorn /doc/user/compliance/compliance_report/index.md @eread /doc/user/compliance/index.md @eread /doc/user/compliance/license_compliance/index.md @rdickenson +/doc/user/crm/index.md @msedlakjakubowski /doc/user/discussions/index.md @aqualls -/doc/user/feature_flags.md @marcia -/doc/user/group/clusters/index.md @marcia +/doc/user/group/clusters/index.md @sselhorn /doc/user/group/contribution_analytics/index.md @fneill /doc/user/group/custom_project_templates.md @ngaskill /doc/user/group/devops_adoption/index.md @fneill @@ -699,6 +688,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/group/insights/index.md @fneill /doc/user/group/issues_analytics/index.md @msedlakjakubowski /doc/user/group/iterations/index.md @msedlakjakubowski +/doc/user/group/planning_hierarchy/index.md @msedlakjakubowski /doc/user/group/repositories_analytics/index.md @eread /doc/user/group/roadmap/index.md @msedlakjakubowski /doc/user/group/saml_sso/group_managed_accounts.md @eread @@ -707,31 +697,24 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/group/settings/import_export.md @ngaskill /doc/user/group/subgroups/index.md @eread /doc/user/group/value_stream_analytics/index.md @fneill -/doc/user/infrastructure/clusters/ @marcia -/doc/user/infrastructure/clusters/manage/clusters_health.md @marcia +/doc/user/infrastructure/clusters/ @sselhorn /doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md @marcia /doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/falco.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md @marcia -/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @sselhorn -/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md @marcia -/doc/user/infrastructure/iac/ @marcia -/doc/user/infrastructure/index.md @marcia +/doc/user/infrastructure/iac/ @sselhorn +/doc/user/infrastructure/index.md @ssehorn /doc/user/markdown.md @aqualls /doc/user/packages/ @ngaskill -/doc/user/packages/infrastructure_registry/index.md @marcia -/doc/user/packages/terraform_module_registry/index.md @marcia +/doc/user/packages/infrastructure_registry/index.md @sselhorn +/doc/user/packages/terraform_module_registry/index.md @sselhorn /doc/user/permissions.md @eread /doc/user/profile/ @eread /doc/user/profile/notifications.md @msedlakjakubowski /doc/user/project/autocomplete_characters.md @aqualls /doc/user/project/badges.md @aqualls -/doc/user/project/clusters/ @marcia +/doc/user/project/clusters/ @sselhorn /doc/user/project/clusters/kubernetes_pod_logs.md @ngaskill /doc/user/project/clusters/protect/ @ngaskill /doc/user/project/code_intelligence.md @aqualls @@ -786,8 +769,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/project/wiki/index.md @aqualls /doc/user/project/working_with_projects.md @fneill /doc/user/reserved_names.md @fneill -/doc/user/search/advanced_search.md @marcia +/doc/user/search/advanced_search.md @rdickenson /doc/user/search/index.md @aqualls +/doc/user/shortcuts.md @aqualls /doc/user/snippets.md @aqualls /doc/user/tasks.md @msedlakjakubowski /doc/user/todos.md @msedlakjakubowski diff --git a/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue b/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue index 01606d07554..27c67e84675 100644 --- a/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue +++ b/app/assets/javascripts/members/components/action_buttons/remove_member_button.vue @@ -25,7 +25,8 @@ export default { }, title: { type: String, - required: true, + required: false, + default: null, }, icon: { type: String, diff --git a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue index 594da7f68cc..122e0a142a9 100644 --- a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue +++ b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue @@ -61,7 +61,7 @@ export default { }; }, removeMemberButtonText() { - return this.isInvitedUser ? null : __('Remove user'); + return this.isInvitedUser ? null : __('Remove member'); }, removeMemberButtonIcon() { return this.isInvitedUser ? 'remove' : ''; @@ -86,7 +86,6 @@ export default { :icon="removeMemberButtonIcon" :button-text="removeMemberButtonText" :button-category="removeMemberButtonCategory" - :title="s__('Member|Remove member')" /> </div> <div v-else-if="permissions.canOverride && !member.isOverridden" class="gl-px-1"> diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue index 710f49b833c..0f744e858f2 100644 --- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue +++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue @@ -134,6 +134,7 @@ export default { methods: { changeCurrentRequest(newRequestId) { this.currentRequest = newRequestId; + this.$emit('change-request', newRequestId); }, flamegraphPath(mode) { return mergeUrlParams( diff --git a/app/assets/javascripts/performance_bar/components/request_selector.vue b/app/assets/javascripts/performance_bar/components/request_selector.vue index a46ac620f48..ffc22c2113d 100644 --- a/app/assets/javascripts/performance_bar/components/request_selector.vue +++ b/app/assets/javascripts/performance_bar/components/request_selector.vue @@ -1,15 +1,5 @@ <script> -import { GlPopover, GlSafeHtmlDirective } from '@gitlab/ui'; -import { glEmojiTag } from '~/emoji'; -import { n__ } from '~/locale'; - export default { - components: { - GlPopover, - }, - directives: { - SafeHtml: GlSafeHtmlDirective, - }, props: { currentRequest: { type: Object, @@ -25,27 +15,11 @@ export default { currentRequestId: this.currentRequest.id, }; }, - computed: { - requestsWithWarnings() { - return this.requests.filter((request) => request.hasWarnings); - }, - warningMessage() { - return n__( - '%d request with warnings', - '%d requests with warnings', - this.requestsWithWarnings.length, - ); - }, - }, watch: { currentRequestId(newRequestId) { this.$emit('change-current-request', newRequestId); }, }, - methods: { - glEmojiTag, - }, - safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] }, }; </script> <template> @@ -58,19 +32,7 @@ export default { data-qa-selector="request_dropdown_option" > {{ request.truncatedUrl }} - <span v-if="request.hasWarnings">(!)</span> </option> </select> - <span v-if="requestsWithWarnings.length" class="gl-cursor-default"> - <span - id="performance-bar-request-selector-warning" - v-safe-html:[$options.safeHtmlConfig]="glEmojiTag('warning')" - ></span> - <gl-popover - placement="bottom" - target="performance-bar-request-selector-warning" - :content="warningMessage" - /> - </span> </div> </template> diff --git a/app/assets/javascripts/performance_bar/index.js b/app/assets/javascripts/performance_bar/index.js index eae424ae4ae..e7f84eacdca 100644 --- a/app/assets/javascripts/performance_bar/index.js +++ b/app/assets/javascripts/performance_bar/index.js @@ -1,5 +1,6 @@ import '../webpack'; +import { isEmpty } from 'lodash'; import Vue from 'vue'; import axios from '~/lib/utils/axios_utils'; import { numberToHumanSize } from '~/lib/utils/number_utils'; @@ -37,9 +38,10 @@ const initPerformanceBar = (el) => { }; }, mounted() { - PerformanceBarService.registerInterceptor(this.peekUrl, this.loadRequestDetails); + PerformanceBarService.registerInterceptor(this.peekUrl, this.addRequest); - this.loadRequestDetails(this.requestId, window.location.href); + this.addRequest(this.requestId, window.location.href); + this.loadRequestDetails(this.requestId); }, beforeDestroy() { PerformanceBarService.removeInterceptor(); @@ -51,26 +53,32 @@ const initPerformanceBar = (el) => { // want to trace the request. axios.get(urlOrRequestId); } else { - this.loadRequestDetails(urlOrRequestId, urlOrRequestId); + this.addRequest(urlOrRequestId, urlOrRequestId); } }, - loadRequestDetails(requestId, requestUrl) { + addRequest(requestId, requestUrl) { if (!this.store.canTrackRequest(requestUrl)) { return; } this.store.addRequest(requestId, requestUrl); + }, + loadRequestDetails(requestId) { + const request = this.store.findRequest(requestId); + + if (request && isEmpty(request.details)) { + return PerformanceBarService.fetchRequestDetails(this.peekUrl, requestId) + .then((res) => { + this.store.addRequestDetails(requestId, res.data); + if (this.requestId === requestId) this.collectFrontendPerformanceMetrics(); + }) + .catch(() => + // eslint-disable-next-line no-console + console.warn(`Error getting performance bar results for ${requestId}`), + ); + } - PerformanceBarService.fetchRequestDetails(this.peekUrl, requestId) - .then((res) => { - this.store.addRequestDetails(requestId, res.data); - - if (this.requestId === requestId) this.collectFrontendPerformanceMetrics(); - }) - .catch(() => - // eslint-disable-next-line no-console - console.warn(`Error getting performance bar results for ${requestId}`), - ); + return Promise.resolve(); }, collectFrontendPerformanceMetrics() { if (performance) { @@ -143,6 +151,7 @@ const initPerformanceBar = (el) => { }, on: { 'add-request': this.addRequestManually, + 'change-request': this.loadRequestDetails, }, }); }, diff --git a/app/assets/javascripts/performance_bar/stores/performance_bar_store.js b/app/assets/javascripts/performance_bar/stores/performance_bar_store.js index 51a8eb5ca69..5a69960e4d9 100644 --- a/app/assets/javascripts/performance_bar/stores/performance_bar_store.js +++ b/app/assets/javascripts/performance_bar/stores/performance_bar_store.js @@ -12,7 +12,6 @@ export default class PerformanceBarStore { url: requestUrl, truncatedUrl: shortUrl, details: {}, - hasWarnings: false, }); } @@ -27,7 +26,6 @@ export default class PerformanceBarStore { const request = this.findRequest(requestId); request.details = requestDetails.data; - request.hasWarnings = requestDetails.has_warnings; return request; } diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue index 68cff1368af..b062833cdf8 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue @@ -1,6 +1,7 @@ <script> /* eslint-disable @gitlab/require-i18n-strings */ import { GlModal, GlLink, GlSprintf } from '@gitlab/ui'; +import { helpPagePath } from '~/helpers/help_page_helper'; import { escapeShellString } from '~/lib/utils/text_utility'; import { __ } from '~/locale'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; @@ -10,24 +11,26 @@ export default { steps: { step1: { label: __('Step 1.'), - help: __('Fetch and check out the branch for this merge request'), + help: __("Fetch and check out this merge request's feature branch:"), }, step2: { label: __('Step 2.'), - help: __('Review the changes locally'), + help: __('Review the changes locally.'), }, step3: { label: __('Step 3.'), - help: __('Merge the branch and fix any conflicts that come up'), + help: __( + 'Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}', + ), }, step4: { label: __('Step 4.'), - help: __('Push the result of the merge to GitLab'), + help: __('Push the target branch up to GitLab.'), }, }, copyCommands: __('Copy commands'), tip: __( - '%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}', + '%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}', ), title: __('Check out, review, and merge locally'), }, @@ -74,6 +77,13 @@ export default { default: null, }, }, + data() { + return { + resolveConflictsFromCli: helpPagePath('ee/user/project/merge_requests/conflicts.html', { + anchor: 'resolve-conflicts-from-the-command-line', + }), + }; + }, computed: { mergeInfo1() { const escapedOriginBranch = escapeShellString(`origin/${this.sourceBranch}`); @@ -138,7 +148,13 @@ export default { <strong> {{ $options.i18n.steps.step3.label }} </strong> - {{ $options.i18n.steps.step3.help }} + <gl-sprintf :message="$options.i18n.steps.step3.help"> + <template #link="{ content }"> + <gl-link class="gl-display-inline-block" :href="resolveConflictsFromCli"> + {{ content }} + </gl-link> + </template> + </gl-sprintf> </p> <div class="gl-display-flex"> <pre class="gl-w-full" data-testid="how-to-merge-instructions">{{ mergeInfo2 }}</pre> @@ -163,7 +179,7 @@ export default { /> </div> <p v-if="reviewingDocsPath"> - <gl-sprintf :message="$options.i18n.tip"> + <gl-sprintf data-testid="docs-tip" :message="$options.i18n.tip"> <template #strong="{ content }"> <strong>{{ content }}</strong> </template> diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue index a2c9cfe53cc..1621b6831a2 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue @@ -144,7 +144,7 @@ export default { :size="glFeatures.restructuredMrWidget ? 'small' : 'medium'" data-testid="merge-locally-button" > - {{ s__('mrWidget|Merge locally') }} + {{ s__('mrWidget|Resolve locally') }} </gl-button> </template> </div> diff --git a/app/views/projects/_invite_groups_modal.html.haml b/app/views/projects/_invite_groups_modal.html.haml index d16e87d1c26..40dc0009b24 100644 --- a/app/views/projects/_invite_groups_modal.html.haml +++ b/app/views/projects/_invite_groups_modal.html.haml @@ -1,3 +1,3 @@ -- return unless can_admin_project_member?(project) +- return unless can_invite_members_for_project?(project) .js-invite-groups-modal{ data: common_invite_group_modal_data(project, ProjectMember, 'true') } diff --git a/config/metrics/counts_all/20210514141520_project_imports_total.yml b/config/metrics/counts_all/20210514141520_project_imports_total.yml index 3846e3b9fc7..1c5a42c4892 100644 --- a/config/metrics/counts_all/20210514141520_project_imports_total.yml +++ b/config/metrics/counts_all/20210514141520_project_imports_total.yml @@ -1,7 +1,7 @@ --- data_category: optional key_path: usage_activity_by_stage.manage.project_imports.total -description: 'Count number of projects imported monthly' +description: Number of projects imported product_section: dev product_stage: manage product_group: group::import diff --git a/doc/administration/monitoring/performance/img/performance_bar_request_selector_warning.png b/doc/administration/monitoring/performance/img/performance_bar_request_selector_warning.png Binary files differdeleted file mode 100644 index 3872c8b41b2..00000000000 --- a/doc/administration/monitoring/performance/img/performance_bar_request_selector_warning.png +++ /dev/null diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md index 55ec7faf75b..93098e43544 100644 --- a/doc/administration/monitoring/performance/performance_bar.md +++ b/doc/administration/monitoring/performance/performance_bar.md @@ -95,18 +95,14 @@ For non-administrators to display the performance bar, it must be ## Request warnings +> [Warning icon in the request selector removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82187) in GitLab 14.9. + Requests that exceed predefined limits display a warning **{warning}** icon and explanation next to the metric. In this example, the Gitaly call duration exceeded the threshold. ![Gitaly call duration exceeded threshold](img/performance_bar_gitaly_threshold.png) -If any requests on the current page generated warnings, the warning icon displays -next to the **Requests** selector menu. In this selector menu, an exclamation `(!)` -appears next to requests with warnings. - -![Request selector showing two requests with warnings](img/performance_bar_request_selector_warning.png) - ## Enable the performance bar for non-administrators The performance bar is disabled by default for non-administrators. To enable it diff --git a/doc/development/performance.md b/doc/development/performance.md index ad019afc37d..55453e31d3d 100644 --- a/doc/development/performance.md +++ b/doc/development/performance.md @@ -95,8 +95,13 @@ end This however leads to the question: how many iterations should we run to get meaningful statistics? -The benchmark-ips Gem basically takes care of all this and much more, and as a -result of this should be used instead of the `Benchmark` module. +The [`benchmark-ips`](https://github.com/evanphx/benchmark-ips) +gem takes care of all this and much more. You should therefore use it instead of the `Benchmark` +module. + +The GitLab Gemfile also contains the [`benchmark-memory`](https://github.com/michaelherold/benchmark-memory) +gem, which works similarly to the `benchmark` and `benchmark-ips` gems. However, `benchmark-memory` +instead returns the memory size, objects, and strings allocated and retained during the benchmark. In short: @@ -110,7 +115,7 @@ In short: - If you must write a benchmark use the benchmark-ips Gem instead of Ruby's `Benchmark` module. -## Profiling +## Profiling with Stackprof By collecting snapshots of process state at regular intervals, profiling allows you to see where time is spent in a process. The @@ -124,15 +129,36 @@ frequency (for example, 100hz, that is 100 stacks per second). This type of prof has quite a low (albeit non-zero) overhead and is generally considered to be safe for production. -### Development - A profiler can be a very useful tool during development, even if it does run *in an unrepresentative environment*. In particular, a method is not necessarily troublesome just because it's executed many times, or takes a long time to execute. Profiles are tools you can use to better understand what is happening in an application - using that information wisely is up to you! -Keeping that in mind, to create a profile, identify (or create) a spec that +There are multiple ways to create a profile with Stackprof. + +### Wrapping a code block + +To profile a specific code block, you can wrap that block in a `Stackprof.run` call: + +```ruby +StackProf.run(mode: :wall, out: 'tmp/stackprof-profiling.dump') do + #... +end +``` + +This creates a `.dump` file that you can [read](#reading-a-stackprof-profile). +For all available options, see the [Stackprof documentation](https://github.com/tmm1/stackprof#all-options). + +### Performance bar + +With the [Performance bar](../administration/monitoring/performance/performance_bar.md), +you have the option to profile a request using Stackprof and immediately output the results to a +[Speedscope flamegraph](profiling.md#speedscope-flamegraphs). + +### RSpec profiling with Stackprof + +To create a profile from a spec, identify (or create) a spec that exercises the troublesome code path, then run it using the `bin/rspec-stackprof` helper, for example: @@ -161,89 +187,10 @@ Finished in 18.19 seconds (files took 4.8 seconds to load) 187 (1.1%) 187 (1.1%) block (4 levels) in class_attribute ``` -You can limit the specs that are run by passing any arguments `rspec` would +You can limit the specs that are run by passing any arguments `RSpec` would normally take. -The output is sorted by the `Samples` column by default. This is the number of -samples taken where the method is the one currently being executed. The `Total` -column shows the number of samples taken where the method, or any of the methods -it calls, were being executed. - -To create a graphical view of the call stack: - -```shell -stackprof tmp/project_policy_spec.rb.dump --graphviz > project_policy_spec.dot -dot -Tsvg project_policy_spec.dot > project_policy_spec.svg -``` - -To load the profile in [KCachegrind](https://kcachegrind.github.io/): - -```shell -stackprof tmp/project_policy_spec.rb.dump --callgrind > project_policy_spec.callgrind -kcachegrind project_policy_spec.callgrind # Linux -qcachegrind project_policy_spec.callgrind # Mac -``` - -For flame graphs, enable raw collection first. Note that raw -collection can generate a very large file, so increase the `INTERVAL`, or -run on a smaller number of specs for smaller file size: - -```shell -RAW=true bin/rspec-stackprof spec/policies/group_member_policy_spec.rb -``` - -You can then generate, and view the resultant flame graph. It might take a -while to generate based on the output file size: - -```shell -# Generate -stackprof --flamegraph tmp/group_member_policy_spec.rb.dump > group_member_policy_spec.flame - -# View -stackprof --flamegraph-viewer=group_member_policy_spec.flame -``` - -It may be useful to zoom in on a specific method, for example: - -```shell -$ stackprof tmp/project_policy_spec.rb.dump --method warm_asset_cache - -TestEnv#warm_asset_cache (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/spec/support/test_env.rb:164) - samples: 0 self (0.0%) / 6288 total (36.9%) - callers: - 6288 ( 100.0%) block (2 levels) in <top (required)> - callees (6288 total): - 6288 ( 100.0%) Capybara::RackTest::Driver#visit - code: - | 164 | def warm_asset_cache - | 165 | return if warm_asset_cache? - | 166 | return unless defined?(Capybara) - | 167 | - 6288 (36.9%) | 168 | Capybara.current_session.driver.visit '/' - | 169 | end -$ stackprof tmp/project_policy_spec.rb.dump --method BasePolicy#abilities -BasePolicy#abilities (/Users/lupine/dev/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/app/policies/base_policy.rb:79) - samples: 0 self (0.0%) / 50 total (0.3%) - callers: - 25 ( 50.0%) BasePolicy.abilities - 25 ( 50.0%) BasePolicy#collect_rules - callees (50 total): - 25 ( 50.0%) ProjectPolicy#rules - 25 ( 50.0%) BasePolicy#collect_rules - code: - | 79 | def abilities - | 80 | return RuleSet.empty if @user && @user.blocked? - | 81 | return anonymous_abilities if @user.nil? - 50 (0.3%) | 82 | collect_rules { rules } - | 83 | end -``` - -Since the profile includes the work done by the test suite as well as the -application code, these profiles can be used to investigate slow tests as well. -However, for smaller runs (like this example), this means that the cost of -setting up the test suite tends to dominate. - -### Production +### Using Stackprof in production Stackprof can also be used to profile production workloads. @@ -274,8 +221,8 @@ the timeout. Once profiling stops, the profile is written out to disk at `$STACKPROF_FILE_PREFIX/stackprof.$PID.$RAND.profile`. It can then be inspected -further via the `stackprof` command line tool, as described in the previous -section. +further through the `stackprof` command line tool, as described in the +[Reading a Stackprof profile section](#reading-a-stackprof-profile). Currently supported profiling targets are: @@ -295,14 +242,85 @@ For Sidekiq, the signal can be sent to the `sidekiq-cluster` process via `pkill -USR2 bin/sidekiq-cluster`, which forwards the signal to all Sidekiq children. Alternatively, you can also select a specific PID of interest. -Production profiles can be especially noisy. It can be helpful to visualize them -as a [flame graph](https://github.com/brendangregg/FlameGraph). This can be done -via: +### Reading a Stackprof profile + +The output is sorted by the `Samples` column by default. This is the number of samples taken where +the method is the one currently executed. The `Total` column shows the number of samples taken where +the method (or any of the methods it calls) is executed. + +To create a graphical view of the call stack: ```shell -bundle exec stackprof --stackcollapse /tmp/stackprof.55769.c6c3906452.profile | flamegraph.pl > flamegraph.svg +stackprof tmp/project_policy_spec.rb.dump --graphviz > project_policy_spec.dot +dot -Tsvg project_policy_spec.dot > project_policy_spec.svg ``` +To load the profile in [KCachegrind](https://kcachegrind.github.io/): + +```shell +stackprof tmp/project_policy_spec.rb.dump --callgrind > project_policy_spec.callgrind +kcachegrind project_policy_spec.callgrind # Linux +qcachegrind project_policy_spec.callgrind # Mac +``` + +You can also generate and view the resultant flame graph. To view a flame graph that +`bin/rspec-stackprof` creates, you must set the `RAW` environment variable to `true` when running +`bin/rspec-stackprof`. + +It might take a while to generate based on the output file size: + +```shell +# Generate +stackprof --flamegraph tmp/group_member_policy_spec.rb.dump > group_member_policy_spec.flame + +# View +stackprof --flamegraph-viewer=group_member_policy_spec.flame +``` + +To export the flame graph to an SVG file, use [Brendan Gregg's FlameGraph tool](https://github.com/brendangregg/FlameGraph): + +```shell +stackprof --stackcollapse /tmp/group_member_policy_spec.rb.dump | flamegraph.pl > flamegraph.svg +``` + +It's also possible to view flame graphs through [speedscope](https://github.com/jlfwong/speedscope). +You can do this when using the [performance bar](profiling.md#speedscope-flamegraphs) +and when [profiling code blocks](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby)). +This option isn't supported by `bin/rspec-stackprof`. + +You can profile speciific methods by using `--method method_name`: + +```shell +$ stackprof tmp/project_policy_spec.rb.dump --method access_allowed_to + +ProjectPolicy#access_allowed_to? (/Users/royzwambag/work/gitlab-development-kit/gitlab/app/policies/project_policy.rb:793) + samples: 0 self (0.0%) / 578 total (0.7%) + callers: + 397 ( 68.7%) block (2 levels) in <class:ProjectPolicy> + 95 ( 16.4%) block in <class:ProjectPolicy> + 86 ( 14.9%) block in <class:ProjectPolicy> + callees (578 total): + 399 ( 69.0%) ProjectPolicy#team_access_level + 141 ( 24.4%) Project::GeneratedAssociationMethods#project_feature + 30 ( 5.2%) DeclarativePolicy::Base#can? + 8 ( 1.4%) Featurable#access_level + code: + | 793 | def access_allowed_to?(feature) + 141 (0.2%) | 794 | return false unless project.project_feature + | 795 | + 8 (0.0%) | 796 | case project.project_feature.access_level(feature) + | 797 | when ProjectFeature::DISABLED + | 798 | false + | 799 | when ProjectFeature::PRIVATE + 429 (0.5%) | 800 | can?(:read_all_resources) || team_access_level >= ProjectFeature.required_minimum_access_level(feature) + | 801 | else +``` + +When using Stackprof to profile specs, the profile includes the work done by the test suite and the +application code. You can therefore use these profiles to investigate slow tests as well. However, +for smaller runs (like this example), this means that the cost of setting up the test suite tends to +dominate. + ## RSpec profiling The GitLab development environment also includes the @@ -648,7 +666,7 @@ end ## String Freezing -In recent Ruby versions calling `freeze` on a String leads to it being allocated +In recent Ruby versions calling `.freeze` on a String leads to it being allocated only once and re-used. For example, on Ruby 2.3 or later this only allocates the "foo" String once: @@ -662,6 +680,12 @@ Depending on the size of the String and how frequently it would be allocated (before the `.freeze` call was added), this _may_ make things faster, but this isn't guaranteed. +Freezing strings saves memory, as every allocated string uses at least one `RVALUE_SIZE` bytes (40 +bytes on x64) of memory. + +You can use the [memory profiler](#using-memory-profiler) +to see which strings are allocated often and could potentially benefit from a `.freeze`. + Strings are frozen by default in Ruby 3.0. To prepare our codebase for this eventuality, we are adding the following header to all Ruby files: diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md index bf007572ac7..4d46032d229 100644 --- a/doc/user/packages/pypi_repository/index.md +++ b/doc/user/packages/pypi_repository/index.md @@ -254,7 +254,9 @@ Prerequisites: - The maximum allowed package size is 5 GB. - You can't upload the same version of a package multiple times. If you try, you receive the error `400 Bad Request`. -- You cannot publish PyPI packages to a group, only to a project. +- PyPI packages are published using your projectID. +- If your project is in a group, PyPI packages published to your project registry are also available + at the group-level registry (see [Install from the group level](#install-from-the-group-level)). You can then [publish a package by using twine](#publish-a-pypi-package-by-using-twine). diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md index e342feabbe0..b66f39d6b59 100644 --- a/doc/user/project/members/index.md +++ b/doc/user/project/members/index.md @@ -163,7 +163,7 @@ To remove a member from a project: 1. On the top bar, select **Menu > Projects** and find your project. 1. On the left sidebar, select **Project information > Members**. -1. Next to the project member you want to remove, select **Remove member** **{remove}**. +1. Next to the project member you want to remove, select **Remove member**. 1. Optional. In the confirmation box, select the **Also unassign this user from related issues and merge requests** checkbox. 1. To prevent leaks of sensitive information from private projects, verify the diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 0d6140dee1b..5f040ea0203 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -365,11 +365,6 @@ msgid_plural "%d projects selected" msgstr[0] "" msgstr[1] "" -msgid "%d request with warnings" -msgid_plural "%d requests with warnings" -msgstr[0] "" -msgstr[1] "" - msgid "%d second" msgid_plural "%d seconds" msgstr[0] "" @@ -986,7 +981,7 @@ msgstr "" msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups." msgstr "" -msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}" +msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}" msgstr "" msgid "%{strong_start}%{branch_count}%{strong_end} Branch" @@ -15547,7 +15542,7 @@ msgstr "" msgid "February" msgstr "" -msgid "Fetch and check out the branch for this merge request" +msgid "Fetch and check out this merge request's feature branch:" msgstr "" msgid "Fetching incoming email" @@ -22978,9 +22973,6 @@ msgstr "" msgid "Member|Deny access" msgstr "" -msgid "Member|Remove member" -msgstr "" - msgid "Member|Revoke invite" msgstr "" @@ -23092,7 +23084,7 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" -msgid "Merge the branch and fix any conflicts that come up" +msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}" msgstr "" msgid "Merge unavailable: merge requests are read-only in a secondary Geo node." @@ -29963,7 +29955,7 @@ msgstr "" msgid "Push rules" msgstr "" -msgid "Push the result of the merge to GitLab" +msgid "Push the target branch up to GitLab." msgstr "" msgid "Push to create a project" @@ -31492,7 +31484,7 @@ msgstr "" msgid "Review requests for you" msgstr "" -msgid "Review the changes locally" +msgid "Review the changes locally." msgstr "" msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"." @@ -44077,9 +44069,6 @@ msgstr "" msgid "mrWidget|Merge failed." msgstr "" -msgid "mrWidget|Merge locally" -msgstr "" - msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects." msgstr "" @@ -44152,6 +44141,9 @@ msgstr "" msgid "mrWidget|Resolve conflicts" msgstr "" +msgid "mrWidget|Resolve locally" +msgstr "" + msgid "mrWidget|Revert" msgstr "" diff --git a/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js b/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js index 356df7e7b11..3e4ffb6e61b 100644 --- a/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js +++ b/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js @@ -43,12 +43,12 @@ describe('UserActionButtons', () => { memberId: member.id, memberType: 'GroupMember', message: `Are you sure you want to remove ${member.user.name} from "${member.source.fullName}"?`, - title: 'Remove member', + title: null, isAccessRequest: false, isInvite: false, icon: '', buttonCategory: 'secondary', - buttonText: 'Remove user', + buttonText: 'Remove member', userDeletionObstacles: { name: member.user.name, obstacles: parseUserDeletionObstacles(member.user), @@ -135,9 +135,9 @@ describe('UserActionButtons', () => { describe('isInvitedUser', () => { it.each` - isInvitedUser | icon | buttonText | buttonCategory - ${true} | ${'remove'} | ${null} | ${'primary'} - ${false} | ${''} | ${'Remove user'} | ${'secondary'} + isInvitedUser | icon | buttonText | buttonCategory + ${true} | ${'remove'} | ${null} | ${'primary'} + ${false} | ${''} | ${'Remove member'} | ${'secondary'} `( 'passes the correct props to remove-member-button when isInvitedUser is $isInvitedUser', ({ isInvitedUser, icon, buttonText, buttonCategory }) => { diff --git a/spec/frontend/performance_bar/components/performance_bar_app_spec.js b/spec/frontend/performance_bar/components/performance_bar_app_spec.js index 67a4259a8e3..2c9ab4bf78d 100644 --- a/spec/frontend/performance_bar/components/performance_bar_app_spec.js +++ b/spec/frontend/performance_bar/components/performance_bar_app_spec.js @@ -18,4 +18,15 @@ describe('performance bar app', () => { it('sets the class to match the environment', () => { expect(wrapper.element.getAttribute('class')).toContain('development'); }); + + describe('changeCurrentRequest', () => { + it('emits a change-request event', () => { + expect(wrapper.emitted('change-request')).toBeUndefined(); + + wrapper.vm.changeCurrentRequest('123'); + + expect(wrapper.emitted('change-request')).toBeDefined(); + expect(wrapper.emitted('change-request')[0]).toEqual(['123']); + }); + }); }); diff --git a/spec/frontend/performance_bar/components/request_selector_spec.js b/spec/frontend/performance_bar/components/request_selector_spec.js deleted file mode 100644 index 9cc8c5e73f4..00000000000 --- a/spec/frontend/performance_bar/components/request_selector_spec.js +++ /dev/null @@ -1,31 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import RequestSelector from '~/performance_bar/components/request_selector.vue'; - -describe('request selector', () => { - const requests = [ - { - id: 'warningReq', - url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1/discussions.json', - truncatedUrl: 'discussions.json', - hasWarnings: true, - }, - ]; - - const wrapper = shallowMount(RequestSelector, { - propsData: { - requests, - currentRequest: requests[0], - }, - }); - - it('has a warning icon if any requests have warnings', () => { - expect(wrapper.find('span > gl-emoji').element.dataset.name).toEqual('warning'); - }); - - it('adds a warning glyph to requests with warnings', () => { - const requestValue = wrapper.find('[value="warningReq"]').text(); - - expect(requestValue).toContain('discussions.json'); - expect(requestValue).toContain('(!)'); - }); -}); diff --git a/spec/frontend/performance_bar/index_spec.js b/spec/frontend/performance_bar/index_spec.js index 819b2bcbacf..91cb46002be 100644 --- a/spec/frontend/performance_bar/index_spec.js +++ b/spec/frontend/performance_bar/index_spec.js @@ -51,7 +51,7 @@ describe('performance bar wrapper', () => { mock.restore(); }); - describe('loadRequestDetails', () => { + describe('addRequest', () => { beforeEach(() => { jest.spyOn(vm.store, 'addRequest'); }); @@ -59,26 +59,46 @@ describe('performance bar wrapper', () => { it('does nothing if the request cannot be tracked', () => { jest.spyOn(vm.store, 'canTrackRequest').mockImplementation(() => false); - vm.loadRequestDetails('123', 'https://gitlab.com/'); + vm.addRequest('123', 'https://gitlab.com/'); expect(vm.store.addRequest).not.toHaveBeenCalled(); }); it('adds the request immediately', () => { - vm.loadRequestDetails('123', 'https://gitlab.com/'); + vm.addRequest('123', 'https://gitlab.com/'); expect(vm.store.addRequest).toHaveBeenCalledWith('123', 'https://gitlab.com/'); }); + }); - it('makes an HTTP request for the request details', () => { + describe('loadRequestDetails', () => { + beforeEach(() => { jest.spyOn(PerformanceBarService, 'fetchRequestDetails'); + }); - vm.loadRequestDetails('456', 'https://gitlab.com/'); + it('makes an HTTP request for the request details', () => { + vm.addRequest('456', 'https://gitlab.com/'); + vm.loadRequestDetails('456'); expect(PerformanceBarService.fetchRequestDetails).toHaveBeenCalledWith( '/-/peek/results', '456', ); }); + + it('does not make a request if request was not added', () => { + vm.loadRequestDetails('456'); + + expect(PerformanceBarService.fetchRequestDetails).not.toHaveBeenCalled(); + }); + + it('makes an HTTP request only once for the same request', async () => { + vm.addRequest('456', 'https://gitlab.com/'); + await vm.loadRequestDetails('456'); + + vm.loadRequestDetails('456'); + + expect(PerformanceBarService.fetchRequestDetails).toHaveBeenCalledTimes(1); + }); }); }); diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js index 9dcde3e4f33..bdc38eb0b22 100644 --- a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js +++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js @@ -19,7 +19,7 @@ describe('MRWidgetConflicts', () => { const userCannotMergeText = 'Users who can write to the source or target branches can resolve the conflicts.'; const resolveConflictsBtnText = 'Resolve conflicts'; - const mergeLocallyBtnText = 'Merge locally'; + const mergeLocallyBtnText = 'Resolve locally'; async function createComponent(propsData = {}) { wrapper = extendedWrapper( diff --git a/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js b/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js index 913d5860b48..295b9df30b9 100644 --- a/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js +++ b/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js @@ -1,4 +1,4 @@ -import { GlModal, GlSprintf } from '@gitlab/ui'; +import { GlModal } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import MrWidgetHowToMergeModal from '~/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue'; @@ -27,7 +27,7 @@ describe('MRWidgetHowToMerge', () => { const findModal = () => wrapper.find(GlModal); const findInstructionsFields = () => wrapper.findAll('[ data-testid="how-to-merge-instructions"]'); - const findTipLink = () => wrapper.find(GlSprintf); + const findTipLink = () => wrapper.find("[data-testid='docs-tip']"); it('renders a modal', () => { expect(findModal().exists()).toBe(true); |