From 0852f539aa389c66ef377b7d567c931f928e147f Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Thu, 14 Apr 2016 16:57:25 +0200
Subject: [PATCH] refactored stuff, added a save and compress all class and
 moved mostly everything to lib

---
 .../projects/import_export/export_service.rb  | 11 ++++--
 .../projects => lib/gitlab}/import_export.rb  |  6 +--
 .../import_export/command_line_util.rb        | 16 ++++++--
 .../gitlab}/import_export/import_export.yml   |  0
 .../import_export/import_export_reader.rb     |  4 +-
 .../import_export/project_tree_saver.rb       |  5 +--
 .../gitlab}/import_export/repo_bundler.rb     |  4 +-
 lib/gitlab/import_export/saver.rb             | 38 +++++++++++++++++++
 .../gitlab}/import_export/shared.rb           |  4 +-
 .../import_export/wiki_repo_bundler.rb        |  2 +-
 .../import_export_reader_spec.rb              |  2 +-
 .../import_export/project_tree_saver_spec.rb  |  8 ++--
 .../import_export/repo_bundler_spec.rb        |  8 ++--
 .../import_export/wiki_repo_bundler_spec.rb   |  8 ++--
 14 files changed, 83 insertions(+), 33 deletions(-)
 rename {app/services/projects => lib/gitlab}/import_export.rb (68%)
 rename {app/services/projects => lib/gitlab}/import_export/command_line_util.rb (58%)
 rename {app/services/projects => lib/gitlab}/import_export/import_export.yml (100%)
 rename {app/services/projects => lib/gitlab}/import_export/import_export_reader.rb (96%)
 rename {app/services/projects => lib/gitlab}/import_export/project_tree_saver.rb (85%)
 rename {app/services/projects => lib/gitlab}/import_export/repo_bundler.rb (91%)
 create mode 100644 lib/gitlab/import_export/saver.rb
 rename {app/services/projects => lib/gitlab}/import_export/shared.rb (56%)
 rename {app/services/projects => lib/gitlab}/import_export/wiki_repo_bundler.rb (97%)
 rename spec/{services/projects => lib/gitlab}/import_export/import_export_reader_spec.rb (92%)
 rename spec/{services/projects => lib/gitlab}/import_export/project_tree_saver_spec.rb (89%)
 rename spec/{services/projects => lib/gitlab}/import_export/repo_bundler_spec.rb (55%)
 rename spec/{services/projects => lib/gitlab}/import_export/wiki_repo_bundler_spec.rb (61%)

diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index 99aa8489f6..ce13942c5d 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -2,19 +2,24 @@ module Projects
   module ImportExport
     class ExportService < BaseService
       def execute(options = {})
-        @shared = Projects::ImportExport::Shared.new(relative_path: project.path_with_namespace)
+        @shared = Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace)
         save_project_tree
         bundle_repo
+        save_all
       end
 
       private
 
       def save_project_tree
-        Projects::ImportExport::ProjectTreeSaver.new(project: project, shared: @shared).save
+        Gitlab::ImportExport::ProjectTreeSaver.new(project: project, shared: @shared).save
       end
 
       def bundle_repo
-        Projects::ImportExport::RepoBundler.new(project: project, shared: @shared).bundle
+        Gitlab::ImportExport::RepoBundler.new(project: project, shared: @shared).bundle
+      end
+
+      def save_all
+        Gitlab::ImportExport::Saver.save(storage_path: @shared.export_path)
       end
     end
   end
diff --git a/app/services/projects/import_export.rb b/lib/gitlab/import_export.rb
similarity index 68%
rename from app/services/projects/import_export.rb
rename to lib/gitlab/import_export.rb
index c74f1d3149..fe88850c33 100644
--- a/app/services/projects/import_export.rb
+++ b/lib/gitlab/import_export.rb
@@ -1,9 +1,9 @@
-module Projects
+module Gitlab
   module ImportExport
     extend self
 
     def export_path(relative_path:)
-      File.join(storage_path, "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_gitlab_export/#{relative_path}")
+      File.join(storage_path, relative_path, "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_gitlab_export")
     end
 
     def project_atts
@@ -11,7 +11,7 @@ module Projects
     end
 
     def project_tree
-      Projects::ImportExport::ImportExportReader.project_tree
+      Gitlab::ImportExport::ImportExportReader.project_tree
     end
 
     private
diff --git a/app/services/projects/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb
similarity index 58%
rename from app/services/projects/import_export/command_line_util.rb
rename to lib/gitlab/import_export/command_line_util.rb
index 3ca49e76c7..7bf4b476b6 100644
--- a/app/services/projects/import_export/command_line_util.rb
+++ b/lib/gitlab/import_export/command_line_util.rb
@@ -1,10 +1,12 @@
-module Projects
+module Gitlab
   module ImportExport
     module CommandLineUtil
       def tar_cf(archive:, dir:)
