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
7 changed files with 209 additions and 184 deletions
|
@ -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.
|
||||
|
|
75
doc/api/tags.md
Normal file
75
doc/api/tags.md
Normal file
|
@ -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:
|
||||
|
|
44
lib/api/tags.rb
Normal file
44
lib/api/tags.rb
Normal file
|
@ -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] }
|
||||
|
|
89
spec/requests/api/tags_spec.rb
Normal file
89
spec/requests/api/tags_spec.rb
Normal file
|
@ -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 a new issue