Commit 6fdd9008272f268b05aa498a79dc200da52f7bbc

Authored by Dmitriy Zaporozhets
2 parents ec837932 28de31f5

Merge pull request #7014 from asedge/api_create_tag

Add CreateTagService.  Use new service to allow tag creation through API.
app/controllers/projects/tags_controller.rb
@@ -13,11 +13,8 @@ class Projects::TagsController < Projects::ApplicationController @@ -13,11 +13,8 @@ class Projects::TagsController < Projects::ApplicationController
13 end 13 end
14 14
15 def create 15 def create
16 - @repository.add_tag(params[:tag_name], params[:ref])  
17 -  
18 - if new_tag = @repository.find_tag(params[:tag_name])  
19 - Event.create_ref_event(@project, current_user, new_tag, 'add', 'refs/tags')  
20 - end 16 + @tag = CreateTagService.new.execute(@project, params[:tag_name],
  17 + params[:ref], current_user)
21 18
22 redirect_to project_tags_path(@project) 19 redirect_to project_tags_path(@project)
23 end 20 end
app/services/create_tag_service.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +class CreateTagService
  2 + def execute(project, tag_name, ref, current_user)
  3 + repository = project.repository
  4 + repository.add_tag(tag_name, ref)
  5 + new_tag = repository.find_tag(tag_name)
  6 +
  7 + if new_tag
  8 + Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags')
  9 + end
  10 +
  11 + new_tag
  12 + end
  13 +end
doc/api/repositories.md
@@ -37,6 +37,40 @@ Parameters: @@ -37,6 +37,40 @@ Parameters:
37 ] 37 ]
38 ``` 38 ```
39 39
  40 +## Create a new tag
  41 +
  42 +Creates new tag in the repository that points to the supplied ref.
  43 +
  44 +```
  45 +POST /projects/:id/repository/tags
  46 +```
  47 +
  48 +Parameters:
  49 +
  50 ++ `id` (required) - The ID of a project
  51 ++ `tag_name` (required) - The name of a tag
  52 ++ `ref` (required) - Create tag using commit sha, another tag name, or branch name.
  53 +
  54 +```json
  55 +[
  56 + {
  57 + "name": "v1.0.0",
  58 + "commit": {
  59 + "id": "2695effb5807a22ff3d138d593fd856244e155e7",
  60 + "parents": [],
  61 + "message": "Initial commit",
  62 + "authored_date": "2012-05-28T04:42:42-07:00",
  63 + "author_name": "John Smith",
  64 + "author email": "john@example.com",
  65 + "committer_name": "Jack Smith",
  66 + "committed_date": "2012-05-28T04:42:42-07:00",
  67 + "committer_email": "jack@example.com"
  68 + },
  69 + "protected": false
  70 + }
  71 +]
  72 +```
  73 +
40 ## List repository tree 74 ## List repository tree
41 75
42 Get a list of repository files and directories in a project. 76 Get a list of repository files and directories in a project.
lib/api/repositories.rb
@@ -26,6 +26,22 @@ module API @@ -26,6 +26,22 @@ module API
26 present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project 26 present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project
27 end 27 end
28 28
  29 + # Create tag
  30 + #
  31 + # Parameters:
  32 + # id (required) - The ID of a project
  33 + # tag_name (required) - The name of the tag
  34 + # ref (required) - Create tag from commit sha or branch
  35 + # Example Request:
  36 + # POST /projects/:id/repository/tags
  37 + post ':id/repository/tags' do
  38 + authorize_push_project
  39 + @tag = CreateTagService.new.execute(user_project, params[:tag_name],
  40 + params[:ref], current_user)
  41 +
  42 + present @tag, with: Entities::RepoObject, project: user_project
  43 + end
  44 +
29 # Get a project repository tree 45 # Get a project repository tree
30 # 46 #
31 # Parameters: 47 # Parameters:
spec/requests/api/repositories_spec.rb
@@ -23,6 +23,24 @@ describe API::API, api: true do @@ -23,6 +23,24 @@ describe API::API, api: true do
23 end 23 end
24 end 24 end
25 25
  26 + describe 'POST /projects/:id/repository/tags' do
  27 + it 'should create a new tag' do
  28 + post api("/projects/#{project.id}/repository/tags", user),
  29 + tag_name: 'v1.0.0',
  30 + ref: 'master'
  31 +
  32 + response.status.should == 201
  33 + json_response['name'].should == 'v1.0.0'
  34 + end
  35 + it 'should deny for user without push access' do
  36 + post api("/projects/#{project.id}/repository/tags", user2),
  37 + tag_name: 'v1.0.0',
  38 + ref: '621491c677087aa243f165eab467bfdfbee00be1'
  39 +
  40 + response.status.should == 403
  41 + end
  42 + end
  43 +
26 describe "GET /projects/:id/repository/tree" do 44 describe "GET /projects/:id/repository/tree" do
27 context "authorized user" do 45 context "authorized user" do
28 before { project.team << [user2, :reporter] } 46 before { project.team << [user2, :reporter] }