2013-12-20 14:12:44 -05:00
|
|
|
require 'mime/types'
|
|
|
|
|
2013-05-23 05:23:47 -04:00
|
|
|
module API
|
|
|
|
class Repositories < Grape::API
|
2017-01-16 23:45:07 -05:00
|
|
|
include PaginationParams
|
|
|
|
|
2013-09-29 09:04:57 -04:00
|
|
|
before { authorize! :download_code, user_project }
|
2013-05-23 05:23:47 -04:00
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
params do
|
|
|
|
requires :id, type: String, desc: 'The ID of a project'
|
|
|
|
end
|
2017-08-31 07:44:49 -04:00
|
|
|
resource :projects, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do
|
2013-05-23 05:23:47 -04:00
|
|
|
helpers do
|
|
|
|
def handle_project_member_errors(errors)
|
|
|
|
if errors[:project_access].any?
|
|
|
|
error!(errors[:project_access], 422)
|
|
|
|
end
|
2018-01-11 11:34:01 -05:00
|
|
|
|
2013-05-23 05:23:47 -04:00
|
|
|
not_found!
|
|
|
|
end
|
2017-03-01 15:22:29 -05:00
|
|
|
|
|
|
|
def assign_blob_vars!
|
2017-03-07 19:14:33 -05:00
|
|
|
authorize! :download_code, user_project
|
|
|
|
|
2017-03-01 15:22:29 -05:00
|
|
|
@repo = user_project.repository
|
|
|
|
|
|
|
|
begin
|
|
|
|
@blob = Gitlab::Git::Blob.raw(@repo, params[:sha])
|
2017-03-07 19:14:33 -05:00
|
|
|
@blob.load_all_data!(@repo)
|
2017-03-01 15:22:29 -05:00
|
|
|
rescue
|
|
|
|
not_found! 'Blob'
|
|
|
|
end
|
|
|
|
|
|
|
|
not_found! 'Blob' unless @blob
|
|
|
|
end
|
2013-05-23 05:23:47 -04:00
|
|
|
end
|
2014-05-26 09:08:22 -04:00
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
desc 'Get a project repository tree' do
|
2017-10-05 04:48:05 -04:00
|
|
|
success Entities::TreeObject
|
2016-11-17 10:05:57 -05:00
|
|
|
end
|
|
|
|
params do
|
2017-03-07 19:14:33 -05:00
|
|
|
optional :ref, type: String, desc: 'The name of a repository branch or tag, if not given the default branch is used'
|
2016-11-17 10:05:57 -05:00
|
|
|
optional :path, type: String, desc: 'The path of the tree'
|
|
|
|
optional :recursive, type: Boolean, default: false, desc: 'Used to get a recursive tree'
|
2017-01-16 23:45:07 -05:00
|
|
|
use :pagination
|
2016-11-17 10:05:57 -05:00
|
|
|
end
|
2015-01-18 16:17:10 -05:00
|
|
|
get ':id/repository/tree' do
|
2017-03-07 19:14:33 -05:00
|
|
|
ref = params[:ref] || user_project.try(:default_branch) || 'master'
|
2013-06-06 11:01:03 -04:00
|
|
|
path = params[:path] || nil
|
|
|
|
|
2015-04-21 09:13:40 -04:00
|
|
|
commit = user_project.commit(ref)
|
2015-01-18 16:17:10 -05:00
|
|
|
not_found!('Tree') unless commit
|
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
tree = user_project.repository.tree(commit.id, path, recursive: params[:recursive])
|
2017-01-16 23:45:07 -05:00
|
|
|
entries = ::Kaminari.paginate_array(tree.sorted_entries)
|
2017-10-05 04:48:05 -04:00
|
|
|
present paginate(entries), with: Entities::TreeObject
|
2013-06-06 11:01:03 -04:00
|
|
|
end
|
|
|
|
|
2017-03-07 19:14:33 -05:00
|
|
|
desc 'Get raw blob contents from the repository'
|
2016-11-17 10:05:57 -05:00
|
|
|
params do
|
2017-09-23 09:21:32 -04:00
|
|
|
requires :sha, type: String, desc: 'The commit hash'
|
2013-12-23 04:37:38 -05:00
|
|
|
end
|
2017-03-07 19:14:33 -05:00
|
|
|
get ':id/repository/blobs/:sha/raw' do
|
2017-03-01 15:22:29 -05:00
|
|
|
assign_blob_vars!
|
2013-12-23 04:37:38 -05:00
|
|
|
|
2017-03-01 15:22:29 -05:00
|
|
|
send_git_blob @repo, @blob
|
|
|
|
end
|
2013-12-23 04:37:38 -05:00
|
|
|
|
2017-03-07 19:14:33 -05:00
|
|
|
desc 'Get a blob from the repository'
|
2017-03-01 15:22:29 -05:00
|
|
|
params do
|
2017-09-23 09:21:32 -04:00
|
|
|
requires :sha, type: String, desc: 'The commit hash'
|
2017-03-01 15:22:29 -05:00
|
|
|
end
|
|
|
|
get ':id/repository/blobs/:sha' do
|
|
|
|
assign_blob_vars!
|
|
|
|
|
|
|
|
{
|
|
|
|
size: @blob.size,
|
|
|
|
encoding: "base64",
|
|
|
|
content: Base64.strict_encode64(@blob.data),
|
|
|
|
sha: @blob.id
|
|
|
|
}
|
2013-05-23 05:23:47 -04:00
|
|
|
end
|
2013-09-26 16:42:49 -04:00
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
desc 'Get an archive of the repository'
|
|
|
|
params do
|
|
|
|
optional :sha, type: String, desc: 'The commit sha of the archive to be downloaded'
|
|
|
|
optional :format, type: String, desc: 'The archive format'
|
|
|
|
end
|
2017-05-24 16:59:26 -04:00
|
|
|
get ':id/repository/archive', requirements: { format: Gitlab::PathRegex.archive_formats_regex } do
|
2015-01-18 16:17:10 -05:00
|
|
|
begin
|
2016-06-06 07:16:30 -04:00
|
|
|
send_git_archive user_project.repository, ref: params[:sha], format: params[:format]
|
2015-01-18 16:17:10 -05:00
|
|
|
rescue
|
|
|
|
not_found!('File')
|
|
|
|
end
|
2013-09-26 16:42:49 -04:00
|
|
|
end
|
2014-05-26 09:08:22 -04:00
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
desc 'Compare two branches, tags, or commits' do
|
|
|
|
success Entities::Compare
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :from, type: String, desc: 'The commit, branch name, or tag name to start comparison'
|
|
|
|
requires :to, type: String, desc: 'The commit, branch name, or tag name to stop comparison'
|
|
|
|
end
|
2014-05-26 09:08:22 -04:00
|
|
|
get ':id/repository/compare' do
|
2014-07-29 07:29:59 -04:00
|
|
|
compare = Gitlab::Git::Compare.new(user_project.repository.raw_repository, params[:from], params[:to])
|
2014-05-26 09:08:22 -04:00
|
|
|
present compare, with: Entities::Compare
|
|
|
|
end
|
2014-07-02 02:49:10 -04:00
|
|
|
|
2016-11-17 10:05:57 -05:00
|
|
|
desc 'Get repository contributors' do
|
|
|
|
success Entities::Contributor
|
|
|
|
end
|
2017-01-16 23:45:07 -05:00
|
|
|
params do
|
|
|
|
use :pagination
|
2017-11-18 09:06:55 -05:00
|
|
|
optional :order_by, type: String, values: %w[email name commits], default: nil, desc: 'Return contributors ordered by `name` or `email` or `commits`'
|
|
|
|
optional :sort, type: String, values: %w[asc desc], default: nil, desc: 'Sort by asc (ascending) or desc (descending)'
|
2017-01-16 23:45:07 -05:00
|
|
|
end
|
2014-07-02 02:49:10 -04:00
|
|
|
get ':id/repository/contributors' do
|
2015-01-18 16:17:10 -05:00
|
|
|
begin
|
2017-11-18 09:06:55 -05:00
|
|
|
contributors = ::Kaminari.paginate_array(user_project.repository.contributors(order_by: params[:order_by], sort: params[:sort]))
|
2017-01-16 23:45:07 -05:00
|
|
|
present paginate(contributors), with: Entities::Contributor
|
2015-01-18 16:17:10 -05:00
|
|
|
rescue
|
|
|
|
not_found!
|
|
|
|
end
|
2014-07-02 02:49:10 -04:00
|
|
|
end
|
2013-05-23 05:23:47 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|