mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Explicitly exit with status "1" for create and drop failures
* A non-zero exit status allows subsequent shell commands to be chained together such as: `rake db:reset test:prepare && rspec && cap deploy` (if you're feeling brave :) * Any exceptions raised during the `create` and `drop` tasks are caught in order to print a "pretty" message to the user. Unfortunately doing so prevents rake from aborting with a non-zero exit status to the shell. * Therefore we re-raise the exceptions after the "pretty" message and re-catch them in the task. * From the task we explicitly exit with a non-zero status. This method was chosen (rather than just letting rake fail from the exception) so that the backtrace is suppressed and the output to stderr is unchanged. * Update activerecord CHANGELOG
This commit is contained in:
parent
a11ddbe55f
commit
22f80ae57b
6 changed files with 51 additions and 16 deletions
|
@ -1,3 +1,7 @@
|
|||
* Exit with non-zero status for failed database rake tasks.
|
||||
|
||||
*Jay Hayes*
|
||||
|
||||
* Generate subquery for `Relation` if it passed as array condition for `where`
|
||||
method.
|
||||
|
||||
|
|
|
@ -8,31 +8,47 @@ db_namespace = namespace :db do
|
|||
|
||||
namespace :create do
|
||||
task :all => :load_config do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_all
|
||||
begin
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_all
|
||||
rescue
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Create the database from DATABASE_URL or config/database.yml for the current Rails.env (use db:create:all to create all databases in the config)'
|
||||
task :create => [:load_config] do
|
||||
if ENV['DATABASE_URL']
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_database_url
|
||||
else
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_current
|
||||
begin
|
||||
if ENV['DATABASE_URL']
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_database_url
|
||||
else
|
||||
ActiveRecord::Tasks::DatabaseTasks.create_current
|
||||
end
|
||||
rescue
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
namespace :drop do
|
||||
task :all => :load_config do
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
||||
begin
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
||||
rescue
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Drops the database using DATABASE_URL or the current Rails.env (use db:drop:all to drop all databases)'
|
||||
task :drop => [:load_config] do
|
||||
if ENV['DATABASE_URL']
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_database_url
|
||||
else
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
||||
begin
|
||||
if ENV['DATABASE_URL']
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_database_url
|
||||
else
|
||||
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
||||
end
|
||||
rescue
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -69,9 +69,11 @@ module ActiveRecord
|
|||
class_for_adapter(configuration['adapter']).new(*arguments).create
|
||||
rescue DatabaseAlreadyExists
|
||||
$stderr.puts "#{configuration['database']} already exists"
|
||||
raise
|
||||
rescue Exception => error
|
||||
$stderr.puts error, *(error.backtrace)
|
||||
$stderr.puts "Couldn't create database for #{configuration.inspect}"
|
||||
raise
|
||||
end
|
||||
|
||||
def create_all
|
||||
|
@ -95,6 +97,7 @@ module ActiveRecord
|
|||
rescue Exception => error
|
||||
$stderr.puts error, *(error.backtrace)
|
||||
$stderr.puts "Couldn't drop #{configuration['database']}"
|
||||
raise
|
||||
end
|
||||
|
||||
def drop_all
|
||||
|
|
|
@ -61,7 +61,9 @@ module ActiveRecord
|
|||
ActiveRecord::StatementInvalid.new("Can't create database 'dev'; database exists:")
|
||||
)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
assert_raises(ActiveRecord::Tasks::DatabaseAlreadyExists) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -59,7 +59,9 @@ module ActiveRecord
|
|||
$stderr.expects(:puts).
|
||||
with("Couldn't create database for #{@configuration.inspect}")
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
assert_raises(Exception) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
end
|
||||
|
||||
def test_create_when_database_exists_outputs_info_to_stderr
|
||||
|
@ -69,7 +71,9 @@ module ActiveRecord
|
|||
ActiveRecord::StatementInvalid.new('database "my-app-db" already exists')
|
||||
)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
assert_raises(ActiveRecord::Tasks::DatabaseAlreadyExists) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -27,7 +27,9 @@ module ActiveRecord
|
|||
|
||||
$stderr.expects(:puts).with("#{@database} already exists")
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
assert_raises(ActiveRecord::Tasks::DatabaseAlreadyExists) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
end
|
||||
end
|
||||
|
||||
def test_db_create_with_file_does_nothing
|
||||
|
@ -36,7 +38,9 @@ module ActiveRecord
|
|||
|
||||
ActiveRecord::Base.expects(:establish_connection).never
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
assert_raises(ActiveRecord::Tasks::DatabaseAlreadyExists) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
end
|
||||
end
|
||||
|
||||
def test_db_create_establishes_a_connection
|
||||
|
@ -52,7 +56,9 @@ module ActiveRecord
|
|||
$stderr.expects(:puts).
|
||||
with("Couldn't create database for #{@configuration.inspect}")
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
assert_raises(Exception) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue