Commit 6fdd9008272f268b05aa498a79dc200da52f7bbc
Exists in
spb-stable
and in
2 other branches
Merge pull request #7014 from asedge/api_create_tag
Add CreateTagService. Use new service to allow tag creation through API.
Showing
5 changed files
with
83 additions
and
5 deletions
Show diff stats
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 |
@@ -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] } |