Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-07-14 01:39:24 +0300
committerStan Hu <stanhu@gmail.com>2018-07-14 01:39:24 +0300
commitc793252e8b33a1b7d071aca90c9c05e54ad973b5 (patch)
tree238d0c479817abd68c23212e44d6484d27f9bb04
parentec4109d413f6161b43ad4cc1a6251af30d3bcf03 (diff)
Add support for deleting branches via the Bitbucket Server API
-rw-r--r--lib/bitbucket_server/client.rb9
-rw-r--r--lib/bitbucket_server/connection.rb27
-rw-r--r--spec/lib/bitbucket_server/connection_spec.rb20
3 files changed, 55 insertions, 1 deletions
diff --git a/lib/bitbucket_server/client.rb b/lib/bitbucket_server/client.rb
index 802fe7953ce..bfa8301f643 100644
--- a/lib/bitbucket_server/client.rb
+++ b/lib/bitbucket_server/client.rb
@@ -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)
diff --git a/lib/bitbucket_server/connection.rb b/lib/bitbucket_server/connection.rb
index 853d09b776a..0b65203a824 100644
--- a/lib/bitbucket_server/connection.rb
+++ b/lib/bitbucket_server/connection.rb
@@ -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
diff --git a/spec/lib/bitbucket_server/connection_spec.rb b/spec/lib/bitbucket_server/connection_spec.rb
index 45affbcf4e4..65c78f14f58 100644
--- a/spec/lib/bitbucket_server/connection_spec.rb
+++ b/spec/lib/bitbucket_server/connection_spec.rb
@@ -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