Commit 8256d407 authored by Christian Couder's avatar Christian Couder

Support rm src branch on merge w/ push option

MergeRequests::PushOptionsHandlerService has been updated to allow
creating and updating merge requests with the
`remove_source_branch` set using git push options.

To create a new merge request and set it to remove the source branch
when it is merged:

  git push -u origin -o merge_request.create \
    -o merge_request.remove_source_branch

To update an existing merge request and set it to remove the source
branch when it is merged:

  git push -u origin -o merge_request.remove_source_branch

Issue https://gitlab.com/gitlab-org/gitlab-ce/issues/64320
parent 4f95a8d7
......@@ -133,6 +133,10 @@ module MergeRequests
)
end
if push_options.key?(:remove_source_branch)
params[:force_remove_source_branch] = push_options[:remove_source_branch]
end
params
end
......@@ -146,6 +150,10 @@ module MergeRequests
)
end
if push_options.key?(:remove_source_branch)
params[:force_remove_source_branch] = push_options[:remove_source_branch]
end
if push_options.key?(:target)
params[:target_branch] = push_options[:target]
end
......
---
title: Support remove source branch on merge w/ push options
merge_request: 30728
author:
type: added
......@@ -285,6 +285,7 @@ as pushing changes:
- Create a new merge request for the pushed branch.
- Set the target of the merge request to a particular branch.
- Set the merge request to merge when its pipeline succeeds.
- Set the merge request to remove the source branch when it's merged.
### Create a new merge request using git push options
......@@ -328,6 +329,19 @@ pipeline succeeds at the same time using a `-o` flag per push option:
git push -o merge_request.create -o merge_request.merge_when_pipeline_succeeds
```
### Set removing the source branch using git push options
To set an existing merge request to remove the source branch when the
merge request is merged, the
`merge_request.remove_source_branch` push option can be used:
```sh
git push -o merge_request.remove_source_branch
```
You can also use this push option in addition to the
`merge_request.create` push option.
## Find the merge request that introduced a change
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/2383) in GitLab 10.5.
......
......@@ -4,7 +4,12 @@ module Gitlab
class PushOptions
VALID_OPTIONS = HashWithIndifferentAccess.new({
merge_request: {
keys: [:create, :merge_when_pipeline_succeeds, :target]
keys: [
:create,
:merge_when_pipeline_succeeds,
:remove_source_branch,
:target
]
},
ci: {
keys: [:skip]
......
......@@ -90,6 +90,16 @@ describe MergeRequests::PushOptionsHandlerService do
end
end
shared_examples_for 'a service that can remove the source branch when it is merged' do
subject(:last_mr) { MergeRequest.last }
it 'returns true to force_remove_source_branch?' do
service.execute
expect(last_mr.force_remove_source_branch?).to eq(true)
end
end
shared_examples_for 'a service that does not create a merge request' do
it do
expect { service.execute }.not_to change { MergeRequest.count }
......@@ -208,6 +218,72 @@ describe MergeRequests::PushOptionsHandlerService do
end
end
describe '`remove_source_branch` push option' do
let(:push_options) { { remove_source_branch: true } }
context 'with a new branch' do
let(:changes) { new_branch_changes }
it_behaves_like 'a service that does not create a merge request'
it 'adds an error to the service' do
error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
service.execute
expect(service.errors).to include(error)
end
context 'when coupled with the `create` push option' do
let(:push_options) { { create: true, remove_source_branch: true } }
it_behaves_like 'a service that can create a merge request'
it_behaves_like 'a service that can remove the source branch when it is merged'
end
end
context 'with an existing branch but no open MR' do
let(:changes) { existing_branch_changes }
it_behaves_like 'a service that does not create a merge request'
it 'adds an error to the service' do
error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
service.execute
expect(service.errors).to include(error)
end
context 'when coupled with the `create` push option' do
let(:push_options) { { create: true, remove_source_branch: true } }
it_behaves_like 'a service that can create a merge request'
it_behaves_like 'a service that can remove the source branch when it is merged'
end
end
context 'with an existing branch that has a merge request open' do
let(:changes) { existing_branch_changes }
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
it_behaves_like 'a service that does not create a merge request'
it_behaves_like 'a service that can remove the source branch when it is merged'
end
context 'with a deleted branch' do
let(:changes) { deleted_branch_changes }
it_behaves_like 'a service that does nothing'
end
context 'with the project default branch' do
let(:changes) { default_branch_changes }
it_behaves_like 'a service that does nothing'
end
end
describe '`target` push option' do
let(:push_options) { { target: target_branch } }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment