summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/banzai/filter/issuable_reference_expansion_filter.rb41
-rw-r--r--lib/banzai/filter/reference_redactor_filter.rb4
-rw-r--r--lib/banzai/reference_parser/issue_parser.rb23
-rw-r--r--lib/banzai/reference_parser/merge_request_parser.rb22
-rw-r--r--lib/banzai/render_context.rb5
-rw-r--r--lib/gitlab/github_import/parallel_scheduling.rb35
-rw-r--r--lib/gitlab/regex.rb4
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