summaryrefslogtreecommitdiff
path: root/lib/api
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-12-09 09:37:38 +0000
committerDouwe Maan <douwe@gitlab.com>2015-12-09 09:37:38 +0000
commit7e8dc22dd7fb730d3fc47150cdfe95dc9ffdbc3a (patch)
tree17fb42e05aaa61b59bb4e95d72c42831c6de540f /lib/api
parent291678d61358c141a7ba8cabf0e645408b52a8ea (diff)
parent903151141da36ed9b8c2333a9b66f5c611e4efb6 (diff)
downloadgitlab-ce-7e8dc22dd7fb730d3fc47150cdfe95dc9ffdbc3a.tar.gz
Merge branch 'merge-if-green' into 'master'
Merge when build succeeds ### What does this MR do? Adds a button to a MR when the build/ci is running so it can be merged when/if the build is successfull. ### Are there points in the code the reviewer needs to double check? English spelling and whether or not the grammer is correct. ### Why was this MR needed? When you expect its all good, and don't want to revisit the current MR it can be accepted allready. ### What are the relevant issue numbers / Feature requests? Fixes #2640 -- although `Merge if green` is replaced with `Merge when the build succeeds` the general idea is the same. ### Screenshots (if relevant) ![Screenshot_from_2015-12-07_10-34-39](/uploads/b90b558b6ad6c8266bc9c96120d86f96/Screenshot_from_2015-12-07_10-34-39.png) ![Screenshot_from_2015-11-02_17-26-56](/uploads/9f52f56e3c5e9ec63cb8f42978c92a52/Screenshot_from_2015-11-02_17-26-56.png) ![Screenshot_from_2015-11-02_17-27-03](/uploads/119fc18c9b15ff73dc38010ac5b6244a/Screenshot_from_2015-11-02_17-27-03.png) ![Screenshot_from_2015-12-03_10-08-14](/uploads/bad7b35c7d129981d43631877c958be0/Screenshot_from_2015-12-03_10-08-14.png) ![Screenshot_from_2015-11-02_17-27-16](/uploads/b616d750a16cc11ba72f2ca84213515e/Screenshot_from_2015-11-02_17-27-16.png) ### Further considerations What if there are minor things needed solving, e.g. Rubocop, the current implementation will reset the approved status of the MR. It might be a consideration keep the approval for team member, or even guests. This would require an extra option in the Admin screen, though might add extra value. #### TODO - [x] Docs - [x] Specs /cc @DouweM @rspeicher See merge request !1729
Diffstat (limited to 'lib/api')
-rw-r--r--lib/api/entities.rb1
-rw-r--r--lib/api/merge_requests.rb64
2 files changed, 37 insertions, 28 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 96b73df6af9..81bf7a8222b 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -171,6 +171,7 @@ module API
expose :description
expose :work_in_progress?, as: :work_in_progress
expose :milestone, using: Entities::Milestone
+ expose :merge_when_build_succeeds
end
class MergeRequestChanges < MergeRequest
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index e7c5f808aea..3c1c6bda260 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -195,46 +195,54 @@ module API
# Merge MR
#
# Parameters:
- # id (required) - The ID of a project
- # merge_request_id (required) - ID of MR
- # merge_commit_message (optional) - Custom merge commit message
+ # id (required) - The ID of a project
+ # merge_request_id (required) - ID of MR
+ # merge_commit_message (optional) - Custom merge commit message
+ # should_remove_source_branch (optional) - When true, the source branch will be deleted if possible
+ # merge_when_build_succeeds (optional) - When true, this MR will be merged when the build succeeds
# Example:
# PUT /projects/:id/merge_request/:merge_request_id/merge
#
put ":id/merge_request/:merge_request_id/merge" do
merge_request = user_project.merge_requests.find(params[:merge_request_id])
- allowed = ::Gitlab::GitAccess.new(current_user, user_project).
- can_push_to_branch?(merge_request.target_branch)
+ # Merge request can not be merged
+ # because user dont have permissions to push into target branch
+ unauthorized! unless merge_request.can_be_merged_by?(current_user)
+ not_allowed! if !merge_request.open? || merge_request.work_in_progress?
- if allowed
- if merge_request.unchecked?
- merge_request.check_if_can_be_merged
- end
+ merge_request.check_if_can_be_merged if merge_request.unchecked?
- if merge_request.open? && !merge_request.work_in_progress?
- if merge_request.can_be_merged?
- commit_message = params[:merge_commit_message] || merge_request.merge_commit_message
-
- ::MergeRequests::MergeService.new(merge_request.target_project, current_user).
- execute(merge_request, commit_message)
-
- present merge_request, with: Entities::MergeRequest
- else
- render_api_error!('Branch cannot be merged', 405)
- end
- else
- # Merge request can not be merged
- # because it is already closed/merged or marked as WIP
- not_allowed!
- end
+ render_api_error!('Branch cannot be merged', 406) unless merge_request.can_be_merged?
+
+ merge_params = {
+ commit_message: params[:merge_commit_message],
+ should_remove_source_branch: params[:should_remove_source_branch]
+ }
+
+ if parse_boolean(params[:merge_when_build_succeeds]) && merge_request.ci_commit && merge_request.ci_commit.active?
+ ::MergeRequests::MergeWhenBuildSucceedsService.new(merge_request.target_project, current_user, merge_params).
+ execute(merge_request)
else
- # Merge request can not be merged
- # because user dont have permissions to push into target branch
- unauthorized!
+ ::MergeRequests::MergeService.new(merge_request.target_project, current_user, merge_params).
+ execute(merge_request)
end
+
+ present merge_request, with: Entities::MergeRequest
end
+ # Cancel Merge if Merge When build succeeds is enabled
+ # Parameters:
+ # id (required) - The ID of a project
+ # merge_request_id (required) - ID of MR
+ #
+ post ":id/merge_request/:merge_request_id/cancel_merge_when_build_succeeds" do
+ merge_request = user_project.merge_requests.find(params[:merge_request_id])
+
+ unauthorized! unless merge_request.can_cancel_merge_when_build_succeeds?(current_user)
+
+ ::MergeRequest::MergeWhenBuildSucceedsService.new(merge_request.target_project, current_user).cancel(merge_request)
+ end
# Get a merge request's comments
#