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
|
# 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.
|
||||||
|
|
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 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:
|
||||||
|
|
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!(: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] }
|
||||||
|
|
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