Skip to content

Commit

Permalink
Merge pull request #36440 from malept/multi-db-abort_if_pending_migra…
Browse files Browse the repository at this point in the history
…tions-task

Add support for multiple databases to `rails db:abort_if_pending_migrations`
  • Loading branch information
eileencodes committed Jun 11, 2019
2 parents 4dcb461 + cb8b57d commit 96f142a
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
4 changes: 4 additions & 0 deletions activerecord/CHANGELOG.md
@@ -1,3 +1,7 @@
* Add support for multiple databases to `rails db:abort_if_pending_migrations`.

*Mark Lee*

* Fix sqlite3 collation parsing when using decimal columns.

*Martin R. Schuster*
Expand Down
26 changes: 25 additions & 1 deletion activerecord/lib/active_record/railties/databases.rake
Expand Up @@ -250,7 +250,11 @@ db_namespace = namespace :db do

# desc "Raises an error if there are pending migrations"
task abort_if_pending_migrations: :load_config do
pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
pending_migrations = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).flat_map do |db_config|
ActiveRecord::Base.establish_connection(db_config.config)

ActiveRecord::Base.connection.migration_context.open.pending_migrations
end

if pending_migrations.any?
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
Expand All @@ -261,6 +265,26 @@ db_namespace = namespace :db do
end
end

namespace :abort_if_pending_migrations do
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
# desc "Raises an error if there are pending migrations for #{spec_name} database"
task spec_name => :load_config do
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
ActiveRecord::Base.establish_connection(db_config.config)

pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations

if pending_migrations.any?
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
pending_migrations.each do |pending_migration|
puts " %4d %s" % [pending_migration.version, pending_migration.name]
end
abort %{Run `rails db:migrate:#{spec_name}` to update your database then try again.}
end
end
end
end

desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
task setup: ["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]

Expand Down
26 changes: 26 additions & 0 deletions railties/test/application/rake/multi_dbs_test.rb
Expand Up @@ -299,6 +299,32 @@ class TwoMigration < ActiveRecord::Migration::Current
db_migrate_and_schema_cache_dump_and_schema_cache_clear
end

test "db:abort_if_pending_migrations works on all databases" do
require "#{app_path}/config/environment"

app_file "db/animals_migrate/02_two_migration.rb", <<-MIGRATION
class TwoMigration < ActiveRecord::Migration::Current
end
MIGRATION

output = rails("db:abort_if_pending_migrations", allow_failure: true)
assert_match(/You have 1 pending migration/, output)
end

test "db:abort_if_pending_migrations:namespace works" do
require "#{app_path}/config/environment"

app_file "db/animals_migrate/02_two_migration.rb", <<-MIGRATION
class TwoMigration < ActiveRecord::Migration::Current
end
MIGRATION

output = rails("db:abort_if_pending_migrations:primary")
assert_no_match(/You have \d+ pending migration/, output)
output = rails("db:abort_if_pending_migrations:animals", allow_failure: true)
assert_match(/You have 1 pending migration/, output)
end

test "db:prepare works on all databases" do
require "#{app_path}/config/environment"
db_prepare
Expand Down

0 comments on commit 96f142a

Please sign in to comment.