From 52e0a367f20b0c0574c9d5e19615a55a4f47b1e0 Mon Sep 17 00:00:00 2001
From: Stan Hu <stanhu@gmail.com>
Date: Thu, 17 Jan 2019 00:35:40 -0800
Subject: [PATCH] Refactor use of Shell.import_repository for Wikis

The previous behavior would pass in a list of parameters
to Shell, but we can improve this by using the WikiFormatter
and Project models to give us the same information.
---
 app/services/projects/import_service.rb       |  2 +-
 lib/gitlab/bitbucket_import/importer.rb       |  6 ++---
 lib/gitlab/bitbucket_import/wiki_formatter.rb | 25 +++++++++++++++++++
 .../importer/repository_importer.rb           |  9 +++----
 lib/gitlab/legacy_github_import/importer.rb   |  2 +-
 .../legacy_github_import/wiki_formatter.rb    |  4 +++
 lib/gitlab/shell.rb                           |  8 ++++++
 .../gitlab/bitbucket_import/importer_spec.rb  |  9 ++-----
 .../importer/repository_importer_spec.rb      | 13 ++++++++--
 9 files changed, 59 insertions(+), 19 deletions(-)
 create mode 100644 lib/gitlab/bitbucket_import/wiki_formatter.rb

diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb
index 6f06c6a3864..7214e9efaf6 100644
--- a/app/services/projects/import_service.rb
+++ b/app/services/projects/import_service.rb
@@ -73,7 +73,7 @@ module Projects
           project.ensure_repository
           project.repository.fetch_as_mirror(project.import_url, refmap: refmap)
         else
-          gitlab_shell.import_repository(project.repository_storage, project.disk_path, project.import_url, project.full_path)
+          gitlab_shell.import_project_repository(project)
         end
       rescue Gitlab::Shell::Error => e
         # Expire cache to prevent scenarios such as:
diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb
index 46b1fe1d5a0..75a3f17f549 100644
--- a/lib/gitlab/bitbucket_import/importer.rb
+++ b/lib/gitlab/bitbucket_import/importer.rb
@@ -65,9 +65,9 @@ module Gitlab
       def import_wiki
         return if project.wiki.repository_exists?
 
-        disk_path = project.wiki.disk_path
-        import_url = project.import_url.sub(/\.git\z/, ".git/wiki")
-        gitlab_shell.import_repository(project.repository_storage, disk_path, import_url, project.full_path)
+        wiki = WikiFormatter.new(project)
+
+        gitlab_shell.import_wiki_repository(project, wiki)
       rescue StandardError => e
         errors << { type: :wiki, errors: e.message }
       end
diff --git a/lib/gitlab/bitbucket_import/wiki_formatter.rb b/lib/gitlab/bitbucket_import/wiki_formatter.rb
new file mode 100644
index 00000000000..b8ff43b777b
--- /dev/null
+++ b/lib/gitlab/bitbucket_import/wiki_formatter.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab
+  module BitbucketImport
+    class WikiFormatter
+      attr_reader :project
+
+      def initialize(project)
+        @project = project
+      end
+
+      def disk_path
+        project.wiki.disk_path
+      end
+
+      def full_path
+        project.wiki.full_path
+      end
+
+      def import_url
+        project.import_url.sub(/\.git\z/, ".git/wiki")
+      end
+    end
+  end
+end
diff --git a/lib/gitlab/github_import/importer/repository_importer.rb b/lib/gitlab/github_import/importer/repository_importer.rb
index 4126a653b6e..e2dfb00dcc5 100644
--- a/lib/gitlab/github_import/importer/repository_importer.rb
+++ b/lib/gitlab/github_import/importer/repository_importer.rb
@@ -6,11 +6,12 @@ module Gitlab
       class RepositoryImporter
         include Gitlab::ShellAdapter
 
-        attr_reader :project, :client
+        attr_reader :project, :client, :wiki_formatter
 
         def initialize(project, client)
           @project = project
           @client = client
+          @wiki_formatter = ::Gitlab::LegacyGithubImport::WikiFormatter.new(project)
         end
 
         # Returns true if we should import the wiki for the project.
@@ -57,9 +58,7 @@ module Gitlab
         end
 
         def import_wiki_repository
-          wiki_path = "#{project.disk_path}.wiki"
-
-          gitlab_shell.import_repository(project.repository_storage, wiki_path, wiki_url, project.full_path)
+          gitlab_shell.import_wiki_repository(project, wiki_formatter)
 
           true
         rescue Gitlab::Shell::Error => e
@@ -72,7 +71,7 @@ module Gitlab
         end
 
         def wiki_url
-          project.import_url.sub(/\.git\z/, '.wiki.git')
+          wiki_formatter.import_url
         end
 
         def update_clone_time
