Move git tags API to separate file
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
		
							parent
							
								
									2ac1193720
								
							
						
					
					
						commit
						a5ab56fd91
					
				|  | @ -1,79 +1,5 @@ | |||
| # Repositories | ||||
| 
 | ||||
| ## List project repository tags | ||||
| 
 | ||||
| Get a list of repository tags from a project, sorted by name in reverse alphabetical order. | ||||
| 
 | ||||
| ``` | ||||
| GET /projects/:id/repository/tags | ||||
| ``` | ||||
| 
 | ||||
| Parameters: | ||||
| 
 | ||||
| - `id` (required) - The ID of a project | ||||
| 
 | ||||
| ```json | ||||
| [ | ||||
|   { | ||||
|     "commit": { | ||||
|       "author_name": "John Smith", | ||||
|       "author_email": "john@example.com", | ||||
|       "authored_date": "2012-05-28T04:42:42-07:00", | ||||
|       "committed_date": "2012-05-28T04:42:42-07:00", | ||||
|       "committer_name": "Jack Smith", | ||||
|       "committer_email": "jack@example.com", | ||||
|       "id": "2695effb5807a22ff3d138d593fd856244e155e7", | ||||
|       "message": "Initial commit", | ||||
|       "parents_ids": [ | ||||
|         "2a4b78934375d7f53875269ffd4f45fd83a84ebe" | ||||
|       ] | ||||
|     }, | ||||
|     "name": "v1.0.0", | ||||
|     "message": null | ||||
|   } | ||||
| ] | ||||
| ``` | ||||
| 
 | ||||
| ## Create a new tag | ||||
| 
 | ||||
| Creates new tag in the repository that points to the supplied ref. | ||||
| 
 | ||||
| ``` | ||||
| POST /projects/:id/repository/tags | ||||
| ``` | ||||
| 
 | ||||
| Parameters: | ||||
| 
 | ||||
