diff options
-rw-r--r-- | app/controllers/projects/repositories_controller.rb | 6 | ||||
-rw-r--r-- | app/services/archive_repository_service.rb | 14 | ||||
-rw-r--r-- | lib/api/repositories.rb | 10 |
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! |