A team member had a problem where due to a config change, pg_dump was not 
on path, so when he hit:

        command = "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} 
#{search_path} #{Shellwords.escape(configuration['database'])}"
        raise 'Error dumping database' unless Kernel.system(command)

in 
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb,
 
it just failed with "Error dumping database" without the stdout/stderr 
output that would have helped diagnose the error.

Most of the time all the output from command execution isn't needed, but 
when it fails, it seems like it might be good to use something that could 
log output to debug.

Backticks would be a simple solution, or Open3/Open4 if shell more 
interaction might be required (and if desired).

I'm not sure exactly why Kernel.system is used as much as it is in Rails, 
but there is one mention in about why it isn't used in a particular case:

https://github.com/rails/rails/blob/master/railties/lib/rails/generators/app_base.rb#L320

        # We use backticks and #print here instead of vanilla #system 
because it
        # is easier to silence stdout in the existing test suite this way. 
The
        # end-user gets the bundler commands called anyway, so no big deal.

So, before submitting a patch to use backticks, I was curious as to why 
vanilla system calls are used in Rails at all?

Just for reference, here are the places where system is used currently for 
command execution:

activerecord/lib/active_record/migration.rb:            system("bin/rake 
db:test:prepare")
activerecord/lib/active_record/tasks/mysql_database_tasks.rb:        unless 
Kernel.system(*args)
activerecord/lib/active_record/tasks/mysql_database_tasks.rb:       
 Kernel.system(*args)
activerecord/lib/active_record/tasks/postgresql_database_tasks.rb:       
 raise 'Error dumping database' unless Kernel.system(command)
activerecord/lib/active_record/tasks/postgresql_database_tasks.rb:       
 Kernel.system("psql -q -f #{Shellwords.escape(filename)} 
#{configuration['database']}")
railties/lib/rails/generators/app_base.rb:        # We use backticks and 
#print here instead of vanilla #system because it
railties/lib/rails/generators/rails/app/templates/bin/setup:  system 'gem 
install bundler --conservative'
railties/lib/rails/generators/rails/app/templates/bin/setup: 
 system('bundle check') or system('bundle install')
railties/lib/rails/generators/rails/app/templates/bin/setup:  system 'ruby 
bin/rake db:setup'

And places where backticks are used currently for command execution:

railties/lib/rails/api/task.rb:        "master@#{`git rev-parse HEAD`[0, 
7]}"
railties/lib/rails/generators/app_base.rb:          output = `"#{Gem.ruby}" 
"#{_bundle_command}" #{command}`
railties/lib/rails/generators/rails/plugin/plugin_generator.rb:         
 @author = `git config user.name`.chomp rescue default
railties/lib/rails/generators/rails/plugin/plugin_generator.rb:         
 @email = `git config user.email`.chomp rescue default

And popen uses:

actionpack/lib/action_dispatch/journey/gtg/transition_table.rb:         
 svg = IO.popen('dot -Tsvg', 'w+') { |f|
activesupport/lib/active_support/testing/isolation.rb:              child = 
IO.popen([env, command])

Thanks in advance,
Gary

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to