Handle errors on API when a project does not have a repository (Closes #6289)

This commit is contained in:
jubianchi 2015-01-18 22:17:10 +01:00
parent 2fba31890e
commit 39e54e21cb
2 changed files with 45 additions and 8 deletions

View file

@ -58,11 +58,13 @@ module API
# ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
# Example Request:
# GET /projects/:id/repository/tree
get ":id/repository/tree" do
get ':id/repository/tree' do
ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
path = params[:path] || nil
commit = user_project.repository.commit(ref)
not_found!('Tree') unless commit
tree = user_project.repository.tree(commit.id, path)
present tree.sorted_entries, with: Entities::RepoTreeObject
@ -100,14 +102,18 @@ module API
# sha (required) - The blob's sha
# Example Request:
# GET /projects/:id/repository/raw_blobs/:sha
get ":id/repository/raw_blobs/:sha" do
get ':id/repository/raw_blobs/:sha' do
ref = params[:sha]
repo = user_project.repository
begin
blob = Gitlab::Git::Blob.raw(repo, ref)
rescue
not_found! 'Blob'
end
not_found! "Blob" unless blob
not_found! 'Blob' unless blob
env['api.format'] = :txt
@ -122,13 +128,23 @@ module API
# sha (optional) - the commit sha to download defaults to the tip of the default branch
# Example Request:
# GET /projects/:id/repository/archive
get ":id/repository/archive", requirements: { format: Gitlab::Regex.archive_formats_regex } do
get ':id/repository/archive',
requirements: { format: Gitlab::Regex.archive_formats_regex } do
authorize! :download_code, user_project
file_path = ArchiveRepositoryService.new.execute(user_project, params[:sha], params[:format])
begin
file_path = ArchiveRepositoryService.new.execute(
user_project,
params[:sha],
params[:format])
rescue
not_found!('File')
end
if file_path && File.exists?(file_path)
data = File.open(file_path, 'rb').read
header["Content-Disposition"] = "attachment; filename=\"#{File.basename(file_path)}\""
basename = File.basename(file_path)
header['Content-Disposition'] = "attachment; filename=\"#{basename}\""
content_type MIME::Types.type_for(file_path).first.content_type
env['api.format'] = :binary
present data
@ -161,7 +177,12 @@ module API
get ':id/repository/contributors' do
authorize! :download_code, user_project
present user_project.repository.contributors, with: Entities::Contributor
begin
present user_project.repository.contributors,
with: Entities::Contributor
rescue
not_found!
end
end
end
end

View file

@ -101,6 +101,14 @@ describe API::API, api: true do
json_response.first['type'].should == 'tree'
json_response.first['mode'].should == '040000'
end
it 'should return a 404 for unknown ref' do
get api("/projects/#{project.id}/repository/tree?ref_name=foo", user)
response.status.should == 404
json_response.should be_an Object
json_response['message'] == '404 Tree Not Found'
end
end
context "unauthorized user" do
@ -145,6 +153,14 @@ describe API::API, api: true do
get api("/projects/#{project.id}/repository/raw_blobs/#{sample_blob.oid}", user)
response.status.should == 200
end
it 'should return a 404 for unknown blob' do
get api("/projects/#{project.id}/repository/raw_blobs/123456", user)
response.status.should == 404
json_response.should be_an Object
json_response['message'] == '404 Blob Not Found'
end
end
describe "GET /projects/:id/repository/archive(.:format)?:sha" do