Project

General

Profile

« Previous | Next » 

Revision 946

Trac importer:
  • should now support mysql and postgresql Trac database
  • minor fixes

View differences:

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