From 556cafa44e7baae4de0f4169703d8a6174de458a Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Tue, 8 Mar 2016 15:53:32 +0100
Subject: [PATCH] added repo bundler spec and refactored some of the export
 code

---
 app/services/projects/import_export.rb        |  4 +--
 .../projects/import_export/export_service.rb  |  2 +-
 .../projects/import_export/repo_bundler.rb    |  7 +++---
 app/services/projects/import_export/shared.rb |  2 +-
 .../import_export/project_tree_saver_spec.rb  |  4 +--
 .../import_export/repo_bundler_spec.rb        | 25 +++++++++++++++++++
 6 files changed, 35 insertions(+), 9 deletions(-)
 create mode 100644 spec/services/projects/import_export/repo_bundler_spec.rb

diff --git a/app/services/projects/import_export.rb b/app/services/projects/import_export.rb
index f87b10390a5..2fc0d5dd7fe 100644
--- a/app/services/projects/import_export.rb
+++ b/app/services/projects/import_export.rb
@@ -2,8 +2,8 @@ module Projects
   module ImportExport
     extend self
 
-    def export_path(project_name:)
-      File.join(storage_path, "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_gitlab_export_#{project_name}")
+    def export_path(relative_path:)
+      File.join(storage_path, "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_gitlab_export/#{relative_path}")
     end
 
     def project_atts
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index b3ad278733a..99aa8489f65 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -2,7 +2,7 @@ module Projects
   module ImportExport
     class ExportService < BaseService
       def execute(options = {})
-        @shared = Projects::ImportExport::Shared.new(project_name: @project_name)
+        @shared = Projects::ImportExport::Shared.new(relative_path: project.path_with_namespace)
         save_project_tree
         bundle_repo
       end
diff --git a/app/services/projects/import_export/repo_bundler.rb b/app/services/projects/import_export/repo_bundler.rb
index 27f1d5c87e5..b0b2df1c14c 100644
--- a/app/services/projects/import_export/repo_bundler.rb
+++ b/app/services/projects/import_export/repo_bundler.rb
@@ -11,14 +11,15 @@ module Projects
       end
 
       def bundle
-        return false if project.empty_repo?
-        @full_path = File.join(export_path, project_filename)
+        return false if @project.empty_repo?
+        @full_path = File.join(@export_path, project_filename)
         bundle_to_disk
       end
 
       private
 
       def bundle_to_disk
+        FileUtils.mkdir_p(@export_path)
         tar_cf(archive: full_path, dir: path_to_repo)
       rescue
         #TODO: handle error
@@ -26,7 +27,7 @@ module Projects
       end
 
       def project_filename
-        @project.path_with_namespace + ".bundle"
+        "#{@project.namespace}#{@project.name}.bundle"
       end
 
       def path_to_repo
diff --git a/app/services/projects/import_export/shared.rb b/app/services/projects/import_export/shared.rb
index cdff8b02dd3..5101f514ab2 100644
--- a/app/services/projects/import_export/shared.rb
+++ b/app/services/projects/import_export/shared.rb
@@ -6,7 +6,7 @@ module Projects
       end
 
       def export_path
-        @export_path ||= ImportExport.export_path(project_name: @opts[:project_name])
+        @export_path ||= Projects::ImportExport.export_path(relative_path: @opts[:relative_path])
       end
     end
   end
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 816171ca7e5..1b3568bb7a8 100644
--- a/spec/services/projects/import_export/project_tree_saver_spec.rb
+++ b/spec/services/projects/import_export/project_tree_saver_spec.rb
@@ -23,12 +23,12 @@ 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(:shared) { Projects::ImportExport::Shared.new(project_name: @project_name) }
+    let(:shared) { Projects::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
     let(:project_tree_saver) { Projects::ImportExport::ProjectTreeSaver.new(project: project, shared: shared) }
 
     before(:each) do
       project.team << [user, :master]
-      allow_any_instance_of(Projects::ImportExport::ProjectTreeSaver).to receive(:export_path).and_return(export_path)
+      allow_any_instance_of(Projects::ImportExport).to receive(:storage_path).and_return(export_path)
     end
 
     after(:each) do
diff --git a/spec/services/projects/import_export/repo_bundler_spec.rb b/spec/services/projects/import_export/repo_bundler_spec.rb
new file mode 100644
index 00000000000..1f8ed41718f
--- /dev/null
+++ b/spec/services/projects/import_export/repo_bundler_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe Projects::ImportExport::RepoBundler, services: true do
+  describe :bundle do
+
+    let(:user) { create(:user) }
+    let!(:project) { create(:project, :public, name: 'searchable_project') }
+    let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" }
+    let(:shared) { Projects::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
+    let(:bundler) { Projects::ImportExport::RepoBundler.new(project: project, shared: shared) }
+
+    before(:each) do
+      project.team << [user, :master]
+      allow_any_instance_of(Projects::ImportExport).to receive(:storage_path).and_return(export_path)
+    end
+
+    after(:each) do
+      FileUtils.rm_rf(export_path)
+    end
+
+    it 'bundles the repo successfully' do
+      expect(bundler.bundle).to be true
+    end
+  end
+end
-- 
GitLab