From 95305d5e6233c2b0abf1920e4a1c5d7d07c32b30 Mon Sep 17 00:00:00 2001 From: Asherah Connor Date: Mon, 1 Dec 2025 16:29:21 +1100 Subject: [PATCH 1/4] Remove deckar01-task_list; remove formatting from task item system notes We used to include the Markdown from the entire original line of input right here, allowing user formatting to become permanently part of the system note. You could also trivially break formatting in system notes this way, with unpredictable results. As of this change, system notes for task item status changes ("marked the checklist item XYZ as completed" and "as incomplete") no longer contain formatting from the task item, and only contain the textual contents. Changelog: changed --- Gemfile | 1 - Gemfile.checksum | 1 - Gemfile.lock | 3 - Gemfile.next.checksum | 1 - Gemfile.next.lock | 3 - app/models/concerns/taskable.rb | 71 ++++++++-------- .../system_notes/issuables_service.rb | 4 +- app/services/task_list_toggle_service.rb | 2 +- lib/banzai/filter/task_list_filter.rb | 84 +++++++++++-------- spec/frontend/merge_request_spec.js | 1 - spec/models/concerns/taskable_spec.rb | 74 ++++++++++++++-- .../system_notes/issuables_service_spec.rb | 28 ++++++- 12 files changed, 179 insertions(+), 94 deletions(-) diff --git a/Gemfile b/Gemfile index 16996184acd846..5bf41a96e12473 100644 --- a/Gemfile +++ b/Gemfile @@ -253,7 +253,6 @@ gem 'gitlab-active-context', path: 'gems/gitlab-active-context', require: 'activ # Markdown and HTML processing gem 'html-pipeline', '~> 2.14.3', feature_category: :markdown -gem 'deckar01-task_list', '2.3.4', feature_category: :markdown gem 'gitlab-markup', '~> 2.0.0', require: 'github/markup', feature_category: :markdown gem 'commonmarker', '~> 0.23.10', feature_category: :markdown gem 'kramdown', '~> 2.5.0', feature_category: :markdown diff --git a/Gemfile.checksum b/Gemfile.checksum index 3e61bce04dc5f3..a760be397c0b6c 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -110,7 +110,6 @@ {"name":"deb_version","version":"1.0.2","platform":"ruby","checksum":"c21f911d7f2fd1d61219caae254fc078e6598e477fdff8a05a18bec6c72ee713"}, {"name":"debug","version":"1.11.0","platform":"ruby","checksum":"1425db64cfa0130c952684e3dc974985be201dd62899bf4bbe3f8b5d6cf1aef2"}, {"name":"debug_inspector","version":"1.1.0","platform":"ruby","checksum":"eaa5a2d0195e1d65fb4164e8e7e466cca2e7eb53bc5e608cf12b8bf02c3a8606"}, -{"name":"deckar01-task_list","version":"2.3.4","platform":"ruby","checksum":"66abdc7e009ea759732bb53867e1ea42de550e2aa03ac30a015cbf42a04c1667"}, {"name":"declarative","version":"0.0.20","platform":"ruby","checksum":"8021dd6cb17ab2b61233c56903d3f5a259c5cf43c80ff332d447d395b17d9ff9"}, {"name":"declarative_policy","version":"2.0.1","platform":"ruby","checksum":"5ac5a67fc87edad6ef89b12ff8916520c8d11cb95e16529c259c93ef0ec3e6e8"}, {"name":"deprecation_toolkit","version":"2.2.4","platform":"ruby","checksum":"b1dad75eaeccd22327ee98f6a0b9d4dcd2e13274ff9069cf6b31d9879dcb2526"}, diff --git a/Gemfile.lock b/Gemfile.lock index 41844da2d6da0e..16c28c81d5d844 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -497,8 +497,6 @@ GEM irb (~> 1.10) reline (>= 0.3.8) debug_inspector (1.1.0) - deckar01-task_list (2.3.4) - html-pipeline (~> 2.0) declarative (0.0.20) declarative_policy (2.0.1) deprecation_toolkit (2.2.4) @@ -2130,7 +2128,6 @@ DEPENDENCIES cvss-suite (~> 3.3.0) database_cleaner-active_record (~> 2.2.0) debug (~> 1.11.0) - deckar01-task_list (= 2.3.4) declarative_policy (~> 2.0.1) deprecation_toolkit (~> 2.2.3) derailed_benchmarks diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 3e61bce04dc5f3..a760be397c0b6c 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -110,7 +110,6 @@ {"name":"deb_version","version":"1.0.2","platform":"ruby","checksum":"c21f911d7f2fd1d61219caae254fc078e6598e477fdff8a05a18bec6c72ee713"}, {"name":"debug","version":"1.11.0","platform":"ruby","checksum":"1425db64cfa0130c952684e3dc974985be201dd62899bf4bbe3f8b5d6cf1aef2"}, {"name":"debug_inspector","version":"1.1.0","platform":"ruby","checksum":"eaa5a2d0195e1d65fb4164e8e7e466cca2e7eb53bc5e608cf12b8bf02c3a8606"}, -{"name":"deckar01-task_list","version":"2.3.4","platform":"ruby","checksum":"66abdc7e009ea759732bb53867e1ea42de550e2aa03ac30a015cbf42a04c1667"}, {"name":"declarative","version":"0.0.20","platform":"ruby","checksum":"8021dd6cb17ab2b61233c56903d3f5a259c5cf43c80ff332d447d395b17d9ff9"}, {"name":"declarative_policy","version":"2.0.1","platform":"ruby","checksum":"5ac5a67fc87edad6ef89b12ff8916520c8d11cb95e16529c259c93ef0ec3e6e8"}, {"name":"deprecation_toolkit","version":"2.2.4","platform":"ruby","checksum":"b1dad75eaeccd22327ee98f6a0b9d4dcd2e13274ff9069cf6b31d9879dcb2526"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index 41844da2d6da0e..16c28c81d5d844 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -497,8 +497,6 @@ GEM irb (~> 1.10) reline (>= 0.3.8) debug_inspector (1.1.0) - deckar01-task_list (2.3.4) - html-pipeline (~> 2.0) declarative (0.0.20) declarative_policy (2.0.1) deprecation_toolkit (2.2.4) @@ -2130,7 +2128,6 @@ DEPENDENCIES cvss-suite (~> 3.3.0) database_cleaner-active_record (~> 2.2.0) debug (~> 1.11.0) - deckar01-task_list (= 2.3.4) declarative_policy (~> 2.0.1) deprecation_toolkit (~> 2.2.3) derailed_benchmarks diff --git a/app/models/concerns/taskable.rb b/app/models/concerns/taskable.rb index e34ef0e94a368c..76ec7512726d84 100644 --- a/app/models/concerns/taskable.rb +++ b/app/models/concerns/taskable.rb @@ -1,18 +1,21 @@ # frozen_string_literal: true -require 'task_list' -require 'task_list/filter' - # Contains functionality for objects that can have task lists in their # descriptions. Task list items can be added with Markdown like "* [x] Fix # bugs". # # Used by MergeRequest and Issue module Taskable + # Model class for task items returned by Taskable.get_tasks, Taskable.get_updated_tasks, and + # #task_list_items on classes included by Taskable. + Item = Struct.new(:complete?, :text, :source) + COMPLETED = 'completed' INCOMPLETE = 'incomplete' COMPLETE_PATTERN = /\[[xX]\]/ INCOMPLETE_PATTERN = /\[[[:space:]]\]/ + + # Used by TaskListToggleService and WorkItems::TaskListReferenceReplacementService. ITEM_PATTERN = %r{ ^ (?:(?:>\s{0,4})*) # optional blockquote characters @@ -24,37 +27,22 @@ module Taskable (\s.+) # followed by whitespace and some text. }x - ITEM_PATTERN_UNTRUSTED = - '^' \ - '(?:(?:>\s{0,4})*)' \ - '(?P(?:\s*(?:[-+*]|(?:\d+[.)])))+)' \ - '\s+' \ - '(?P' \ - "#{COMPLETE_PATTERN.source}|#{INCOMPLETE_PATTERN.source}" \ - ')' \ - '(?P