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 {