Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-06-16 12:09:26 +00:00
parent b7b44de429
commit b019dc959e
158 changed files with 1659 additions and 493 deletions

View File

@ -91,7 +91,7 @@ gemnasium-python-dependency_scanning:
yarn-audit-dependency_scanning:
extends: .ds-analyzer
image: "${REGISTRY_HOST}/${REGISTRY_GROUP}/security-products/analyzers/npm-audit:1.4.1"
image: "${REGISTRY_HOST}/${REGISTRY_GROUP}/security-products/analyzers/npm-audit:1"
variables:
TOOL: yarn
rules: !reference [".reports:rules:yarn-audit-dependency_scanning", rules]

View File

@ -184,6 +184,17 @@
- "*.yml"
- "**/*.yml"
.lint-pipeline-yaml-patterns: &lint-pipeline-yaml-patterns
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*.yml"
- "lib/gitlab/ci/templates/**/*.yml"
- "data/deprecations/**/*.yml"
- "data/removals/**/*.yml"
- "data/whats_new/**/*.yml"
.lint-metrics-yaml-patterns: &lint-metrics-yaml-patterns
- "config/metrics/**/*.yml"
.docs-patterns: &docs-patterns
- ".gitlab/route-map.yml"
- "doc/**/*"
@ -1801,3 +1812,13 @@
rules:
- <<: *if-default-refs
changes: *yaml-lint-patterns
.lint-pipeline-yaml:rules:
rules:
- <<: *if-default-refs
changes: *lint-pipeline-yaml-patterns
.lint-metrics-yaml:rules:
rules:
- <<: *if-default-refs
changes: *lint-metrics-yaml-patterns

View File

@ -18,7 +18,7 @@ lint-yaml:
lint-pipeline-yaml:
extends:
- .default-retry
- .yaml-lint:rules
- .lint-pipeline-yaml:rules
image: pipelinecomponents/yamllint:latest
stage: lint
needs: []
@ -30,7 +30,7 @@ lint-pipeline-yaml:
lint-metrics-yaml:
extends:
- .default-retry
- .yaml-lint:rules
- .lint-metrics-yaml:rules
image: pipelinecomponents/yamllint:latest
stage: lint
needs: []

View File

@ -26,7 +26,6 @@ Cop/UserAdmin:
- app/models/protected_branch.rb
- app/models/user.rb
- app/policies/note_policy.rb
- app/serializers/deploy_key_entity.rb
- app/services/auth/container_registry_authentication_service.rb
- app/services/emails/create_service.rb
- app/services/projects/enable_deploy_key_service.rb

View File

@ -25,7 +25,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/controllers/projects/subscriptions_controller.rb
- ee/app/finders/autocomplete/vulnerabilities_autocomplete_finder.rb
- ee/app/finders/clusters/agents_finder.rb
- ee/app/finders/ee/alert_management/alerts_finder.rb
- ee/app/finders/ee/alert_management/http_integrations_finder.rb
- ee/app/graphql/ee/types/group_type.rb
- ee/app/graphql/mutations/dast/profiles/create.rb

View File

@ -500,8 +500,6 @@ Gitlab/NamespacedClass:
- 'app/serializers/current_board_entity.rb'
- 'app/serializers/current_board_serializer.rb'
- 'app/serializers/current_user_entity.rb'
- 'app/serializers/deploy_key_entity.rb'
- 'app/serializers/deploy_key_serializer.rb'
- 'app/serializers/deploy_keys_project_entity.rb'
- 'app/serializers/deployment_cluster_entity.rb'
- 'app/serializers/deployment_entity.rb'
@ -770,7 +768,6 @@ Gitlab/NamespacedClass:
- 'app/workers/error_tracking_issue_link_worker.rb'
- 'app/workers/expire_build_artifacts_worker.rb'
- 'app/workers/expire_job_cache_worker.rb'
- 'app/workers/expire_pipeline_cache_worker.rb'
- 'app/workers/export_csv_worker.rb'
- 'app/workers/external_service_reactive_caching_worker.rb'
- 'app/workers/file_hook_worker.rb'
@ -812,7 +809,6 @@ Gitlab/NamespacedClass:
- 'app/workers/post_receive.rb'
- 'app/workers/process_commit_worker.rb'
- 'app/workers/project_cache_worker.rb'
- 'app/workers/project_daily_statistics_worker.rb'
- 'app/workers/project_destroy_worker.rb'
- 'app/workers/project_export_worker.rb'
- 'app/workers/propagate_integration_group_worker.rb'
@ -1017,7 +1013,6 @@ Gitlab/NamespacedClass:
- 'ee/app/serializers/group_analytics_serializer.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_entity.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_serializer.rb'
- 'ee/app/serializers/invited_group_entity.rb'
- 'ee/app/serializers/invited_group_serializer.rb'
- 'ee/app/serializers/iteration_serializer.rb'
- 'ee/app/serializers/license_entity.rb'
@ -1216,7 +1211,6 @@ Gitlab/NamespacedClass:
- 'lib/gitlab/object_hierarchy.rb'
- 'lib/gitlab/omniauth_initializer.rb'
- 'lib/gitlab/otp_key_rotator.rb'
- 'lib/gitlab/pages_transfer.rb'
- 'lib/gitlab/pipeline_scope_counts.rb'
- 'lib/gitlab/polling_interval.rb'
- 'lib/gitlab/process_memory_cache.rb'
@ -1270,7 +1264,6 @@ Gitlab/NamespacedClass:
- 'lib/gitlab/unicode.rb'
- 'lib/gitlab/untrusted_regexp.rb'
- 'lib/gitlab/untrusted_regexp/ruby_syntax.rb'
- 'lib/gitlab/updated_notes_paginator.rb'
- 'lib/gitlab/uploads_transfer.rb'
- 'lib/gitlab/url_blocker.rb'
- 'lib/gitlab/url_builder.rb'

View File

@ -293,7 +293,6 @@ Layout/ArgumentAlignment:
- 'ee/app/controllers/subscriptions_controller.rb'
- 'ee/app/finders/geo/registry_finder.rb'
- 'ee/app/graphql/ee/mutations/boards/issues/issue_move_list.rb'
- 'ee/app/graphql/ee/mutations/ci/ci_cd_settings_update.rb'
- 'ee/app/graphql/ee/types/ci/pipeline_type.rb'
- 'ee/app/graphql/ee/types/deprecated_mutations.rb'
- 'ee/app/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create.rb'
@ -395,7 +394,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/features/uncompleted_learn_gitlab_link_spec.rb'
- 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
- 'ee/spec/frontend/fixtures/search.rb'
- 'ee/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb'
- 'ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb'
- 'ee/spec/helpers/billing_plans_helper_spec.rb'
- 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'

View File

@ -383,7 +383,6 @@ Layout/LineLength:
- 'app/models/concerns/redis_cacheable.rb'
- 'app/models/concerns/restricted_signup.rb'
- 'app/models/concerns/routable.rb'
- 'app/models/concerns/sha256_attribute.rb'
- 'app/models/concerns/shardable.rb'
- 'app/models/concerns/sortable.rb'
- 'app/models/concerns/storage/legacy_namespace.rb'
@ -529,7 +528,6 @@ Layout/LineLength:
- 'app/serializers/base_discussion_entity.rb'
- 'app/serializers/build_details_entity.rb'
- 'app/serializers/ci/pipeline_entity.rb'
- 'app/serializers/deploy_key_entity.rb'
- 'app/serializers/deployment_cluster_entity.rb'
- 'app/serializers/deployment_entity.rb'
- 'app/serializers/diff_file_base_entity.rb'
@ -649,7 +647,6 @@ Layout/LineLength:
- 'app/services/members/approve_access_request_service.rb'
- 'app/services/members/destroy_service.rb'
- 'app/services/members/invitation_reminder_email_service.rb'
- 'app/services/members/mailgun/process_webhook_service.rb'
- 'app/services/members/update_service.rb'
- 'app/services/merge_requests/add_context_service.rb'
- 'app/services/merge_requests/assign_issues_service.rb'
@ -795,7 +792,6 @@ Layout/LineLength:
- 'app/workers/packages/maven/metadata/sync_worker.rb'
- 'app/workers/personal_access_tokens/expired_notification_worker.rb'
- 'app/workers/pipeline_metrics_worker.rb'
- 'app/workers/quality/test_data_cleanup_worker.rb'
- 'app/workers/repository_fork_worker.rb'
- 'app/workers/repository_import_worker.rb'
- 'app/workers/ssh_keys/expired_notification_worker.rb'
@ -831,7 +827,6 @@ Layout/LineLength:
- 'config/initializers/wikicloth_redos_patch.rb'
- 'config/initializers/zz_metrics.rb'
- 'config/object_store_settings.rb'
- 'config/puma.rb'
- 'config/routes.rb'
- 'config/routes/admin.rb'
- 'config/routes/api.rb'
@ -1176,7 +1171,6 @@ Layout/LineLength:
- 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
- 'ee/app/controllers/projects/security/policies_controller.rb'
- 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
- 'ee/app/controllers/projects/threat_monitoring_controller.rb'
- 'ee/app/controllers/registrations/groups_controller.rb'
- 'ee/app/controllers/registrations/groups_projects_controller.rb'
- 'ee/app/controllers/subscriptions_controller.rb'
@ -1324,7 +1318,6 @@ Layout/LineLength:
- 'ee/app/helpers/projects/security/dast_configuration_helper.rb'
- 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
- 'ee/app/helpers/projects/security/discover_helper.rb'
- 'ee/app/helpers/projects/security/policies_helper.rb'
- 'ee/app/helpers/push_rules_helper.rb'
- 'ee/app/helpers/seats_count_alert_helper.rb'
- 'ee/app/helpers/security_helper.rb'
@ -1524,7 +1517,6 @@ Layout/LineLength:
- 'ee/app/services/ee/users/update_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- 'ee/app/services/elastic/indexing_control_service.rb'
- 'ee/app/services/epic_links/create_service.rb'
- 'ee/app/services/epic_links/list_service.rb'
- 'ee/app/services/epics/issue_promote_service.rb'
- 'ee/app/services/epics/update_service.rb'
@ -1818,7 +1810,6 @@ Layout/LineLength:
- 'ee/lib/gitlab/geo/jwt_request_decoder.rb'
- 'ee/lib/gitlab/geo/log_cursor/events/repository_created_event.rb'
- 'ee/lib/gitlab/geo/registry_batcher.rb'
- 'ee/lib/gitlab/geo/replication/base_downloader.rb'
- 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- 'ee/lib/gitlab/geo/replicator.rb'

View File

