summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/api/repositories.md13
-rw-r--r--lib/api/repositories.rb26
-rw-r--r--spec/requests/api/repositories_spec.rb11
3 files changed, 49 insertions, 1 deletions
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index cb0626972e5..1792d2b5edf 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 or branch name
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 1a911eae2bb..ac17aeabb13 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,30 @@ 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 head
+ # 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 || 'HEAD', storage_path)
+ if file_path
+ data = File.open(file_path).read
+ content_type 'application/x-gzip'
+ header "Content-Disposition:"," infile; filename=\"#{File.basename(file_path)}\""
+ 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 2e509ea2933..6cd8c2688ff 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -225,4 +225,15 @@ 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
+ 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