summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2017-04-19 22:12:27 +0000
committerLin Jen-Shin <godfat@godfat.org>2017-04-20 15:21:56 +0800
commit1845f9e5aba5566d5e89c49bba009187f23089b9 (patch)
tree549af19cc4fadd296989b544bc80d91dd421a6f8 /app
parent32f2596e4cf072b5a8bbe7b9ffd9f98d81b13d14 (diff)
downloadgitlab-ce-1845f9e5aba5566d5e89c49bba009187f23089b9.tar.gz
Merge branch 'sh-issue-29247-fix' into 'master'
Don't delete a branch involved in an open merge request in "Delete all merged branches" service Closes #29427 See merge request !10727
Diffstat (limited to 'app')
-rw-r--r--app/services/delete_merged_branches_service.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/app/services/delete_merged_branches_service.rb b/app/services/delete_merged_branches_service.rb
index 1b5623baebe..3b611588466 100644
--- a/app/services/delete_merged_branches_service.rb
+++ b/app/services/delete_merged_branches_service.rb
@@ -8,9 +8,20 @@ class DeleteMergedBranchesService < BaseService
branches = project.repository.branch_names
branches = branches.select { |branch| project.repository.merged_to_root_ref?(branch) }
+ # Prevent deletion of branches relevant to open merge requests
+ branches -= merge_request_branch_names
branches.each do |branch|
DeleteBranchService.new(project, current_user).execute(branch)
end
end
+
+ private
+
+ def merge_request_branch_names
+ # reorder(nil) is necessary for SELECT DISTINCT because default scope adds an ORDER BY
+ source_names = project.origin_merge_requests.opened.reorder(nil).uniq.pluck(:source_branch)
+ target_names = project.merge_requests.opened.reorder(nil).uniq.pluck(:target_branch)
+ (source_names + target_names).uniq
+ end
end