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 {
+
{{ $options.i18n.overlayMessage }}