namespace :redmine_ckeditor do namespace :assets do desc "Compile and copy all assets" task :precompile do ENV['RAILS_ENV'] ||= "production" ENV['RAILS_GROUP'] ||= "assets" Rails.configuration.assets.enabled = true Rails.configuration.assets.paths << File.expand_path("../../../app/assets/javascripts", __FILE__) Rails.configuration.assets.precompile << "ckeditor-releases/ckeditor" Rails.configuration.assets.precompile << "browser.js" Rake::Task["assets:precompile:all"].invoke Rake::Task["rich:assetize_ckeditor"].invoke ckeditor = RedmineCkeditor.root.join("assets/ckeditor") mkdir_p ckeditor cp_r RedmineCkeditor.root.join("app/assets/javascripts/ckeditor-releases/."), ckeditor ckeditor_contrib = RedmineCkeditor.root.join("assets/ckeditor-contrib") mkdir_p ckeditor_contrib cp_r Rails.root.join("public/assets/ckeditor-contrib/."), ckeditor_contrib javascripts = RedmineCkeditor.root.join("assets/javascripts") stylesheets = RedmineCkeditor.root.join("assets/stylesheets") images = RedmineCkeditor.root.join("assets/images") mkdir_p [javascripts, stylesheets, images] cp Rails.root.join("public/assets/application.js"), javascripts cp Rails.root.join("public/assets/browser.js"), javascripts cp Dir.glob(Rails.root.join("public/assets/rich/*.css")), stylesheets cp Dir.glob(Rails.root.join("public/assets/rich/*.png")), images rm_rf Rails.root.join(".sass-cache") Rake::Task["assets:clean:all"].invoke end end class Migration def initialize(projects, format) @formatter = Redmine::WikiFormatting.formatter_for(format) @messages = [ "*** WARNING ***", "All formattable texts are migrated to HTML and cannot be rollback.", "It is strongly recommended to backup your database.", "***************" ] if projects.empty? @projects = Project.all @messages << "projects: ALL" else @projects = Project.where(:identifier => projects) @messages << "projects: #{@projects.pluck(:identifier).join(",")}" end @messages << "migration: #{format} to HTML" end def start @messages.each {|message| puts message} print "Do you want to continue? (type 'y' to continue): " unless STDIN.gets.chomp == 'y' puts "Cancelled" return end @projects.each do |project| puts "project #{project.name}" project.description = format(project.description) project.save! migrate(:issues, project.issues, :description) migrate(:journals, Journal.where(:journalized_type => "Issue", :journalized_id => project.issues), :notes) migrate(:documents, project.documents, :description) migrate(:messages, Message.where(:board_id => project.boards), :content) migrate(:news, project.news, :description) migrate(:comments, Comment.where(:commented_type => "News", :commented_id => project.news), :comments) migrate(:wiki, WikiContent.where(:page_id => project.wiki.pages), :text) if project.wiki end end def migrate(type, records, column) n = records.count return if n == 0 records.each_with_index do |record, i| print "\rMigrating #{type} ... (#{i}/#{n})" record.send("#{column.to_s}=", format(record.send(column))) record.save! end puts "\rMigrating #{type} ... done " end def format(text) text && @formatter.new(text).to_html end end desc "Migrate text to html" task :migrate => :environment do projects = ENV['PROJECT'].to_s.split(",") format = ENV['FORMAT'] || Setting.text_formatting Migration.new(projects, format).start end end