diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/banzai/filter/issuable_reference_expansion_filter.rb | 41 | ||||
| -rw-r--r-- | lib/banzai/filter/reference_redactor_filter.rb | 4 | ||||
| -rw-r--r-- | lib/banzai/reference_parser/issue_parser.rb | 23 | ||||
| -rw-r--r-- | lib/banzai/reference_parser/merge_request_parser.rb | 22 | ||||
| -rw-r--r-- | lib/banzai/render_context.rb | 5 | ||||
| -rw-r--r-- | lib/gitlab/github_import/parallel_scheduling.rb | 35 | ||||
| -rw-r--r-- | lib/gitlab/regex.rb | 4 |
7 files changed, 74 insertions, 60 deletions
diff --git a/lib/banzai/filter/issuable_reference_expansion_filter.rb b/lib/banzai/filter/issuable_reference_expansion_filter.rb index 6822e36c9be..8fe1c90b314 100644 --- a/lib/banzai/filter/issuable_reference_expansion_filter.rb +++ b/lib/banzai/filter/issuable_reference_expansion_filter.rb @@ -10,13 +10,17 @@ module Banzai class IssuableReferenceExpansionFilter < HTML::Pipeline::Filter include Gitlab::Utils::StrongMemoize + NUMBER_OF_SUMMARY_ASSIGNEES = 2 VISIBLE_STATES = %w(closed merged).freeze + EXTENDED_FORMAT_XPATH = Gitlab::Utils::Nokogiri.css_to_xpath('a[data-reference-format="+s"]') def call return doc unless context[:issuable_reference_expansion_enabled] - context = RenderContext.new(project, current_user) - extractor = Banzai::IssuableExtractor.new(context) + options = { extended_preload: doc.xpath(EXTENDED_FORMAT_XPATH).present? } + extractor_context = RenderContext.new(project, current_user, options: options) + + extractor = Banzai::IssuableExtractor.new(extractor_context) issuables = extractor.extract([doc]) issuables.each do |node, issuable| @@ -26,6 +30,9 @@ module Banzai case node.attr('data-reference-format') when '+' expand_reference_with_title_and_state(node, issuable) + when '+s' + expand_reference_with_title_and_state(node, issuable) + expand_reference_with_summary(node, issuable) else expand_reference_with_state(node, issuable) end @@ -43,11 +50,41 @@ module Banzai node.content += ')' end + # rubocop:disable Style/AsciiComments + # Example: Issue Title (#123 - closed) assignee name 1, assignee name 2+ • v15.9 • On track + def expand_reference_with_summary(node, issuable) + summary = [] + + summary << assignees_text(issuable) if issuable.supports_assignee? + summary << milestone_text(issuable.milestone) if issuable.supports_milestone? + summary << health_status_text(issuable.health_status) if issuable.supports_health_status? + + node.content = [node.content, *summary].compact_blank.join(' • ') + end + # rubocop:enable Style/AsciiComments + # Example: #123 (closed) def expand_reference_with_state(node, issuable) node.content += " (#{issuable_state_text(issuable)})" end + def assignees_text(issuable) + assignee_names = issuable.assignees.first(NUMBER_OF_SUMMARY_ASSIGNEES + 1).map(&:sanitize_name) + + return _('Unassigned') if assignee_names.empty? + + "#{assignee_names.first(NUMBER_OF_SUMMARY_ASSIGNEES).to_sentence(two_words_connector: ', ')}" \ + "#{assignee_names.size > NUMBER_OF_SUMMARY_ASSIGNEES ? '+' : ''}" + end + + def milestone_text(milestone) + milestone&.title + end + + def health_status_text(health_status) + health_status&.humanize + end + def issuable_state_text(issuable) moved_issue?(issuable) ? s_("IssuableStatus|moved") : issuable.state end diff --git a/lib/banzai/filter/reference_redactor_filter.rb b/lib/banzai/filter/reference_redactor_filter.rb index 485d3fd5fc7..9fae46a24a9 100644 --- a/lib/banzai/filter/reference_redactor_filter.rb +++ b/lib/banzai/filter/reference_redactor_filter.rb @@ -10,9 +10,9 @@ module Banzai class ReferenceRedactorFilter < HTML::Pipeline::Filter def call unless context[:skip_redaction] - context = RenderContext.new(project, current_user) + redactor_context = RenderContext.new(project, current_user) - ReferenceRedactor.new(context).redact([doc]) + ReferenceRedactor.new(redactor_context).redact([doc]) end doc diff --git a/lib/banzai/reference_parser/issue_parser.rb b/lib/banzai/reference_parser/issue_parser.rb index 6b1491cc56b..ecf77191c13 100644 --- a/lib/banzai/reference_parser/issue_parser.rb +++ b/lib/banzai/reference_parser/issue_parser.rb @@ -57,18 +57,21 @@ module Banzai end def records_for_nodes(nodes) + node_includes = [ + :author, + :assignees, + { + # These associations are primarily used for checking permissions. + # Eager loading these ensures we don't end up running dozens of + # queries in this process. + project: [:namespace, :project_feature, :route] + } + ] + node_includes << :milestone if context.options[:extended_preload] + @issues_for_nodes ||= grouped_objects_for_nodes( nodes, - Issue.all.includes( - :author, - :assignees, - { - # These associations are primarily used for checking permissions. - # Eager loading these ensures we don't end up running dozens of - # queries in this process. - project: [:namespace, :project_feature, :route] - } - ), + Issue.all.includes(node_includes), self.class.data_attribute ) end diff --git a/lib/banzai/reference_parser/merge_request_parser.rb b/lib/banzai/reference_parser/merge_request_parser.rb index 3e28f06b783..2bd06e79e96 100644 --- a/lib/banzai/reference_parser/merge_request_parser.rb +++ b/lib/banzai/reference_parser/merge_request_parser.rb @@ -19,17 +19,21 @@ module Banzai end def records_for_nodes(nodes) + node_includes = [ + :author, + :assignees, + { + # These associations are primarily used for checking permissions. + # Eager loading these ensures we don't end up running dozens of + # queries in this process. + target_project: [{ namespace: :route }, :project_feature, :route] + } + ] + node_includes << :milestone if context.options[:extended_preload] + @merge_requests_for_nodes ||= grouped_objects_for_nodes( nodes, - MergeRequest.includes( - :author, - :assignees, - { - # These associations are primarily used for checking permissions. - # Eager loading these ensures we don't end up running dozens of - # queries in this process. - target_project: [{ namespace: :route }, :project_feature, :route] - }), + MergeRequest.includes(node_includes), self.class.data_attribute ) end diff --git a/lib/banzai/render_context.rb b/lib/banzai/render_context.rb index e30fc9f469b..a69732a26e2 100644 --- a/lib/banzai/render_context.rb +++ b/lib/banzai/render_context.rb @@ -4,13 +4,14 @@ module Banzai # Object storing the current user, project, and other details used when # parsing Markdown references. class RenderContext - attr_reader :current_user + attr_reader :current_user, :options # default_project - The default project to use for all documents, if any. # current_user - The user viewing the document, if any. - def initialize(default_project = nil, current_user = nil) + def initialize(default_project = nil, current_user = nil, options: {}) @current_user = current_user @projects = Hash.new(default_project) + @options = options end # Associates an HTML document with a Project. diff --git a/lib/gitlab/github_import/parallel_scheduling.rb b/lib/gitlab/github_import/parallel_scheduling.rb index 4b54a77983d..f8d8e4c1e8d 100644 --- a/lib/gitlab/github_import/parallel_scheduling.rb +++ b/lib/gitlab/github_import/parallel_scheduling.rb @@ -85,14 +85,10 @@ module Gitlab def parallel_import raise 'Batch settings must be defined for parallel import' if parallel_import_batch.blank? - if Feature.enabled?(:improved_spread_parallel_import) - improved_spread_parallel_import - else - spread_parallel_import - end + spread_parallel_import end - def improved_spread_parallel_import + def spread_parallel_import enqueued_job_counter = 0 each_object_to_import do |object| @@ -108,33 +104,6 @@ module Gitlab job_waiter end - def spread_parallel_import - waiter = JobWaiter.new - - import_arguments = [] - - each_object_to_import do |object| - repr = object_representation(object) - - import_arguments << [project.id, repr.to_hash, waiter.key] - - waiter.jobs_remaining += 1 - end - - # rubocop:disable Scalability/BulkPerformWithContext - Gitlab::ApplicationContext.with_context(project: project) do - sidekiq_worker_class.bulk_perform_in( - 1.second, - import_arguments, - batch_size: parallel_import_batch[:size], - batch_delay: parallel_import_batch[:delay] - ) - end - # rubocop:enable Scalability/BulkPerformWithContext - - waiter - end - # The method that will be called for traversing through all the objects to # import, yielding them to the supplied block. def each_object_to_import diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb index e76056709e9..4d15ac99277 100644 --- a/lib/gitlab/regex.rb +++ b/lib/gitlab/regex.rb @@ -548,11 +548,11 @@ module Gitlab end def issue - @issue ||= /(?<issue>\d+)(?<format>\+)?(?=\W|\z)/ + @issue ||= /(?<issue>\d+)(?<format>\+s{,1})?(?=\W|\z)/ end def merge_request - @merge_request ||= /(?<merge_request>\d+)(?<format>\+)?/ + @merge_request ||= /(?<merge_request>\d+)(?<format>\+s{,1})?/ end def base64_regex |
