From 78f5eb94fb15f7e4cc4208a4871b9533243bec40 Mon Sep 17 00:00:00 2001
From: Douglas Barbosa Alexandre <dbalexandre@gmail.com>
Date: Wed, 6 Jan 2016 21:15:37 -0200
Subject: [PATCH] Import GitHub wiki into GitLab

---
 lib/gitlab/github_import/importer.rb          | 13 +++++++++++
 lib/gitlab/github_import/project_creator.rb   |  3 ++-
 lib/gitlab/github_import/wiki_formatter.rb    | 19 ++++++++++++++++
 .../github_import/wiki_formatter_spec.rb      | 22 +++++++++++++++++++
 4 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 lib/gitlab/github_import/wiki_formatter.rb
 create mode 100644 spec/lib/gitlab/github_import/wiki_formatter_spec.rb

diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb
index 2b0afbc7b39..f75227b4734 100644
--- a/lib/gitlab/github_import/importer.rb
+++ b/lib/gitlab/github_import/importer.rb
@@ -1,6 +1,8 @@
 module Gitlab
   module GithubImport
     class Importer
+      include Gitlab::ShellAdapter
+
       attr_reader :project, :client
 
       def initialize(project)
@@ -14,8 +16,11 @@ module Gitlab
       def execute
         import_issues
         import_pull_requests
+        import_wiki
 
         true
+      rescue Gitlab::Shell::Error
+        false
       end
 
       private
@@ -66,6 +71,14 @@ module Gitlab
           noteable.notes.create!(comment.attributes)
         end
       end
+
+      def import_wiki
+        unless project.wiki_enabled?
+          wiki = WikiFormatter.new(project)
+          gitlab_shell.import_repository(wiki.path_with_namespace, wiki.import_url)
+          project.update_attribute(:wiki_enabled, true)
+        end
+      end
     end
   end
 end
diff --git a/lib/gitlab/github_import/project_creator.rb b/lib/gitlab/github_import/project_creator.rb
index 8c27ebd1ce8..474927069a5 100644
--- a/lib/gitlab/github_import/project_creator.rb
+++ b/lib/gitlab/github_import/project_creator.rb
@@ -20,7 +20,8 @@ module Gitlab
           visibility_level: repo.private ? Gitlab::VisibilityLevel::PRIVATE : Gitlab::VisibilityLevel::PUBLIC,
           import_type: "github",
           import_source: repo.full_name,
-          import_url: repo.clone_url.sub("https://", "https://#{@session_data[:github_access_token]}@")
+          import_url: repo.clone_url.sub("https://", "https://#{@session_data[:github_access_token]}@"),
+          wiki_enabled: !repo.has_wiki? # If repo has wiki we'll import it later
         ).execute
 
         project.create_import_data(data: { "github_session" => session_data } )
diff --git a/lib/gitlab/github_import/wiki_formatter.rb b/lib/gitlab/github_import/wiki_formatter.rb
new file mode 100644
index 00000000000..6dd2b917c4a
--- /dev/null
+++ b/lib/gitlab/github_import/wiki_formatter.rb
@@ -0,0 +1,19 @@
+module Gitlab
+  module GithubImport
+    class WikiFormatter
+      attr_reader :project
+
+      def initialize(project)
+        @project = project
+      end
+
+      def path_with_namespace
+        "#{project.path_with_namespace}.wiki"
+      end
+
+      def import_url
+        project.import_url.sub(".git", ".wiki.git")
+      end
+    end
+  end
+end
diff --git a/spec/lib/gitlab/github_import/wiki_formatter_spec.rb b/spec/lib/gitlab/github_import/wiki_formatter_spec.rb
new file mode 100644
index 00000000000..a4ef7b60ae1
--- /dev/null
+++ b/spec/lib/gitlab/github_import/wiki_formatter_spec.rb
@@ -0,0 +1,22 @@
+require 'spec_helper'
+
+describe Gitlab::GithubImport::WikiFormatter, lib: true do
+  let(:project) do
+    create(:project, namespace: create(:namespace, path: 'gitlabhq'),
+                     import_url: 'https://xxx@github.com/gitlabhq/gitlabhq.git')
+  end
+
+  subject(:wiki) { described_class.new(project)}
+
+  describe '#path_with_namespace' do
+    it 'appends .wiki to project path' do
+      expect(wiki.path_with_namespace).to eq 'gitlabhq/gitlabhq.wiki'
+    end
+  end
+
+  describe '#import_url' do
+    it 'returns URL of the wiki repository' do
+      expect(wiki.import_url).to eq 'https://xxx@github.com/gitlabhq/gitlabhq.wiki.git'
+    end
+  end
+end
-- 
GitLab