| - `id` (required) - The ID of a project | ||||
| - `tag_name` (required) - The name of a tag | ||||
| - `ref` (required) - Create tag using commit SHA, another tag name, or branch name. | ||||
| - `message` (optional) - Creates annotated tag. | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|   "commit": { | ||||
|     "author_name": "John Smith", | ||||
|     "author_email": "john@example.com", | ||||
|     "authored_date": "2012-05-28T04:42:42-07:00", | ||||
|     "committed_date": "2012-05-28T04:42:42-07:00", | ||||
|     "committer_name": "Jack Smith", | ||||
|     "committer_email": "jack@example.com", | ||||
|     "id": "2695effb5807a22ff3d138d593fd856244e155e7", | ||||
|     "message": "Initial commit", | ||||
|     "parents_ids": [ | ||||
|       "2a4b78934375d7f53875269ffd4f45fd83a84ebe" | ||||
|     ] | ||||
|   }, | ||||
|   "name": "v1.0.0", | ||||
|   "message": null | ||||
| } | ||||
| ``` | ||||
| The message will be `nil` when creating a lightweight tag otherwise | ||||
| it will contain the annotation. | ||||
| 
 | ||||
| It returns 200 if the operation succeed. In case of an error, | ||||
| 405 with an explaining error message is returned. | ||||
| 
 | ||||
| ## List repository tree | ||||
| 
 | ||||
| Get a list of repository files and directories in a project. | ||||
|  |  | |||
|  | @ -0,0 +1,75 @@ | |||
| # Tags | ||||
| 
 | ||||
| ## List project repository tags | ||||
| 
 | ||||
| Get a list of repository tags from a project, sorted by name in reverse alphabetical order. | ||||
| 
 | ||||
| ``` | ||||
| GET /projects/:id/repository/tags | ||||
| ``` | ||||
| 
 | ||||
| Parameters: | ||||
| 
 | ||||
| - `id` (required) - The ID of a project | ||||
| 
 | ||||
| ```json | ||||
| [ | ||||
|   { | ||||
|     "commit": { | ||||
|       "author_name": "John Smith", | ||||
|       "author_email": "john@example.com", | ||||
|       "authored_date": "2012-05-28T04:42:42-07:00", | ||||
|       "committed_date": "2012-05-28T04:42:42-07:00", | ||||
|       "committer_name": "Jack Smith", | ||||
|       "committer_email": "jack@example.com", | ||||
|       "id": "2695effb5807a22ff3d138d593fd856244e155e7", | ||||
|       "message": "Initial commit", | ||||
|       "parents_ids": [ | ||||
|         "2a4b78934375d7f53875269ffd4f45fd83a84ebe" | ||||
|       ] | ||||
|     }, | ||||
|     "name": "v1.0.0", | ||||
|     "message": null | ||||
|   } | ||||
| ] | ||||
| ``` | ||||
| 
 | ||||
| ## Create a new tag | ||||
| 
 | ||||
| Creates new tag in the repository that points to the supplied ref. | ||||
| 
 | ||||
| ``` | ||||
| POST /projects/:id/repository/tags | ||||
| ``` | ||||
| 
 | ||||
| Parameters: | ||||
| 
 | ||||
| - `id` (required) - The ID of a project | ||||
| - `tag_name` (required) - The name of a tag | ||||
| - `ref` (required) - Create tag using commit SHA, another tag name, or branch name. | ||||
| - `message` (optional) - Creates annotated tag. | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|   "commit": { | ||||
|     "author_name": "John Smith", | ||||
|     "author_email": "john@example.com", | ||||
|     "authored_date": "2012-05-28T04:42:42-07:00", | ||||
|     "committed_date": "2012-05-28T04:42:42-07:00", | ||||
|     "committer_name": "Jack Smith", | ||||
|     "committer_email": "jack@example.com", | ||||
|     "id": "2695effb5807a22ff3d138d593fd856244e155e7", | ||||
|     "message": "Initial commit", | ||||
|     "parents_ids": [ | ||||
|       "2a4b78934375d7f53875269ffd4f45fd83a84ebe" | ||||
|     ] | ||||
|   }, | ||||
|   "name": "v1.0.0", | ||||
|   "message": null | ||||
| } | ||||
| ``` | ||||
| The message will be `nil` when creating a lightweight tag otherwise | ||||
| it will contain the annotation. | ||||
| 
 | ||||
| It returns 200 if the operation succeed. In case of an error, | ||||
| 405 with an explaining error message is returned. | ||||
|  | @ -52,5 +52,6 @@ module API | |||
|     mount Labels | ||||
|     mount Settings | ||||
|     mount Keys | ||||
|     mount Tags | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -16,41 +16,6 @@ module API | |||
|         end | ||||
|       end | ||||
| 
 | ||||
|       # Get a project repository tags | ||||
|       # | ||||
|       # Parameters: | ||||
|       #   id (required) - The ID of a project | ||||
|       # Example Request: | ||||
|       #   GET /projects/:id/repository/tags | ||||
|       get ":id/repository/tags" do | ||||
|         present user_project.repo.tags.sort_by(&:name).reverse, | ||||
|                 with: Entities::RepoTag, project: user_project | ||||
|       end | ||||
| 
 | ||||
|       # Create tag | ||||
|       # | ||||
|       # Parameters: | ||||
|       #   id (required) - The ID of a project | ||||
|       #   tag_name (required) - The name of the tag | ||||
|       #   ref (required) - Create tag from commit sha or branch | ||||
|       #   message (optional) - Specifying a message creates an annotated tag. | ||||
|       # Example Request: | ||||
|       #   POST /projects/:id/repository/tags | ||||
|       post ':id/repository/tags' do | ||||
|         authorize_push_project | ||||
|         message = params[:message] || nil | ||||
|         result = CreateTagService.new(user_project, current_user). | ||||
|           execute(params[:tag_name], params[:ref], message) | ||||
| 
 | ||||