@ -79,8 +79,6 @@ RSpec/VerifiedDoubles:
- ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb
- ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb
- ee/spec/lib/gitlab/geo/oauth/session_spec.rb
- ee/spec/lib/gitlab/geo/replication/job_artifact_retriever_spec.rb
- ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb
- ee/spec/lib/gitlab/geo/replicator_spec.rb
- ee/spec/lib/gitlab/geo_spec.rb
- ee/spec/lib/gitlab/git_access_spec.rb
@ -91,7 +89,6 @@ RSpec/VerifiedDoubles:
- ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb
- ee/spec/lib/gitlab/subscription_portal/clients/rest_spec.rb
- ee/spec/lib/sidebars/groups/menus/analytics_menu_spec.rb
- ee/spec/lib/system_check/app/elasticsearch_check_spec.rb
- ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb
- ee/spec/models/app_sec/fuzzing/api/ci_configuration_spec.rb
- ee/spec/models/approvable_spec.rb
@ -111,7 +108,6 @@ RSpec/VerifiedDoubles:
- ee/spec/presenters/group_member_presenter_spec.rb
- ee/spec/presenters/merge_request_approver_presenter_spec.rb
- ee/spec/presenters/project_member_presenter_spec.rb
- ee/spec/requests/api/alert_management_alerts_spec.rb
- ee/spec/requests/api/geo_spec.rb
- ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb
- ee/spec/requests/api/internal/base_spec.rb
@ -142,7 +138,6 @@ RSpec/VerifiedDoubles:
- ee/spec/serializers/issuable_sidebar_extras_entity_spec.rb
- ee/spec/serializers/issues/linked_issue_feature_flag_entity_spec.rb
- ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb
- ee/spec/serializers/merge_request_compliance_entity_spec.rb
- ee/spec/serializers/merge_request_poll_widget_entity_spec.rb
- ee/spec/serializers/merge_request_sidebar_basic_entity_spec.rb
- ee/spec/serializers/merge_request_widget_entity_spec.rb
@ -173,9 +168,6 @@ RSpec/VerifiedDoubles:
- ee/spec/services/ee/merge_requests/refresh_service_spec.rb
- ee/spec/services/ee/notification_service_spec.rb
- ee/spec/services/ee/post_receive_service_spec.rb
- ee/spec/services/ee/service_ping/build_payload_service_spec.rb
- ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb
- ee/spec/services/ee/service_ping/service_ping_settings_spec.rb
- ee/spec/services/geo/blob_download_service_spec.rb
- ee/spec/services/geo/graphql_request_service_spec.rb
- ee/spec/services/geo/node_status_request_service_spec.rb
@ -1040,8 +1032,6 @@ RSpec/VerifiedDoubles:
- spec/services/repositories/changelog_service_spec.rb
- spec/services/search_service_spec.rb
- spec/services/service_ping/build_payload_service_spec.rb
- spec/services/service_ping/permit_data_categories_service_spec.rb
- spec/services/service_ping/service_ping_settings_spec.rb
- spec/services/service_ping/submit_service_ping_service_spec.rb
- spec/services/snippets/update_repository_storage_service_spec.rb
- spec/services/spam/akismet_mark_as_spam_service_spec.rb
@ -1155,7 +1145,6 @@ RSpec/VerifiedDoubles:
- spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb
- spec/workers/gitlab_performance_bar_stats_worker_spec.rb
- spec/workers/invalid_gpg_signature_update_worker_spec.rb
- spec/workers/issue_rebalancing_worker_spec.rb
- spec/workers/issues/rebalancing_worker_spec.rb
- spec/workers/merge_request_mergeability_check_worker_spec.rb
- spec/workers/new_issue_worker_spec.rb

View File

@ -10,7 +10,6 @@ Style/BarePercentLiterals:
- 'app/models/integrations/datadog.rb'
- 'app/services/feature_flags/base_service.rb'
- 'app/services/repositories/base_service.rb'
- 'app/services/repositories/destroy_rollback_service.rb'
- 'app/services/repositories/destroy_service.rb'
- 'ee/app/services/jira/jql_builder_service.rb'
- 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'

View File

@ -351,9 +351,7 @@ Style/ClassAndModuleChildren:
- 'app/serializers/merge_requests/pipeline_entity.rb'
- 'app/services/projects/branches_by_mode_service.rb'
- 'app/services/repositories/base_service.rb'
- 'app/services/repositories/destroy_rollback_service.rb'
- 'app/services/repositories/destroy_service.rb'
- 'app/services/repositories/shell_destroy_service.rb'
- 'app/uploaders/dependency_proxy/file_uploader.rb'
- 'app/uploaders/packages/composer/cache_uploader.rb'
- 'app/uploaders/packages/debian/component_file_uploader.rb'

View File

@ -182,7 +182,6 @@ Style/FormatString:
- 'config/initializers/rack_lineprof.rb'
- 'danger/roulette/Dangerfile'
- 'ee/app/components/billing/plan_component.rb'
- 'ee/app/components/namespaces/preview_free_user_cap_alert_component.rb'
- 'ee/app/controllers/admin/elasticsearch_controller.rb'
- 'ee/app/controllers/admin/geo/application_controller.rb'
- 'ee/app/controllers/admin/geo/projects_controller.rb'
@ -235,7 +234,6 @@ Style/FormatString:
- 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
- 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/network_policies/responses.rb'
- 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
- 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
- 'ee/app/services/timebox_report_service.rb'

View File

@ -60,7 +60,6 @@ Style/GuardClause:
- 'app/finders/ci/runners_finder.rb'
- 'app/finders/deployments_finder.rb'
- 'app/finders/group_members_finder.rb'
- 'app/finders/projects/serverless/functions_finder.rb'
- 'app/finders/snippets_finder.rb'
- 'app/graphql/mutations/concerns/mutations/spam_protection.rb'
- 'app/graphql/mutations/design_management/delete.rb'
@ -73,7 +72,6 @@ Style/GuardClause:
- 'app/graphql/resolvers/concerns/time_frame_arguments.rb'
- 'app/graphql/resolvers/projects/jira_projects_resolver.rb'
- 'app/graphql/types/ci/job_type.rb'
- 'app/graphql/types/concerns/find_closest.rb'
- 'app/helpers/admin/user_actions_helper.rb'
- 'app/helpers/appearances_helper.rb'
- 'app/helpers/application_helper.rb'
@ -235,7 +233,6 @@ Style/GuardClause:
- 'app/services/post_receive_service.rb'
- 'app/services/projects/after_rename_service.rb'
- 'app/services/projects/create_service.rb'
- 'app/services/projects/destroy_rollback_service.rb'
- 'app/services/projects/destroy_service.rb'
- 'app/services/projects/hashed_storage/rollback_service.rb'
- 'app/services/projects/import_export/export_service.rb'
@ -463,7 +460,6 @@ Style/GuardClause:
- 'ee/lib/gitlab/insights/serializers/chartjs/multi_series_serializer.rb'
- 'ee/lib/gitlab/insights/validators/params_validator.rb'
- 'ee/lib/omni_auth/strategies/group_saml.rb'
- 'ee/lib/pseudonymizer/dumper.rb'
- 'ee/spec/features/billings/billing_plans_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
- 'ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb'
@ -545,7 +541,6 @@ Style/GuardClause:
- 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
- 'lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb'
- 'lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb'
- 'lib/gitlab/diff/custom_diff.rb'
- 'lib/gitlab/diff/file.rb'
- 'lib/gitlab/diff/highlight.rb'
- 'lib/gitlab/diff/highlight_cache.rb'
@ -580,7 +575,6 @@ Style/GuardClause:
- 'lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb'
- 'lib/gitlab/graphql/pagination/keyset/order_info.rb'
- 'lib/gitlab/graphql/pagination/keyset/query_builder.rb'
- 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
- 'lib/gitlab/i18n/metadata_entry.rb'
- 'lib/gitlab/i18n/po_linter.rb'
- 'lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb'

View File

@ -14,7 +14,6 @@ Style/IfInsideElse:
- 'app/models/ci/build.rb'
- 'app/models/namespace.rb'
- 'app/presenters/project_presenter.rb'
- 'app/services/service_ping/build_payload_service.rb'
- 'app/services/system_notes/commit_service.rb'
- 'app/services/task_list_toggle_service.rb'
- 'app/services/user_project_access_changed_service.rb'

View File

@ -8,7 +8,6 @@ Style/IfUnlessModifier:
- 'app/channels/graphql_channel.rb'
- 'app/controllers/admin/application_settings_controller.rb'
- 'app/controllers/admin/projects_controller.rb'
- 'app/controllers/admin/requests_profiles_controller.rb'
- 'app/controllers/admin/runners_controller.rb'
- 'app/controllers/admin/users_controller.rb'
- 'app/controllers/application_controller.rb'
@ -379,7 +378,6 @@ Style/IfUnlessModifier:
- 'app/services/projects/update_repository_storage_service.rb'
- 'app/services/resource_access_tokens/create_service.rb'
- 'app/services/resource_events/change_labels_service.rb'
- 'app/services/service_ping/devops_report_service.rb'
- 'app/services/snippets/create_service.rb'
- 'app/services/snippets/destroy_service.rb'
- 'app/services/snippets/repository_validation_service.rb'
@ -420,7 +418,6 @@ Style/IfUnlessModifier:
- 'app/workers/concerns/worker_attributes.rb'
- 'app/workers/database/batched_background_migration/single_database_worker.rb'
- 'app/workers/file_hook_worker.rb'
- 'app/workers/issue_rebalancing_worker.rb'
- 'app/workers/issues/rebalancing_worker.rb'
- 'app/workers/merge_request_mergeability_check_worker.rb'
- 'app/workers/object_storage/migrate_uploads_worker.rb'
@ -497,7 +494,6 @@ Style/IfUnlessModifier:
- 'ee/app/controllers/projects/push_rules_controller.rb'
- 'ee/app/controllers/projects/settings/slacks_controller.rb'
- 'ee/app/controllers/trials_controller.rb'
- 'ee/app/finders/ee/alert_management/alerts_finder.rb'
- 'ee/app/finders/iterations_finder.rb'
- 'ee/app/finders/merge_trains_finder.rb'
- 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
@ -610,8 +606,6 @@ Style/IfUnlessModifier:
- 'ee/app/services/ee/users/update_service.rb'
- 'ee/app/services/elastic/indexing_control_service.rb'
- 'ee/app/services/elastic/process_bookkeeping_service.rb'
- 'ee/app/services/epic_links/create_service.rb'
- 'ee/app/services/epic_links/update_service.rb'
- 'ee/app/services/epics/base_service.rb'
- 'ee/app/services/epics/create_service.rb'
- 'ee/app/services/epics/update_dates_service.rb'
@ -719,7 +713,6 @@ Style/IfUnlessModifier:
- 'ee/lib/gitlab/geo/log_cursor/daemon.rb'
- 'ee/lib/gitlab/geo/log_cursor/events/repository_deleted_event.rb'
- 'ee/lib/gitlab/geo/oauth/logout_token.rb'
- 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- 'ee/lib/gitlab/geo/replicator.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
@ -735,13 +728,10 @@ Style/IfUnlessModifier:
- 'ee/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
- 'ee/lib/omni_auth/strategies/group_saml.rb'
- 'ee/lib/pseudonymizer/dumper.rb'
- 'ee/lib/pseudonymizer/uploader.rb'
- 'ee/lib/sidebars/groups/menus/administration_menu.rb'
- 'ee/lib/sidebars/groups/menus/analytics_menu.rb'
- 'ee/lib/sidebars/groups/menus/security_compliance_menu.rb'
- 'ee/lib/tasks/geo.rake'
- 'ee/lib/tasks/gitlab/db.rake'
- 'ee/lib/tasks/gitlab/geo.rake'
- 'ee/lib/tasks/gitlab/seed/insights.rake'
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
@ -945,7 +935,6 @@ Style/IfUnlessModifier:
- 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
- 'lib/gitlab/database/transaction/observer.rb'
- 'lib/gitlab/database/with_lock_retries.rb'
- 'lib/gitlab/diff/custom_diff.rb'
- 'lib/gitlab/diff/formatters/base_formatter.rb'
- 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
- 'lib/gitlab/elasticsearch/logs/lines.rb'
@ -1154,7 +1143,6 @@ Style/IfUnlessModifier:
- 'rubocop/cop/ignored_columns.rb'
- 'rubocop/cop/migration/add_limit_to_text_columns.rb'
- 'rubocop/cop/migration/add_reference.rb'
- 'rubocop/cop/migration/hash_index.rb'
- 'rubocop/cop/migration/remove_column.rb'
- 'rubocop/cop/migration/sidekiq_queue_migrate.rb'
- 'rubocop/cop/performance/ar_exists_and_present_blank.rb'

