Skip to content

Instantly share code, notes, and snippets.

@siefca
Created December 8, 2009 17:22
Show Gist options
  • Save siefca/251820 to your computer and use it in GitHub Desktop.
Save siefca/251820 to your computer and use it in GitHub Desktop.
# Enabling order for Radiant extensions migration.
#
# -------------------------------------------------
# Modify environment.rb by putting this AFTER the line with 'config.extensions':
if ENV.has_key?('CONFIG_EXTENSIONS')
::PENDING_EXTENSIONS = config.extensions.clone
config.extensions = ENV['CONFIG_EXTENSIONS'].split(/[\,\ \:]+/).map{ |x| x.strip.to_sym }
end
# -------------------------------------------------
# Modify Rakefile by adding:
def subcall_rake(c_task, extensions_to_load=[])
rails_env = ENV['RAILS_ENV'].to_s.empty? ? "" : "RAILS_ENV=" + ENV['RAILS_ENV']
rake_call = defined?(rake_cmd) ? rake_cmd : ENV['SUDO_COMMAND'] || ENV['_'] || Rake.application.name || 'rake'
enable_trace = Rake.application.options.trace.nil? ? "" : "--trace"
config_extensions = extensions_to_load.empty? ? "" : "CONFIG_EXTENSIONS=" + extensions_to_load.join(':')
sh %{ #{rake_call} #{config_extensions} #{rails_env} #{c_task} #{enable_trace} }
end
namespace :db do
namespace :migrate do
namespace :extensions do
desc "Migrates database according to needs of installed extensions."
task :all_safely do
# For some extensions order of migration has meaning.
# Safely assume that each succeeding extension from configuration
# requires all previously listed extensions loaded to run properly.
extensions_to_load = []
exts_orig_dir = File.join(File.dirname(__FILE__), 'vendor', 'extensions')
exts_bak_dir = File.join(File.dirname(__FILE__), 'vendor', 'extensions.DB_BOOT2')
begin
begin
FileUtils.rmdir(exts_orig_dir)
rescue
end
FileUtils.mv(exts_orig_dir, exts_bak_dir)
FileUtils.mkdir(exts_orig_dir, :mode => File.stat(exts_bak_dir).mode)
ENV['CONFIG_EXTENSIONS'] = "all"
require File.join(RAILS_ROOT, 'config/environment')
::PENDING_EXTENSIONS.each do |extension|
next if extension == :all
extension = extension.to_s.strip
ext_orig = File.join(exts_orig_dir, extension)
ext_bak = File.join(exts_bak_dir, extension)
extensions_to_load << extension
subtask = "radiant:extensions:#{extension}:migrate"
FileUtils.mv(ext_bak, ext_orig)
puts "----------------"
puts "[SAFE MIGRATION]: #{extension}"
subcall_rake(subtask, extensions_to_load) if Rake::Task.task_defined?(subtask)
end
ensure
extensions_to_load.each do |extension|
ext_orig = File.join(exts_orig_dir, extension)
ext_bak = File.join(exts_bak_dir, extension)
FileUtils.mv(ext_orig, ext_bak)
end
FileUtils.rmdir exts_orig_dir
FileUtils.mv(exts_bak_dir, exts_orig_dir)
end
# For the rest extensions just call joint migrate
# with default set of extensions.
ENV.delete 'CONFIG_EXTENSIONS'
subcall_rake 'db:migrate:extensions'
end
end # namespace :extensions
end # namespace :migrate
end # namespace :db
# Usage:
#
# rake db:migrate:extensions:all_safely
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment