jbox-web/redmine_git_hosting

View on GitHub
lib/tasks/migration_tools.rake

Summary

Maintainability
Test Coverage
# frozen_string_literal: true

namespace :redmine_git_hosting do
  namespace :migration_tools do
    desc 'Fix migration numbers (add missing trailing 0 to some migrations)'
    task fix_migration_numbers: [:environment] do
      puts ''

      %w[2011072600000 2011080700000 2011081300000 2011081700000 2012052100000 2012052100001 2012052200000].each do |migration|
        old_name = "#{migration}-redmine_git_hosting"
        new_name = "#{migration}0-redmine_git_hosting"
        puts "old_name : #{old_name}"
        puts "new_name : #{new_name}"

        # Get the old migration name
        query  = "SELECT * FROM #{ActiveRecord::Base.connection.quote_string 'schema_migrations'} " \
                 "WHERE #{ActiveRecord::Base.connection.quote_string 'version'} = " \
                 "'#{ActiveRecord::Base.connection.quote_string old_name}';"
        result = ActiveRecord::Base.connection.execute query

        # If present, rename
        if result.to_a.present?
          query = "DELETE FROM #{ActiveRecord::Base.connection.quote_string 'schema_migrations'} " \
                  "WHERE #{ActiveRecord::Base.connection.quote_string 'version'} = " \
                  "'#{ActiveRecord::Base.connection.quote_string old_name}';"
          ActiveRecord::Base.connection.execute query

          query = "INSERT INTO #{ActiveRecord::Base.connection.quote_string 'schema_migrations'} (VERSION) " \
                  "VALUES ('#{ActiveRecord::Base.connection.quote_string new_name}');"
          ActiveRecord::Base.connection.execute query
        else
          # Check the new name is present
          query  = "SELECT * FROM #{ActiveRecord::Base.connection.quote_string 'schema_migrations'} " \
                   "WHERE #{ActiveRecord::Base.connection.quote_string 'version'} = " \
                   "'#{ActiveRecord::Base.connection.quote_string new_name}';"
          result = ActiveRecord::Base.connection.execute query

          if result.to_a.empty?
            puts "Error : migration is missing #{new_name}"
          else
            puts 'Already migrated, pass!'
            puts ''
          end
          next
        end
        puts ''
      end

      puts 'Done!'
    end

    desc 'Rename SSH keys'
    task rename_ssh_keys: [:environment] do
      puts ''
      puts 'Delete SSH keys in Gitolite and reset identifier :'
      puts ''

      GitolitePublicKey.all.each do |ssh_key|
        puts "  - Delete SSH key #{ssh_key.identifier}"
        RedmineGitHosting::GitoliteAccessor.destroy_ssh_key ssh_key, bypass_sidekiq: true
        ssh_key.reset_identifiers
      end
      puts ''

      puts 'Add SSH keys with new name in Gitolite :'
      puts ''

      GitolitePublicKey.all.each do |ssh_key|
        puts "  - Add SSH key : #{ssh_key.identifier}"
        RedmineGitHosting::GitoliteAccessor.create_ssh_key ssh_key, bypass_sidekiq: true
      end

      puts ''

      RedmineGitHosting::GitoliteAccessor.update_projects 'all',
                                                          message: 'Gitolite configuration has been modified, resync all projects...',
                                                          bypass_sidekiq: true
      puts 'Done!'
    end

    desc 'Update repositories type (from Git to Xitolite)'
    task update_repositories_type: [:environment] do
      puts ''
      puts 'Update repositories type (from Git to Xitolite) :'
      puts ''

      Repository::Git.all.each do |repository|
        # Don't update real Git repositories
        next if repository.url.start_with? '/'

        # Don't update orphan repositories
        if repository.project.nil?
          puts "Repository with id: '#{repository.id}' doesn't have a project, skipping!!"
          puts ''
          next
        end

        # Update Gitolite repositories
        if repository.identifier.blank?
          puts repository.project.identifier
        else
          puts repository.identifier
        end

        repository.update_attribute :type, 'Repository::Xitolite'
        puts 'Done!'
        puts ''
      end
    end

    desc 'Check GitExtras presence'
    task check_git_extras_presence: [:environment] do
      puts ''
      puts 'Checking for GitExtras presence'
      puts ''

      Repository::Xitolite.all.each do |repository|
        if repository.project.nil?
          puts " - ERROR : Repository with id '##{repository.id}' has no associated project ! You should take a look at it !"
          puts ''
          next
        elsif !repository.extra.nil?
          puts " - Repository '#{repository.redmine_name}' has an entry in RepositoryGitExtras table, update it :"
          repository.extra.save!
        else
          puts " - Repository '#{repository.redmine_name}' has no entry in RepositoryGitExtras table, create it :"
          default_extra_options = {
            git_http: RedmineGitHosting::Config.gitolite_http_by_default?,
            git_daemon: RedmineGitHosting::Config.gitolite_daemon_by_default?,
            git_notify: RedmineGitHosting::Config.gitolite_notify_by_default?,
            git_annex: false,
            default_branch: 'master',
            key: RedmineGitHosting::Utils::Crypto.generate_secret(64)
          }
          extra = repository.build_extra default_extra_options
          extra.save!
        end
        puts '   Done!'
        puts ''
      end

      puts 'Done!'
    end
  end

  desc 'Migrate to v1.0 version'
  task migrate_to_v1: [:environment] do
    ## First step : rename migrations in DB
    task('redmine_git_hosting:migration_tools:fix_migration_numbers').invoke
    ## Migrate DB only for redmine_git_hosting plugin
    ENV['NAME'] = 'redmine_git_hosting'
    task('redmine:plugins:migrate').invoke
    ## Rename SSH keys (reset identifier)
    task('redmine_git_hosting:migration_tools:rename_ssh_keys').invoke
    ## Update repositories type
    task('redmine_git_hosting:migration_tools:update_repositories_type').invoke
  end
end