summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/projects/repositories_controller.rb6
-rw-r--r--app/services/archive_repository_service.rb14
-rw-r--r--lib/api/repositories.rb10
3 files changed, 16 insertions, 14 deletions
diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb
index f76ddb34bc4..f30eaadd928 100644
--- a/app/controllers/projects/repositories_controller.rb
+++ b/app/controllers/projects/repositories_controller.rb
@@ -14,11 +14,7 @@ class Projects::RepositoriesController < Projects::ApplicationController
render_404 and return
end
- storage_path = Gitlab.config.gitlab.repository_downloads_path
-
- @repository.clean_old_archives
-
- file_path = @repository.archive_repo(params[:ref], storage_path, params[:format].downcase)
+ file_path = ArchiveRepositoryService.new.execute(@project, params[:ref], params[:format])
if file_path
# Send file to user
diff --git a/app/services/archive_repository_service.rb b/app/services/archive_repository_service.rb
new file mode 100644
index 00000000000..8823f6fdc67
--- /dev/null
+++ b/app/services/archive_repository_service.rb
@@ -0,0 +1,14 @@
+class ArchiveRepositoryService
+ def execute(project, ref, format)
+ storage_path = Gitlab.config.gitlab.repository_downloads_path
+
+ unless File.directory?(storage_path)
+ FileUtils.mkdir_p(storage_path)
+ end
+
+ format ||= 'tar.gz'
+ repository = project.repository
+ repository.clean_old_archives
+ repository.archive_repo(ref, storage_path, format.downcase)
+ end
+end
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 461ce4e59cf..42068bb343d 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -115,21 +115,13 @@ module API
# GET /projects/:id/repository/archive
get ":id/repository/archive", requirements: { format: Gitlab::Regex.archive_formats_regex } do
authorize! :download_code, user_project
- repo = user_project.repository
- ref = params[:sha]
- format = params[:format]
- storage_path = Gitlab.config.gitlab.repository_downloads_path
+ file_path = ArchiveRepositoryService.new.execute(user_project, params[:sha], params[:format])
- file_path = repo.archive_repo(ref, storage_path, format)
if file_path && File.exists?(file_path)
data = File.open(file_path, 'rb').read
-
header["Content-Disposition"] = "attachment; filename=\"#{File.basename(file_path)}\""
-
content_type MIME::Types.type_for(file_path).first.content_type
-
env['api.format'] = :binary
-
present data
else
not_found!