diff --git a/lib/gitlab/legacy_github_import/importer.rb b/lib/gitlab/legacy_github_import/importer.rb
index ea4e56afb04..f3323c98af2 100644
--- a/lib/gitlab/legacy_github_import/importer.rb
+++ b/lib/gitlab/legacy_github_import/importer.rb
@@ -267,7 +267,7 @@ module Gitlab
       def import_wiki
         unless project.wiki.repository_exists?
           wiki = WikiFormatter.new(project)
-          gitlab_shell.import_repository(project.repository_storage, wiki.disk_path, wiki.import_url, project.wiki.full_path)
+          gitlab_shell.import_wiki_repository(project, wiki)
         end
       rescue Gitlab::Shell::Error => e
         # GitHub error message when the wiki repo has not been created,
diff --git a/lib/gitlab/legacy_github_import/wiki_formatter.rb b/lib/gitlab/legacy_github_import/wiki_formatter.rb
index ea52be5ee0f..cf1e21ad1e1 100644
--- a/lib/gitlab/legacy_github_import/wiki_formatter.rb
+++ b/lib/gitlab/legacy_github_import/wiki_formatter.rb
@@ -13,6 +13,10 @@ module Gitlab
         project.wiki.disk_path
       end
 
+      def full_path
+        project.wiki.full_path
+      end
+
       def import_url
         project.import_url.sub(/\.git\z/, ".wiki.git")
       end
diff --git a/lib/gitlab/shell.rb b/lib/gitlab/shell.rb
index 6f896f03947..62fcc08ffdf 100644
--- a/lib/gitlab/shell.rb
+++ b/lib/gitlab/shell.rb
@@ -86,6 +86,14 @@ module Gitlab
       false
     end
 
+    def import_wiki_repository(project, wiki_formatter)
+      import_repository(project.repository_storage, wiki_formatter.disk_path, wiki_formatter.import_url, project.wiki.full_path)
+    end
+
+    def import_project_repository(project)
+      import_repository(project.repository_storage, project.disk_path, project.import_url, project.full_path)
+    end
+
     # Import repository
     #
     # storage - project's storage name
diff --git a/spec/lib/gitlab/bitbucket_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
index 034e65ddfeb..c432cc223b9 100644
--- a/spec/lib/gitlab/bitbucket_import/importer_spec.rb
+++ b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
@@ -218,7 +218,7 @@ describe Gitlab::BitbucketImport::Importer do
     describe 'wiki import' do
       it 'is skipped when the wiki exists' do
         expect(project.wiki).to receive(:repository_exists?) { true }
-        expect(importer.gitlab_shell).not_to receive(:import_repository)
+        expect(importer.gitlab_shell).not_to receive(:import_wiki_repository)
 
         importer.execute
 
@@ -227,12 +227,7 @@ describe Gitlab::BitbucketImport::Importer do
 
       it 'imports to the project disk_path' do
         expect(project.wiki).to receive(:repository_exists?) { false }
-        expect(importer.gitlab_shell).to receive(:import_repository).with(
-          project.repository_storage,
-          project.wiki.disk_path,
-          project.import_url + '/wiki',
-          project.full_path
-        )
+        expect(importer.gitlab_shell).to receive(:import_wiki_repository)
 
         importer.execute
 
diff --git a/spec/lib/gitlab/github_import/importer/repository_importer_spec.rb b/spec/lib/gitlab/github_import/importer/repository_importer_spec.rb
index e3a1c1e6064..47233ea6ee2 100644
--- a/spec/lib/gitlab/github_import/importer/repository_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/repository_importer_spec.rb
@@ -5,6 +5,14 @@ describe Gitlab::GithubImport::Importer::RepositoryImporter do
   let(:import_state) { double(:import_state) }
   let(:client) { double(:client) }
 
+  let(:wiki) do
+    double(
+      :wiki,
+      disk_path: 'foo.wiki',
+      full_path: 'group/foo.wiki'
+    )
+  end
+
   let(:project) do
     double(
       :project,
@@ -16,7 +24,8 @@ describe Gitlab::GithubImport::Importer::RepositoryImporter do
       create_wiki: true,
       import_state: import_state,
       full_path: 'group/foo',
-      lfs_enabled?: true
+      lfs_enabled?: true,
+      wiki: wiki
     )
   end
 
@@ -196,7 +205,7 @@ describe Gitlab::GithubImport::Importer::RepositoryImporter do
     it 'imports the wiki repository' do
       expect(importer.gitlab_shell)
         .to receive(:import_repository)
-        .with('foo', 'foo.wiki', 'foo.wiki.git', 'group/foo')
+        .with('foo', 'foo.wiki', 'foo.wiki.git', 'group/foo.wiki')
 
       expect(importer.import_wiki_repository).to eq(true)
     end
-- 
2.30.9