##// END OF EJS Templates
Trac importer:...
Jean-Philippe Lang -
r933:e4724c7626a3
parent child
Show More
@@ -24,7 +24,7 namespace :redmine do
24 task :migrate_from_trac => :environment do
24 task :migrate_from_trac => :environment do
25
25
26 module TracMigrate
26 module TracMigrate
27 TICKET_MAP = [];
27 TICKET_MAP = []
28
28
29 DEFAULT_STATUS = IssueStatus.default
29 DEFAULT_STATUS = IssueStatus.default
30 assigned_status = IssueStatus.find_by_position(2)
30 assigned_status = IssueStatus.find_by_position(2)
@@ -187,7 +187,7 namespace :redmine do
187 # External Links
187 # External Links
188 text = text.gsub(/\[(http[^\s]+)\s+([^\]]+)\]/) {|s| "\"#{$2}\":#{$1}"}
188 text = text.gsub(/\[(http[^\s]+)\s+([^\]]+)\]/) {|s| "\"#{$2}\":#{$1}"}
189 # Internal Links
189 # Internal Links
190 text = text.gsub(/[[BR]]/, "\n") # This has to go before the rules below
190 text = text.gsub(/\[\[BR\]\]/, "\n") # This has to go before the rules below
191 text = text.gsub(/\[\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
191 text = text.gsub(/\[\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
192 text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
192 text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
193 text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
193 text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
@@ -197,7 +197,7 namespace :redmine do
197 # Ticket number re-writing
197 # Ticket number re-writing
198 text = text.gsub(/#(\d+)/) do |s|
198 text = text.gsub(/#(\d+)/) do |s|
199 TICKET_MAP[$1.to_i] ||= $1
199 TICKET_MAP[$1.to_i] ||= $1
200 "\##{TICKET_MAP[$1.to_i]}"
200 "\##{TICKET_MAP[$1.to_i] || $1}"
201 end
201 end
202 # Preformatted blocks
202 # Preformatted blocks
203 text = text.gsub(/\{\{\{/, '<pre>')
203 text = text.gsub(/\{\{\{/, '<pre>')
@@ -213,14 +213,12 namespace :redmine do
213 text = text.gsub(/,,/, '~')
213 text = text.gsub(/,,/, '~')
214 # Lists
214 # Lists
215 text = text.gsub(/^([ ]+)\* /) {|s| '*' * $1.length + " "}
215 text = text.gsub(/^([ ]+)\* /) {|s| '*' * $1.length + " "}
216
217
216
218 text
217 text
219 end
218 end
220
219
221 def self.migrate
220 def self.migrate
222 establish_connection({:adapter => trac_adapter,
221 establish_connection
223 :database => trac_db_path})
224
222
225 # Quick database test
223 # Quick database test
226 TracComponent.count
224 TracComponent.count
@@ -418,26 +416,55 namespace :redmine do
418 end
416 end
419
417
420 def self.set_trac_directory(path)
418 def self.set_trac_directory(path)
421 @trac_directory = path
419 @@trac_directory = path
422 raise "This directory doesn't exist!" unless File.directory?(path)
420 raise "This directory doesn't exist!" unless File.directory?(path)
423 raise "#{trac_db_path} doesn't exist!" unless File.exist?(trac_db_path)
424 raise "#{trac_attachments_directory} doesn't exist!" unless File.directory?(trac_attachments_directory)
421 raise "#{trac_attachments_directory} doesn't exist!" unless File.directory?(trac_attachments_directory)
425 @trac_directory
422 @@trac_directory
426 rescue Exception => e
423 rescue Exception => e
427 puts e
424 puts e
428 return false
425 return false
429 end
426 end
430
427
431 def self.trac_directory
428 def self.trac_directory
432 @trac_directory
429 @@trac_directory
433 end
430 end
434
431
435 def self.set_trac_adapter(adapter)
432 def self.set_trac_adapter(adapter)
436 return false unless %w(sqlite sqlite3).include?(adapter)
433 return false if adapter.blank?
437 @trac_adapter = adapter
434 raise "Unknown adapter: #{adapter}!" unless %w(sqlite sqlite3 mysql postgresql).include?(adapter)
435 # If adapter is sqlite or sqlite3, make sure that trac.db exists
436 raise "#{trac_db_path} doesn't exist!" if %w(sqlite sqlite3).include?(adapter) && !File.exist?(trac_db_path)
437 @@trac_adapter = adapter
438 rescue Exception => e
439 puts e
440 return false
441 end
442
443 def self.set_trac_db_host(host)
444 return nil if host.blank?
445 @@trac_db_host = host
446 end
447
448 def self.set_trac_db_port(port)
449 return nil if port.to_i == 0
450 @@trac_db_port = port.to_i
451 end
452
453 def self.set_trac_db_name(name)
454 return nil if name.blank?
455 @@trac_db_name = name
438 end
456 end
457
458 def self.set_trac_db_username(username)
459 @@trac_db_username = username
460 end
461
462 def self.set_trac_db_password(password)
463 @@trac_db_password = password
464 end
465
466 mattr_reader :trac_directory, :trac_adapter, :trac_db_host, :trac_db_port, :trac_db_name, :trac_db_username, :trac_db_password
439
467
440 def self.trac_adapter; @trac_adapter end
441 def self.trac_db_path; "#{trac_directory}/db/trac.db" end
468 def self.trac_db_path; "#{trac_directory}/db/trac.db" end
442 def self.trac_attachments_directory; "#{trac_directory}/attachments" end
469 def self.trac_attachments_directory; "#{trac_directory}/attachments" end
443
470
@@ -451,17 +478,31 namespace :redmine do
451 puts "Unable to create a project with identifier '#{identifier}'!" unless project.save
478 puts "Unable to create a project with identifier '#{identifier}'!" unless project.save
452 # enable issues and wiki for the created project
479 # enable issues and wiki for the created project
453 project.enabled_module_names = ['issue_tracking', 'wiki']
480 project.enabled_module_names = ['issue_tracking', 'wiki']
454 project.trackers << TRACKER_BUG
455 project.trackers << TRACKER_FEATURE
456 end
481 end
482 project.trackers << TRACKER_BUG
483 project.trackers << TRACKER_FEATURE
457 @target_project = project.new_record? ? nil : project
484 @target_project = project.new_record? ? nil : project
458 end
485 end
459
486
460 def self.establish_connection(params)
487 def self.connection_params
488 if %w(sqlite sqlite3).include?(trac_adapter)
489 {:adapter => trac_adapter,
490 :database => trac_db_path}
491 else
492 {:adapter => trac_adapter,
493 :database => trac_db_name,
494 :host => trac_db_host,
495 :port => trac_db_port,
496 :username => trac_db_username,
497 :password => trac_db_password}
498 end
499 end
500
501 def self.establish_connection
461 constants.each do |const|
502 constants.each do |const|
462 klass = const_get(const)
503 klass = const_get(const)
463 next unless klass.respond_to? 'establish_connection'
504 next unless klass.respond_to? 'establish_connection'
464 klass.establish_connection params
505 klass.establish_connection connection_params
465 end
506 end
466 end
507 end
467
508
@@ -474,7 +515,7 namespace :redmine do
474 end
515 end
475
516
476 puts
517 puts
477 puts "WARNING: Your Redmine install will have a new project added during this process."
518 puts "WARNING: a new project will be added to Redmine during this process."
478 print "Are you sure you want to continue ? [y/N] "
519 print "Are you sure you want to continue ? [y/N] "
479 break unless STDIN.gets.match(/^y$/i)
520 break unless STDIN.gets.match(/^y$/i)
480 puts
521 puts
@@ -489,8 +530,17 namespace :redmine do
489 end
530 end
490 end
531 end
491
532
533 DEFAULT_PORTS = {'mysql' => 3306, 'postgresl' => 5432}
534
492 prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory}
535 prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory}
493 prompt('Trac database adapter (sqlite, sqlite3)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
536 prompt('Trac database adapter (sqlite, sqlite3, mysql, postgresql)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
537 unless %w(sqlite sqlite3).include?(TracMigrate.trac_adapter)
538 prompt('Trac database host', :default => 'localhost') {|host| TracMigrate.set_trac_db_host host}
539 prompt('Trac database port', :default => DEFAULT_PORTS[TracMigrate.trac_adapter]) {|port| TracMigrate.set_trac_db_port port}
540 prompt('Trac database name') {|name| TracMigrate.set_trac_db_name name}
541 prompt('Trac database username') {|username| TracMigrate.set_trac_db_username username}
542 prompt('Trac database password') {|password| TracMigrate.set_trac_db_password password}
543 end
494 prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding}
544 prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding}
495 prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier}
545 prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier}
496 puts
546 puts
General Comments 0
You need to be logged in to leave comments. Login now