From e033caddffed180123c53455e14ae7afbde4e036 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 31 Jan 2025 12:12:04 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/database.gitlab-ci.yml | 15 ++++ .gitlab/ci/rails/shared.gitlab-ci.yml | 4 + .rubocop_todo/rspec/be_empty.yml | 22 ------ Gemfile.checksum | 2 +- Gemfile.lock | 2 +- Gemfile.next.checksum | 2 +- Gemfile.next.lock | 2 +- .../graphql_shared/issuable_client.js | 28 ++++++- app/assets/javascripts/merge_request_tabs.js | 6 +- .../merge_requests/reports/components/app.vue | 18 ++++- .../merge_requests/reports/pages/index.vue | 19 ++++- .../merge_requests/reports/routes.js | 21 +----- .../pipeline_wizard/components/wrapper.vue | 10 +-- .../components/related_issuable_input.vue | 13 +++- .../components/widget/app.vue | 45 +++++++++-- .../components/widget/widget.vue | 35 ++++++--- .../work_item_relationships.vue | 3 - app/assets/stylesheets/framework/forms.scss | 6 +- .../work_items/shared_filter_arguments.rb | 2 +- .../types/work_items/linked_item_type.rb | 2 +- app/graphql/types/work_items/type_type.rb | 4 +- .../work_items/widgets/hierarchy_type.rb | 4 +- .../widgets/labels_update_input_type.rb | 4 +- app/models/work_items/type.rb | 4 + .../work_items/types/user_preference.rb | 17 +++++ ...ct_aggregate_pipeline_analytics_service.rb | 4 +- ...collect_pipeline_analytics_service_base.rb | 4 + ..._time_series_pipeline_analytics_service.rb | 65 +++++++++++++++- .../import/gitlab_projects/new.html.haml | 12 +-- config/sidekiq_queues.yml | 2 + db/docs/ci_running_builds.yml | 7 +- db/docs/ml_experiment_metadata.yml | 12 +-- db/docs/work_item_type_user_preferences.yml | 12 +++ ..._create_work_item_type_user_preferences.rb | 23 ++++++ ...keys_to_work_item_type_user_preferences.rb | 35 +++++++++ ...metadata_project_id_not_null_constraint.rb | 14 ++++ db/schema_migrations/20250103105345 | 1 + db/schema_migrations/20250103105346 | 1 + db/schema_migrations/20250108115531 | 1 + db/structure.sql | 43 ++++++++++- doc/administration/integration/plantuml.md | 23 ++++++ ...ported_models_and_hardware_requirements.md | 45 ++++++----- doc/ci/jobs/job_artifacts.md | 74 ++++++++----------- doc/ci/runners/configure_runners.md | 2 +- .../variables/where_variables_can_be_used.md | 6 ++ doc/ci/yaml/index.md | 2 +- doc/development/bulk_imports/contributing.md | 3 + doc/development/import_export.md | 3 + doc/tutorials/hugo/index.md | 6 +- doc/user/asciidoc.md | 17 +++++ doc/user/markdown.md | 69 +++++++++++++---- lib/gitlab/application_setting_fetcher.rb | 8 +- locale/gitlab.pot | 3 + scripts/utils.sh | 15 ++++ spec/factories/work_items/user_preference.rb | 9 +++ .../components/related_issuable_input_spec.js | 28 ++++++- .../components/widget/widget_spec.js | 8 +- spec/helpers/nav/new_dropdown_helper_spec.rb | 4 +- spec/helpers/users_helper_spec.rb | 2 +- .../lib/banzai/pipeline/full_pipeline_spec.rb | 56 ++++++++++++++ spec/lib/click_house/iterator_spec.rb | 2 +- .../application_setting_fetcher_spec.rb | 27 ------- spec/lib/gitlab/asciidoc_spec.rb | 58 +++++++++++++++ spec/lib/gitlab/checks/changes_access_spec.rb | 4 +- spec/lib/gitlab/ci/jwt_spec.rb | 2 +- .../ci/variables/builder/release_spec.rb | 2 +- spec/lib/gitlab/import_export/all_models.yml | 1 + spec/lib/gitlab/mail_room/mail_room_spec.rb | 2 +- spec/lib/gitlab/search_results_spec.rb | 2 +- spec/lib/search/empty_search_results_spec.rb | 4 +- .../work_items/types/user_preference_spec.rb | 11 +++ .../project_pipeline_analytics_spec.rb | 1 + ...gregate_pipeline_analytics_service_spec.rb | 16 ++-- ..._series_pipeline_analytics_service_spec.rb | 30 ++++++-- .../ci/pipeline_analytics_shared_context.rb | 1 + ...lect_pipeline_analytics_shared_examples.rb | 17 ++++- 76 files changed, 821 insertions(+), 268 deletions(-) delete mode 100644 .rubocop_todo/rspec/be_empty.yml create mode 100644 app/models/work_items/types/user_preference.rb create mode 100644 db/docs/work_item_type_user_preferences.yml create mode 100644 db/migrate/20250103105345_create_work_item_type_user_preferences.rb create mode 100644 db/migrate/20250103105346_add_foreign_keys_to_work_item_type_user_preferences.rb create mode 100644 db/post_migrate/20250108115531_add_ml_experiment_metadata_project_id_not_null_constraint.rb create mode 100644 db/schema_migrations/20250103105345 create mode 100644 db/schema_migrations/20250103105346 create mode 100644 db/schema_migrations/20250108115531 create mode 100644 spec/factories/work_items/user_preference.rb create mode 100644 spec/models/work_items/types/user_preference_spec.rb diff --git a/.gitlab/ci/database.gitlab-ci.yml b/.gitlab/ci/database.gitlab-ci.yml index 39065d1c9db..7806cc15b18 100644 --- a/.gitlab/ci/database.gitlab-ci.yml +++ b/.gitlab/ci/database.gitlab-ci.yml @@ -1,6 +1,21 @@ include: - local: .gitlab/ci/rails/shared.gitlab-ci.yml +db:setup pg14: + stage: prepare + needs: [] + extends: + - .use-pg14 + - .default-before_script + - .ruby-cache + - .rails:rules:setup-test-env + script: + - source scripts/utils.sh + - run_timed_command "pg_dumpall -h postgres -U postgres > pg_dumpall.sql" + artifacts: + paths: + - pg_dumpall.sql + db:rollback single-db-ci-connection: extends: - db:rollback diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml index b7cb464675f..ddbbbac9b00 100644 --- a/.gitlab/ci/rails/shared.gitlab-ci.yml +++ b/.gitlab/ci/rails/shared.gitlab-ci.yml @@ -210,6 +210,10 @@ include: - !reference [.rspec-base, after_script] .rspec-base-pg14: + needs: + - !reference [.rspec-base, needs] + - job: "db:setup pg14" + optional: true extends: - .rspec-base - .use-pg14 diff --git a/.rubocop_todo/rspec/be_empty.yml b/.rubocop_todo/rspec/be_empty.yml deleted file mode 100644 index 86b50685bad..00000000000 --- a/.rubocop_todo/rspec/be_empty.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Cop supports --autocorrect. -RSpec/BeEmpty: - Exclude: - - 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb' - - 'ee/spec/models/ee/group_spec.rb' - - 'ee/spec/models/ee/user_spec.rb' - - 'ee/spec/models/product_analytics/visualization_spec.rb' - - 'ee/spec/requests/api/graphql/ai/feature_settings/feature_settings_spec.rb' - - 'ee/spec/services/releases/update_service_spec.rb' - - 'ee/spec/support/shared_examples/lib/sidebars/menus_shared_examples.rb' - - 'ee/spec/support/shared_examples/models/authz/member_roles_shared_examples.rb' - - 'ee/spec/support/shared_examples/quick_actions/merge_request/unassign_reviewer_shared_examples.rb' - - 'spec/helpers/nav/new_dropdown_helper_spec.rb' - - 'spec/helpers/users_helper_spec.rb' - - 'spec/lib/click_house/iterator_spec.rb' - - 'spec/lib/gitlab/checks/changes_access_spec.rb' - - 'spec/lib/gitlab/ci/jwt_spec.rb' - - 'spec/lib/gitlab/ci/variables/builder/release_spec.rb' - - 'spec/lib/gitlab/mail_room/mail_room_spec.rb' - - 'spec/lib/gitlab/search_results_spec.rb' - - 'spec/lib/search/empty_search_results_spec.rb' diff --git a/Gemfile.checksum b/Gemfile.checksum index 19e34367a84..bc0c9fa91af 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -709,7 +709,7 @@ {"name":"sprockets-rails","version":"3.5.1","platform":"ruby","checksum":"c44626cb3887a1a8b572ca258685db33b4ebd041aa73428a716eac444ee5ef48"}, {"name":"ssh_data","version":"1.3.0","platform":"ruby","checksum":"ec7c1e95a3aebeee412147998f4c147b4b05da6ed0aafda6083f9449318eaac0"}, {"name":"ssrf_filter","version":"1.0.8","platform":"ruby","checksum":"03f49f54837e407d43ee93ec733a8a94dc1bcf8185647ac61606e63aaedaa0db"}, -{"name":"stackprof","version":"0.2.26","platform":"ruby","checksum":"ee408cbcccd9422aabd66edff8b76a77d67955f2ee1b674961b5dfaa2cc7b8bd"}, +{"name":"stackprof","version":"0.2.27","platform":"ruby","checksum":"aff6d28656c852e74cf632cc2046f849033dc1dedffe7cb8c030d61b5745e80c"}, {"name":"state_machines","version":"0.5.0","platform":"ruby","checksum":"23e6249d374a920b528dccade403518b4abbd83841a3e2c9ef13e6f1a009b102"}, {"name":"state_machines-activemodel","version":"0.8.0","platform":"ruby","checksum":"e932dab190d4be044fb5f9cab01a3ea0b092c5f113d4676c6c0a0d49bf738d2c"}, {"name":"state_machines-activerecord","version":"0.8.0","platform":"ruby","checksum":"072fb701b8ab03de0608297f6c55dc34ed096e556fa8f77e556f3c461c71aab6"}, diff --git a/Gemfile.lock b/Gemfile.lock index b82b385af80..ffdf6ac4535 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1803,7 +1803,7 @@ GEM sprockets (>= 3.0.0) ssh_data (1.3.0) ssrf_filter (1.0.8) - stackprof (0.2.26) + stackprof (0.2.27) state_machines (0.5.0) state_machines-activemodel (0.8.0) activemodel (>= 5.1) diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 9bce4ed1e88..b1e9cce97d2 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -720,7 +720,7 @@ {"name":"sprockets-rails","version":"3.5.1","platform":"ruby","checksum":"c44626cb3887a1a8b572ca258685db33b4ebd041aa73428a716eac444ee5ef48"}, {"name":"ssh_data","version":"1.3.0","platform":"ruby","checksum":"ec7c1e95a3aebeee412147998f4c147b4b05da6ed0aafda6083f9449318eaac0"}, {"name":"ssrf_filter","version":"1.0.8","platform":"ruby","checksum":"03f49f54837e407d43ee93ec733a8a94dc1bcf8185647ac61606e63aaedaa0db"}, -{"name":"stackprof","version":"0.2.26","platform":"ruby","checksum":"ee408cbcccd9422aabd66edff8b76a77d67955f2ee1b674961b5dfaa2cc7b8bd"}, +{"name":"stackprof","version":"0.2.27","platform":"ruby","checksum":"aff6d28656c852e74cf632cc2046f849033dc1dedffe7cb8c030d61b5745e80c"}, {"name":"state_machines","version":"0.5.0","platform":"ruby","checksum":"23e6249d374a920b528dccade403518b4abbd83841a3e2c9ef13e6f1a009b102"}, {"name":"state_machines-activemodel","version":"0.8.0","platform":"ruby","checksum":"e932dab190d4be044fb5f9cab01a3ea0b092c5f113d4676c6c0a0d49bf738d2c"}, {"name":"state_machines-activerecord","version":"0.8.0","platform":"ruby","checksum":"072fb701b8ab03de0608297f6c55dc34ed096e556fa8f77e556f3c461c71aab6"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index c190c8c9265..3c33588d593 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -1836,7 +1836,7 @@ GEM sprockets (>= 3.0.0) ssh_data (1.3.0) ssrf_filter (1.0.8) - stackprof (0.2.26) + stackprof (0.2.27) state_machines (0.5.0) state_machines-activemodel (0.8.0) activemodel (>= 5.1) diff --git a/app/assets/javascripts/graphql_shared/issuable_client.js b/app/assets/javascripts/graphql_shared/issuable_client.js index 2d64a1153ed..5aeb527564f 100644 --- a/app/assets/javascripts/graphql_shared/issuable_client.js +++ b/app/assets/javascripts/graphql_shared/issuable_client.js @@ -12,6 +12,7 @@ import { WIDGET_TYPE_AWARD_EMOJI, WIDGET_TYPE_HIERARCHY, WIDGET_TYPE_CUSTOM_FIELDS, + WIDGET_TYPE_LINKED_ITEMS, CUSTOM_FIELDS_TYPE_NUMBER, CUSTOM_FIELDS_TYPE_TEXT, CUSTOM_FIELDS_TYPE_SINGLE_SELECT, @@ -136,9 +137,6 @@ export const config = { }, }, }, - LinkedWorkItemType: { - keyFields: ['linkId'], - }, WorkItem: { fields: { // @todo: Mocking CUSTOM_FIELDS widget while not suported by backend @@ -474,6 +472,30 @@ export const config = { }; } + // this ensures that we don’t override linkedItems.workItem when updating parent + if (incomingWidget?.type === WIDGET_TYPE_LINKED_ITEMS) { + if (!incomingWidget.linkedItems) { + return existingWidget; + } + + const incomindNodes = incomingWidget.linkedItems?.nodes || []; + const existingNodes = existingWidget.linkedItems?.nodes || []; + + const resultNodes = incomindNodes.map((incomingNode) => { + const existingNode = + existingNodes.find((n) => n.linkId === incomingNode.linkId) ?? {}; + return { ...existingNode, ...incomingNode }; + }); + + return { + ...incomingWidget, + linkedItems: { + ...incomingWidget.linkedItems, + nodes: resultNodes, + }, + }; + } + return { ...existingWidget, ...incomingWidget }; }); }, diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index f4c79bd97bd..32ed2c40f5a 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -443,7 +443,11 @@ export default class MergeRequestTabs { let newStatePathname = pathname.replace(this.actionRegex, ''); // Append the new action if we're on a tab other than 'notes' - if (this.currentAction !== 'show' && this.currentAction !== 'new') { + if ( + this.currentAction !== 'show' && + this.currentAction !== 'new' && + this.currentAction !== 'reports' + ) { newStatePathname += `/${this.currentAction}`; } diff --git a/app/assets/javascripts/merge_requests/reports/components/app.vue b/app/assets/javascripts/merge_requests/reports/components/app.vue index 8bd0ea7d95a..09a8be9a08f 100644 --- a/app/assets/javascripts/merge_requests/reports/components/app.vue +++ b/app/assets/javascripts/merge_requests/reports/components/app.vue @@ -1,4 +1,6 @@ @@ -50,7 +64,7 @@ export default {
- +
diff --git a/app/assets/javascripts/merge_requests/reports/pages/index.vue b/app/assets/javascripts/merge_requests/reports/pages/index.vue index b4f055da191..9694ae00bee 100644 --- a/app/assets/javascripts/merge_requests/reports/pages/index.vue +++ b/app/assets/javascripts/merge_requests/reports/pages/index.vue @@ -1,9 +1,26 @@ diff --git a/app/assets/javascripts/merge_requests/reports/routes.js b/app/assets/javascripts/merge_requests/reports/routes.js index a3906ffbd03..b8dfe19d2f0 100644 --- a/app/assets/javascripts/merge_requests/reports/routes.js +++ b/app/assets/javascripts/merge_requests/reports/routes.js @@ -1,11 +1,6 @@ import BlockersPage from 'ee_else_ce/merge_requests/reports/pages/blockers_page.vue'; import IndexComponent from './pages/index.vue'; -import { - BLOCKERS_ROUTE, - CODE_QUALITY_ROUTE, - LICENSE_COMPLIANCE_ROUTE, - SECURITY_ROUTE, -} from './constants'; +import { BLOCKERS_ROUTE } from './constants'; export default [ { @@ -14,18 +9,8 @@ export default [ component: BlockersPage, }, { - path: '/?type=code-quality', - name: CODE_QUALITY_ROUTE, - component: IndexComponent, - }, - { - path: '/?type=security', - name: SECURITY_ROUTE, - component: IndexComponent, - }, - { - path: '/?type=license-compliance', - name: LICENSE_COMPLIANCE_ROUTE, + name: 'report', + path: '/:report', component: IndexComponent, }, ]; diff --git a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue index 473993d5729..bdff88869e5 100644 --- a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue +++ b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue @@ -221,16 +221,16 @@ export default { />
-
-

{{ filename }}

-

+

+

{{ filename }}

+

{{ $options.i18n.overlayMessage }}

diff --git a/app/assets/javascripts/related_issues/components/related_issuable_input.vue b/app/assets/javascripts/related_issues/components/related_issuable_input.vue index 337e5ea07e9..28f9f810988 100644 --- a/app/assets/javascripts/related_issues/components/related_issuable_input.vue +++ b/app/assets/javascripts/related_issues/components/related_issuable_input.vue @@ -13,7 +13,6 @@ import IssueToken from './issue_token.vue'; const SPACE_FACTOR = 1; export default { - TYPE_ISSUE, name: 'RelatedIssuableInput', components: { GlFormGroup, @@ -64,6 +63,11 @@ export default { required: false, default: false, }, + inline: { + type: Boolean, + required: false, + default: false, + }, }, data() { return { @@ -84,6 +88,9 @@ export default { allowAutoComplete() { return Object.keys(this.autoCompleteSources).length > 0; }, + showDescription() { + return !this.inline && this.issuableType === TYPE_ISSUE; + }, }, mounted() { this.setupAutoComplete(); @@ -182,7 +189,7 @@ export default {