-        cmd = %W(tar -cf #{archive} -C #{dir} .)
-        _output, status = Gitlab::Popen.popen(cmd)
-        status.zero?
+        tar_with_options(archive: archive, dir: dir, options: 'cf')
+      end
+
+      def tar_czf(archive:, dir:)
+        tar_with_options(archive: archive, dir: dir, options: 'czf')
       end
 
       def git_bundle(git_bin_path: Gitlab.config.git.bin_path, repo_path:, bundle_path:)
@@ -12,6 +14,12 @@ module Projects
         _output, status = Gitlab::Popen.popen(cmd)
         status.zero?
       end
+
+      def tar_with_options(archive:, dir:, options:)
+        cmd = %W(tar -#{options} #{archive} -C #{dir} .)
+        _output, status = Gitlab::Popen.popen(cmd)
+        status.zero?
+      end
     end
   end
 end
diff --git a/app/services/projects/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml
similarity index 100%
rename from app/services/projects/import_export/import_export.yml
rename to lib/gitlab/import_export/import_export.yml
diff --git a/app/services/projects/import_export/import_export_reader.rb b/lib/gitlab/import_export/import_export_reader.rb
similarity index 96%
rename from app/services/projects/import_export/import_export_reader.rb
rename to lib/gitlab/import_export/import_export_reader.rb
index 001d24af60..717d3026f9 100644
--- a/app/services/projects/import_export/import_export_reader.rb
+++ b/lib/gitlab/import_export/import_export_reader.rb
@@ -1,4 +1,4 @@
-module Projects
+module Gitlab
   module ImportExport
     module ImportExportReader
       extend self
@@ -14,7 +14,7 @@ module Projects
       private
 
       def config
-        @config ||= YAML.load_file('app/services/projects/import_export/import_export.yml')
+        @config ||= YAML.load_file('lib/gitlab/import_export/import_export.yml')
       end
 
       def atts_only
diff --git a/app/services/projects/import_export/project_tree_saver.rb b/lib/gitlab/import_export/project_tree_saver.rb
similarity index 85%
rename from app/services/projects/import_export/project_tree_saver.rb
rename to lib/gitlab/import_export/project_tree_saver.rb
index 37bf3e8e54..b2615f8273 100644
--- a/app/services/projects/import_export/project_tree_saver.rb
+++ b/lib/gitlab/import_export/project_tree_saver.rb
@@ -1,4 +1,4 @@
-module Projects
+module Gitlab
   module ImportExport
     class ProjectTreeSaver
       attr_reader :full_path
@@ -25,12 +25,11 @@ module Projects
       end
 
       def project_filename
-        # TODO sanitize name
         "#{@project.name}.json"
       end
 
       def project_json_tree
-        @project.to_json(Projects::ImportExport.project_tree)
+        @project.to_json(Gitlab::ImportExport.project_tree)
       end
     end
   end
diff --git a/app/services/projects/import_export/repo_bundler.rb b/lib/gitlab/import_export/repo_bundler.rb
similarity index 91%
rename from app/services/projects/import_export/repo_bundler.rb
rename to lib/gitlab/import_export/repo_bundler.rb
index d43fb4ea09..7a1c2a12a5 100644
--- a/app/services/projects/import_export/repo_bundler.rb
+++ b/lib/gitlab/import_export/repo_bundler.rb
@@ -1,7 +1,7 @@
-module Projects
+module Gitlab
   module ImportExport
     class RepoBundler
-      include Projects::ImportExport::CommandLineUtil
+      include Gitlab::ImportExport::CommandLineUtil
 
       attr_reader :full_path
 
diff --git a/lib/gitlab/import_export/saver.rb b/lib/gitlab/import_export/saver.rb
new file mode 100644
index 0000000000..f26804d240
--- /dev/null
+++ b/lib/gitlab/import_export/saver.rb
@@ -0,0 +1,38 @@
+module Gitlab
+  module ImportExport
+    class Saver
+      include Gitlab::ImportExport::CommandLineUtil
+
+      def self.save(*args)
+        new(*args).save
+      end
+
+      def initialize(storage_path:)
+        @storage_path = storage_path
+      end
+
+      def save
+        if compress_and_save
+          remove_storage_path
+          archive_file
+        else
+          false
+        end
+      end
+
+      private
+
+      def compress_and_save
+        tar_czf(archive: archive_file, dir: @storage_path)
+      end
+
+      def remove_storage_path
+        FileUtils.rm_rf(@storage_path)
+      end
+
+      def archive_file
+        @archive_file ||= File.join(@storage_path, '..', 'project.tar.gz')
+      end
+    end
+  end
+end
diff --git a/app/services/projects/import_export/shared.rb b/lib/gitlab/import_export/shared.rb
similarity index 56%
rename from app/services/projects/import_export/shared.rb
rename to lib/gitlab/import_export/shared.rb
index 04fe01c0d6..a4ec33a6cf 100644
--- a/app/services/projects/import_export/shared.rb
+++ b/lib/gitlab/import_export/shared.rb
@@ -1,4 +1,4 @@
-module Projects
+module Gitlab
   module ImportExport
     class Shared
       def initialize(opts)
@@ -6,7 +6,7 @@ module Projects
       end
 
       def export_path
-        @export_path ||= Projects::ImportExport.export_path(relative_path: @opts[:relative_path])
+        @export_path ||= Gitlab::ImportExport.export_path(relative_path: @opts[:relative_path])
       end
     end
   end
diff --git a/app/services/projects/import_export/wiki_repo_bundler.rb b/lib/gitlab/import_export/wiki_repo_bundler.rb
similarity index 97%
rename from app/services/projects/import_export/wiki_repo_bundler.rb
rename to lib/gitlab/import_export/wiki_repo_bundler.rb
index bf69936503..9ef0febee5 100644
--- a/app/services/projects/import_export/wiki_repo_bundler.rb
+++ b/lib/gitlab/import_export/wiki_repo_bundler.rb
@@ -1,4 +1,4 @@
-module Projects
+module Gitlab
   module ImportExport
     class WikiRepoBundler < RepoBundler
       def bundle
diff --git a/spec/services/projects/import_export/import_export_reader_spec.rb b/spec/lib/gitlab/import_export/import_export_reader_spec.rb
similarity index 92%
rename from spec/services/projects/import_export/import_export_reader_spec.rb
rename to spec/lib/gitlab/import_export/import_export_reader_spec.rb
index f825292ce7..e71c7b60b8 100644
--- a/spec/services/projects/import_export/import_export_reader_spec.rb
+++ b/spec/lib/gitlab/import_export/import_export_reader_spec.rb
@@ -1,6 +1,6 @@
 require 'rspec'
 
-describe Projects::ImportExport::ImportExportReader do
+describe Gitlab::ImportExport::ImportExportReader do
 
   let(:test_config) { 'spec/support/import_export/import_export.yml' }
   let(:project_tree_hash) do
diff --git a/spec/services/projects/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
similarity index 89%
rename from spec/services/projects/import_export/project_tree_saver_spec.rb
rename to spec/lib/gitlab/import_export/project_tree_saver_spec.rb
index 05ece41341..8a923dde46 100644
--- a/spec/services/projects/import_export/project_tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Projects::ImportExport::ProjectTreeSaver, services: true do
+describe Gitlab::ImportExport::ProjectTreeSaver, services: true do
   describe :save do
 
     # TODO refactor this into a setup method
@@ -26,14 +26,14 @@ describe Projects::ImportExport::ProjectTreeSaver, services: true do
     let!(:ci_commit) { create(:ci_commit, project: project, sha: merge_request.last_commit.id, ref: merge_request.source_branch, statuses: [commit_status]) }
     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(relative_path: project.path_with_namespace) }
-    let(:project_tree_saver) { Projects::ImportExport::ProjectTreeSaver.new(project: project, shared: shared) }
+    let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
+    let(:project_tree_saver) { Gitlab::ImportExport::ProjectTreeSaver.new(project: project, shared: shared) }
     let!(:issue_note) { create(:note, note: ":+1: issue", noteable: issue) }
     let!(:merge_request_note) { create(:note, note: ":+1: merge_request", noteable: merge_request) }
 
     before(:each) do
       project.team << [user, :master]
-      allow_any_instance_of(Projects::ImportExport).to receive(:storage_path).and_return(export_path)
+      allow_any_instance_of(Gitlab::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/lib/gitlab/import_export/repo_bundler_spec.rb
similarity index 55%
rename from spec/services/projects/import_export/repo_bundler_spec.rb
rename to spec/lib/gitlab/import_export/repo_bundler_spec.rb
index 1f8ed41718..23447d878a 100644
--- a/spec/services/projects/import_export/repo_bundler_spec.rb
+++ b/spec/lib/gitlab/import_export/repo_bundler_spec.rb
@@ -1,17 +1,17 @@
 require 'spec_helper'
 
-describe Projects::ImportExport::RepoBundler, services: true do
+describe Gitlab::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) }
+    let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
+    let(:bundler) { Gitlab::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)
+      allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
     end
 
     after(:each) do
diff --git a/spec/services/projects/import_export/wiki_repo_bundler_spec.rb b/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb
similarity index 61%
rename from spec/services/projects/import_export/wiki_repo_bundler_spec.rb
rename to spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb
index a589f81c5f..6cc95edc21 100644
--- a/spec/services/projects/import_export/wiki_repo_bundler_spec.rb
+++ b/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb
@@ -1,18 +1,18 @@
 require 'spec_helper'
 
-describe Projects::ImportExport::WikiRepoBundler, services: true do
+describe Gitlab::ImportExport::WikiRepoBundler, 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(:wiki_bundler) { Projects::ImportExport::WikiRepoBundler.new(project: project, shared: shared) }
+    let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
+    let(:wiki_bundler) { Gitlab::ImportExport::WikiRepoBundler.new(project: project, shared: shared) }
     let!(:project_wiki) { ProjectWiki.new(project, user) }
 
     before(:each) do
       project.team << [user, :master]
-      allow_any_instance_of(Projects::ImportExport).to receive(:storage_path).and_return(export_path)
+      allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
       project_wiki.wiki
       project_wiki.create_page("index", "test content")
     end
-- 
2.30.9