提交 c3a26c59 编写于 作者: O OZAWA Sakuro

Preserve magic comments and content encoding of copied migrations.

During insertion of "# This migration comes from ... " comment at the beginning of
a migration, presence of magic comment was not considered.
上级 11dd15a5
## Rails 4.0.0 (unreleased) ## ## Rails 4.0.0 (unreleased) ##
* When copying migrations, preserve their magic comments and content encoding.
*OZAWA Sakuro*
* Fix ActiveRecord `subclass_from_attrs` when `eager_load` is false. * Fix ActiveRecord `subclass_from_attrs` when `eager_load` is false.
It cannot find subclass because all classes are loaded automatically It cannot find subclass because all classes are loaded automatically
when it needs. when it needs.
......
...@@ -634,8 +634,17 @@ def copy(destination, sources, options = {}) ...@@ -634,8 +634,17 @@ def copy(destination, sources, options = {})
source_migrations = ActiveRecord::Migrator.migrations(path) source_migrations = ActiveRecord::Migrator.migrations(path)
source_migrations.each do |migration| source_migrations.each do |migration|
source = File.read(migration.filename) source = File.binread(migration.filename)
source = "# This migration comes from #{scope} (originally #{migration.version})\n#{source}" inserted_comment = "# This migration comes from #{scope} (originally #{migration.version})\n"
if /\A#.*\b(?:en)?coding:\s*\S+/ =~ source
# If we have a magic comment in the original migration,
# insert our comment after the first newline(end of the magic comment line)
# so the magic keep working.
# Note that magic comments must be at the first line(except sh-bang).
source[/\n/] = "\n#{inserted_comment}"
else
source = "#{inserted_comment}#{source}"
end
if duplicate = destination_migrations.detect { |m| m.name == migration.name } if duplicate = destination_migrations.detect { |m| m.name == migration.name }
if options[:on_skip] && duplicate.scope != scope.to_s if options[:on_skip] && duplicate.scope != scope.to_s
...@@ -649,7 +658,7 @@ def copy(destination, sources, options = {}) ...@@ -649,7 +658,7 @@ def copy(destination, sources, options = {})
old_path, migration.filename = migration.filename, new_path old_path, migration.filename = migration.filename, new_path
last = migration last = migration
File.open(migration.filename, "w") { |f| f.write source } File.binwrite(migration.filename, source)
copied << migration copied << migration
options[:on_copy].call(scope, migration, old_path) if options[:on_copy] options[:on_copy].call(scope, migration, old_path) if options[:on_copy]
destination_migrations << migration destination_migrations << migration
......
...@@ -738,6 +738,26 @@ def test_copying_migrations_with_timestamps_to_destination_with_timestamps_in_fu ...@@ -738,6 +738,26 @@ def test_copying_migrations_with_timestamps_to_destination_with_timestamps_in_fu
clear clear
end end
def test_copying_migrations_preserving_magic_comments
ActiveRecord::Base.timestamped_migrations = false
@migrations_path = MIGRATIONS_ROOT + "/valid"
@existing_migrations = Dir[@migrations_path + "/*.rb"]
copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
assert File.exists?(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")
assert_equal [@migrations_path + "/4_currencies_have_symbols.bukkits.rb"], copied.map(&:filename)
expected = "# coding: ISO-8859-15\n# This migration comes from bukkits (originally 1)"
assert_equal expected, IO.readlines(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")[0..1].join.chomp
files_count = Dir[@migrations_path + "/*.rb"].length
copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
assert copied.empty?
ensure
clear
end
def test_skipping_migrations def test_skipping_migrations
@migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps" @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
@existing_migrations = Dir[@migrations_path + "/*.rb"] @existing_migrations = Dir[@migrations_path + "/*.rb"]
......
# coding: ISO-8859-15
class CurrenciesHaveSymbols < ActiveRecord::Migration
def self.up
# We use for default currency symbol
add_column "currencies", "symbol", :string, :default => ""
end
def self.down
remove_column "currencies", "symbol"
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册