1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Fix can't modify frozen String error in DatabaseTasks

Without this, `db:structure:dump` task raises an error as follwing:

```
can't modify frozen String
activerecord/lib/active_record/tasks/sqlite_database_tasks.rb:77:in `run_cmd_error'
activerecord/lib/active_record/tasks/sqlite_database_tasks.rb:72:in `run_cmd'
activerecord/lib/active_record/tasks/sqlite_database_tasks.rb:52:in `structure_dump'
activerecord/lib/active_record/tasks/database_tasks.rb:219:in `structure_dump'
activerecord/lib/active_record/railties/databases.rake:279:in `block (3 levels) in <main>'
railties/lib/rails/commands/rake/rake_command.rb:23:in `block in perform'
railties/lib/rails/commands/rake/rake_command.rb:20:in `perform'
railties/lib/rails/command.rb:48:in `invoke'
railties/lib/rails/commands.rb:18:in `<main>'
```
This commit is contained in:
yuuji.yaginuma 2017-08-30 08:03:53 +09:00
parent 5c2c8d8cfd
commit c9a084a530
4 changed files with 37 additions and 2 deletions

View file

@ -117,7 +117,7 @@ module ActiveRecord
end end
def run_cmd_error(cmd, args, action) def run_cmd_error(cmd, args, action)
msg = "failed to execute:\n" msg = "failed to execute:\n".dup
msg << "#{cmd} #{args.join(' ')}\n\n" msg << "#{cmd} #{args.join(' ')}\n\n"
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n" msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
msg msg

View file

@ -73,7 +73,7 @@ module ActiveRecord
end end
def run_cmd_error(cmd, args) def run_cmd_error(cmd, args)
msg = "failed to execute:\n" msg = "failed to execute:\n".dup
msg << "#{cmd} #{args.join(' ')}\n\n" msg << "#{cmd} #{args.join(' ')}\n\n"
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n" msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
msg msg

View file

@ -295,6 +295,16 @@ if current_adapter?(:PostgreSQLAdapter)
end end
end end
def test_structure_dump_execution_fails
filename = "awesome-file.sql"
Kernel.expects(:system).with("pg_dump", "-s", "-x", "-O", "-f", filename, "my-app-db").returns(nil)
e = assert_raise(RuntimeError) do
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
end
assert_match("failed to execute:", e.message)
end
private private
def with_dump_schemas(value, &block) def with_dump_schemas(value, &block)
old_dump_schemas = ActiveRecord::Base.dump_schemas old_dump_schemas = ActiveRecord::Base.dump_schemas

View file

@ -215,6 +215,31 @@ if current_adapter?(:SQLite3Adapter)
FileUtils.rm_f(filename) FileUtils.rm_f(filename)
FileUtils.rm_f(dbfile) FileUtils.rm_f(dbfile)
end end
def test_structure_dump_execution_fails
dbfile = @database
filename = "awesome-file.sql"
Kernel.expects(:system).with("sqlite3", "--noop", "db_create.sqlite3", ".schema", out: "awesome-file.sql").returns(nil)
e = assert_raise(RuntimeError) do
with_structure_dump_flags(["--noop"]) do
quietly { ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename, "/rails/root") }
end
end
assert_match("failed to execute:", e.message)
ensure
FileUtils.rm_f(filename)
FileUtils.rm_f(dbfile)
end
private
def with_structure_dump_flags(flags)
old = ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags
ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
yield
ensure
ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = old
end
end end
class SqliteStructureLoadTest < ActiveRecord::TestCase class SqliteStructureLoadTest < ActiveRecord::TestCase