Revision 946
Added by Jean-Philippe Lang over 17 years ago
Trac importer:
- should now support mysql and postgresql Trac database
- minor fixes
trunk/lib/tasks/migrate_from_trac.rake | ||
---|---|---|
24 | 24 |
task :migrate_from_trac => :environment do |
25 | 25 |
|
26 | 26 |
module TracMigrate |
27 |
TICKET_MAP = [];
|
|
27 |
TICKET_MAP = [] |
|
28 | 28 |
|
29 | 29 |
DEFAULT_STATUS = IssueStatus.default |
30 | 30 |
assigned_status = IssueStatus.find_by_position(2) |
... | ... | |
187 | 187 |
# External Links |
188 | 188 |
text = text.gsub(/\[(http[^\s]+)\s+([^\]]+)\]/) {|s| "\"#{$2}\":#{$1}"} |
189 | 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 | 191 |
text = text.gsub(/\[\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} |
192 | 192 |
text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} |
193 | 193 |
text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} |
... | ... | |
197 | 197 |
# Ticket number re-writing |
198 | 198 |
text = text.gsub(/#(\d+)/) do |s| |
199 | 199 |
TICKET_MAP[$1.to_i] ||= $1 |
200 |
"\##{TICKET_MAP[$1.to_i]}" |
|
200 |
"\##{TICKET_MAP[$1.to_i] || $1}"
|
|
201 | 201 |
end |
202 | 202 |
# Preformatted blocks |
203 | 203 |
text = text.gsub(/\{\{\{/, '<pre>') |
... | ... | |
213 | 213 |
text = text.gsub(/,,/, '~') |
214 | 214 |
# Lists |
215 | 215 |
text = text.gsub(/^([ ]+)\* /) {|s| '*' * $1.length + " "} |
216 |
|
|
217 | 216 |
|
218 | 217 |
text |
219 | 218 |
end |
220 | 219 |
|
221 | 220 |
def self.migrate |
222 |
establish_connection({:adapter => trac_adapter, |
|
223 |
:database => trac_db_path}) |
|
221 |
establish_connection |
|
224 | 222 |
|
225 | 223 |
# Quick database test |
226 | 224 |
TracComponent.count |
... | ... | |
418 | 416 |
end |
419 | 417 |
|
420 | 418 |
def self.set_trac_directory(path) |
421 |
@trac_directory = path |
|
419 |
@@trac_directory = path
|
|
422 | 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 | 421 |
raise "#{trac_attachments_directory} doesn't exist!" unless File.directory?(trac_attachments_directory) |
425 |
@trac_directory |
|
422 |
@@trac_directory
|
|
426 | 423 |
rescue Exception => e |
427 | 424 |
puts e |
428 | 425 |
return false |
429 | 426 |
end |
430 | 427 |
|
431 | 428 |
def self.trac_directory |
432 |
@trac_directory |
|
429 |
@@trac_directory
|
|
433 | 430 |
end |
434 | 431 |
|
435 | 432 |
def self.set_trac_adapter(adapter) |
436 |
return false unless %w(sqlite sqlite3).include?(adapter) |
|
437 |
@trac_adapter = adapter |
|
433 |
return false if adapter.blank? |
|
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 |
|
438 | 441 |
end |
439 | 442 |
|
440 |
def self.trac_adapter; @trac_adapter end |
|
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 |
|
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 |
|
467 |
|
|
441 | 468 |
def self.trac_db_path; "#{trac_directory}/db/trac.db" end |
442 | 469 |
def self.trac_attachments_directory; "#{trac_directory}/attachments" end |
443 | 470 |
|
... | ... | |
451 | 478 |
puts "Unable to create a project with identifier '#{identifier}'!" unless project.save |
452 | 479 |
# enable issues and wiki for the created project |
453 | 480 |
project.enabled_module_names = ['issue_tracking', 'wiki'] |
454 |
project.trackers << TRACKER_BUG |
|
455 |
project.trackers << TRACKER_FEATURE |
|
456 | 481 |
end |
482 |
project.trackers << TRACKER_BUG |
|
483 |
project.trackers << TRACKER_FEATURE |
|
457 | 484 |
@target_project = project.new_record? ? nil : project |
458 | 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 | 502 |
constants.each do |const| |
462 | 503 |
klass = const_get(const) |
463 | 504 |
next unless klass.respond_to? 'establish_connection' |
464 |
klass.establish_connection params |
|
505 |
klass.establish_connection connection_params
|
|
465 | 506 |
end |
466 | 507 |
end |
467 | 508 |
|
... | ... | |
474 | 515 |
end |
475 | 516 |
|
476 | 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 | 519 |
print "Are you sure you want to continue ? [y/N] " |
479 | 520 |
break unless STDIN.gets.match(/^y$/i) |
480 | 521 |
puts |
... | ... | |
489 | 530 |
end |
490 | 531 |
end |
491 | 532 |
|
533 |
DEFAULT_PORTS = {'mysql' => 3306, 'postgresl' => 5432} |
|
534 |
|
|
492 | 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 | 544 |
prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding} |
495 | 545 |
prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier} |
496 | 546 |
puts |
Also available in: Unified diff