View File

@ -5,7 +5,6 @@ Style/Next:
# Temporarily disabled due to too many offenses
Enabled: false
Exclude:
- 'app/finders/projects/serverless/functions_finder.rb'
- 'app/models/preloaders/environments/deployment_preloader.rb'
- 'app/models/route.rb'
- 'app/services/authorized_project_update/find_records_due_for_refresh_service.rb'

View File

@ -10,16 +10,12 @@ Style/NumericLiteralPrefix:
- 'config/initializers/01_secret_token.rb'
- 'config/initializers/1_settings.rb'
- 'db/post_migrate/20220131000001_schedule_trace_expiry_removal.rb'
- 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
- 'ee/spec/lib/bulk_imports/groups/pipelines/iterations_pipeline_spec.rb'
- 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
- 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
- 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
- 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
- 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
- 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
- 'ee/spec/models/ci/minutes/quota_spec.rb'
- 'ee/spec/models/ee/group_spec.rb'
- 'ee/spec/models/gitlab/seat_link_data_spec.rb'
- 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'

View File

@ -177,7 +177,6 @@ Style/PercentLiteralDelimiters:
- 'app/services/projects/update_service.rb'
- 'app/services/prometheus/proxy_service.rb'
- 'app/services/repositories/base_service.rb'
- 'app/services/repositories/destroy_rollback_service.rb'
- 'app/services/repositories/destroy_service.rb'
- 'app/services/repository_archive_clean_up_service.rb'
- 'app/services/resource_access_tokens/create_service.rb'
@ -293,7 +292,6 @@ Style/PercentLiteralDelimiters:
- 'ee/lib/api/managed_licenses.rb'
- 'ee/lib/api/status_checks.rb'
- 'ee/lib/api/visual_review_discussions.rb'
- 'ee/lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb'
- 'ee/lib/ee/api/helpers/members_helpers.rb'
- 'ee/lib/ee/api/helpers/projects_helpers.rb'
- 'ee/lib/ee/api/search.rb'
@ -305,7 +303,6 @@ Style/PercentLiteralDelimiters:
- 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'
- 'ee/lib/ee/gitlab/ci/parsers/security/validators/schema_validator.rb'
- 'ee/lib/ee/gitlab/etag_caching/router/rails.rb'
- 'ee/lib/ee/gitlab/integrations/sti_type.rb'
- 'ee/lib/ee/gitlab/middleware/read_only/controller.rb'
- 'ee/lib/ee/gitlab/path_regex.rb'
- 'ee/lib/ee/gitlab/uploads/migration_helper.rb'
@ -316,7 +313,6 @@ Style/PercentLiteralDelimiters:
- 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/elastic/latest/project_instance_proxy.rb'
- 'ee/lib/elastic/latest/snippet_class_proxy.rb'
- 'ee/lib/gitlab/alert_management/payload/cilium.rb'
- 'ee/lib/gitlab/auth/group_saml/auth_hash.rb'
- 'ee/lib/gitlab/ci/parsers/security/formatters/dast.rb'
- 'ee/lib/gitlab/geo.rb'
@ -368,7 +364,6 @@ Style/PercentLiteralDelimiters:
- 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
- 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
- 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
- 'ee/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb'
- 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
- 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
- 'ee/spec/lib/ee/gitlab/auth/ldap/config_spec.rb'
@ -558,7 +553,6 @@ Style/PercentLiteralDelimiters:
- 'lib/gitlab/gitaly_client/diff.rb'
- 'lib/gitlab/gitaly_client/wiki_page.rb'
- 'lib/gitlab/graphql/pagination/keyset/order_info.rb'
- 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
- 'lib/gitlab/hotlinking_detector.rb'
- 'lib/gitlab/import_export/command_line_util.rb'
- 'lib/gitlab/import_export/file_importer.rb'
@ -645,10 +639,6 @@ Style/PercentLiteralDelimiters:
- 'rubocop/migration_helpers.rb'
- 'scripts/qa/testcases-check'
- 'scripts/regenerate-schema'
- 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/57/files/67/package.gemspec'
- 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/6/files/5/package.gemspec'
- 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/7/files/7/package.gemspec'
- 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/88/files/91/package.gemspec'
- 'sidekiq_cluster/cli.rb'
- 'spec/benchmarks/banzai_benchmark.rb'
- 'spec/commands/sidekiq_cluster/cli_spec.rb'
@ -894,7 +884,6 @@ Style/PercentLiteralDelimiters:
- 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
- 'spec/lib/gitlab/jira_import/labels_importer_spec.rb'
- 'spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb'
- 'spec/lib/gitlab/kubernetes/network_policy_spec.rb'
- 'spec/lib/gitlab/kubernetes/role_spec.rb'
- 'spec/lib/gitlab/language_data_spec.rb'
- 'spec/lib/gitlab/markup_helper_spec.rb'

View File

@ -77,7 +77,6 @@ Style/RedundantInterpolation:
- 'qa/qa/resource/events/base.rb'
- 'qa/qa/service/praefect_manager.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
- 'qa/qa/tools/generate_perf_testdata.rb'

View File

@ -35,7 +35,6 @@ Style/RedundantRegexpEscape:
- 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
- 'ee/lib/gitlab/return_to_location.rb'
- 'ee/spec/features/read_only_spec.rb'
- 'ee/spec/helpers/seats_count_alert_helper_spec.rb'
- 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
- 'ee/spec/mailers/notify_spec.rb'

View File

@ -260,7 +260,6 @@ Style/RedundantSelf:
- 'ee/lib/elastic/latest/note_config.rb'
- 'ee/lib/elastic/migration.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
- 'ee/lib/gitlab/alert_management/payload/cilium.rb'
- 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
- 'ee/lib/gitlab/auth/group_saml/response_check.rb'
- 'ee/lib/gitlab/auth/group_saml/user.rb'
@ -277,7 +276,6 @@ Style/RedundantSelf:
- 'ee/lib/gitlab/geo/oauth/logout_state.rb'
- 'ee/lib/gitlab/geo/replicator.rb'
- 'ee/lib/gitlab/template/custom_template.rb'
- 'ee/lib/system_check/app/elasticsearch_check.rb'
- 'ee/spec/helpers/ee/feature_flags_helper_spec.rb'
- 'ee/spec/helpers/ee/graph_helper_spec.rb'
- 'ee/spec/models/geo/deleted_project_spec.rb'
@ -365,8 +363,6 @@ Style/RedundantSelf:
- 'lib/gitlab/instrumentation/redis_base.rb'
- 'lib/gitlab/jira_import.rb'
- 'lib/gitlab/jwt_token.rb'
- 'lib/gitlab/kubernetes/cilium_network_policy.rb'
- 'lib/gitlab/kubernetes/network_policy.rb'
- 'lib/gitlab/logger.rb'
- 'lib/gitlab/marker_range.rb'
- 'lib/gitlab/memory/instrumentation.rb'

View File

@ -301,11 +301,9 @@ Style/StringConcatenation:
- 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
- 'spec/services/packages/helm/process_file_service_spec.rb'
- 'spec/services/projects/create_service_spec.rb'
- 'spec/services/projects/destroy_rollback_service_spec.rb'
- 'spec/services/projects/destroy_service_spec.rb'
- 'spec/services/projects/download_service_spec.rb'
- 'spec/services/push_event_payload_service_spec.rb'
- 'spec/services/repositories/destroy_rollback_service_spec.rb'
- 'spec/services/repositories/destroy_service_spec.rb'
- 'spec/services/snippets/bulk_destroy_service_spec.rb'
- 'spec/services/snippets/update_service_spec.rb'

View File

@ -24,7 +24,6 @@ Style/StringLiteralsInInterpolation:
- 'ee/app/models/license.rb'
- 'ee/app/services/epics/tree_reorder_service.rb'
- 'ee/lib/gitlab/elastic/helper.rb'
- 'ee/lib/pseudonymizer/pager.rb'
- 'ee/spec/features/admin/admin_settings_spec.rb'
- 'lib/api/helpers/snippets_helpers.rb'
- 'lib/api/validations/validators/check_assignees_count.rb'
@ -54,7 +53,6 @@ Style/StringLiteralsInInterpolation:
- 'qa/qa/specs/helpers/context_selector.rb'
- 'qa/qa/tools/generate_perf_testdata.rb'
- 'rubocop/cop/migration/prevent_index_creation.rb'
- 'spec/controllers/projects/serverless/functions_controller_spec.rb'
- 'spec/features/commits_spec.rb'
- 'spec/features/dashboard/merge_requests_spec.rb'
- 'spec/features/users/login_spec.rb'

View File

@ -2,6 +2,13 @@
documentation](doc/development/changelog.md) for instructions on adding your own
entry.
## 15.0.3 (2022-06-16)
### Fixed (2 changes)
- [Disconnect alternates when unlinking from a repository pool](gitlab-org/gitlab@a6f4b701af0d5850a10d77feeb4842b1fe017047) ([merge request](gitlab-org/gitlab!90269))
- [Add GitLab agent image tag to install command](gitlab-org/gitlab@09decb04e391f095139412ed623164cab8023a7c) ([merge request](gitlab-org/gitlab!90269))
## 15.0.2 (2022-06-06)
### Added (1 change)

