##// END OF EJS Templates
Trac importer fix:...
Jean-Philippe Lang -
r1161:421d4203113a
parent child
Show More
@@ -43,7 +43,13 namespace :redmine do
43 'low' => priorities[0],
43 'low' => priorities[0],
44 'normal' => priorities[1],
44 'normal' => priorities[1],
45 'high' => priorities[2],
45 'high' => priorities[2],
46 'highest' => priorities[3]
46 'highest' => priorities[3],
47 # ---
48 'trivial' => priorities[0],
49 'minor' => priorities[1],
50 'major' => priorities[2],
51 'critical' => priorities[3],
52 'blocker' => priorities[4]
47 }
53 }
48
54
49 TRACKER_BUG = Tracker.find_by_position(1)
55 TRACKER_BUG = Tracker.find_by_position(1)
@@ -143,8 +149,19 namespace :redmine do
143 def time; Time.at(read_attribute(:time)) end
149 def time; Time.at(read_attribute(:time)) end
144 end
150 end
145
151
152 TRAC_WIKI_PAGES = %w(TracAccessibility TracAdmin TracBackup TracBrowser TracCgi TracChangeset \
153 TracEnvironment TracFastCgi TracGuide TracImport TracIni TracInstall TracInterfaceCustomization \
154 TracLinks TracLogging TracModPython TracNotification TracPermissions TracPlugins TracQuery \
155 TracReports TracRoadmap TracRss TracSearch TracStandalone TracSupport TracSyntaxColoring TracTickets \
156 TracTicketsCustomFields TracTimeline TracUnicode TracUpgrade TracWiki WikiDeletePage WikiFormatting \
157 WikiHtml WikiMacros WikiNewPage WikiPageNames WikiProcessors WikiRestructuredText WikiRestructuredTextLinks \
158 CamelCase TitleIndex)
159
146 class TracWikiPage < ActiveRecord::Base
160 class TracWikiPage < ActiveRecord::Base
147 set_table_name :wiki
161 set_table_name :wiki
162 set_primary_key :name
163
164 has_many :attachments, :class_name => "TracAttachment", :foreign_key => :id, :conditions => "#{TracMigrate::TracAttachment.table_name}.type = 'wiki'"
148
165
149 def self.columns
166 def self.columns
150 # Hides readonly Trac field to prevent clash with AR readonly? method (Rails 2.0)
167 # Hides readonly Trac field to prevent clash with AR readonly? method (Rails 2.0)
@@ -203,8 +220,12 namespace :redmine do
203 text = text.gsub(/\[(\d+)\]/, 'r\1')
220 text = text.gsub(/\[(\d+)\]/, 'r\1')
204 # Ticket number re-writing
221 # Ticket number re-writing
205 text = text.gsub(/#(\d+)/) do |s|
222 text = text.gsub(/#(\d+)/) do |s|
223 if $1.length < 10
206 TICKET_MAP[$1.to_i] ||= $1
224 TICKET_MAP[$1.to_i] ||= $1
207 "\##{TICKET_MAP[$1.to_i] || $1}"
225 "\##{TICKET_MAP[$1.to_i] || $1}"
226 else
227 s
228 end
208 end
229 end
209 # Preformatted blocks
230 # Preformatted blocks
210 text = text.gsub(/\{\{\{/, '<pre>')
231 text = text.gsub(/\{\{\{/, '<pre>')
@@ -236,6 +257,7 namespace :redmine do
236 migrated_custom_values = 0
257 migrated_custom_values = 0
237 migrated_ticket_attachments = 0
258 migrated_ticket_attachments = 0
238 migrated_wiki_edits = 0
259 migrated_wiki_edits = 0
260 migrated_wiki_attachments = 0
239
261
240 # Components
262 # Components
241 print "Migrating components"
263 print "Migrating components"
@@ -384,8 +406,12 namespace :redmine do
384 @target_project.wiki.destroy if @target_project.wiki
406 @target_project.wiki.destroy if @target_project.wiki
385 @target_project.reload
407 @target_project.reload
386 wiki = Wiki.new(:project => @target_project, :start_page => 'WikiStart')
408 wiki = Wiki.new(:project => @target_project, :start_page => 'WikiStart')
409 wiki_edit_count = 0
387 if wiki.save
410 if wiki.save
388 TracWikiPage.find(:all, :order => 'name, version').each do |page|
411 TracWikiPage.find(:all, :order => 'name, version').each do |page|
412 # Do not migrate Trac manual wiki pages
413 next if TRAC_WIKI_PAGES.include?(page.name)
414 wiki_edit_count += 1
389 print '.'
415 print '.'
390 STDOUT.flush
416 STDOUT.flush
391 p = wiki.find_or_new_page(page.name)
417 p = wiki.find_or_new_page(page.name)
@@ -394,7 +420,20 namespace :redmine do
394 p.content.author = find_or_create_user(page.author) unless page.author.blank? || page.author == 'trac'
420 p.content.author = find_or_create_user(page.author) unless page.author.blank? || page.author == 'trac'
395 p.content.comments = page.comment
421 p.content.comments = page.comment
396 p.new_record? ? p.save : p.content.save
422 p.new_record? ? p.save : p.content.save
397 migrated_wiki_edits += 1 unless p.content.new_record?
423
424 next if p.content.new_record?
425 migrated_wiki_edits += 1
426
427 # Attachments
428 page.attachments.each do |attachment|
429 next unless attachment.exist?
430 next if p.attachments.find_by_filename(attachment.filename.gsub(/^.*(\\|\/)/, '').gsub(/[^\w\.\-]/,'_')) #add only once per page
431 a = Attachment.new :created_on => attachment.time
432 a.file = attachment
433 a.author = find_or_create_user(attachment.author)
434 a.container = p
435 migrated_wiki_attachments += 1 if a.save
436 end
398 end
437 end
399
438
400 wiki.reload
439 wiki.reload
@@ -409,9 +448,10 namespace :redmine do
409 puts "Components: #{migrated_components}/#{TracComponent.count}"
448 puts "Components: #{migrated_components}/#{TracComponent.count}"
410 puts "Milestones: #{migrated_milestones}/#{TracMilestone.count}"
449 puts "Milestones: #{migrated_milestones}/#{TracMilestone.count}"
411 puts "Tickets: #{migrated_tickets}/#{TracTicket.count}"
450 puts "Tickets: #{migrated_tickets}/#{TracTicket.count}"
412 puts "Ticket files: #{migrated_ticket_attachments}/" + TracAttachment.count("type = 'ticket'").to_s
451 puts "Ticket files: #{migrated_ticket_attachments}/" + TracAttachment.count(:conditions => {:type => 'ticket'}).to_s
413 puts "Custom values: #{migrated_custom_values}/#{TracTicketCustom.count}"
452 puts "Custom values: #{migrated_custom_values}/#{TracTicketCustom.count}"
414 puts "Wiki edits: #{migrated_wiki_edits}/#{TracWikiPage.count}"
453 puts "Wiki edits: #{migrated_wiki_edits}/#{wiki_edit_count}"
454 puts "Wiki files: #{migrated_wiki_attachments}/" + TracAttachment.count(:conditions => {:type => 'wiki'}).to_s
415 end
455 end
416
456
417 def self.limit_for(klass, attribute)
457 def self.limit_for(klass, attribute)
@@ -542,7 +582,7 namespace :redmine do
542
582
543 DEFAULT_PORTS = {'mysql' => 3306, 'postgresl' => 5432}
583 DEFAULT_PORTS = {'mysql' => 3306, 'postgresl' => 5432}
544
584
545 prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory}
585 prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory.strip}
546 prompt('Trac database adapter (sqlite, sqlite3, mysql, postgresql)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
586 prompt('Trac database adapter (sqlite, sqlite3, mysql, postgresql)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
547 unless %w(sqlite sqlite3).include?(TracMigrate.trac_adapter)
587 unless %w(sqlite sqlite3).include?(TracMigrate.trac_adapter)
548 prompt('Trac database host', :default => 'localhost') {|host| TracMigrate.set_trac_db_host host}
588 prompt('Trac database host', :default => 'localhost') {|host| TracMigrate.set_trac_db_host host}
General Comments 0
You need to be logged in to leave comments. Login now