diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-05 09:19:15 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-05 09:19:15 +0000 |
commit | 508f0c4ee719abb1294684eea4a63aa44cd23597 (patch) | |
tree | 1af8199669fe0e9086bc57ba91510e80da093ffa /lib/atlassian | |
parent | 9a0dd27b634dde1f947beafcf822efef1cd2dcfc (diff) | |
download | gitlab-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.rb | 5 | ||||
-rw-r--r-- | lib/atlassian/jira_issue_key_extractors/branch.rb | 46 |
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 |