summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-03-17 04:48:27 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-03-17 04:48:27 -0700
commita96e0ec57ef6ae129a1adb54e5b9b67d8ffb04b3 (patch)
tree6cf64c471f4573c1b181f528e3c98fc3866103ab
parentc367cc5ca66c0d59c0e5228ed1724023ea6ad06e (diff)
parent330fe4162eea06dbcf2cd498fe35436163093e40 (diff)
downloadgitlab-ce-a96e0ec57ef6ae129a1adb54e5b9b67d8ffb04b3.tar.gz
Merge pull request #3240 from DanKnox/fix_wiki_migrator
Fix Wiki migration task and add more test coverage.
-rw-r--r--lib/tasks/gitlab/migrate_wiki.rake22
-rw-r--r--lib/wiki_to_gollum_migrator.rb33
-rw-r--r--spec/lib/wiki_to_gollum_migrator_spec.rb105
3 files changed, 154 insertions, 6 deletions
diff --git a/lib/tasks/gitlab/migrate_wiki.rake b/lib/tasks/gitlab/migrate_wiki.rake
index 9b2f34c6b19..5d9881e45db 100644
--- a/lib/tasks/gitlab/migrate_wiki.rake
+++ b/lib/tasks/gitlab/migrate_wiki.rake
@@ -16,5 +16,27 @@ namespace :gitlab do
wiki_migrator = WikiToGollumMigrator.new
wiki_migrator.migrate!
end
+
+ # This task will destroy all of the Wiki repos
+ # that the Wiki migration task created. Run this
+ # to clean up your environment if you experienced
+ # problems during the original migration. After
+ # executing this task, you can attempt the original
+ # migration again.
+ #
+ # Notes:
+ # * This will not affect Wikis that have been created
+ # as Gollum Wikis only. It will only remove the wikis
+ # for the repositories that have old Wiki data in the
+ # dataabase.
+ # * If you have any repositories already named
+ # namespace/project.wiki that you do not wish
+ # to be removed you may want to perform a manual
+ # cleanup instead.
+ desc "GITLAB | Remove the Wiki repositories created by the `gitlab:wiki:migrate` task."
+ task :rollback => :environment do
+ wiki_migrator = WikiToGollumMigrator.new
+ wiki_migrator.rollback!
+ end
end
end
diff --git a/lib/wiki_to_gollum_migrator.rb b/lib/wiki_to_gollum_migrator.rb
index 6083533b7e2..ed6a1700631 100644
--- a/lib/wiki_to_gollum_migrator.rb
+++ b/lib/wiki_to_gollum_migrator.rb
@@ -19,12 +19,30 @@ class WikiToGollumMigrator
end
end
+ def rollback!
+ log "\nBeginning Wiki Migration Rollback..."
+ projects.each do |project|
+ destroy_gollum_repo project
+ end
+ log "\nWiki Rollback Complete."
+ end
+
private
def create_gollum_repo(project)
GollumWiki.new(project, nil).wiki
end
+ def destroy_gollum_repo(project)
+ log " Removing Wiki repo for project: #{project.path_with_namespace}"
+ path = GollumWiki.new(project, nil).path_with_namespace
+ if Gitlab::Shell.new.remove_repository(path)
+ log " Wiki destroyed successfully. " + "[OK}".green
+ else
+ log " Problem destroying wiki. Please remove it manually. " + "[FAILED]".red
+ end
+ end
+
def create_pages(project, wiki)
pages = project.wikis.group(:slug).all
@@ -45,8 +63,9 @@ class WikiToGollumMigrator
wiki = GollumWiki.new(project, page.user)
wiki_page = WikiPage.new(wiki)
- attributes = extract_attributes_from_page(first_rev)
+ attributes = extract_attributes_from_page(first_rev, project)
+ log " Creating page '#{first_rev.title}'..."
if wiki_page.create(attributes)
log " Created page '#{wiki_page.title}' " + "[OK]".green
@@ -59,15 +78,15 @@ class WikiToGollumMigrator
end
def create_revisions(project, page, revisions)
+ log " Creating revisions..."
revisions.each do |revision|
- log " Creating revisions..."
# Reinitialize a new GollumWiki instance for each page
# and revision created so the correct User is shown in
# the commit message.
wiki = GollumWiki.new(project, revision.user)
wiki_page = wiki.find_page(page.slug)
- attributes = extract_attributes_from_page(revision)
+ attributes = extract_attributes_from_page(revision, project)
content = attributes[:content]
@@ -79,13 +98,15 @@ class WikiToGollumMigrator
end
end
- def extract_attributes_from_page(page)
+ def extract_attributes_from_page(page, project)
attributes = page.attributes
.with_indifferent_access
.slice(:title, :content)
+ slug = page.slug
+
# Change 'index' pages to 'home' pages to match Gollum standards
- if attributes[:title].downcase == "index"
+ if slug.downcase == "index"
attributes[:title] = "home" unless home_already_exists?(project)
end
@@ -93,7 +114,7 @@ class WikiToGollumMigrator
end
def home_already_exists?(project)
- project.wikis.where(title: 'home').any? || project.wikis.where(title: 'Home').any?
+ project.wikis.where(slug: 'home').any? || project.wikis.where(slug: 'Home').any?
end
def log(message)
diff --git a/spec/lib/wiki_to_gollum_migrator_spec.rb b/spec/lib/wiki_to_gollum_migrator_spec.rb
index a784d836d62..f9b9c78ea01 100644
--- a/spec/lib/wiki_to_gollum_migrator_spec.rb
+++ b/spec/lib/wiki_to_gollum_migrator_spec.rb
@@ -108,6 +108,111 @@ describe WikiToGollumMigrator do
end
end
end
+
+ context "wikis with pages that have titles that do not match the slugs" do
+ before do
+ project = @projects.last
+ @page = project.wikis.new(title: "test page", content: "Invalid Page")
+ @page.slug = "totally-incorrect-slug"
+ @page.user = project.owner
+ @page.save!
+
+ create_revision(@page)
+
+ subject.rollback!
+ subject.migrate!
+ end
+
+ it "has a page with a title differing the slug" do
+ @page.slug.should_not == @page.title.parameterize
+ end
+
+ it "creates a new revision for each old revision of the page" do
+ @projects.each do |project|
+ wiki = GollumWiki.new(project, nil)
+ wiki.pages.each do |page|
+ page.versions.count.should == 2
+ end
+ end
+ end
+ end
+
+ context "changing wiki title from index to home" do
+ before do
+ @project = @projects.last
+ @page = @project.wikis.new(title: "Index", content: "Home Page")
+ @page.slug = "index"
+ @page.user = @project.owner
+ @page.save!
+
+ create_revision(@page)
+
+ subject.rollback!
+ end
+
+ it "creates a page called Home" do
+ subject.migrate!
+ wiki = GollumWiki.new(@project, nil)
+ page = wiki.find_page("home")
+ page.should be_present
+ end
+
+ context "when a page called Home already exists" do
+ before do
+ @index_page = @project.wikis.new(title: "Index", content: "Index Page")
+ @index_page.slug = "index"
+ @index_page.user = @project.owner
+ @index_page.save!
+
+ create_revision(@index_page)
+
+ @home_page = @project.wikis.new(title: "Home", content: "Home Page")
+ @home_page.slug = "home"
+ @home_page.user = @project.owner
+ @home_page.save!
+
+ create_revision(@home_page)
+ subject.migrate!
+ end
+
+ it "creates the index page" do
+ wiki = GollumWiki.new(@project, nil)
+ page = wiki.find_page("index")
+ page.should be_present
+ end
+
+ it "creates the home page" do
+ wiki = GollumWiki.new(@project, nil)
+ page = wiki.find_page("home")
+ page.should be_present
+ end
+ end
+ end
+ end
+
+ context "#rollback!" do
+ before do
+ Gitlab::Shell.any_instance.stub(:add_repository) do |path|
+ create_temp_repo("#{@repo_path}/#{path}.git")
+ end
+
+ Gitlab::Shell.any_instance.stub(:remove_repository) do |path|
+ FileUtils.rm_rf "#{@repo_path}/#{path}.git"
+ end
+
+ subject.stub(:log).as_null_object
+
+ subject.migrate!
+ subject.rollback!
+ end
+
+ it "destroys all of the wiki repositories that were created during migrate!" do
+ @projects.each do |project|
+ wiki_path = project.path_with_namespace + ".wiki.git"
+ full_path = @repo_path + "/" + wiki_path
+ File.exist?(full_path).should be_false
+ end
+ end
end