diff --git a/doc/api/repositories.md b/doc/api/repositories.md index cb0626972e5a20720a3b53c3a638de54a42030b9..2769c22d6aa69078f93f9abe0fec414b94d3d998 100644 --- a/doc/api/repositories.md +++ b/doc/api/repositories.md @@ -356,3 +356,16 @@ Parameters: + `id` (required) - The ID of a project + `sha` (required) - The commit or branch name + `filepath` (required) - The path the file + + +## Get file archive + +Get a an archive of the repository + +``` +GET /projects/:id/repository/archive +``` + +Parameters: ++ `id` (required) - The ID of a project ++ `sha` (optional) - The commit sha to download defaults to the tip of the default branch \ No newline at end of file diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb index 1a911eae2bb13c8cbcb082d216498cadb6337f8e..c9422fdb1653c2d7387ef6b0bdc60e76e5faddc9 100644 --- a/lib/api/repositories.rb +++ b/lib/api/repositories.rb @@ -144,7 +144,7 @@ module API trees = [] %w(trees blobs submodules).each do |type| - trees += tree.send(type).map { |t| { name: t.name, type: type.singularize, mode: t.mode, id: t.id } } + trees += tree.send(type).map { |t| {name: t.name, type: type.singularize, mode: t.mode, id: t.id} } end trees @@ -176,6 +176,34 @@ module API content_type blob.mime_type present blob.data end + + # Get a an archive of the repository + # + # Parameters: + # id (required) - The ID of a project + # 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" do + authorize! :download_code, user_project + repo = user_project.repository + ref = params[:sha] + storage_path = Rails.root.join("tmp", "repositories") + + file_path = repo.archive_repo(ref, storage_path) + if file_path && File.exists?(file_path) + data = File.open(file_path, 'rb').read + + header "Content-Disposition:", " infile; filename=\"#{File.basename(file_path)}\"" + content_type 'application/x-gzip' + + env['api.format'] = :binary + + present data + else + not_found! + end + end end end end diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb index 2e509ea2933ccedf42b7ec925a591386fa0fa8bc..9649c4d09c8ecd1d6b5a26d125a75407441cf579 100644 --- a/spec/requests/api/repositories_spec.rb +++ b/spec/requests/api/repositories_spec.rb @@ -225,4 +225,16 @@ describe API::API do end end + describe "GET /projects/:id/repository/archive/:sha" do + it "should get the archive" do + get api("/projects/#{project.id}/repository/archive", user) + response.status.should == 200 + response.content_type.should == 'application/x-gzip' + end + + it "should return 404 for invalid sha" do + get api("/projects/#{project.id}/repository/archive/?sha=xxx", user) + response.status.should == 404 + end + end end