Commit bc26b06e authored by Sean McGivern's avatar Sean McGivern Committed by Alejandro Rodríguez

Merge branch 'issue_25030' into 'master'

Allow branch names with dots on API endpoint

closes #25030

See merge request !7963
parent a4a8ac21
---
title: Allow branch names with dots on API endpoint
merge_request:
author:
...@@ -23,9 +23,9 @@ module API ...@@ -23,9 +23,9 @@ module API
success Entities::RepoBranch success Entities::RepoBranch
end end
params do params do
requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch' requires :branch, type: String, desc: 'The name of the branch'
end end
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.find_branch(params[:branch])
not_found!("Branch") unless branch not_found!("Branch") unless branch
...@@ -39,11 +39,11 @@ module API ...@@ -39,11 +39,11 @@ module API
success Entities::RepoBranch success Entities::RepoBranch
end end
params do params do
requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch' requires :branch, type: String, desc: 'The name of the branch'
optional :developers_can_push, type: Boolean, desc: 'Flag if developers can push to that branch' optional :developers_can_push, type: Boolean, desc: 'Flag if developers can push to that branch'
optional :developers_can_merge, type: Boolean, desc: 'Flag if developers can merge to that branch' optional :developers_can_merge, type: Boolean, desc: 'Flag if developers can merge to that branch'
end end
put ':id/repository/branches/:branch/protect' do put ':id/repository/branches/:branch/protect', 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])
...@@ -76,9 +76,9 @@ module API ...@@ -76,9 +76,9 @@ module API
success Entities::RepoBranch success Entities::RepoBranch
end end
params do params do
requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch' requires :branch, type: String, desc: 'The name of the branch'
end end
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])
...@@ -112,9 +112,9 @@ module API ...@@ -112,9 +112,9 @@ module API
desc 'Delete a branch' desc 'Delete a branch'
params do params do
requires :branch, type: String, regexp: /.+/, desc: 'The name of the branch' requires :branch, type: String, desc: 'The name of the branch'
end end
delete ":id/repository/branches/:branch" do 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).
......
...@@ -11,6 +11,7 @@ describe API::API, api: true do ...@@ -11,6 +11,7 @@ describe API::API, api: true do
let!(:guest) { create(:project_member, :guest, user: user2, project: project) } let!(:guest) { create(:project_member, :guest, user: user2, project: project) }
let!(:branch_name) { 'feature' } let!(:branch_name) { 'feature' }
let!(:branch_sha) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } let!(:branch_sha) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' }
let!(:branch_with_dot) { CreateBranchService.new(project, user).execute("with.1.2.3", "master") }
describe "GET /projects/:id/repository/branches" do describe "GET /projects/:id/repository/branches" do
it "returns an array of project branches" do it "returns an array of project branches" do
...@@ -36,6 +37,13 @@ describe API::API, api: true do ...@@ -36,6 +37,13 @@ describe API::API, api: true do
expect(json_response['developers_can_merge']).to eq(false) expect(json_response['developers_can_merge']).to eq(false)
end end
it "returns the branch information for a single branch with dots in the name" do
get api("/projects/#{project.id}/repository/branches/with.1.2.3", user)
expect(response).to have_http_status(200)
expect(json_response['name']).to eq("with.1.2.3")
end
it "returns a 403 error if guest" do it "returns a 403 error if guest" do
get api("/projects/#{project.id}/repository/branches", user2) get api("/projects/#{project.id}/repository/branches", user2)
expect(response).to have_http_status(403) expect(response).to have_http_status(403)
...@@ -60,6 +68,14 @@ describe API::API, api: true do ...@@ -60,6 +68,14 @@ describe API::API, api: true do
expect(json_response['developers_can_merge']).to eq(false) expect(json_response['developers_can_merge']).to eq(false)
end end
it "protects a single branch with dots in the name" do
put api("/projects/#{project.id}/repository/branches/with.1.2.3/protect", user)
expect(response).to have_http_status(200)
expect(json_response['name']).to eq("with.1.2.3")
expect(json_response['protected']).to eq(true)
end
it 'protects a single branch and developers can push' do it 'protects a single branch and developers can push' do
put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user), put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user),
developers_can_push: true developers_can_push: true
...@@ -209,6 +225,14 @@ describe API::API, api: true do ...@@ -209,6 +225,14 @@ describe API::API, api: true do
expect(json_response['protected']).to eq(false) expect(json_response['protected']).to eq(false)
end end
it "update branches with dots in branch name" do
put api("/projects/#{project.id}/repository/branches/with.1.2.3/unprotect", user)
expect(response).to have_http_status(200)
expect(json_response['name']).to eq("with.1.2.3")
expect(json_response['protected']).to eq(false)
end
it "returns success when unprotect branch" do it "returns success when unprotect branch" do
put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user) put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
expect(response).to have_http_status(404) expect(response).to have_http_status(404)
...@@ -281,6 +305,13 @@ describe API::API, api: true do ...@@ -281,6 +305,13 @@ describe API::API, api: true do
expect(json_response['branch_name']).to eq(branch_name) expect(json_response['branch_name']).to eq(branch_name)
end end
it "removes a branch with dots in the branch name" do
delete api("/projects/#{project.id}/repository/branches/with.1.2.3", user)
expect(response).to have_http_status(200)
expect(json_response['branch_name']).to eq("with.1.2.3")
end
it 'returns 404 if branch not exists' do it 'returns 404 if branch not exists' do
delete api("/projects/#{project.id}/repository/branches/foobar", user) delete api("/projects/#{project.id}/repository/branches/foobar", user)
expect(response).to have_http_status(404) expect(response).to have_http_status(404)
......
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