From ef696614134597e58e5ca0287bed3fa8fea804e2 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 9 Apr 2025 21:14:45 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .eslint_todo/vue-no-unused-properties.mjs | 1 - Gemfile | 4 +- Gemfile.checksum | 4 +- Gemfile.lock | 8 +- Gemfile.next.checksum | 4 +- Gemfile.next.lock | 8 +- .../graph/components/linked_pipeline.vue | 2 +- .../services/gl_api_markdown_deserializer.js | 15 +- .../components/provider_repo_table_row.vue | 73 ++++-- .../notes/components/note_body.vue | 3 - .../components/work_item_labels.vue | 101 +++---- app/controllers/groups_controller.rb | 71 ++++- app/mailers/emails/projects.rb | 14 + app/mailers/previews/notify_preview.rb | 8 + app/serializers/project_note_entity.rb | 2 - app/services/notification_service.rb | 23 ++ .../projects/mark_for_deletion_service.rb | 9 + .../project_scheduled_for_deletion.html.haml | 7 + .../project_scheduled_for_deletion.text.erb | 7 + .../project_deletion_notification_email.yml | 10 + config/routes.rb | 1 - config/routes/group.rb | 2 + doc/administration/raketasks/_index.md | 1 + doc/administration/raketasks/password.md | 34 +++ doc/development/database/foreign_keys.md | 10 +- doc/development/feature_flags/_index.md | 11 +- doc/user/profile/notifications.md | 3 +- doc/user/work_items/custom_fields.md | 1 + lib/gitlab/auth.rb | 9 +- lib/tasks/gitlab/password.rake | 35 +++ locale/gitlab.pot | 28 +- spec/controllers/groups_controller_spec.rb | 247 ++++++++++++++++-- spec/features/boards/sidebar_labels_spec.rb | 9 +- spec/features/import/manifest_import_spec.rb | 1 + .../api/schemas/entities/discussion.json | 6 - .../gl_api_markdown_deserializer_spec.js | 12 +- .../provider_repo_table_row_spec.js | 35 ++- .../components/work_item_labels_spec.js | 46 ++-- spec/lib/gitlab/auth_spec.rb | 18 +- spec/mailers/emails/projects_spec.rb | 25 ++ spec/services/notification_service_spec.rb | 70 +++++ .../mark_for_deletion_service_spec.rb | 110 +++++++- spec/tasks/gitlab/password_rake_spec.rb | 101 +++++-- 43 files changed, 967 insertions(+), 222 deletions(-) create mode 100644 app/views/notify/project_scheduled_for_deletion.html.haml create mode 100644 app/views/notify/project_scheduled_for_deletion.text.erb create mode 100644 config/feature_flags/gitlab_com_derisk/project_deletion_notification_email.yml create mode 100644 doc/administration/raketasks/password.md diff --git a/.eslint_todo/vue-no-unused-properties.mjs b/.eslint_todo/vue-no-unused-properties.mjs index 45b29aab035..65bf5c82ef3 100644 --- a/.eslint_todo/vue-no-unused-properties.mjs +++ b/.eslint_todo/vue-no-unused-properties.mjs @@ -292,7 +292,6 @@ export default { 'app/assets/javascripts/work_items/components/work_item_detail_modal.vue', 'app/assets/javascripts/work_items/components/work_item_development/work_item_create_branch_merge_request_modal.vue', 'app/assets/javascripts/work_items/components/work_item_development/work_item_development_mr_item.vue', - 'app/assets/javascripts/work_items/components/work_item_labels.vue', 'app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue', 'app/assets/javascripts/work_items/components/work_item_links/work_item_groups_listbox.vue', 'app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue', diff --git a/Gemfile b/Gemfile index 82cbfc576c6..5ac6ad608cb 100644 --- a/Gemfile +++ b/Gemfile @@ -401,7 +401,7 @@ gem 'sentry-sidekiq', '~> 5.22.0', feature_category: :observability # PostgreSQL query parsing # -gem 'pg_query', '~> 6.0.0', feature_category: :database +gem 'pg_query', '~> 6.1.0', feature_category: :database gem 'gitlab-schema-validation', path: 'gems/gitlab-schema-validation', feature_category: :shared gem 'gitlab-http', path: 'gems/gitlab-http', feature_category: :shared @@ -521,7 +521,7 @@ group :development, :test do # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826) gem 'minitest', '~> 5.11.0', feature_category: :shared - gem 'spring', '~> 4.1.0', feature_category: :shared + gem 'spring', '~> 4.3.0', feature_category: :shared gem 'spring-commands-rspec', '~> 1.0.4', feature_category: :shared gem 'gitlab-styles', '~> 13.1.0', feature_category: :tooling, require: false diff --git a/Gemfile.checksum b/Gemfile.checksum index 0d36a489296..06f16753ec9 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -513,7 +513,7 @@ {"name":"pg","version":"1.5.9","platform":"x64-mingw-ucrt","checksum":"9d9d6a4fcc25251312065b61f94eb56c5266007c0e747606704641d47b92c5eb"}, {"name":"pg","version":"1.5.9","platform":"x64-mingw32","checksum":"02a682056d3db6677e0ed5b233e69383d20641785ba0123cdf56a5eb8286a013"}, {"name":"pg","version":"1.5.9","platform":"x86-mingw32","checksum":"f32a3cde1018a16f0b3392f654f763fd7ef3f6af4fee008312ad7d3575b3c0ab"}, -{"name":"pg_query","version":"6.0.0","platform":"ruby","checksum":"fbf09a4e900cee1d61e2bbfda1fefdbc35bc83c5f1c7ae1be1c6ffc5ae0f5c04"}, +{"name":"pg_query","version":"6.1.0","platform":"ruby","checksum":"8b005229e209f12c5887c34c60d0eb2a241953b9475b53a9840d24578532481e"}, {"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"}, {"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"}, {"name":"premailer","version":"1.23.0","platform":"ruby","checksum":"f0d7f6ba299559c96ddf982aa5263f85e5617c86437c8d8ffff120813b2d7efb"}, @@ -701,7 +701,7 @@ {"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"}, {"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"}, {"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"}, -{"name":"spring","version":"4.1.0","platform":"ruby","checksum":"f17f080fb0df558d663c897a6229ed3d5cc54819ab51876ea6eef49a67f0a3cb"}, +{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"}, {"name":"spring-commands-rspec","version":"1.0.4","platform":"ruby","checksum":"6202e54fa4767452e3641461a83347645af478bf45dddcca9737b43af0dd1a2c"}, {"name":"sprite-factory","version":"1.7.1","platform":"ruby","checksum":"5586524a1aec003241f1abc6852b61433e988aba5ee2b55f906387bf49b01ba2"}, {"name":"sprockets","version":"3.7.2","platform":"ruby","checksum":"5ea1d7facd09203c1aa196afd6178208cd25abdbcc2a9978810a2f0754e152a0"}, diff --git a/Gemfile.lock b/Gemfile.lock index 5d3c2238136..bc55799c4cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1451,7 +1451,7 @@ GEM peek (1.1.0) railties (>= 4.0.0) pg (1.5.9) - pg_query (6.0.0) + pg_query (6.1.0) google-protobuf (>= 3.25.3) plist (3.7.0) png_quantizator (0.2.1) @@ -1806,7 +1806,7 @@ GEM sorbet-runtime (0.5.11647) spamcheck (1.3.3) grpc (~> 1.63) - spring (4.1.0) + spring (4.3.0) spring-commands-rspec (1.0.4) spring (>= 0.9.1) sprite-factory (1.7.1) @@ -2262,7 +2262,7 @@ DEPENDENCIES parslet (~> 1.8) peek (~> 1.1) pg (~> 1.5.6) - pg_query (~> 6.0.0) + pg_query (~> 6.1.0) png_quantizator (~> 0.2.1) premailer-rails (~> 1.12.0) prometheus-client-mmap (~> 1.2.8) @@ -2328,7 +2328,7 @@ DEPENDENCIES snowplow-tracker (~> 0.8.0) solargraph (~> 0.47.2) spamcheck (~> 1.3.0) - spring (~> 4.1.0) + spring (~> 4.3.0) spring-commands-rspec (~> 1.0.4) sprite-factory (~> 1.7) sprockets (~> 3.7.0) diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 1e7af0546e6..5b5d8480963 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -516,7 +516,7 @@ {"name":"pg","version":"1.5.9","platform":"x64-mingw-ucrt","checksum":"9d9d6a4fcc25251312065b61f94eb56c5266007c0e747606704641d47b92c5eb"}, {"name":"pg","version":"1.5.9","platform":"x64-mingw32","checksum":"02a682056d3db6677e0ed5b233e69383d20641785ba0123cdf56a5eb8286a013"}, {"name":"pg","version":"1.5.9","platform":"x86-mingw32","checksum":"f32a3cde1018a16f0b3392f654f763fd7ef3f6af4fee008312ad7d3575b3c0ab"}, -{"name":"pg_query","version":"6.0.0","platform":"ruby","checksum":"fbf09a4e900cee1d61e2bbfda1fefdbc35bc83c5f1c7ae1be1c6ffc5ae0f5c04"}, +{"name":"pg_query","version":"6.1.0","platform":"ruby","checksum":"8b005229e209f12c5887c34c60d0eb2a241953b9475b53a9840d24578532481e"}, {"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"}, {"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"}, {"name":"pp","version":"0.6.2","platform":"ruby","checksum":"947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff"}, @@ -712,7 +712,7 @@ {"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"}, {"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"}, {"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"}, -{"name":"spring","version":"4.1.0","platform":"ruby","checksum":"f17f080fb0df558d663c897a6229ed3d5cc54819ab51876ea6eef49a67f0a3cb"}, +{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"}, {"name":"spring-commands-rspec","version":"1.0.4","platform":"ruby","checksum":"6202e54fa4767452e3641461a83347645af478bf45dddcca9737b43af0dd1a2c"}, {"name":"sprite-factory","version":"1.7.1","platform":"ruby","checksum":"5586524a1aec003241f1abc6852b61433e988aba5ee2b55f906387bf49b01ba2"}, {"name":"sprockets","version":"3.7.2","platform":"ruby","checksum":"5ea1d7facd09203c1aa196afd6178208cd25abdbcc2a9978810a2f0754e152a0"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index 7267abfc995..adbbab95ffc 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -1468,7 +1468,7 @@ GEM peek (1.1.0) railties (>= 4.0.0) pg (1.5.9) - pg_query (6.0.0) + pg_query (6.1.0) google-protobuf (>= 3.25.3) plist (3.7.0) png_quantizator (0.2.1) @@ -1839,7 +1839,7 @@ GEM sorbet-runtime (0.5.11647) spamcheck (1.3.3) grpc (~> 1.63) - spring (4.1.0) + spring (4.3.0) spring-commands-rspec (1.0.4) spring (>= 0.9.1) sprite-factory (1.7.1) @@ -2296,7 +2296,7 @@ DEPENDENCIES parslet (~> 1.8) peek (~> 1.1) pg (~> 1.5.6) - pg_query (~> 6.0.0) + pg_query (~> 6.1.0) png_quantizator (~> 0.2.1) premailer-rails (~> 1.12.0) prometheus-client-mmap (~> 1.2.8) @@ -2362,7 +2362,7 @@ DEPENDENCIES snowplow-tracker (~> 0.8.0) solargraph (~> 0.47.2) spamcheck (~> 1.3.0) - spring (~> 4.1.0) + spring (~> 4.3.0) spring-commands-rspec (~> 1.0.4) sprite-factory (~> 1.7) sprockets (~> 3.7.0) diff --git a/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue index 57007944e55..038f406de87 100644 --- a/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue +++ b/app/assets/javascripts/ci/pipeline_details/graph/components/linked_pipeline.vue @@ -300,7 +300,7 @@ export default { />
- + {{ downstreamTitle }}
diff --git a/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js index 5d567d5911e..30ea50ce9c3 100644 --- a/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js +++ b/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js @@ -7,6 +7,12 @@ const markdownToAst = (markdown) => { return unified().use(remarkParse).parse(markdown); }; +export const transformQuickActions = (markdown) => { + // ensure 3 newlines after all quick actions so that + // any reference style links after it get correctly parsed + return markdown.replace(/^\/(.+?)\n/gm, '/$1\n\n\n'); +}; + /** * Extracts link reference definitions from a markdown string. * This is useful for preserving reference definitions when @@ -44,21 +50,22 @@ export default ({ render }) => { * @returns {{ document: ProseMirror.Node }} */ deserialize: async ({ schema, markdown }) => { - const html = markdown ? (await render(markdown)).body : '

'; + const transformedMarkdown = transformQuickActions(markdown); + const html = markdown ? (await render(transformedMarkdown)).body : '

'; const parser = new DOMParser(); const { body } = parser.parseFromString(`${html}`, 'text/html'); replaceCommentsWith(body, 'comment'); // append original source as a comment that nodes can access - body.append(document.createComment(markdown)); + body.append(document.createComment(transformedMarkdown)); const doc = ProseMirror.DOMParser.fromSchema(schema).parse(body); if (preserveMarkdown()) doc.attrs = { - source: markdown, - referenceDefinitions: extractReferenceDefinitions(markdown), + source: transformedMarkdown, + referenceDefinitions: extractReferenceDefinitions(transformedMarkdown), }; return { document: doc }; diff --git a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue index eb4d1f5d790..ab166b8fba1 100644 --- a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue +++ b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue @@ -1,9 +1,18 @@ @@ -223,7 +240,8 @@ export default { 'ImportProjects|Imported files will be kept. You can import this repository again later.', ) }} - {{ __('Learn more.') }} + {{ __('Learn more') }}.
{{ importButtonText }} + +

+ {{ + s__( + 'ImportProjects|Importing a project into a personal namespace results in all contributions being mapped to the same bot user and they cannot be reassigned. To map contributions to actual users, import the project to a group instead.', + ) + }} + {{ __('Learn more') }}. +

+
{{ s__( - 'ImportProjects|Importing a project into a personal namespace results in all contributions being mapped to the same bot user. To map contributions to real users, import projects into a group instead.', + 'ImportProjects|Importing a project into a personal namespace results in all contributions being mapped to the same bot user and they cannot be reassigned. To map contributions to actual users, import the project to a group instead.', ) }} - {{ - __('Learn more.') - }} + {{ __('Learn more') }}. diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue index 4a863550f46..2f77eb3dd51 100644 --- a/app/assets/javascripts/notes/components/note_body.vue +++ b/app/assets/javascripts/notes/components/note_body.vue @@ -27,8 +27,6 @@ export default { Suggestions, DuoCodeReviewFeedback: () => import('ee_component/notes/components/duo_code_review_feedback.vue'), - AmazonQFixButton: () => - import('ee_component/merge_requests/components/amazon_q/amazon_q_fix_button.vue'), }, directives: { SafeHtml, @@ -246,7 +244,6 @@ export default { @handleFormUpdate="handleFormUpdate" @cancelForm="formCancelHandler" /> -