Commit 192d40e5 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'api-remove-source-branch' into 'master'

API: Ability to remove source branch

Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/23577

See merge request !7804
parents b026e8cd 8b5c16e4
---
title: 'API: Ability to set ''should_remove_source_branch'' on merge requests'
merge_request:
author: Robert Schilling
...@@ -271,17 +271,18 @@ Creates a new merge request. ...@@ -271,17 +271,18 @@ Creates a new merge request.
POST /projects/:id/merge_requests POST /projects/:id/merge_requests
``` ```
Parameters: | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
- `id` (required) - The ID of a project | `id` | string | yes | The ID of a project |
- `source_branch` (required) - The source branch | `source_branch` | string | yes | The source branch |
- `target_branch` (required) - The target branch | `target_branch` | string | yes | The target branch |
- `assignee_id` (optional) - Assignee user ID | `title` | string | yes | Title of MR |
- `title` (required) - Title of MR | `assignee_id` | integer | no | Assignee user ID |
- `description` (optional) - Description of MR | `description` | string | no | Description of MR |
- `target_project_id` (optional) - The target project (numeric id) | `target_project_id` | integer | no | The target project (numeric id) |
- `labels` (optional) - Labels for MR as a comma-separated list | `labels` | string | no | Labels for MR as a comma-separated list |
- `milestone_id` (optional) - Milestone ID | `milestone_id` | integer | no | The ID of a milestone |
| `remove_source_branch` | boolean | no | Flag indicating if a merge request should remove the source branch when merging |
```json ```json
{ {
...@@ -346,17 +347,19 @@ Updates an existing merge request. You can change the target branch, title, or e ...@@ -346,17 +347,19 @@ Updates an existing merge request. You can change the target branch, title, or e
PUT /projects/:id/merge_requests/:merge_request_id PUT /projects/:id/merge_requests/:merge_request_id
``` ```
Parameters: | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
- `id` (required) - The ID of a project | `id` | string | yes | The ID of a project |
- `merge_request_id` (required) - ID of MR | `merge_request_id` | integer | yes | The ID of a merge request |
- `target_branch` - The target branch | `source_branch` | string | yes | The source branch |
- `assignee_id` - Assignee user ID | `target_branch` | string | yes | The target branch |
- `title` - Title of MR | `title` | string | yes | Title of MR |
- `description` - Description of MR | `assignee_id` | integer | no | Assignee user ID |
- `state_event` - New state (close|reopen|merge) | `description` | string | no | Description of MR |
- `labels` (optional) - Labels for MR as a comma-separated list | `target_project_id` | integer | no | The target project (numeric id) |
- `milestone_id` (optional) - Milestone ID | `labels` | string | no | Labels for MR as a comma-separated list |
| `milestone_id` | integer | no | The ID of a milestone |
| `remove_source_branch` | boolean | no | Flag indicating if a merge request should remove the source branch when merging |
```json ```json
{ {
......
...@@ -30,6 +30,7 @@ module API ...@@ -30,6 +30,7 @@ module API
optional :assignee_id, type: Integer, desc: 'The ID of a user to assign the merge request' optional :assignee_id, type: Integer, desc: 'The ID of a user to assign the merge request'
optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign the merge request' optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign the merge request'
optional :labels, type: String, desc: 'Comma-separated list of label names' optional :labels, type: String, desc: 'Comma-separated list of label names'
optional :remove_source_branch, type: Boolean, desc: 'Remove source branch when merging'
end end
end end
...@@ -78,7 +79,8 @@ module API ...@@ -78,7 +79,8 @@ module API
post ":id/merge_requests" do post ":id/merge_requests" do
authorize! :create_merge_request, user_project authorize! :create_merge_request, user_project
mr_params = declared_params mr_params = declared_params(include_missing: false)
mr_params[:force_remove_source_branch] = mr_params.delete(:remove_source_branch) if mr_params[:remove_source_branch].present?
merge_request = ::MergeRequests::CreateService.new(user_project, current_user, mr_params).execute merge_request = ::MergeRequests::CreateService.new(user_project, current_user, mr_params).execute
...@@ -147,13 +149,15 @@ module API ...@@ -147,13 +149,15 @@ module API
desc: 'Status of the merge request' desc: 'Status of the merge request'
use :optional_params use :optional_params
at_least_one_of :title, :target_branch, :description, :assignee_id, at_least_one_of :title, :target_branch, :description, :assignee_id,
:milestone_id, :labels, :state_event :milestone_id, :labels, :state_event,
:remove_source_branch
end end
put path do put path do
merge_request = user_project.merge_requests.find(params.delete(:merge_request_id)) merge_request = user_project.merge_requests.find(params.delete(:merge_request_id))
authorize! :update_merge_request, merge_request authorize! :update_merge_request, merge_request
mr_params = declared_params(include_missing: false) mr_params = declared_params(include_missing: false)
mr_params[:force_remove_source_branch] = mr_params.delete(:remove_source_branch) if mr_params[:remove_source_branch].present?
merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, mr_params).execute(merge_request) merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, mr_params).execute(merge_request)
......
...@@ -234,11 +234,14 @@ describe API::MergeRequests, api: true do ...@@ -234,11 +234,14 @@ describe API::MergeRequests, api: true do
target_branch: 'master', target_branch: 'master',
author: user, author: user,
labels: 'label, label2', labels: 'label, label2',
milestone_id: milestone.id milestone_id: milestone.id,
remove_source_branch: true
expect(response).to have_http_status(201) expect(response).to have_http_status(201)
expect(json_response['title']).to eq('Test merge_request') expect(json_response['title']).to eq('Test merge_request')
expect(json_response['labels']).to eq(['label', 'label2']) expect(json_response['labels']).to eq(['label', 'label2'])
expect(json_response['milestone']['id']).to eq(milestone.id) expect(json_response['milestone']['id']).to eq(milestone.id)
expect(json_response['force_remove_source_branch']).to be_truthy
end end
it "returns 422 when source_branch equals target_branch" do it "returns 422 when source_branch equals target_branch" do
...@@ -511,6 +514,13 @@ describe API::MergeRequests, api: true do ...@@ -511,6 +514,13 @@ describe API::MergeRequests, api: true do
expect(json_response['target_branch']).to eq('wiki') expect(json_response['target_branch']).to eq('wiki')
end end
it "returns merge_request that removes the source branch" do
put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), remove_source_branch: true
expect(response).to have_http_status(200)
expect(json_response['force_remove_source_branch']).to be_truthy
end
it 'allows special label names' do it 'allows special label names' do
put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user),
title: 'new issue', title: 'new issue',
......
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