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 | # 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 | ## List repository tree | ||||||
| 
 | 
 | ||||||
| Get a list of repository files and directories in a project. | 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 Labels | ||||||
|     mount Settings |     mount Settings | ||||||
|     mount Keys |     mount Keys | ||||||
|  |     mount Tags | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -16,41 +16,6 @@ module API | ||||||
|         end |         end | ||||||
|       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 |       # Get a project repository tree | ||||||
|       # |       # | ||||||
|       # Parameters: |       # 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!(: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) } |   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 |   describe "GET /projects/:id/repository/tree" do | ||||||
|     context "authorized user" do |     context "authorized user" do | ||||||
|       before { project.team << [user2, :reporter] } |       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