|         if result[:status] == :success | ||||
|           present result[:tag], | ||||
|                   with: Entities::RepoTag, | ||||
|                   project: user_project | ||||
|         else | ||||
|           render_api_error!(result[:message], 400) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       # Get a project repository tree | ||||
|       # | ||||
|       # Parameters: | ||||
|  |  | |||
|  | @ -0,0 +1,44 @@ | |||
| module API | ||||
|   # Releases API | ||||
|   class Tags < Grape::API | ||||
|     before { authenticate! } | ||||
|     before { authorize! :download_code, user_project } | ||||
| 
 | ||||
|     resource :projects do | ||||
|       # Get a project repository tags | ||||
|       # | ||||
|       # Parameters: | ||||
|       #   id (required) - The ID of a project | ||||
|       # Example Request: | ||||
|       #   GET /projects/:id/repository/tags | ||||
|       get ":id/repository/tags" do | ||||
|         present user_project.repo.tags.sort_by(&:name).reverse, | ||||
|                 with: Entities::RepoTag, project: user_project | ||||
|       end | ||||
| 
 | ||||
|       # Create tag | ||||
|       # | ||||
|       # Parameters: | ||||
|       #   id (required) - The ID of a project | ||||
|       #   tag_name (required) - The name of the tag | ||||
|       #   ref (required) - Create tag from commit sha or branch | ||||
|       #   message (optional) - Specifying a message creates an annotated tag. | ||||
|       # Example Request: | ||||
|       #   POST /projects/:id/repository/tags | ||||
|       post ':id/repository/tags' do | ||||
|         authorize_push_project | ||||
|         message = params[:message] || nil | ||||
|         result = CreateTagService.new(user_project, current_user). | ||||
|           execute(params[:tag_name], params[:ref], message) | ||||
| 
 | ||||
|         if result[:status] == :success | ||||
|           present result[:tag], | ||||
|                   with: Entities::RepoTag, | ||||
|                   project: user_project | ||||
|         else | ||||
|           render_api_error!(result[:message], 400) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -11,81 +11,6 @@ describe API::API, api: true  do | |||
|   let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } | ||||
|   let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) } | ||||
| 
 | ||||
|   describe "GET /projects/:id/repository/tags" do | ||||
|     it "should return an array of project tags" do | ||||
|       get api("/projects/#{project.id}/repository/tags", user) | ||||
|       expect(response.status).to eq(200) | ||||
|       expect(json_response).to be_an Array | ||||
|       expect(json_response.first['name']).to eq(project.repo.tags.sort_by(&:name).reverse.first.name) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST /projects/:id/repository/tags' do | ||||
|     context 'lightweight tags' do | ||||
|       it 'should create a new tag' do | ||||
|         post api("/projects/#{project.id}/repository/tags", user), | ||||
|              tag_name: 'v7.0.1', | ||||
|              ref: 'master' | ||||
| 
 | ||||
