Add support for deleting branches via the Bitbucket Server API

This commit is contained in:
Stan Hu 2018-07-13 15:39:24 -07:00
parent ec4109d413
commit c793252e8b
3 changed files with 55 additions and 1 deletions

View File

@ -36,6 +36,15 @@ module BitbucketServer
connection.post("/projects/#{project_key}/repos/#{repo}/branches", payload.to_json)
end
def delete_branch(project_key, repo, branch_name, sha)
payload = {
name: Gitlab::Git::BRANCH_REF_PREFIX + branch_name,
dryRun: false
}
connection.delete(:branches, "/projects/#{project_key}/repos/#{repo}/branches", payload.to_json)
end
private
def get_collection(path, type)

View File

@ -36,10 +36,27 @@ module BitbucketServer
response.parsed_response
end
# We need to support two different APIs for deletion:
#
# /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/branches/default
# /rest/branch-utils/1.0/projects/{projectKey}/repos/{repositorySlug}/branches
def delete(resource, path, body)
url = delete_url(resource, path)
response = Gitlab::HTTP.delete(url,
basic_auth: auth,
headers: post_headers,
body: body)
check_errors!(response)
response.parsed_response
end
private
def check_errors!(response)
return if response.code == 200
return if response.code >= 200 && response.code < 300
details =
if response.parsed_response && response.parsed_response.is_a?(Hash)
@ -68,5 +85,13 @@ module BitbucketServer
def root_url
"#{base_uri}/rest/api/#{api_version}"
end
def delete_url(resource, path)
if resource == :branches
"#{base_uri}/branch-utils/#{api_version}#{path}"
else
build_url(path)
end
end
end
end

View File

@ -35,4 +35,24 @@ describe BitbucketServer::Connection do
expect { subject.post(url, payload) }.to raise_error(described_class::ConnectionError)
end
end
describe '#delete' do
context 'branch API' do
let(:branch_path) { '/projects/foo/repos/bar/branches' }
let(:branch_url) { 'https://test:7990/branch-utils/1.0/projects/foo/repos/bar/branches' }
let(:path) { }
it 'returns JSON body' do
WebMock.stub_request(:delete, branch_url).to_return(body: payload.to_json, status: 200, headers: headers)
expect(subject.delete(:branches, branch_path, payload)).to eq(payload)
end
it 'throws an exception if the response is not 200' do
WebMock.stub_request(:delete, branch_url).to_return(body: payload.to_json, status: 500, headers: headers)
expect { subject.delete(:branches, branch_path, payload) }.to raise_error(described_class::ConnectionError)
end
end
end
end