From 4e73f9827cc5b164e409a6beb9a305ef5604423d Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Tue, 8 Mar 2016 12:35:37 +0100
Subject: [PATCH] WIP - started working on bundle the repo, refactored some
 stuff and updated spec

---
 .../import_export/command_line_util.rb        | 11 ++++++
 .../projects/import_export/export_service.rb  |  8 +++-
 .../import_export/project_tree_saver.rb       | 11 ++----
 .../projects/import_export/repo_bundler.rb    | 37 +++++++++++++++++++
 app/services/projects/import_export/shared.rb | 13 +++++++
 .../import_export/project_tree_saver_spec.rb  |  3 +-
 6 files changed, 74 insertions(+), 9 deletions(-)
 create mode 100644 app/services/projects/import_export/command_line_util.rb
 create mode 100644 app/services/projects/import_export/repo_bundler.rb
 create mode 100644 app/services/projects/import_export/shared.rb

diff --git a/app/services/projects/import_export/command_line_util.rb b/app/services/projects/import_export/command_line_util.rb
new file mode 100644
index 00000000000..7b0cc08763b
--- /dev/null
+++ b/app/services/projects/import_export/command_line_util.rb
@@ -0,0 +1,11 @@
+module Projects
+  module ImportExport
+    module CommandLineUtil
+      def tar_cf(archive:, dir:)
+        cmd = %W(tar -cf #{archive} -C #{dir} .)
+        _output, status = Gitlab::Popen.popen(cmd)
+        status.zero?
+      end
+    end
+  end
+end
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index c89dd3d12ed..b3ad278733a 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -2,13 +2,19 @@ module Projects
   module ImportExport
     class ExportService < BaseService
       def execute(options = {})
+        @shared = Projects::ImportExport::Shared.new(project_name: @project_name)
         save_project_tree
+        bundle_repo
       end
 
       private
 
       def save_project_tree
-        Projects::ImportExport::ProjectTreeSaver.save(project: project)
+        Projects::ImportExport::ProjectTreeSaver.new(project: project, shared: @shared).save
+      end
+
+      def bundle_repo
+        Projects::ImportExport::RepoBundler.new(project: project, shared: @shared).bundle
       end
     end
   end
diff --git a/app/services/projects/import_export/project_tree_saver.rb b/app/services/projects/import_export/project_tree_saver.rb
index 4801c791ffe..3ca90d1f79a 100644
--- a/app/services/projects/import_export/project_tree_saver.rb
+++ b/app/services/projects/import_export/project_tree_saver.rb
@@ -3,19 +3,20 @@ module Projects
     class ProjectTreeSaver
       attr_reader :full_path
 
-      def initialize(project: )
+      def initialize(project: , shared: )
         @project = project
+        @export_path = shared.export_path
       end
 
       def save
-        @full_path = File.join(export_path, project_filename)
+        @full_path = File.join(@export_path, project_filename)
         save_to_disk
       end
 
       private
 
       def save_to_disk
-        FileUtils.mkdir_p(export_path)
+        FileUtils.mkdir_p(@export_path)
         File.write(full_path, project_json_tree)
         true
       rescue
@@ -23,10 +24,6 @@ module Projects
         false
       end
 
-      def export_path
-        @export_path ||= ImportExport.export_path(@project.name)
-      end
-
       def project_filename
         # TODO sanitize name
         "#{@project.name}.json"
diff --git a/app/services/projects/import_export/repo_bundler.rb b/app/services/projects/import_export/repo_bundler.rb
new file mode 100644
index 00000000000..27f1d5c87e5
--- /dev/null
+++ b/app/services/projects/import_export/repo_bundler.rb
@@ -0,0 +1,37 @@
+module Projects
+  module ImportExport
+    class RepoBundler
+      include Projects::ImportExport::CommandLineUtil
+
+      attr_reader :full_path
+
+      def initialize(project: , shared: )
+        @project = project
+        @export_path = shared.export_path
+      end
+
+      def bundle
+        return false if project.empty_repo?
+        @full_path = File.join(export_path, project_filename)
+        bundle_to_disk
+      end
+
+      private
+
+      def bundle_to_disk
+        tar_cf(archive: full_path, dir: path_to_repo)
+      rescue
+        #TODO: handle error
+        false
+      end
+
+      def project_filename
+        @project.path_with_namespace + ".bundle"
+      end
+
+      def path_to_repo
+        @project.repository.path_to_repo
+      end
+    end
+  end
+end
diff --git a/app/services/projects/import_export/shared.rb b/app/services/projects/import_export/shared.rb
new file mode 100644
index 00000000000..cdff8b02dd3
--- /dev/null
+++ b/app/services/projects/import_export/shared.rb
@@ -0,0 +1,13 @@
+module Projects
+  module ImportExport
+    class Shared
+      def initialize(opts)
+        @opts = opts
+      end
+
+      def export_path
+        @export_path ||= ImportExport.export_path(project_name: @opts[:project_name])
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/spec/services/projects/import_export/project_tree_saver_spec.rb b/spec/services/projects/import_export/project_tree_saver_spec.rb
index 42302ffee8f..816171ca7e5 100644
--- a/spec/services/projects/import_export/project_tree_saver_spec.rb
+++ b/spec/services/projects/import_export/project_tree_saver_spec.rb
@@ -23,7 +23,8 @@ describe Projects::ImportExport::ProjectTreeSaver, services: true do
     end
     let!(:milestone) { create(:milestone, title: "Milestone v1.2", project: project) }
     let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" }
-    let(:project_tree_saver) { Projects::ImportExport::ProjectTreeSaver.new(project: project) }
+    let(:shared) { Projects::ImportExport::Shared.new(project_name: @project_name) }
+    let(:project_tree_saver) { Projects::ImportExport::ProjectTreeSaver.new(project: project, shared: shared) }
 
     before(:each) do
       project.team << [user, :master]
-- 
GitLab