View File

@ -1 +1 @@
14.7.3
14.7.4

View File

@ -1,4 +1,4 @@
import createFlash from '~/flash';
import { createAlert } from '~/flash';
import { __ } from '~/locale';
import axios from './lib/utils/axios_utils';
import { joinPaths } from './lib/utils/url_utility';
@ -464,7 +464,7 @@ const Api = {
throw error;
}
createFlash({
createAlert({
message: __('Something went wrong while fetching projects'),
});
@ -654,7 +654,7 @@ const Api = {
})
.then(({ data }) => callback(data))
.catch(() =>
createFlash({
createAlert({
message: __('Something went wrong while fetching projects'),
}),
);

View File

@ -0,0 +1,77 @@
<script>
import {
getSandboxFrameSrc,
BUFFER_IFRAME_HEIGHT,
SANDBOX_ATTRIBUTES,
} from '../markdown/render_sandboxed_mermaid';
export default {
name: 'SandboxedMermaid',
props: {
source: {
type: String,
required: true,
},
},
data() {
return {
iframeHeight: BUFFER_IFRAME_HEIGHT,
sandboxFrameSrc: getSandboxFrameSrc(),
};
},
watch: {
source() {
this.updateDiagram();
},
},
mounted() {
window.addEventListener('message', this.onPostMessage, false);
},
destroyed() {
window.removeEventListener('message', this.onPostMessage);
},
methods: {
getSandboxFrameSrc,
onPostMessage(event) {
const container = this.$refs.diagramContainer;
if (event.source === container?.contentWindow) {
this.iframeHeight = Number(event.data.h) + BUFFER_IFRAME_HEIGHT;
}
},
updateDiagram() {
const container = this.$refs.diagramContainer;
// Potential risk associated with '*' discussed in below thread
// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74414#note_735183398
container.contentWindow?.postMessage(this.source, '*');
container.addEventListener('load', () => {
container.contentWindow?.postMessage(this.source, '*');
});
},
},
sandboxFrameSrc: getSandboxFrameSrc(),
sandboxAttributes: SANDBOX_ATTRIBUTES,
};
</script>
<template>
<iframe
ref="diagramContainer"
:src="$options.sandboxFrameSrc"
:sandbox="$options.sandboxAttributes"
frameborder="0"
scrolling="no"
width="100%"
:height="iframeHeight"
>
</iframe>
</template>

View File

@ -32,7 +32,8 @@ const MAX_CHAR_LIMIT = 2000;
const MAX_MERMAID_BLOCK_LIMIT = 50;
// Max # of `&` allowed in Chaining of links syntax
const MAX_CHAINING_OF_LINKS_LIMIT = 30;
const BUFFER_IFRAME_HEIGHT = 10;
export const BUFFER_IFRAME_HEIGHT = 10;
export const SANDBOX_ATTRIBUTES = 'allow-scripts allow-popups';
// Keep a map of mermaid blocks we've already rendered.
const elsProcessingMap = new WeakMap();
let renderedMermaidBlocks = 0;
@ -56,7 +57,7 @@ function fixElementSource(el) {
return { source };
}
function getSandboxFrameSrc() {
export function getSandboxFrameSrc() {
const path = joinPaths(gon.relative_url_root || '', SANDBOX_FRAME_PATH);
if (!darkModeEnabled()) {
return path;
@ -69,7 +70,7 @@ function renderMermaidEl(el, source) {
const iframeEl = document.createElement('iframe');
setAttributes(iframeEl, {
src: getSandboxFrameSrc(),
sandbox: 'allow-scripts allow-popups',
sandbox: SANDBOX_ATTRIBUTES,
frameBorder: 0,
scrolling: 'no',
width: '100%',

View File

@ -36,16 +36,19 @@ export default {
directives: {
GlTooltip,
},
inject: ['tiptapEditor'],
inject: ['tiptapEditor', 'contentEditor'],
data() {
return {
codeBlockType: undefined,
selectedLanguage: {},
filterTerm: '',
filteredLanguages: [],
showCustomLanguageInput: false,
customLanguageType: '',
selectedLanguage: {},
isDiagram: false,
showPreview: false,
};
},
watch: {
@ -61,21 +64,36 @@ export default {
return CODE_BLOCK_NODE_TYPES.some((type) => editor.isActive(type));
},
updateSelectedLanguage() {
async updateCodeBlockInfoToState() {
this.codeBlockType = CODE_BLOCK_NODE_TYPES.find((type) => this.tiptapEditor.isActive(type));
if (this.codeBlockType) {
const { language } = this.tiptapEditor.getAttributes(this.codeBlockType);
this.selectedLanguage = codeBlockLanguageLoader.findOrCreateLanguageBySyntax(language);
}
if (!this.codeBlockType) return;
const { language, isDiagram, showPreview } = this.tiptapEditor.getAttributes(
this.codeBlockType,
);
this.selectedLanguage = codeBlockLanguageLoader.findOrCreateLanguageBySyntax(
language,
isDiagram,
);
this.isDiagram = isDiagram;
this.showPreview = showPreview;
},
copyCodeBlockText() {
getCodeBlockText() {
const { view } = this.tiptapEditor;
const { from } = this.tiptapEditor.state.selection;
const node = getParentByTagName(view.domAtPos(from).node, 'pre');
return node?.textContent || '';
},
navigator.clipboard.writeText(node?.textContent || '');
copyCodeBlockText() {
navigator.clipboard.writeText(this.getCodeBlockText());
},
togglePreview() {
this.showPreview = !this.showPreview;
this.tiptapEditor.commands.updateAttributes(Diagram.name, { showPreview: this.showPreview });
},
async applyLanguage(language) {
@ -125,7 +143,7 @@ export default {
getReferenceClientRect,
} /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
>
<editor-state-observer @transaction="updateSelectedLanguage">
<editor-state-observer @transaction="updateCodeBlockInfoToState">
<gl-button-group>
<gl-dropdown
category="tertiary"
@ -227,6 +245,19 @@ export default {
icon="copy-to-clipboard"
@click="copyCodeBlockText"
/>
<gl-button
v-if="isDiagram"
v-gl-tooltip
variant="default"
category="tertiary"
size="medium"
:class="{ active: showPreview }"
data-testid="preview-diagram"
:aria-label="__('Preview diagram')"
:title="__('Preview diagram')"
icon="eye"
@click="togglePreview"
/>
<gl-button
v-gl-tooltip
variant="default"

View File

@ -0,0 +1,34 @@
<script>
import { GlDropdown, GlDropdownItem, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
export default {
components: {
GlDropdown,
GlDropdownItem,
},
directives: {
GlTooltip,
},
inject: ['tiptapEditor'],
methods: {
execute(contentType, attrs) {
this.tiptapEditor.chain().focus().setNode(contentType, attrs).run();
this.$emit('execute', { contentType });
},
},
};
</script>
<template>
<gl-dropdown size="small" category="tertiary" icon="plus">
<gl-dropdown-item @click="execute('diagram', { language: 'mermaid' })">
{{ __('Mermaid diagram') }}
</gl-dropdown-item>
<gl-dropdown-item @click="execute('diagram', { language: 'plantuml' })">
{{ __('PlantUML diagram') }}
</gl-dropdown-item>
<gl-dropdown-item @click="execute('horizontalRule')">
{{ __('Horizontal rule') }}
</gl-dropdown-item>
</gl-dropdown>
</template>

View File

@ -5,6 +5,7 @@ import ToolbarImageButton from './toolbar_image_button.vue';
import ToolbarLinkButton from './toolbar_link_button.vue';
import ToolbarTableButton from './toolbar_table_button.vue';
import ToolbarTextStyleDropdown from './toolbar_text_style_dropdown.vue';
import ToolbarMoreDropdown from './toolbar_more_dropdown.vue';
export default {
components: {
@ -13,6 +14,7 @@ export default {
ToolbarLinkButton,
ToolbarTableButton,
ToolbarImageButton,
ToolbarMoreDropdown,
},
methods: {
trackToolbarControlExecution({ contentType, value }) {
@ -117,16 +119,8 @@ export default {
:label="__('Add a collapsible section')"
@execute="trackToolbarControlExecution"
/>
<toolbar-button
data-testid="horizontal-rule"
content-type="horizontalRule"
icon-name="dash"
class="gl-mx-2"
editor-command="setHorizontalRule"
:label="__('Add a horizontal rule')"
@execute="trackToolbarControlExecution"
/>
<toolbar-table-button @execute="trackToolbarControlExecution" />
<toolbar-table-button data-testid="table" @execute="trackToolbarControlExecution" />
<toolbar-more-dropdown data-testid="more" @execute="trackToolbarControlExecution" />
</div>
</template>
<style>

View File

@ -1,15 +1,26 @@
<script>
import { debounce } from 'lodash';
import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
import { __ } from '~/locale';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import SandboxedMermaid from '~/behaviors/components/sandboxed_mermaid.vue';
import codeBlockLanguageLoader from '../../services/code_block_language_loader';
import EditorStateObserver from '../editor_state_observer.vue';
export default {
name: 'CodeBlock',
components: {
NodeViewWrapper,
NodeViewContent,
EditorStateObserver,
SandboxedMermaid,
},
inject: ['contentEditor'],
props: {
editor: {
type: Object,
required: true,
},
node: {
type: Object,
required: true,
@ -18,13 +29,48 @@ export default {
type: Function,
required: true,
},
selected: {
type: Boolean,
required: false,
default: false,
},
},
data() {
return {
diagramUrl: '',
diagramSource: '',
};
},
async mounted() {
this.updateDiagramPreview = debounce(
this.updateDiagramPreview,
DEFAULT_DEBOUNCE_AND_THROTTLE_MS,
);
const lang = codeBlockLanguageLoader.findOrCreateLanguageBySyntax(this.node.attrs.language);
await codeBlockLanguageLoader.loadLanguage(lang.syntax);
this.updateAttributes({ language: this.node.attrs.language });
},
methods: {
async updateDiagramPreview() {
if (!this.node.attrs.showPreview) {
this.diagramSource = '';
return;
}
if (!this.editor.isActive('diagram')) return;
this.diagramSource = this.$refs.nodeViewContent.$el.textContent;
if (this.node.attrs.language !== 'mermaid') {
this.diagramUrl = await this.contentEditor.renderDiagram(
this.diagramSource,
this.node.attrs.language,
);
}
},
},
i18n: {
frontmatter: __('frontmatter'),
},
@ -32,17 +78,26 @@ export default {
};
</script>
<template>
<node-view-wrapper
:class="`content-editor-code-block gl-relative code highlight ${$options.userColorScheme}`"
as="pre"
>
<span
v-if="node.attrs.isFrontmatter"
data-testid="frontmatter-label"
class="gl-absolute gl-top-0 gl-right-3"
contenteditable="false"
>{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
<editor-state-observer @transaction="updateDiagramPreview">
<node-view-wrapper
:class="`content-editor-code-block gl-relative code highlight ${$options.userColorScheme}`"
as="pre"
>
<node-view-content as="code" />
</node-view-wrapper>
<div
v-if="node.attrs.showPreview"
class="gl-mt-n3! gl-ml-n4! gl-mr-n4! gl-mb-3 gl-bg-white! gl-p-4 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100"
>
<sandboxed-mermaid v-if="node.attrs.language === 'mermaid'" :source="diagramSource" />
<img v-else ref="diagramContainer" :src="diagramUrl" />
</div>
<span
v-if="node.attrs.isFrontmatter"
data-testid="frontmatter-label"
class="gl-absolute gl-top-0 gl-right-3"
contenteditable="false"
>{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
>
<node-view-content ref="nodeViewContent" as="code" />
</node-view-wrapper>
</editor-state-observer>
</template>

View File

@ -1,6 +1,10 @@
import { textblockTypeInputRule } from '@tiptap/core';
import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
import languageLoader from '../services/code_block_language_loader';
import CodeBlockHighlight from './code_block_highlight';
const backtickInputRegex = /^```(mermaid|plantuml)[\s\n]$/;
export default CodeBlockHighlight.extend({
name: 'diagram',
@ -17,11 +21,19 @@ export default CodeBlockHighlight.extend({
isDiagram: {
default: true,
},
showPreview: {
default: true,
},
};
},
parseHTML() {
return [
{
priority: PARSE_HTML_PRIORITY_HIGHEST,
tag: 'pre[lang="mermaid"]',
getAttrs: () => ({ language: 'mermaid' }),
},
{
priority: PARSE_HTML_PRIORITY_HIGHEST,
tag: '[data-diagram]',
@ -54,6 +66,14 @@ export default CodeBlockHighlight.extend({
},
addInputRules() {
return [];
const getAttributes = (match) => languageLoader?.loadLanguageFromInputRule(match) || {};
return [
textblockTypeInputRule({
find: backtickInputRegex,
type: this.type,
getAttributes,
}),
];
},
});

View File

@ -1,13 +1,24 @@
import { memoize } from 'lodash';
const parser = new DOMParser();
export default ({ renderMarkdown }) => ({
resolveUrl: memoize(async (canonicalSrc) => {
const html = await renderMarkdown(`[link](${canonicalSrc})`);
if (!html) return canonicalSrc;
const parser = new DOMParser();
const { body } = parser.parseFromString(html, 'text/html');
return body.querySelector('a').getAttribute('href');
}),
renderDiagram: memoize(async (code, language) => {
const backticks = '`'.repeat(4);
const html = await renderMarkdown(`${backticks}${language}\n${code}\n${backticks}`);
const { body } = parser.parseFromString(html, 'text/html');
const img = body.querySelector('img');
if (!img) return '';
return img.dataset.src || img.getAttribute('src');
}),
});

View File

@ -8,7 +8,7 @@ const codeBlockLanguageLoader = {
allLanguages: CODE_BLOCK_LANGUAGES,
findOrCreateLanguageBySyntax(value) {
findOrCreateLanguageBySyntax(value, isDiagram) {
const lowercaseValue = value?.toLowerCase() || 'plaintext';
return (
this.allLanguages.find(
@ -16,7 +16,9 @@ const codeBlockLanguageLoader = {
syntax === lowercaseValue || variants?.toLowerCase().split(', ').includes(lowercaseValue),
) || {
syntax: lowercaseValue,
label: sprintf(__(`Custom (%{language})`), { language: lowercaseValue }),
label: sprintf(isDiagram ? __(`Diagram (%{language})`) : __(`Custom (%{language})`), {
language: lowercaseValue,
}),
}
);
},

View File

@ -52,6 +52,10 @@ export class ContentEditor {
return this._assetResolver.resolveUrl(canonicalSrc);
}
renderDiagram(code, language) {
return this._assetResolver.renderDiagram(code, language);
}
async setSerializedContent(serializedContent) {
const { _tiptapEditor: editor, _eventHub: eventHub } = this;
const { doc, tr } = editor.state;

View File

@ -121,7 +121,7 @@ export default {
<div class="d-flex float-left align-items-center align-self-start">
<input
v-if="isSelectable"
class="mr-2"
class="gl-mr-3"
type="checkbox"
:checked="checked"
@change="$emit('handleCheckboxChange', $event.target.checked)"

View File

@ -453,13 +453,7 @@ export default {
>
</textarea>
<gl-modal
ref="modal"
modal-id="create-task-modal"
:title="s__('WorkItem|New Task')"
hide-footer
body-class="gl-p-0!"
>
<gl-modal ref="modal" size="lg" modal-id="create-task-modal" hide-footer body-class="gl-p-0!">
<create-work-item
is-modal
:initial-title="activeTask.title"

View File

@ -67,7 +67,7 @@ export function darkModeEnabled() {
const ideDarkThemes = ['dark', 'solarized-dark', 'monokai'];
// eslint-disable-next-line @gitlab/require-i18n-strings
const isWebIde = document.body.dataset.page.startsWith('ide:');
const isWebIde = document.body.dataset.page?.startsWith('ide:');
if (isWebIde) {
return ideDarkThemes.includes(window.gon?.user_color_scheme);

View File

@ -416,7 +416,7 @@ export default {
<gl-form-checkbox
v-if="internalNotesEnabled && canSetInternalNote"
v-model="noteIsInternal"
class="gl-mb-6"
class="gl-mb-2"
data-testid="internal-note-checkbox"
>
{{ $options.i18n.internal }}

View File

@ -1,30 +1,68 @@
<script>
import { GlAlert } from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
import { s__ } from '~/locale';
import Composer from '~/packages_and_registries/package_registry/components/details/metadata/composer.vue';
import Conan from '~/packages_and_registries/package_registry/components/details/metadata/conan.vue';
import Maven from '~/packages_and_registries/package_registry/components/details/metadata/maven.vue';
import Nuget from '~/packages_and_registries/package_registry/components/details/metadata/nuget.vue';
import Pypi from '~/packages_and_registries/package_registry/components/details/metadata/pypi.vue';
import {
FETCH_PACKAGE_METADATA_ERROR_MESSAGE,
PACKAGE_TYPE_COMPOSER,
PACKAGE_TYPE_CONAN,
PACKAGE_TYPE_MAVEN,
PACKAGE_TYPE_NUGET,
PACKAGE_TYPE_PYPI,
} from '~/packages_and_registries/package_registry/constants';
import getPackageMetadataQuery from '../../graphql/queries/get_package_metadata.query.graphql';
import AdditionalMetadataLoader from './additional_metadata_loader.vue';
export default {
components: {
Composer,
Conan,
GlAlert,
Maven,
Nuget,
Pypi,
AdditionalMetadataLoader,
},
props: {
packageEntity: {
type: Object,
packageId: {
type: String,
required: true,
},
packageType: {
type: String,
required: true,
},
},
apollo: {
packageMetadata: {
query: getPackageMetadataQuery,
context: {
isSingleRequest: true,
},
variables() {
return {
id: this.packageId,
};
},
update(data) {
return data.package?.metadata || null;
},
error(error) {
this.fetchPackageMetadataError = true;
Sentry.captureException(error);
},
},
},
data() {
return {
packageMetadata: null,
fetchPackageMetadataError: false,
};
},
computed: {
metadataComponent() {
@ -34,22 +72,43 @@ export default {
[PACKAGE_TYPE_MAVEN]: Maven,
[PACKAGE_TYPE_NUGET]: Nuget,
[PACKAGE_TYPE_PYPI]: Pypi,
}[this.packageEntity.packageType];
}[this.packageType];
},
showMetadata() {
return this.metadataComponent && this.packageEntity.metadata;
return this.metadataComponent && this.packageMetadata;
},
isLoading() {
return this.$apollo.queries.packageMetadata.loading;
},
},
i18n: {
componentTitle: s__('PackageRegistry|Additional metadata'),
fetchPackageMetadataErrorMessage: FETCH_PACKAGE_METADATA_ERROR_MESSAGE,
},
};
</script>
<template>
<div v-if="showMetadata">
<h3 class="gl-font-lg" data-testid="title">{{ __('Additional Metadata') }}</h3>
<div class="gl-bg-gray-50 gl-inset-border-1-gray-100 gl-rounded-base" data-testid="main">
<div>
<h3 v-if="isLoading || showMetadata" class="gl-font-lg" data-testid="title">
{{ $options.i18n.componentTitle }}
</h3>
<gl-alert
v-if="fetchPackageMetadataError"
variant="danger"
@dismiss="fetchPackageMetadataError = false"
>
{{ $options.i18n.fetchPackageMetadataErrorMessage }}
</gl-alert>
<additional-metadata-loader v-if="isLoading" />
<div
v-if="showMetadata"
class="gl-bg-gray-50 gl-inset-border-1-gray-100 gl-rounded-base"
data-testid="main"
>
<component
:is="metadataComponent"
:package-entity="packageEntity"
:package-metadata="packageMetadata"
data-testid="component-is"
/>
</div>

View File

@ -0,0 +1,30 @@
<script>
import { GlSkeletonLoader } from '@gitlab/ui';
export default {
components: {
GlSkeletonLoader,
},
loader: {
width: 302,
height: 16,
repeat: 2,
},
};
</script>
<template>
<div class="gl-bg-gray-50 gl-inset-border-1-gray-100 gl-rounded-base">
<div
v-for="index in $options.loader.repeat"
:key="index"
class="gl-display-flex gl-align-items-center gl-p-4 gl-border-gray-100 gl-border-b-1"
>
<div class="gl-md-max-w-30p">
<gl-skeleton-loader :width="$options.loader.width" :height="$options.loader.height">
<rect :width="$options.loader.width" :height="$options.loader.height" rx="4" />
</gl-skeleton-loader>
</div>
</div>
</div>
</template>

View File

@ -18,7 +18,7 @@ export default {
ClipboardButton,
},
props: {
packageEntity: {
packageMetadata: {
type: Object,
required: true,
},
@ -31,10 +31,10 @@ export default {
<details-row icon="information-o" padding="gl-p-4" dashed data-testid="composer-target-sha">
<gl-sprintf :message="$options.i18n.targetSha">
<template #sha>
<strong>{{ packageEntity.metadata.targetSha }}</strong>
<strong>{{ packageMetadata.targetSha }}</strong>
<clipboard-button
:title="$options.i18n.targetShaCopyButton"
:text="packageEntity.metadata.targetSha"
:text="packageMetadata.targetSha"
category="tertiary"
css-class="gl-p-0!"
/>
@ -44,10 +44,10 @@ export default {
<details-row icon="information-o" padding="gl-p-4" data-testid="composer-json">
<gl-sprintf :message="$options.i18n.composerJson">
<template #license>
<strong>{{ packageEntity.metadata.composerJson.license }}</strong>
<strong>{{ packageMetadata.composerJson.license }}</strong>
</template>
<template #version>
<strong>{{ packageEntity.metadata.composerJson.version }}</strong>
<strong>{{ packageMetadata.composerJson.version }}</strong>
</template>
</gl-sprintf>
</details-row>

View File

@ -13,7 +13,7 @@ export default {
GlSprintf,
},
props: {
packageEntity: {
packageMetadata: {
type: Object,
required: true,
},
@ -25,7 +25,7 @@ export default {
<div>
<details-row icon="information-o" padding="gl-p-4" data-testid="conan-recipe">
<gl-sprintf :message="$options.i18n.recipeText">
<template #recipe>{{ packageEntity.metadata.recipe }}</template>
<template #recipe>{{ packageMetadata.recipe }}</template>
</gl-sprintf>
</details-row>
</div>

View File

@ -14,7 +14,7 @@ export default {
GlSprintf,
},
props: {
packageEntity: {
packageMetadata: {
type: Object,
required: true,
},
@ -27,14 +27,14 @@ export default {
<details-row icon="information-o" padding="gl-p-4" dashed data-testid="maven-app">
<gl-sprintf :message="$options.i18n.appName">
<template #name>
<strong>{{ packageEntity.metadata.appName }}</strong>
<strong>{{ packageMetadata.appName }}</strong>
</template>
</gl-sprintf>
</details-row>
<details-row icon="information-o" padding="gl-p-4" data-testid="maven-group">
<gl-sprintf :message="$options.i18n.appGroup">
<template #group>
<strong>{{ packageEntity.metadata.appGroup }}</strong>
<strong>{{ packageMetadata.appGroup }}</strong>
</template>
</gl-sprintf>
</details-row>

View File

@ -14,7 +14,7 @@ export default {
GlSprintf,
},
props: {
packageEntity: {
packageMetadata: {
type: Object,
required: true,
},
@ -25,7 +25,7 @@ export default {
<template>
<div>
<details-row
v-if="packageEntity.metadata.projectUrl"
v-if="packageMetadata.projectUrl"
icon="project"
padding="gl-p-4"
dashed
@ -33,22 +33,22 @@ export default {
>
<gl-sprintf :message="$options.i18n.sourceText">
<template #link>
<gl-link :href="packageEntity.metadata.projectUrl" target="_blank">{{
packageEntity.metadata.projectUrl
<gl-link :href="packageMetadata.projectUrl" target="_blank">{{
packageMetadata.projectUrl
}}</gl-link>
</template>
</gl-sprintf>
</details-row>
<details-row
v-if="packageEntity.metadata.licenseUrl"
v-if="packageMetadata.licenseUrl"
icon="license"
padding="gl-p-4"
data-testid="nuget-license"
>
<gl-sprintf :message="$options.i18n.licenseText">
<template #link>
<gl-link :href="packageEntity.metadata.licenseUrl" target="_blank">{{
packageEntity.metadata.licenseUrl
<gl-link :href="packageMetadata.licenseUrl" target="_blank">{{
packageMetadata.licenseUrl
}}</gl-link>
</template>
</gl-sprintf>

View File

@ -13,7 +13,7 @@ export default {
GlSprintf,
},
props: {
packageEntity: {
packageMetadata: {
type: Object,
required: true,
},
@ -26,7 +26,7 @@ export default {
<details-row icon="information-o" padding="gl-p-4" data-testid="pypi-required-python">
<gl-sprintf :message="$options.i18n.requiredPython">
<template #pythonVersion>
<strong>{{ packageEntity.metadata.requiredPython }}</strong>
<strong>{{ packageMetadata.requiredPython }}</strong>
</template>
</gl-sprintf>
</details-row>

View File

@ -1,7 +1,7 @@
<script>
import { GlLink, GlSprintf } from '@gitlab/ui';
import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
import { first } from 'lodash';
import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { truncateSha } from '~/lib/utils/text_utility';
import { s__, n__ } from '~/locale';
@ -27,8 +27,10 @@ export default {
combinedUpdateText: s__(
'PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}',
),
fetchPackagePipelinesErrorMessage: FETCH_PACKAGE_PIPELINES_ERROR_MESSAGE,
},
components: {
GlAlert,
GlLink,
GlSprintf,
HistoryItem,
@ -54,15 +56,16 @@ export default {
update(data) {
return data.package?.pipelines?.nodes || [];
},
error() {
createFlash({ message: FETCH_PACKAGE_PIPELINES_ERROR_MESSAGE });
error(error) {
this.fetchPackagePipelinesError = true;
Sentry.captureException(error);
},
},
},
data() {
return {
pipelines: [],
showDescription: false,
fetchPackagePipelinesError: false,
};
},
computed: {
@ -109,6 +112,13 @@ export default {
<template>
<div class="issuable-discussion">
<h3 class="gl-font-lg" data-testid="title">{{ __('History') }}</h3>
<gl-alert
v-if="fetchPackagePipelinesError"
variant="danger"
@dismiss="fetchPackagePipelinesError = false"
>
{{ $options.i18n.fetchPackagePipelinesErrorMessage }}
</gl-alert>
<package-history-loader v-if="isLoading" />
<ul v-else class="timeline main-notes-list notes gl-mb-4" data-testid="timeline">
<history-item icon="clock" data-testid="created-on">

View File

@ -75,6 +75,9 @@ export const FETCH_PACKAGE_DETAILS_ERROR_MESSAGE = s__(
export const FETCH_PACKAGE_PIPELINES_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while fetching the package history.',
);
export const FETCH_PACKAGE_METADATA_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while fetching the package metadata.',
);
export const DELETE_PACKAGE_SUCCESS_MESSAGE = s__('PackageRegistry|Package deleted successfully');
export const PACKAGE_REGISTRY_TITLE = __('Package Registry');

View File

@ -27,6 +27,17 @@ query getPackageDetails($id: PackagesPackageID!) {
name
}
}
pipelines(first: 1) {
nodes {
ref
id
project {
id
name
webUrl
}
}
}
packageFiles(first: 100) {
nodes {
id
@ -72,37 +83,15 @@ query getPackageDetails($id: PackagesPackageID!) {
}
}
metadata {
... on ComposerMetadata {
targetSha
composerJson {
license
version
}
}
... on PypiMetadata {
id
requiredPython
}
... on ConanMetadata {
id
packageChannel
packageUsername
recipe
recipePath
}
... on MavenMetadata {
id
appName
appGroup
appVersion
path
}
... on NugetMetadata {
id
iconUrl
licenseUrl
projectUrl
}
}
}

View File

@ -0,0 +1,39 @@
query getPackageMetadata($id: PackagesPackageID!) {
package(id: $id) {
id
packageType
metadata {
... on ComposerMetadata {
targetSha
composerJson {
license
version
}
}
... on PypiMetadata {
id
requiredPython
}
... on ConanMetadata {
id
packageChannel
packageUsername
recipe
recipePath
}
... on MavenMetadata {
id
appName
appGroup
appVersion
path
}
... on NugetMetadata {
id
iconUrl
licenseUrl
projectUrl
}
}
}
}

View File

@ -27,6 +27,9 @@ import DeletePackage from '~/packages_and_registries/package_registry/components
import {
PACKAGE_TYPE_NUGET,
PACKAGE_TYPE_COMPOSER,
PACKAGE_TYPE_CONAN,
PACKAGE_TYPE_MAVEN,
PACKAGE_TYPE_PYPI,
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
@ -122,6 +125,9 @@ export default {
packageFiles() {
return this.packageEntity.packageFiles?.nodes;
},
packageType() {
return this.packageEntity.packageType;
},
isLoading() {
return this.$apollo.queries.packageEntity.loading;
},
@ -130,7 +136,7 @@ export default {
},
tracking() {
return {
category: packageTypeToTrackCategory(this.packageEntity.packageType),
category: packageTypeToTrackCategory(this.packageType),
};
},
hasVersions() {
@ -140,10 +146,19 @@ export default {
return this.packageEntity.dependencyLinks?.nodes || [];
},
showDependencies() {
return this.packageEntity.packageType === PACKAGE_TYPE_NUGET;
return this.packageType === PACKAGE_TYPE_NUGET;
},
showFiles() {
return this.packageEntity.packageType !== PACKAGE_TYPE_COMPOSER;
return this.packageType !== PACKAGE_TYPE_COMPOSER;
},
showMetadata() {
return [
PACKAGE_TYPE_COMPOSER,
PACKAGE_TYPE_CONAN,
PACKAGE_TYPE_MAVEN,
PACKAGE_TYPE_NUGET,
PACKAGE_TYPE_PYPI,
].includes(this.packageType);
},
},
methods: {
@ -262,7 +277,11 @@ export default {
<installation-commands :package-entity="packageEntity" />
<additional-metadata :package-entity="packageEntity" />
<additional-metadata
v-if="showMetadata"
:package-id="packageEntity.id"
:package-type="packageType"
/>
</div>
<package-files

View File

@ -12,6 +12,7 @@ import {
import { toSafeInteger } from 'lodash';
import csrf from '~/lib/utils/csrf';
import { __, n__, s__, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import SignupCheckbox from './signup_checkbox.vue';
const DENYLIST_TYPE_RAW = 'raw';
@ -31,7 +32,12 @@ export default {
GlLink,
SignupCheckbox,
GlModal,
PasswordComplexityCheckboxGroup: () =>
import(
'ee_component/pages/admin/application_settings/general/components/password_complexity_checkbox_group.vue'
),
},
mixins: [glFeatureFlagMixin()],
inject: [
'host',
'settingsPath',
@ -178,6 +184,9 @@ export default {
this.submitForm();
},
setPasswordComplexity({ name, value }) {
this.$set(this.form, name, value);
},
submitForm() {
this.$refs.form.submit();
},
@ -291,9 +300,7 @@ export default {
<template #description>
<gl-sprintf
:message="
s__(
'ApplicationSettings|See GitLab\'s %{linkStart}Password Policy Guidelines%{linkEnd}.',
)
s__('ApplicationSettings|See %{linkStart}password policy guidelines%{linkEnd}.')
"
>
<template #link="{ content }">
@ -305,6 +312,10 @@ export default {
</template>
</gl-form-group>
<password-complexity-checkbox-group
v-if="glFeatures.passwordComplexity"
@set-password-complexity="setPasswordComplexity"
/>
<gl-form-group
:description="$options.i18n.domainAllowListDescription"
:label="$options.i18n.domainAllowListLabel"

View File

@ -18,6 +18,10 @@ export default function initSignupRestrictions(elementSelector = '#js-signup-for
'domainDenylistEnabled',
'denylistTypeRawSelected',
'emailRestrictionsEnabled',
'passwordNumberRequired',
'passwordLowercaseRequired',
'passwordUppercaseRequired',
'passwordSymbolRequired',
],
});

View File

@ -274,7 +274,7 @@ export default {
<template #collapsed>
<div v-gl-tooltip.viewport.left :title="dateLabel" class="sidebar-collapsed-icon">
<gl-icon :size="16" name="calendar" />
<span class="collapse-truncated-title">{{ formattedDate }}</span>
<span class="gl-pt-2 gl-px-3 gl-font-sm">{{ formattedDate }}</span>
</div>
<sidebar-inherit-date
v-if="canInherit && !initialLoading"

View File

@ -99,7 +99,9 @@ export default {
>
<gl-icon name="users" />
<gl-loading-icon v-if="loading" size="sm" />
<span v-else data-testid="collapsed-count"> {{ participantCount }} </span>
<span v-else data-testid="collapsed-count" class="gl-pt-2 gl-px-3 gl-font-sm">
{{ participantCount }}
</span>
</div>
<div
v-if="showParticipantLabel"

View File

@ -322,7 +322,7 @@ export default {
class="sidebar-collapsed-icon"
>
<gl-icon :aria-label="attributeTypeTitle" :name="attributeTypeIcon" />
<span class="collapse-truncated-title">
<span class="collapse-truncated-title gl-pt-2 gl-px-3 gl-font-sm">
{{ attributeTitle }}
</span>
</div>

View File

@ -58,7 +58,7 @@ export default {
} else if (this.showEstimateOnlyState || this.showSpentOnlyState) {
return 'bold';
} else if (this.showNoTimeTrackingState) {
return 'no-value';
return 'no-value collapse-truncated-title gl-pt-2 gl-px-3 gl-font-sm';
}
return '';

View File

@ -126,7 +126,7 @@ export default {
<div class="gl-display-flex gl-align-items-center">
<span
:style="{ backgroundColor: label.color }"
class="gl-display-inline-block mr-2 p-2"
class="gl-display-inline-block gl-mr-3 gl-p-3"
></span>
<div>{{ getLabelName(label) }}</div>
</div>

View File

@ -92,7 +92,9 @@ export default {
@click="handleCollapsedClick"
>
<gl-icon name="labels" />
<span class="gl-font-base gl-line-height-24">{{ selectedLabels.length }}</span>
<span class="collapse-truncated-title gl-pt-2 gl-px-3 gl-font-sm">{{
selectedLabels.length
}}</span>
</div>
<span
v-if="!selectedLabels.length"

View File

@ -49,14 +49,28 @@ export default {
</script>
<template>
<gl-form-group :label="$options.i18n.status" :label-for="$options.labelId">
<gl-form-group
:label="$options.i18n.status"
:label-for="$options.labelId"
label-cols="3"
label-cols-lg="2"
label-class="gl-pb-0!"
class="gl-align-items-center"
>
<gl-form-select
:id="$options.labelId"
:value="state"
:options="$options.states"
:disabled="loading"
class="gl-w-auto"
class="gl-w-auto hide-select-decoration"
@change="setState"
/>
</gl-form-group>
</template>
<style>
.hide-select-decoration:not(:focus, :hover) {
background-image: none;
box-shadow: none;
}
</style>

View File

@ -40,18 +40,18 @@ export default {
<template>
<h2
class="gl-font-weight-normal gl-sm-font-weight-bold gl-my-5 gl-display-inline-block"
class="gl-font-weight-normal gl-sm-font-weight-bold gl-my-5 gl-w-full"
:class="{ 'gl-cursor-not-allowed': disabled }"
aria-labelledby="item-title"
>
<span
<div
id="item-title"
ref="titleEl"
role="textbox"
:aria-label="__('Title')"
:data-placeholder="placeholder"
:contenteditable="!disabled"
class="gl-pseudo-placeholder"
class="gl-pseudo-placeholder gl-px-4 gl-py-3 gl-ml-n4 gl-border gl-border-white gl-hover-border-gray-200 gl-rounded-base"
@blur="handleBlur"
@keyup="handleInput"
@keydown.enter.exact="handleSubmit"
@ -59,7 +59,8 @@ export default {
@keydown.meta.u.prevent
@keydown.ctrl.b.prevent
@keydown.meta.b.prevent
>{{ title }}</span
>
{{ title }}
</div>
</h2>
</template>

View File

@ -115,7 +115,7 @@ export default {
</gl-skeleton-loader>
</div>
<template v-else>
<div class="gl-display-flex">
<div class="gl-display-flex gl-align-items-start">
<work-item-title
:work-item-id="workItem.id"
:work-item-title="workItem.title"
@ -127,7 +127,7 @@ export default {
<work-item-actions
:work-item-id="workItem.id"
:can-delete="canDelete"
class="gl-ml-auto gl-mt-5"
class="gl-ml-auto gl-mt-6"
@deleteWorkItem="$emit('deleteWorkItem')"
@error="error = $event"
/>

View File

@ -98,7 +98,15 @@ export default {
</script>
<template>
<gl-modal ref="modal" hide-footer size="lg" modal-id="work-item-detail-modal" @hide="closeModal">
<gl-modal
ref="modal"
hide-footer
size="lg"
modal-id="work-item-detail-modal"
header-class="gl-p-0 gl-pb-2!"
body-class="gl-pb-6!"
@hide="closeModal"
>
<gl-alert v-if="error" variant="danger" @dismiss="error = false">
{{ error }}
</gl-alert>
@ -106,6 +114,7 @@ export default {
<work-item-detail
:work-item-parent-id="issueGid"
:work-item-id="workItemId"
class="gl-p-5 gl-mt-n3"
@deleteWorkItem="deleteWorkItem"
/>
</gl-modal>
@ -114,7 +123,7 @@ export default {
<style>
/* hide the existing modal header
*/
#work-item-detail-modal .modal-header {
#work-item-detail-modal .modal-header * {
display: none;
}
</style>

View File

@ -82,7 +82,7 @@
}
&:hover {
background-color: $gray-normal;
background-color: $gray-10;
}
svg {

View File

@ -27,7 +27,7 @@
background-color: $indigo-50;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
border-bottom: 1px solid darken($gray-normal, 8%);
border-bottom: 1px solid darken($gray-10, 8%);
}
.feature-highlight-popover {

View File

@ -464,7 +464,7 @@
float: left;
margin-right: 5px;
border-radius: 50%;
border: 1px solid $gray-normal;
border: 1px solid $gray-10;
}
.notification-dot {

View File

@ -452,7 +452,7 @@
@mixin avatar-counter($border-radius: 1em) {
background-color: $gray-darkest;
color: $white;
border: 1px solid $gray-normal;
border: 1px solid $gray-10;
border-radius: $border-radius;
font-family: $regular-font;
font-size: 9px;

View File

@ -95,7 +95,7 @@
display: block;
align-self: stretch;
min-height: 0;
background-color: $gray-normal;
background-color: $gray-10;
border-top: 1px solid $border-color;
.table-action-buttons {

View File

@ -92,7 +92,6 @@ $white-transparent: rgba($white, 0.8) !default;
$gray-lightest: #fdfdfd !default;
$gray-light: #fafafa !default;
$gray-lighter: #f9f9f9 !default;
$gray-normal: #f5f5f5 !default;
$gray-dark: darken($gray-light, $darken-dark-factor) !default;
$gray-darker: #eee !default;
$gray-darkest: #c4c4c4 !default;
@ -169,7 +168,7 @@ $purple-800: #453894 !default;
$purple-900: #2f2a6b !default;
$purple-950: #232150 !default;
$gray-10: #fafafa !default;
$gray-10: #f5f5f5 !default;
$gray-50: #f0f0f0 !default;
$gray-100: #dbdbdb !default;
$gray-200: #bfbfbf !default;
@ -351,13 +350,13 @@ $border-white-light: darken($white, $darken-border-factor) !default;
$border-white-normal: darken($white-normal, $darken-border-factor) !default;
$border-gray-light: darken($gray-light, $darken-border-factor);
$border-gray-normal: darken($gray-normal, $darken-border-factor);
$border-gray-normal-dashed: darken($gray-normal, $darken-border-dashed-factor);
$border-gray-normal: darken($gray-10, $darken-border-factor);
$border-gray-normal-dashed: darken($gray-10, $darken-border-dashed-factor);
/*
* UI elements
*/
$contextual-sidebar-bg-color: #f5f5f5;
$contextual-sidebar-bg-color: $gray-10;
$contextual-sidebar-border-color: #e9e9e9;
$border-color: $gray-100;
$shadow-color: $t-gray-a-08;

View File

@ -76,7 +76,7 @@
}
.dark-well {
background-color: $gray-normal;
background-color: $gray-10;
}
.card.card-body-centered {

View File

@ -95,17 +95,17 @@ $conflict-colors: (
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,
none_button_head_neutral : $gray-normal,
none_header_head_neutral : $gray-10,
none_line_head_neutral : $gray-10,
none_button_head_neutral : $gray-10,
none_header_head_chosen : $gray-darker,
none_line_head_chosen : $gray-darker,
none_button_head_chosen : $gray-darker,
none_header_origin_neutral : $gray-normal,
none_line_origin_neutral : $gray-normal,
none_button_origin_neutral : $gray-normal,
none_header_origin_neutral : $gray-10,
none_line_origin_neutral : $gray-10,
none_button_origin_neutral : $gray-10,
none_header_origin_chosen : $gray-darker,
none_line_origin_chosen : $gray-darker,

View File

@ -140,7 +140,7 @@
}
hr {
border-color: var(--ide-border-color, darken($gray-normal, 8%));
border-color: var(--ide-border-color, darken($gray-10, 8%));
}
.md h1,

View File

@ -93,7 +93,7 @@ $ide-commit-header-height: 48px;
display: flex;
align-items: center;
padding: $grid-size $gl-padding;
background-color: var(--ide-background-hover, $gray-normal);
background-color: var(--ide-background-hover, $gray-10);
border-right: 1px solid var(--ide-border-color, $white-dark);
border-bottom: 1px solid var(--ide-border-color, $white-dark);
@ -135,7 +135,7 @@ $ide-commit-header-height: 48px;
box-shadow: none !important;
font-weight: normal !important;
background-color: var(--ide-background-hover, $gray-normal);
background-color: var(--ide-background-hover, $gray-10);
border-right: 1px solid var(--ide-border-color, $white-dark);
border-bottom: 1px solid var(--ide-border-color, $white-dark);

View File

@ -5,7 +5,7 @@
border-left: 1px solid $border-color;
border-bottom: 0;
border-radius: $border-radius-small $border-radius-small 0 0;
background: $gray-normal;
background: $gray-10;
}
#editor,

View File

@ -17,14 +17,14 @@
.issue-token:hover &,
.issue-token-link:focus > & {
background-color: $gray-normal;
background-color: $gray-10;
color: $blue-800;
text-decoration: none;
}
}
.issue-token-title {
background-color: $gray-normal;
background-color: $gray-10;
transition: background $general-hover-transition-duration $general-hover-transition-curve;
.issue-token:hover &,
@ -34,7 +34,7 @@
}
.issue-token-remove-button {
background-color: $gray-normal;
background-color: $gray-10;
transition: background $general-hover-transition-duration $general-hover-transition-curve;
&:hover,

View File

@ -276,7 +276,7 @@ input[type='checkbox']:hover {
width: $search-avatar-size;
height: $search-avatar-size;
border-radius: 50%;
border: 1px solid $gray-normal;
border: 1px solid $gray-10;
}
}

View File

@ -40,7 +40,7 @@ body {
line-height: 1.5;
color: #fafafa;
text-align: left;
background-color: #1f1f1f;
background-color: #333;
}
ul {
margin-top: 0;
@ -430,7 +430,7 @@ a.gl-badge.badge-warning:active {
.gl-form-input:not(.form-control-plaintext):not([type="color"]):read-only,
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #1f1f1f;
background-color: #333;
box-shadow: inset 0 0 0 1px #404040;
}
.gl-form-input:disabled,
@ -1034,7 +1034,7 @@ input {
z-index: 600;
width: 256px;
top: var(--header-height, 48px);
background-color: #f5f5f5;
background-color: #333;
border-right: 1px solid #e9e9e9;
transform: translate3d(0, 0, 0);
}
@ -1402,7 +1402,7 @@ input {
color: #999;
display: flex;
align-items: center;
background-color: #f5f5f5;
background-color: #333;
position: fixed;
bottom: 0;
width: 255px;
@ -1698,7 +1698,7 @@ svg.s16 {
border-radius: 4px;
}
body.gl-dark {
--gray-10: #1f1f1f;
--gray-10: #333;
--gray-50: #303030;
--gray-100: #404040;
--gray-200: #525252;
@ -1939,7 +1939,7 @@ body.gl-dark .navbar-gitlab .search form .search-input {
}
body.gl-dark {
--gray-10: #1f1f1f;
--gray-10: #333;
--gray-50: #303030;
--gray-100: #404040;
--gray-200: #525252;

View File

@ -415,7 +415,7 @@ a.gl-badge.badge-warning:active {
.gl-form-input:not(.form-control-plaintext):not([type="color"]):read-only,
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #fafafa;
background-color: #f5f5f5;
box-shadow: inset 0 0 0 1px #dbdbdb;
}
.gl-form-input:disabled,

View File

@ -297,7 +297,7 @@ fieldset:disabled a.btn {
.gl-form-input:not(.form-control-plaintext):not([type="color"]):read-only,
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #fafafa;
background-color: #f5f5f5;
box-shadow: inset 0 0 0 1px #dbdbdb;
}
.gl-form-input:disabled,

View File

@ -86,7 +86,7 @@ $purple-950: #f4f0ff;
$gray-lightest: #222;
$gray-light: $gray-50;
$gray-lighter: #303030;
$gray-normal: #333;
$gray-10: #333;
$gray-dark: $gray-100;
$gray-darker: #4f4f4f;
$gray-darkest: #c4c4c4;

View File

@ -8,6 +8,7 @@
# group: Group, required
# search: String, optional
# state: CustomerRelations::ContactStateEnum, optional
# ids: int[], optional
module Crm
class ContactsFinder
include Gitlab::Allowable
@ -24,6 +25,7 @@ module Crm
return CustomerRelations::Contact.none unless root_group
contacts = root_group.contacts
contacts = by_ids(contacts)
contacts = by_state(contacts)
contacts = by_search(contacts)
contacts.sort_by_name
@ -53,6 +55,12 @@ module Crm
contacts.search_by_state(params[:state])
end
def by_ids(contacts)
return contacts unless ids?
contacts.id_in(params[:ids])
end
def search?
params[:search].present?
end
@ -60,5 +68,9 @@ module Crm
def state?
params[:state].present?
end
def ids?
params[:ids].present?
end
end
end

View File

@ -8,6 +8,7 @@
# group: Group, required
# search: String, optional
# state: CustomerRelations::OrganizationStateEnum, optional
# ids: int[], optional
module Crm
class OrganizationsFinder
include Gitlab::Allowable
@ -24,6 +25,7 @@ module Crm
return CustomerRelations::Organization.none unless root_group
organizations = root_group.organizations
organizations = by_ids(organizations)
organizations = by_search(organizations)
organizations = by_state(organizations)
organizations.sort_by_name
@ -53,6 +55,12 @@ module Crm
organizations.search_by_state(params[:state])
end
def by_ids(organizations)
return organizations unless ids?
organizations.id_in(params[:ids])
end
def search?
params[:search].present?
end
@ -60,5 +68,9 @@ module Crm
def state?
params[:state].present?
end
def ids?
params[:ids].present?
end
end
end

View File

@ -23,7 +23,9 @@ module Mutations
authorize!(incident)
response ::IncidentManagement::TimelineEvents::CreateService.new(incident, current_user, args).execute
response ::IncidentManagement::TimelineEvents::CreateService.new(
incident, current_user, args.merge(editable: true)
).execute
end
private

View File

@ -21,7 +21,8 @@ module Mutations
current_user,
promoted_from_note: note,
note: note.note,
occurred_at: note.created_at
occurred_at: note.created_at,
editable: true
).execute
end

View File

@ -4,6 +4,7 @@ module Resolvers
module Crm
class ContactsResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
include ResolvesIds
authorize :read_crm_contact
@ -17,7 +18,13 @@ module Resolvers
required: false,
description: 'State of the contacts to search for.'
argument :ids, [::Types::GlobalIDType[CustomerRelations::Contact]],
required: false,
description: 'Filter contacts by IDs.'
def resolve(**args)
args[:ids] = resolve_ids(args.delete(:ids))
::Crm::ContactsFinder.new(current_user, { group: group }.merge(args)).execute
end

View File

@ -4,6 +4,7 @@ module Resolvers
module Crm
class OrganizationsResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
include ResolvesIds
authorize :read_crm_organization
@ -17,7 +18,13 @@ module Resolvers
required: false,
description: 'State of the organization to search for.'
argument :ids, [Types::GlobalIDType[CustomerRelations::Organization]],
required: false,
description: 'Filter organizations by IDs.'
def resolve(**args)
args[:ids] = resolve_ids(args.delete(:ids))
::Crm::OrganizationsFinder.new(current_user, { group: group }.merge(args)).execute
end

View File

@ -50,6 +50,7 @@ module Projects
scope :stale, -> { with_state(:running).where('updated_at < ?', STALE_WINDOW.ago) }
scope :remaining, -> { with_state(:created, :pending).or(stale) }
scope :processing_queue, -> { remaining.order(state: :desc) }
def self.enqueue_refresh(projects)
now = Time.zone.now
@ -65,8 +66,7 @@ module Projects
next_refresh = nil
transaction do
next_refresh = remaining
.order(:state, :updated_at)
next_refresh = processing_queue
.lock('FOR UPDATE SKIP LOCKED')
.take

View File

@ -31,6 +31,7 @@ class Release < ApplicationRecord
validates :description, length: { maximum: Gitlab::Database::MAX_TEXT_SIZE_LIMIT }, if: :description_changed?
validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") }
validates :links, nested_attributes_duplicates: { scope: :release, child_attributes: %i[name url filepath] }
validates :author_id, presence: true, on: :create, if: :validate_release_with_author?
scope :sorted, -> { order(released_at: :desc) }
scope :preloaded, -> {
@ -117,6 +118,10 @@ class Release < ApplicationRecord
end
end
def validate_release_with_author?
Feature.enabled?(:validate_release_with_author, self.project)
end
def set_released_at
self.released_at ||= created_at
end

View File

@ -3,6 +3,7 @@
module IncidentManagement
module TimelineEvents
DEFAULT_ACTION = 'comment'
DEFAULT_EDITABLE = false
class CreateService < TimelineEvents::BaseService
def initialize(incident, user, params)
@ -23,7 +24,8 @@ module IncidentManagement
action: params.fetch(:action, DEFAULT_ACTION),
note_html: params[:note_html].presence || params[:note],
occurred_at: params[:occurred_at],
promoted_from_note: params[:promoted_from_note]
promoted_from_note: params[:promoted_from_note],
editable: params.fetch(:editable, DEFAULT_EDITABLE)
}
timeline_event = IncidentManagement::TimelineEvent.new(timeline_event_params)

View File

@ -17,6 +17,7 @@ module IncidentManagement
end
def execute
return error_non_editable unless timeline_event.editable?
return error_no_permissions unless allowed?
if timeline_event.update(update_params)
@ -56,6 +57,10 @@ module IncidentManagement
:none
end
def error_non_editable
error(_('You cannot edit this timeline event.'))
end
end
end
end

View File

@ -1,7 +1,7 @@
- max_date = ::Gitlab::CurrentSettings.max_ssh_key_lifetime_from_now.to_date if ssh_key_expiration_policy_enabled?
%div
= form_for [:profile, @key], html: { class: 'js-requires-input' } do |f|
= form_errors(@key)
= form_errors(@key, pajamas_alert: true)
.form-group
= f.label :key, s_('Profiles|Key'), class: 'label-bold'

View File

@ -0,0 +1,8 @@
---
name: validate_release_with_author
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89694
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365350
milestone: '15.1'
type: development
group: group::release
default_enabled: false

View File

@ -10,6 +10,29 @@ value_type: number
status: active
time_frame: 28d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- users_viewing_analytics_group_devops_adoption
- i_analytics_dev_ops_adoption
- i_analytics_dev_ops_score
- p_analytics_merge_request
- i_analytics_instance_statistics
- g_analytics_contribution
- g_analytics_insights
- g_analytics_issues
- g_analytics_productivity
- g_analytics_valuestream
- p_analytics_pipelines
- p_analytics_code_reviews
- p_analytics_valuestream
- p_analytics_insights
- p_analytics_issues
- p_analytics_repo
- i_analytics_cohorts
- p_analytics_ci_cd_pipelines
- p_analytics_ci_cd_deployment_frequency
- p_analytics_ci_cd_lead_time
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: active
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_pipelines
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: active
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_valuestream
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: active
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- p_analytics_repo
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: active
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- i_analytics_cohorts
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: active
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- i_analytics_dev_ops_score
distribution:
- ce
- ee

View File

@ -8,8 +8,12 @@ product_group: group::optimize
product_category:
value_type: number
status: removed
time_frame: all
time_frame: 7d
data_source: redis_hll
instrumentation_class: RedisHLLMetric
options:
events:
- g_analytics_merge_request
distribution:
- ce
- ee

Some files were not shown because too many files have changed in this diff Show More