Commit a83d4d01 authored by Z.J. van de Weg's avatar Z.J. van de Weg Committed by Z.J. van de Weg

GrapeDSL for branches endpoints

parent b216d9bf
...@@ -6,58 +6,55 @@ module API ...@@ -6,58 +6,55 @@ module API
before { authenticate! } before { authenticate! }
before { authorize! :download_code, user_project } before { authorize! :download_code, user_project }
params do
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects do resource :projects do
# Get a project repository branches desc 'Get a project repository branches' do
# success Entities::RepoBranch
# Parameters: end
# id (required) - The ID of a project
# Example Request:
# GET /projects/:id/repository/branches
get ":id/repository/branches" do get ":id/repository/branches" do
branches = user_project.repository.branches.sort_by(&:name) branches = user_project.repository.branches.sort_by(&:name)
present branches, with: Entities::RepoBranch, project: user_project present branches, with: Entities::RepoBranch, project: user_project
end end
# Get a single branch desc 'Get a single branch' do
# success Entities::RepoBranch
# Parameters: end
# id (required) - The ID of a project params do
# branch (required) - The name of the branch requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch'
# Example Request: end
# GET /projects/:id/repository/branches/:branch get ':id/repository/branches/:branch' do
get ':id/repository/branches/:branch', requirements: { branch: /.+/ } do branch = user_project.repository.find_branch(params[:branch])
@branch = user_project.repository.branches.find { |item| item.name == params[:branch] } not_found!("Branch") unless branch
not_found!("Branch") unless @branch
present @branch, with: Entities::RepoBranch, project: user_project present branch, with: Entities::RepoBranch, project: user_project
end end
# Protect a single branch
#
# Note: The internal data model moved from `developers_can_{merge,push}` to `allowed_to_{merge,push}` # Note: The internal data model moved from `developers_can_{merge,push}` to `allowed_to_{merge,push}`
# in `gitlab-org/gitlab-ce!5081`. The API interface has not been changed (to maintain compatibility), # in `gitlab-org/gitlab-ce!5081`. The API interface has not been changed (to maintain compatibility),
# but it works with the changed data model to infer `developers_can_merge` and `developers_can_push`. # but it works with the changed data model to infer `developers_can_merge` and `developers_can_push`.
# desc 'Protect a single branch' do
# Parameters: success Entities::RepoBranch
# id (required) - The ID of a project end
# branch (required) - The name of the branch params do
# developers_can_push (optional) - Flag if developers can push to that branch requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch'
# developers_can_merge (optional) - Flag if developers can merge to that branch optional :developers_can_push, type: Boolean, desc: 'Flag if developers can push to that branch'
# Example Request: optional :developers_can_merge, type: Boolean, desc: 'Flag if developers can merge to that branch'
# PUT /projects/:id/repository/branches/:branch/protect end
put ':id/repository/branches/:branch/protect', put ':id/repository/branches/:branch/protect' do
requirements: { branch: /.+/ } do
authorize_admin_project authorize_admin_project
@branch = user_project.repository.find_branch(params[:branch]) branch = user_project.repository.find_branch(params[:branch])
not_found!('Branch') unless @branch not_found!('Branch') unless branch
protected_branch = user_project.protected_branches.find_by(name: @branch.name)
protected_branch = user_project.protected_branches.find_by(name: branch.name)
protected_branch_params = { protected_branch_params = {
name: @branch.name, name: branch.name,
developers_can_push: to_boolean(params[:developers_can_push]), developers_can_push: params[:developers_can_push],
developers_can_merge: to_boolean(params[:developers_can_merge]) developers_can_merge: params[:developers_can_merge]
} }
service_args = [user_project, current_user, protected_branch_params] service_args = [user_project, current_user, protected_branch_params]
...@@ -69,39 +66,36 @@ module API ...@@ -69,39 +66,36 @@ module API
end end
if protected_branch.valid? if protected_branch.valid?
present @branch, with: Entities::RepoBranch, project: user_project present branch, with: Entities::RepoBranch, project: user_project
else else
render_api_error!(protected_branch.errors.full_messages, 422) render_api_error!(protected_branch.errors.full_messages, 422)
end end
end end
# Unprotect a single branch desc 'Unprotect a single branch' do
# success Entities::RepoBranch
# Parameters: end
# id (required) - The ID of a project params do
# branch (required) - The name of the branch requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch'
# Example Request: end
# PUT /projects/:id/repository/branches/:branch/unprotect put ':id/repository/branches/:branch/unprotect' do
put ':id/repository/branches/:branch/unprotect',
requirements: { branch: /.+/ } do
authorize_admin_project authorize_admin_project
@branch = user_project.repository.find_branch(params[:branch]) branch = user_project.repository.find_branch(params[:branch])
not_found!("Branch") unless @branch not_found!("Branch") unless branch
protected_branch = user_project.protected_branches.find_by(name: @branch.name) protected_branch = user_project.protected_branches.find_by(name: branch.name)
protected_branch.destroy if protected_branch protected_branch.destroy if protected_branch
present @branch, with: Entities::RepoBranch, project: user_project present branch, with: Entities::RepoBranch, project: user_project
end end
# Create branch desc 'Create branch' do
# success Entities::RepoBranch
# Parameters: end
# id (required) - The ID of a project params do
# branch_name (required) - The name of the branch requires :branch_name, type: String, desc: 'The name of the branch'
# ref (required) - Create branch from commit sha or existing branch requires :ref, type: String, desc: 'Create branch from commit sha or existing branch'
# Example Request: end
# POST /projects/:id/repository/branches
post ":id/repository/branches" do post ":id/repository/branches" do
authorize_push_project authorize_push_project
result = CreateBranchService.new(user_project, current_user). result = CreateBranchService.new(user_project, current_user).
...@@ -116,16 +110,13 @@ module API ...@@ -116,16 +110,13 @@ module API
end end
end end
# Delete branch desc 'Delete a branch'
# params do
# Parameters: requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch'
# id (required) - The ID of a project end
# branch (required) - The name of the branch delete ":id/repository/branches/:branch" do
# Example Request:
# DELETE /projects/:id/repository/branches/:branch
delete ":id/repository/branches/:branch",
requirements: { branch: /.+/ } do
authorize_push_project authorize_push_project
result = DeleteBranchService.new(user_project, current_user). result = DeleteBranchService.new(user_project, current_user).
execute(params[:branch]) execute(params[:branch])
......
...@@ -95,18 +95,6 @@ describe API::API, api: true do ...@@ -95,18 +95,6 @@ describe API::API, api: true do
expect(json_response['developers_can_push']).to eq(true) expect(json_response['developers_can_push']).to eq(true)
expect(json_response['developers_can_merge']).to eq(true) expect(json_response['developers_can_merge']).to eq(true)
end end
it 'protects a single branch and developers cannot push and merge' do
put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user),
developers_can_push: 'tru', developers_can_merge: 'tr'
expect(response).to have_http_status(200)
expect(json_response['name']).to eq(branch_name)
expect(json_response['commit']['id']).to eq(branch_sha)
expect(json_response['protected']).to eq(true)
expect(json_response['developers_can_push']).to eq(false)
expect(json_response['developers_can_merge']).to eq(false)
end
end end
context 'for an existing protected branch' do context 'for an existing protected branch' do
......
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