Merge branch 'api_only_allow_merge_if_build_succeeds' into 'master'

expose 'only_allow_merge_if_build_succeeds' project setting in the API

## What does this MR do?
Adds the 'only_allow_merge_if_build_succeeds' project setting in the API.

## Are there points in the code the reviewer needs to double check?
No, but maybe this code is not enough for ACLs or the like.

## Why was this MR needed?
Because that's a very useful setting to change via automation (through the API)

## What are the relevant issue numbers?

Closes #21085, closes https://gitlab.com/gitlab-org/gitlab-ce/issues/20088.

## Screenshots (if relevant)

## Does this MR meet the acceptance criteria?

- [X] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added
- [X] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)
- [X] API support added
- Tests
  - [X] Added for this feature/bug
  - [X] All builds are passing
- [X] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [X] Branch has no merge conflicts with `master` (if you do - rebase it please)
- [X] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)

See merge request !5930
This commit is contained in:
Douwe Maan 2016-08-24 19:27:58 +00:00
commit 952c501fdf
6 changed files with 53 additions and 12 deletions

View file

@ -6,6 +6,7 @@ v 8.12.0 (unreleased)
- Optimistic locking for Issues and Merge Requests (title and description overriding prevention)
- Add `wiki_page_events` to project hook APIs (Ben Boeckel)
- Added tests for diff notes
- Added 'only_allow_merge_if_build_succeeds' project setting in the API. !5930 (Duck)
v 8.11.2 (unreleased)
- Show "Create Merge Request" widget for push events to fork projects on the source project

View file

@ -84,7 +84,8 @@ Parameters:
"star_count": 0,
"runners_token": "b8547b1dc37721d05889db52fa2f02",
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
},
{
"id": 6,
@ -144,7 +145,8 @@ Parameters:
"star_count": 0,
"runners_token": "b8547b1dc37721d05889db52fa2f02",
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}
]
```
@ -280,7 +282,8 @@ Parameters:
"group_name": "Gitlab Org",
"group_access_level": 10
}
]
],
"only_allow_merge_if_build_succeeds": false
}
```
@ -448,6 +451,7 @@ Parameters:
- `visibility_level` (optional)
- `import_url` (optional)
- `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
### Create project for user
@ -473,6 +477,7 @@ Parameters:
- `visibility_level` (optional)
- `import_url` (optional)
- `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
### Edit project
@ -499,6 +504,7 @@ Parameters:
- `public` (optional) - if `true` same as setting visibility_level = 20
- `visibility_level` (optional)
- `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
On success, method returns 200 with the updated project. If parameters are
invalid, 400 is returned.
@ -577,7 +583,8 @@ Example response:
"forks_count": 0,
"star_count": 1,
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}
```
@ -643,7 +650,8 @@ Example response:
"forks_count": 0,
"star_count": 0,
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}
```
@ -729,7 +737,8 @@ Example response:
"star_count": 0,
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}
```
@ -815,7 +824,8 @@ Example response:
"star_count": 0,
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"public_builds": true,
"shared_with_groups": []
"shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}
```

View file

@ -90,6 +90,7 @@ module API
expose :shared_with_groups do |project, options|
SharedGroup.represent(project.project_group_links.all, options)
end
expose :only_allow_merge_if_build_succeeds
end
class Member < UserBasic

View file

@ -123,7 +123,8 @@ module API
:public,
:visibility_level,
:import_url,
:public_builds]
:public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs)
@project = ::Projects::CreateService.new(current_user, attrs).execute
if @project.saved?
@ -172,7 +173,8 @@ module API
:public,
:visibility_level,
:import_url,
:public_builds]
:public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs)
@project = ::Projects::CreateService.new(user, attrs).execute
if @project.saved?
@ -234,7 +236,8 @@ module API
:shared_runners_enabled,
:public,
:visibility_level,
:public_builds]
:public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs)
authorize_admin_project
authorize! :rename_project, user_project if attrs[:name].present?

File diff suppressed because one or more lines are too long

View file

@ -224,7 +224,8 @@ describe API::API, api: true do
description: FFaker::Lorem.sentence,
issues_enabled: false,
merge_requests_enabled: false,
wiki_enabled: false
wiki_enabled: false,
only_allow_merge_if_build_succeeds: false
})
post api('/projects', user), project
@ -276,6 +277,18 @@ describe API::API, api: true do
expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
end
it 'sets a project as allowing merge even if build fails' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: false })
post api('/projects', user), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_falsey
end
it 'sets a project as allowing merge only if build succeeds' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: true })
post api('/projects', user), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_truthy
end
context 'when a visibility level is restricted' do
before do
@project = attributes_for(:project, { public: true })
@ -384,6 +397,18 @@ describe API::API, api: true do
expect(json_response['public']).to be_falsey
expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
end
it 'sets a project as allowing merge even if build fails' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: false })
post api("/projects/user/#{user.id}", admin), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_falsey
end
it 'sets a project as allowing merge only if build succeeds' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: true })
post api("/projects/user/#{user.id}", admin), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_truthy
end
end
describe "POST /projects/:id/uploads" do
@ -444,6 +469,7 @@ describe API::API, api: true do
expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id)
expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name)
expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
expect(json_response['only_allow_merge_if_build_succeeds']).to eq(project.only_allow_merge_if_build_succeeds)
end
it 'returns a project by path name' do