diff options
author | schneems <richard.schneeman@gmail.com> | 2016-01-11 11:58:12 -0600 |
---|---|---|
committer | schneems <richard.schneeman@gmail.com> | 2016-01-11 11:58:12 -0600 |
commit | 4d60e93174a3d6d90b1a06fc7515cb5cd749a6f3 (patch) | |
tree | 15b55ee18593a0c256510aeecde7eb07cb1b029c /activerecord | |
parent | a703999c62aa9950920bbc621aa332da337c68ca (diff) | |
download | rails-4d60e93174a3d6d90b1a06fc7515cb5cd749a6f3.tar.gz rails-4d60e93174a3d6d90b1a06fc7515cb5cd749a6f3.tar.bz2 rails-4d60e93174a3d6d90b1a06fc7515cb5cd749a6f3.zip |
Set environment even when no migration runs
This PR addresses the issue described in https://github.com/rails/rails/pull/22967#issuecomment-170251635. If the database is non empty and has no new migrations than `db:migrate` will not set the environment. This PR works by always setting the environment value on successful `up` migration regardless of whether or not a migration was actually executed.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/migration.rb | 11 | ||||
-rw-r--r-- | activerecord/test/cases/migration_test.rb | 27 |
2 files changed, 37 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/migration.rb b/activerecord/lib/active_record/migration.rb index 471c5dc05a..8dedd4c8a2 100644 --- a/activerecord/lib/active_record/migration.rb +++ b/activerecord/lib/active_record/migration.rb @@ -1170,6 +1170,8 @@ module ActiveRecord migration = migrations.detect { |m| m.version == @target_version } raise UnknownMigrationVersionError.new(@target_version) if migration.nil? execute_migration_in_transaction(migration, @direction) + + record_environment end # Used for running multiple migrations up to or down to a certain value. @@ -1181,6 +1183,14 @@ module ActiveRecord runnable.each do |migration| execute_migration_in_transaction(migration, @direction) end + + record_environment + end + + # Stores the current environment in the database. + def record_environment + return if down? + ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment end def ran?(migration) @@ -1236,7 +1246,6 @@ module ActiveRecord else migrated << version ActiveRecord::SchemaMigration.create!(version: version.to_s) - ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment end end diff --git a/activerecord/test/cases/migration_test.rb b/activerecord/test/cases/migration_test.rb index 4d264caffb..fe74ca127f 100644 --- a/activerecord/test/cases/migration_test.rb +++ b/activerecord/test/cases/migration_test.rb @@ -398,6 +398,33 @@ class MigrationTest < ActiveRecord::TestCase ENV["RACK_ENV"] = original_rack_env end + + def test_migration_sets_internal_metadata_even_when_fully_migrated + current_env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call + migrations_path = MIGRATIONS_ROOT + "/valid" + old_path = ActiveRecord::Migrator.migrations_paths + ActiveRecord::Migrator.migrations_paths = migrations_path + + ActiveRecord::Migrator.up(migrations_path) + assert_equal current_env, ActiveRecord::InternalMetadata[:environment] + + original_rails_env = ENV["RAILS_ENV"] + original_rack_env = ENV["RACK_ENV"] + ENV["RAILS_ENV"] = ENV["RACK_ENV"] = "foofoo" + new_env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call + + refute_equal current_env, new_env + + sleep 1 # mysql by default does not store fractional seconds in the database + + ActiveRecord::Migrator.up(migrations_path) + assert_equal new_env, ActiveRecord::InternalMetadata[:environment] + ensure + ActiveRecord::Migrator.migrations_paths = old_path + ENV["RAILS_ENV"] = original_rails_env + ENV["RACK_ENV"] = original_rack_env + end + def test_proper_table_name_on_migration reminder_class = new_isolated_reminder_class migration = ActiveRecord::Migration.new |