summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schilling <rschilling@student.tugraz.at>2015-11-21 22:34:53 +0100
committerRobert Schilling <rschilling@student.tugraz.at>2015-11-21 22:34:53 +0100
commit04a3d27eaba0312d99e8d88a3a9ee4b5c83ecce1 (patch)
tree76edf025912fa34c1942f98deefb406148953842
parent3ea05c5b5b253de33d8bf8d615c66e2935b940ef (diff)
downloadgitlab-ce-04a3d27eaba0312d99e8d88a3a9ee4b5c83ecce1.tar.gz
Allow editing a release in API via PUT method
-rw-r--r--app/services/create_release_service.rb2
-rw-r--r--app/services/update_release_service.rb29
-rw-r--r--doc/api/tags.md23
-rw-r--r--lib/api/tags.rb21
-rw-r--r--spec/requests/api/tags_spec.rb38
5 files changed, 112 insertions, 1 deletions
diff --git a/app/services/create_release_service.rb b/app/services/create_release_service.rb
index 54e87478e64..e06a6f2f47a 100644
--- a/app/services/create_release_service.rb
+++ b/app/services/create_release_service.rb
@@ -10,7 +10,7 @@ class CreateReleaseService < BaseService
if existing_tag
release = project.releases.find_by(tag: tag_name)
- if(release)
+ if release
error('Release already exists', 409)
else
release = project.releases.new({ tag: tag_name, description: release_description })
diff --git a/app/services/update_release_service.rb b/app/services/update_release_service.rb
new file mode 100644
index 00000000000..25eb13ef09a
--- /dev/null
+++ b/app/services/update_release_service.rb
@@ -0,0 +1,29 @@
+require_relative 'base_service'
+
+class UpdateReleaseService < BaseService
+ def execute(tag_name, release_description)
+
+ repository = project.repository
+ existing_tag = repository.find_tag(tag_name)
+
+ if existing_tag
+ release = project.releases.find_by(tag: tag_name)
+
+ if release
+ release.update_attributes(description: release_description)
+
+ success(release)
+ else
+ error('Release does not exist', 404)
+ end
+ else
+ error('Tag does not exist', 404)
+ end
+ end
+
+ def success(release)
+ out = super()
+ out[:release] = release
+ out
+ end
+end
diff --git a/doc/api/tags.md b/doc/api/tags.md
index bc61aa1118f..085d387e824 100644
--- a/doc/api/tags.md
+++ b/doc/api/tags.md
@@ -106,3 +106,26 @@ Parameters:
"description": "Amazing release. Wow"
}
```
+
+## Update a release
+
+Updates the release notes of a given release. It returns 200 if the release is
+successfully updated. If the tag or the release does not exist, it returns 404
+with a proper error message.
+
+```
+PUT /projects/:id/repository/tags/:tag_name/release
+```
+
+Parameters:
+
+- `id` (required) - The ID of a project
+- `tag_name` (required) - The name of a tag
+- `description` (required) - Release notes with markdown support
+
+```json
+{
+ "tag_name": "1.0.0",
+ "description": "Amazing release. Wow"
+}
+``` \ No newline at end of file
diff --git a/lib/api/tags.rb b/lib/api/tags.rb
index e46d9bb96f0..47621f443e6 100644
--- a/lib/api/tags.rb
+++ b/lib/api/tags.rb
@@ -60,6 +60,27 @@ module API
render_api_error!(result[:message], result[:http_status])
end
end
+
+ # Updates a release notes of a tag
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # tag_name (required) - The name of the tag
+ # description (required) - Release notes with markdown support
+ # Example Request:
+ # PUT /projects/:id/repository/tags/:tag_name/release
+ put ':id/repository/tags/:tag_name/release', requirements: { tag_name: /.*/ } do
+ authorize_push_project
+ required_attributes! [:description]
+ result = UpdateReleaseService.new(user_project, current_user).
+ execute(params[:tag_name], params[:description])
+
+ if result[:status] == :success
+ present result[:release], with: Entities::Release
+ else
+ render_api_error!(result[:message], result[:http_status])
+ end
+ end
end
end
end
diff --git a/spec/requests/api/tags_spec.rb b/spec/requests/api/tags_spec.rb
index 0a456fc3b5d..17f2643fd45 100644
--- a/spec/requests/api/tags_spec.rb
+++ b/spec/requests/api/tags_spec.rb
@@ -155,4 +155,42 @@ describe API::API, api: true do
end
end
end
+
+ describe 'PUT id/repository/tags/:tag_name/release' do
+ let(:tag_name) { project.repository.tag_names.first }
+ let(:description) { 'Awesome release!' }
+ let(:new_description) { 'The best release!' }
+
+ context 'on tag with existing release' do
+ before do
+ release = project.releases.find_or_initialize_by(tag: tag_name)
+ release.update_attributes(description: description)
+ end
+
+ it 'should update the release description' do
+ put api("/projects/#{project.id}/repository/tags/#{tag_name}/release", user),
+ description: new_description
+
+ expect(response.status).to eq(200)
+ expect(json_response['tag_name']).to eq(tag_name)
+ expect(json_response['description']).to eq(new_description)
+ end
+ end
+
+ it 'should return 404 if the tag does not exist' do
+ put api("/projects/#{project.id}/repository/tags/foobar/release", user),
+ description: new_description
+
+ expect(response.status).to eq(404)
+ expect(json_response['message']).to eq('Tag does not exist')
+ end
+
+ it 'should return 404 if the release does not exist' do
+ put api("/projects/#{project.id}/repository/tags/#{tag_name}/release", user),
+ description: new_description
+
+ expect(response.status).to eq(404)
+ expect(json_response['message']).to eq('Release does not exist')
+ end
+ end
end