Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeger-Jan van de Weg <mail@zjvandeweg.nl>2015-11-02 19:27:38 +0300
committerZeger-Jan van de Weg <mail@zjvandeweg.nl>2015-11-02 19:27:38 +0300
commit77f8a1e392b64f51326df8aebdc77e97af07bfed (patch)
treef1ce42885c2459c9e4737d8a8b5099fbdc2efa7b /app/services
parent8c9e1df98eb45e3305ab5badc6727580e84d36e0 (diff)
Merge when build succeeds
Diffstat (limited to 'app/services')
-rw-r--r--app/services/merge_requests/merge_when_build_succeeds_service.rb43
-rw-r--r--app/services/merge_requests/refresh_service.rb8
-rw-r--r--app/services/system_note_service.rb14
3 files changed, 64 insertions, 1 deletions
diff --git a/app/services/merge_requests/merge_when_build_succeeds_service.rb b/app/services/merge_requests/merge_when_build_succeeds_service.rb
new file mode 100644
index 00000000000..a4418360b8c
--- /dev/null
+++ b/app/services/merge_requests/merge_when_build_succeeds_service.rb
@@ -0,0 +1,43 @@
+module MergeRequests
+ class MergeWhenBuildSucceedsService < MergeRequests::BaseService
+ def execute(merge_request)
+ merge_request.merge_params.merge!(params[:merge_params])
+
+ # The service is also called when the merge params are updated.
+ already_approved = merge_request.merge_when_build_succeeds?
+
+ unless already_approved
+ merge_request.merge_when_build_succeeds = true
+ merge_request.merge_user = @current_user
+ end
+
+ merge_request.save
+
+ unless already_approved
+ SystemNoteService.merge_when_build_succeeds(merge_request, @project, @current_user)
+ end
+ end
+
+ def trigger(build)
+ merge_requests = merge_request_from(build)
+
+ merge_requests.each do |merge_request|
+ next unless merge_request.merge_when_build_succeeds?
+
+ ci_commit = merge_request.ci_commit
+ if ci_commit && ci_commit.success? && merge_request.mergeable?
+ MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
+ end
+ end
+ end
+
+ private
+
+ def merge_request_from(build)
+ merge_requests = @project.origin_merge_requests.opened.where(source_branch: build.ref).to_a
+ merge_requests += @project.fork_merge_requests.opened.where(source_branch: build.ref).to_a
+
+ merge_requests.uniq.select(&:source_project)
+ end
+ end
+end
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index d68bc79ecc0..335ef32abce 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -8,6 +8,7 @@ module MergeRequests
find_new_commits
reload_merge_requests
+ reset_merge_when_build_succeeds
# Leave a system note if a branch was deleted/added
if branch_added? || branch_removed?
@@ -57,7 +58,6 @@ module MergeRequests
merge_requests = filter_merge_requests(merge_requests)
merge_requests.each do |merge_request|
-
if merge_request.source_branch == @branch_name || force_push?
merge_request.reload_code
merge_request.mark_as_unchecked
@@ -76,6 +76,12 @@ module MergeRequests
end
end
+ def reset_merge_when_build_succeeds
+ merge_requests_for_source_branch.each do |merge_request|
+ merge_request.reset_merge_when_build_succeeds
+ end
+ end
+
def find_new_commits
if branch_added?
@commits = []
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 708c2f00486..c9846e9f26f 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -130,6 +130,20 @@ class SystemNoteService
create_note(noteable: noteable, project: project, author: author, note: body)
end
+ # Called when 'merge when build succeeds' is executed
+ def self.merge_when_build_succeeds(noteable, project, author)
+ body = "Approved this request to be merged automatically when the build succeeds"
+
+ create_note(noteable: noteable, project: project, author: author, note: body)
+ end
+
+ # Called when 'merge when build succeeds' is canceled
+ def self.cancel_merge_when_build_succeeds(noteable, project, author)
+ body = "Canceled the automatic merge"
+
+ create_note(noteable: noteable, project: project, author: author, note: body)
+ end
+
# Called when the title of a Noteable is changed
#
# noteable - Noteable object that responds to `title`