Remove wiki migrator. We dont need it any more. Users should migrate to 5.0 first
This commit is contained in:
parent
86e368a8af
commit
0415566b37
|
@ -1,42 +0,0 @@
|
|||
namespace :gitlab do
|
||||
namespace :wiki do
|
||||
|
||||
# This task will migrate all of the existing Wiki
|
||||
# content stored in your database into the new
|
||||
# Gollum Wiki system. A new repository named
|
||||
# namespace/project.wiki.git will be created for
|
||||
# each project that currently has Wiki pages in
|
||||
# the database.
|
||||
#
|
||||
# Notes:
|
||||
# * The existing Wiki content will remain in your
|
||||
# database in-tact.
|
||||
desc "GITLAB | Migrate Wiki content from database to Gollum repositories."
|
||||
task :migrate => :environment 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
|
|
@ -1,124 +0,0 @@
|
|||
class WikiToGollumMigrator
|
||||
|
||||
attr_reader :projects
|
||||
|
||||
def initialize
|
||||
@projects = []
|
||||
|
||||
Project.find_in_batches(batch_size: 50) do |batch|
|
||||
batch.each { |p| @projects << p if p.wikis.any? }
|
||||
end
|
||||
end
|
||||
|
||||
def migrate!
|
||||
projects.each do |project|
|
||||
log "\nMigrating Wiki for '#{project.path_with_namespace}'"
|
||||
wiki = create_gollum_repo(project)
|
||||
create_pages project, wiki
|
||||
log "Project '#{project.path_with_namespace}' migrated. " + "[OK]".green
|
||||
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
|
||||
|
||||
pages.each do |page|
|
||||
create_page_and_revisions(project, page)
|
||||
end
|
||||
end
|
||||
|
||||
def create_page_and_revisions(project, page)
|
||||
# Grab all revisions of the page
|
||||
revisions = project.wikis.where(slug: page.slug).ordered.all
|
||||
|
||||
# Remove the first revision created from the array
|
||||
# and use it to create the Gollum page. Each successive revision
|
||||
# will then be applied to the new Gollum page as an update.
|
||||
first_rev = revisions.pop
|
||||
|
||||
wiki = GollumWiki.new(project, page.user)
|
||||
wiki_page = WikiPage.new(wiki)
|
||||
|
||||
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
|
||||
|
||||
# Reverse the revisions to create them in the correct
|
||||
# chronological order.
|
||||
create_revisions(project, wiki_page, revisions.reverse)
|
||||
else
|
||||
log " Failed to create page '#{wiki_page.title}' " + "[FAILED]".red
|
||||
end
|
||||
end
|
||||
|
||||
def create_revisions(project, page, revisions)
|
||||
log " Creating revisions..."
|
||||
revisions.each do |revision|
|
||||
# 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, project)
|
||||
|
||||
content = attributes[:content]
|
||||
|
||||
if wiki_page.update(content)
|
||||
log " Created revision " + "[OK]".green
|
||||
else
|
||||
log " Failed to create revision " + "[FAILED]".red
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
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 slug.downcase == "index"
|
||||
attributes[:title] = "home" unless home_already_exists?(project)
|
||||
end
|
||||
|
||||
attributes
|
||||
end
|
||||
|
||||
def home_already_exists?(project)
|
||||
project.wikis.where(slug: 'home').any? || project.wikis.where(slug: 'Home').any?
|
||||
end
|
||||
|
||||
def log(message)
|
||||
puts message
|
||||
end
|
||||
|
||||
end
|
|
@ -1,219 +0,0 @@
|
|||
require "spec_helper"
|
||||
|
||||
describe WikiToGollumMigrator do
|
||||
|
||||
def create_wiki_for(project)
|
||||
3.times { @pages[project.id] << create_page(project) }
|
||||
end
|
||||
|
||||
def create_revisions_for(project)
|
||||
@pages[project.id].each do |page|
|
||||
create_revision(page)
|
||||
end
|
||||
end
|
||||
|
||||
def create_page(project)
|
||||
page = project.wikis.new(title: "Page #{rand(1000)}", content: "Content")
|
||||
page.user = project.owner
|
||||
page.slug = page.title.parameterize
|
||||
page.save!
|
||||
page
|
||||
end
|
||||
|
||||
def create_revision(page)
|
||||
revision = page.dup
|
||||
revision.content = "Updated Content"
|
||||
revision.save!
|
||||
end
|
||||
|
||||
def create_temp_repo(path)
|
||||
FileUtils.mkdir_p path
|
||||
command = "git init --quiet --bare #{path};"
|
||||
system(command)
|
||||
end
|
||||
|
||||
before do
|
||||
@repo_path = "#{Rails.root}/tmp/test-git-base-path"
|
||||
@projects = []
|
||||
@pages = Hash.new {|h,k| h[k] = Array.new }
|
||||
|
||||
@projects << create(:project)
|
||||
@projects << create(:project)
|
||||
|
||||
@projects.each do |project|
|
||||
create_wiki_for project
|
||||
create_revisions_for project
|
||||
end
|
||||
|
||||
@project_without_wiki = create(:project)
|
||||
end
|
||||
|
||||
context "Before the migration" do
|
||||
it "has two projects with valid wikis" do
|
||||
@projects.each do |project|
|
||||
pages = project.wikis.group(:slug).all
|
||||
pages.count.should == 3
|
||||
end
|
||||
end
|
||||
|
||||
it "has two revision for each page" do
|
||||
@projects.each do |project|
|
||||
@pages[project.id].each do |page|
|
||||
revisions = project.wikis.where(slug: page.slug)
|
||||
revisions.count.should == 2
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#initialize" do
|
||||
it "finds all projects that have existing wiki pages" do
|
||||
Project.count.should == 3
|
||||
subject.projects.count.should == 2
|
||||
end
|
||||
end
|
||||
|
||||
context "#migrate!" do
|
||||
before do
|
||||
Gitlab::Shell.any_instance.stub(:add_repository) do |path|
|
||||
create_temp_repo("#{@repo_path}/#{path}.git")
|
||||
end
|
||||
|
||||
subject.stub(:log).as_null_object
|
||||
|
||||
subject.migrate!
|
||||
end
|
||||
|
||||
it "creates a new Gollum Wiki for each project" 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_true
|
||||
File.directory?(full_path).should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "creates a gollum page for each unique Wiki page" do
|
||||
@projects.each do |project|
|
||||
wiki = GollumWiki.new(project, nil)
|
||||
wiki.pages.count.should == 3
|
||||
end
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
end
|
Loading…
Reference in New Issue