@@ -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 |
|
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. |
|
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: |
|
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