summaryrefslogtreecommitdiff
path: root/lib/atlassian
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-04-05 09:19:15 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-04-05 09:19:15 +0000
commit508f0c4ee719abb1294684eea4a63aa44cd23597 (patch)
tree1af8199669fe0e9086bc57ba91510e80da093ffa /lib/atlassian
parent9a0dd27b634dde1f947beafcf822efef1cd2dcfc (diff)
downloadgitlab-ce-508f0c4ee719abb1294684eea4a63aa44cd23597.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/atlassian')
-rw-r--r--lib/atlassian/jira_connect/serializers/branch_entity.rb5
-rw-r--r--lib/atlassian/jira_issue_key_extractors/branch.rb46
2 files changed, 48 insertions, 3 deletions
diff --git a/lib/atlassian/jira_connect/serializers/branch_entity.rb b/lib/atlassian/jira_connect/serializers/branch_entity.rb
index c663575b7a8..682b2d77102 100644
--- a/lib/atlassian/jira_connect/serializers/branch_entity.rb
+++ b/lib/atlassian/jira_connect/serializers/branch_entity.rb
@@ -7,14 +7,13 @@ module Atlassian
expose :id do |branch|
Digest::SHA256.hexdigest(branch.name)
end
- expose :issueKeys do |branch|
- JiraIssueKeyExtractor.new(branch.name).issue_keys
+ expose :issueKeys do |branch, options|
+ JiraIssueKeyExtractors::Branch.new(options[:project], branch.name).issue_keys
end
expose :name
expose :lastCommit, using: JiraConnect::Serializers::CommitEntity do |branch, options|
options[:project].commit(branch.dereferenced_target)
end
-
expose :url do |branch, options|
project_commits_url(options[:project], branch.name)
end
diff --git a/lib/atlassian/jira_issue_key_extractors/branch.rb b/lib/atlassian/jira_issue_key_extractors/branch.rb
new file mode 100644
index 00000000000..67105cd093b
--- /dev/null
+++ b/lib/atlassian/jira_issue_key_extractors/branch.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Atlassian
+ module JiraIssueKeyExtractors
+ class Branch
+ def self.has_keys?(project, branch_name)
+ new(project, branch_name).issue_keys.any?
+ end
+
+ def initialize(project, branch_name)
+ @project = project
+ @branch_name = branch_name
+ end
+
+ # Extract Jira issue keys from the branch name and associated open merge request.
+ # Use BatchLoader to load this data without N+1 queries when serializing multiple branches
+ # in `Atlassian::JiraConnect::Serializers::BranchEntity`.
+ def issue_keys
+ unless Feature.enabled?(:jira_include_keys_from_associated_mr_for_branch, project)
+ return JiraIssueKeyExtractor.new(branch_name).issue_keys
+ end
+
+ BatchLoader.for(branch_name).batch do |branch_names, loader|
+ merge_requests = MergeRequest
+ .select(:description, :source_branch, :title)
+ .from_project(project)
+ .from_source_branches(branch_names)
+ .opened
+
+ branch_names.each do |branch_name|
+ related_merge_request = merge_requests.find { |mr| mr.source_branch == branch_name }
+
+ key_sources = [branch_name, related_merge_request&.title, related_merge_request&.description].compact
+ issue_keys = JiraIssueKeyExtractor.new(key_sources).issue_keys
+
+ loader.call(branch_name, issue_keys)
+ end
+ end
+ end
+
+ private
+
+ attr_reader :branch_name, :project
+ end
+ end
+end