Commit a96e0ec57ef6ae129a1adb54e5b9b67d8ffb04b3
Exists in
master
and in
4 other branches
Merge pull request #3240 from DanKnox/fix_wiki_migrator
Fix Wiki migration task and add more test coverage.
Showing
3 changed files
with
154 additions
and
6 deletions
Show diff stats
lib/tasks/gitlab/migrate_wiki.rake
| ... | ... | @@ -16,5 +16,27 @@ namespace :gitlab do |
| 16 | 16 | wiki_migrator = WikiToGollumMigrator.new |
| 17 | 17 | wiki_migrator.migrate! |
| 18 | 18 | end |
| 19 | + | |
| 20 | + # This task will destroy all of the Wiki repos | |
| 21 | + # that the Wiki migration task created. Run this | |
| 22 | + # to clean up your environment if you experienced | |
| 23 | + # problems during the original migration. After | |
| 24 | + # executing this task, you can attempt the original | |
| 25 | + # migration again. | |
| 26 | + # | |
| 27 | + # Notes: | |
| 28 | + # * This will not affect Wikis that have been created | |
| 29 | + # as Gollum Wikis only. It will only remove the wikis | |
| 30 | + # for the repositories that have old Wiki data in the | |
| 31 | + # dataabase. | |
| 32 | + # * If you have any repositories already named | |
| 33 | + # namespace/project.wiki that you do not wish | |
| 34 | + # to be removed you may want to perform a manual | |
| 35 | + # cleanup instead. | |
| 36 | + desc "GITLAB | Remove the Wiki repositories created by the `gitlab:wiki:migrate` task." | |
| 37 | + task :rollback => :environment do | |
| 38 | + wiki_migrator = WikiToGollumMigrator.new | |
| 39 | + wiki_migrator.rollback! | |
| 40 | + end | |
| 19 | 41 | end |
| 20 | 42 | end | ... | ... |
lib/wiki_to_gollum_migrator.rb
| ... | ... | @@ -19,12 +19,30 @@ class WikiToGollumMigrator |
| 19 | 19 | end |
| 20 | 20 | end |
| 21 | 21 | |
| 22 | + def rollback! | |
| 23 | + log "\nBeginning Wiki Migration Rollback..." | |
| 24 | + projects.each do |project| | |
| 25 | + destroy_gollum_repo project | |
| 26 | + end | |
| 27 | + log "\nWiki Rollback Complete." | |
| 28 | + end | |
| 29 | + | |
| 22 | 30 | private |
| 23 | 31 | |
| 24 | 32 | def create_gollum_repo(project) |
| 25 | 33 | GollumWiki.new(project, nil).wiki |
| 26 | 34 | end |
| 27 | 35 | |
| 36 | + def destroy_gollum_repo(project) | |
| 37 | + log " Removing Wiki repo for project: #{project.path_with_namespace}" | |
| 38 | + path = GollumWiki.new(project, nil).path_with_namespace | |
| 39 | + if Gitlab::Shell.new.remove_repository(path) | |
| 40 | + log " Wiki destroyed successfully. " + "[OK}".green | |
| 41 | + else | |
| 42 | + log " Problem destroying wiki. Please remove it manually. " + "[FAILED]".red | |
| 43 | + end | |
| 44 | + end | |
| 45 | + | |
| 28 | 46 | def create_pages(project, wiki) |
| 29 | 47 | pages = project.wikis.group(:slug).all |
| 30 | 48 | |
| ... | ... | @@ -45,8 +63,9 @@ class WikiToGollumMigrator |
| 45 | 63 | wiki = GollumWiki.new(project, page.user) |
| 46 | 64 | wiki_page = WikiPage.new(wiki) |
| 47 | 65 | |
| 48 | - attributes = extract_attributes_from_page(first_rev) | |
| 66 | + attributes = extract_attributes_from_page(first_rev, project) | |
| 49 | 67 | |
| 68 | + log " Creating page '#{first_rev.title}'..." | |
| 50 | 69 | if wiki_page.create(attributes) |
| 51 | 70 | log " Created page '#{wiki_page.title}' " + "[OK]".green |
| 52 | 71 | |
| ... | ... | @@ -59,15 +78,15 @@ class WikiToGollumMigrator |
| 59 | 78 | end |
| 60 | 79 | |
| 61 | 80 | def create_revisions(project, page, revisions) |
| 81 | + log " Creating revisions..." | |
| 62 | 82 | revisions.each do |revision| |
| 63 | - log " Creating revisions..." | |
| 64 | 83 | # Reinitialize a new GollumWiki instance for each page |
| 65 | 84 | # and revision created so the correct User is shown in |
| 66 | 85 | # the commit message. |
| 67 | 86 | wiki = GollumWiki.new(project, revision.user) |
| 68 | 87 | wiki_page = wiki.find_page(page.slug) |
| 69 | 88 | |
| 70 | - attributes = extract_attributes_from_page(revision) | |
| 89 | + attributes = extract_attributes_from_page(revision, project) | |
| 71 | 90 | |
| 72 | 91 | content = attributes[:content] |
| 73 | 92 | |
| ... | ... | @@ -79,13 +98,15 @@ class WikiToGollumMigrator |
| 79 | 98 | end |
| 80 | 99 | end |
| 81 | 100 | |
| 82 | - def extract_attributes_from_page(page) | |
| 101 | + def extract_attributes_from_page(page, project) | |
| 83 | 102 | attributes = page.attributes |
| 84 | 103 | .with_indifferent_access |
| 85 | 104 | .slice(:title, :content) |
| 86 | 105 | |
| 106 | + slug = page.slug | |
| 107 | + | |
| 87 | 108 | # Change 'index' pages to 'home' pages to match Gollum standards |
| 88 | - if attributes[:title].downcase == "index" | |
| 109 | + if slug.downcase == "index" | |
| 89 | 110 | attributes[:title] = "home" unless home_already_exists?(project) |
| 90 | 111 | end |
| 91 | 112 | |
| ... | ... | @@ -93,7 +114,7 @@ class WikiToGollumMigrator |
| 93 | 114 | end |
| 94 | 115 | |
| 95 | 116 | def home_already_exists?(project) |
| 96 | - project.wikis.where(title: 'home').any? || project.wikis.where(title: 'Home').any? | |
| 117 | + project.wikis.where(slug: 'home').any? || project.wikis.where(slug: 'Home').any? | |
| 97 | 118 | end |
| 98 | 119 | |
| 99 | 120 | def log(message) | ... | ... |
spec/lib/wiki_to_gollum_migrator_spec.rb
| ... | ... | @@ -108,6 +108,111 @@ describe WikiToGollumMigrator do |
| 108 | 108 | end |
| 109 | 109 | end |
| 110 | 110 | end |
| 111 | + | |
| 112 | + context "wikis with pages that have titles that do not match the slugs" do | |
| 113 | + before do | |
| 114 | + project = @projects.last | |
| 115 | + @page = project.wikis.new(title: "test page", content: "Invalid Page") | |
| 116 | + @page.slug = "totally-incorrect-slug" | |
| 117 | + @page.user = project.owner | |
| 118 | + @page.save! | |
| 119 | + | |
| 120 | + create_revision(@page) | |
| 121 | + | |
| 122 | + subject.rollback! | |
| 123 | + subject.migrate! | |
| 124 | + end | |
| 125 | + | |
| 126 | + it "has a page with a title differing the slug" do | |
| 127 | + @page.slug.should_not == @page.title.parameterize | |
| 128 | + end | |
| 129 | + | |
| 130 | + it "creates a new revision for each old revision of the page" do | |
| 131 | + @projects.each do |project| | |
| 132 | + wiki = GollumWiki.new(project, nil) | |
| 133 | + wiki.pages.each do |page| | |
| 134 | + page.versions.count.should == 2 | |
| 135 | + end | |
| 136 | + end | |
| 137 | + end | |
| 138 | + end | |
| 139 | + | |
| 140 | + context "changing wiki title from index to home" do | |
| 141 | + before do | |
| 142 | + @project = @projects.last | |
| 143 | + @page = @project.wikis.new(title: "Index", content: "Home Page") | |
| 144 | + @page.slug = "index" | |
| 145 | + @page.user = @project.owner | |
| 146 | + @page.save! | |
| 147 | + | |
| 148 | + create_revision(@page) | |
| 149 | + | |
| 150 | + subject.rollback! | |
| 151 | + end | |
| 152 | + | |
| 153 | + it "creates a page called Home" do | |
| 154 | + subject.migrate! | |
| 155 | + wiki = GollumWiki.new(@project, nil) | |
| 156 | + page = wiki.find_page("home") | |
| 157 | + page.should be_present | |
| 158 | + end | |
| 159 | + | |
| 160 | + context "when a page called Home already exists" do | |
| 161 | + before do | |
| 162 | + @index_page = @project.wikis.new(title: "Index", content: "Index Page") | |
| 163 | + @index_page.slug = "index" | |
| 164 | + @index_page.user = @project.owner | |
| 165 | + @index_page.save! | |
| 166 | + | |
| 167 | + create_revision(@index_page) | |
| 168 | + | |
| 169 | + @home_page = @project.wikis.new(title: "Home", content: "Home Page") | |
| 170 | + @home_page.slug = "home" | |
| 171 | + @home_page.user = @project.owner | |
| 172 | + @home_page.save! | |
| 173 | + | |
| 174 | + create_revision(@home_page) | |
| 175 | + subject.migrate! | |
| 176 | + end | |
| 177 | + | |
| 178 | + it "creates the index page" do | |
| 179 | + wiki = GollumWiki.new(@project, nil) | |
| 180 | + page = wiki.find_page("index") | |
| 181 | + page.should be_present | |
| 182 | + end | |
| 183 | + | |
| 184 | + it "creates the home page" do | |
| 185 | + wiki = GollumWiki.new(@project, nil) | |
| 186 | + page = wiki.find_page("home") | |
| 187 | + page.should be_present | |
| 188 | + end | |
| 189 | + end | |
| 190 | + end | |
| 191 | + end | |
| 192 | + | |
| 193 | + context "#rollback!" do | |
| 194 | + before do | |
| 195 | + Gitlab::Shell.any_instance.stub(:add_repository) do |path| | |
| 196 | + create_temp_repo("#{@repo_path}/#{path}.git") | |
| 197 | + end | |
| 198 | + | |
| 199 | + Gitlab::Shell.any_instance.stub(:remove_repository) do |path| | |
| 200 | + FileUtils.rm_rf "#{@repo_path}/#{path}.git" | |
| 201 | + end | |
| 202 | + | |
| 203 | + subject.stub(:log).as_null_object | |
| 204 | + | |
| 205 | + subject.migrate! | |
| 206 | + subject.rollback! | |
| 207 | + end | |
| 208 | + | |
| 209 | + it "destroys all of the wiki repositories that were created during migrate!" do | |
| 210 | + @projects.each do |project| | |
| 211 | + wiki_path = project.path_with_namespace + ".wiki.git" | |
| 212 | + full_path = @repo_path + "/" + wiki_path | |
| 213 | + File.exist?(full_path).should be_false | |
| 214 | + end | |
| 215 | + end | |
| 111 | 216 | end |
| 112 | 217 | |
| 113 | 218 | ... | ... |