|         expect(response.status).to eq(201) | ||||
|         expect(json_response['name']).to eq('v7.0.1') | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'annotated tag' do | ||||
|       it 'should create a new annotated tag' do | ||||
|         # Identity must be set in .gitconfig to create annotated tag. | ||||
|         repo_path = project.repository.path_to_repo | ||||
|         system(*%W(#{Gitlab.config.git.bin_path} --git-dir=#{repo_path} config user.name #{user.name})) | ||||
|         system(*%W(#{Gitlab.config.git.bin_path} --git-dir=#{repo_path} config user.email #{user.email})) | ||||
| 
 | ||||
|         post api("/projects/#{project.id}/repository/tags", user), | ||||
|              tag_name: 'v7.1.0', | ||||
|              ref: 'master', | ||||
|              message: 'Release 7.1.0' | ||||
| 
 | ||||
|         expect(response.status).to eq(201) | ||||
|         expect(json_response['name']).to eq('v7.1.0') | ||||
|         expect(json_response['message']).to eq('Release 7.1.0') | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'should deny for user without push access' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user2), | ||||
|            tag_name: 'v1.9.0', | ||||
|            ref: '621491c677087aa243f165eab467bfdfbee00be1' | ||||
|       expect(response.status).to eq(403) | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if tag name is invalid' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v 1.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Tag name invalid') | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if tag already exists' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v8.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(201) | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v8.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Tag already exists') | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if ref name is invalid' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'mytag', | ||||
|            ref: 'foo' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Invalid reference name') | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe "GET /projects/:id/repository/tree" do | ||||
|     context "authorized user" do | ||||
|       before { project.team << [user2, :reporter] } | ||||
|  |  | |||
|  | @ -0,0 +1,89 @@ | |||
| require 'spec_helper' | ||||
| require 'mime/types' | ||||
| 
 | ||||
| describe API::API, api: true  do | ||||
|   include ApiHelpers | ||||
|   include RepoHelpers | ||||
| 
 | ||||
|   let(:user) { create(:user) } | ||||
|   let(:user2) { create(:user) } | ||||
|   let!(:project) { create(:project, creator_id: user.id) } | ||||
|   let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } | ||||
|   let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) } | ||||
| 
 | ||||
| 
 | ||||
|   describe "GET /projects/:id/repository/tags" do | ||||
|     it "should return an array of project tags" do | ||||
|       get api("/projects/#{project.id}/repository/tags", user) | ||||
|       expect(response.status).to eq(200) | ||||
|       expect(json_response).to be_an Array | ||||
|       expect(json_response.first['name']).to eq(project.repo.tags.sort_by(&:name).reverse.first.name) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST /projects/:id/repository/tags' do | ||||
|     context 'lightweight tags' do | ||||
|       it 'should create a new tag' do | ||||
|         post api("/projects/#{project.id}/repository/tags", user), | ||||
|              tag_name: 'v7.0.1', | ||||
|              ref: 'master' | ||||
| 
 | ||||
|         expect(response.status).to eq(201) | ||||
|         expect(json_response['name']).to eq('v7.0.1') | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     context 'annotated tag' do | ||||
|       it 'should create a new annotated tag' do | ||||
|         # Identity must be set in .gitconfig to create annotated tag. | ||||
|         repo_path = project.repository.path_to_repo | ||||
|         system(*%W(#{Gitlab.config.git.bin_path} --git-dir=#{repo_path} config user.name #{user.name})) | ||||
|         system(*%W(#{Gitlab.config.git.bin_path} --git-dir=#{repo_path} config user.email #{user.email})) | ||||
| 
 | ||||
|         post api("/projects/#{project.id}/repository/tags", user), | ||||
|              tag_name: 'v7.1.0', | ||||
|              ref: 'master', | ||||
|              message: 'Release 7.1.0' | ||||
| 
 | ||||
|         expect(response.status).to eq(201) | ||||
|         expect(json_response['name']).to eq('v7.1.0') | ||||
|         expect(json_response['message']).to eq('Release 7.1.0') | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'should deny for user without push access' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user2), | ||||
|            tag_name: 'v1.9.0', | ||||
|            ref: '621491c677087aa243f165eab467bfdfbee00be1' | ||||
|       expect(response.status).to eq(403) | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if tag name is invalid' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v 1.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Tag name invalid') | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if tag already exists' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v8.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(201) | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'v8.0.0', | ||||
|            ref: 'master' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Tag already exists') | ||||
|     end | ||||
| 
 | ||||
|     it 'should return 400 if ref name is invalid' do | ||||
|       post api("/projects/#{project.id}/repository/tags", user), | ||||
|            tag_name: 'mytag', | ||||
|            ref: 'foo' | ||||
|       expect(response.status).to eq(400) | ||||
|       expect(json_response['message']).to eq('Invalid reference name') | ||||
|     end | ||||
|   end | ||||
| end | ||||
		Loading…
	
		Reference in New Issue