detect being inside a rails application even from a subdirectory
Signed-off-by: David Heinemeier Hansson <david@loudthinking.com>
This commit is contained in:
parent
330a89072a
commit
dcc758acb0
@ -1,3 +1,8 @@
|
||||
*Rails 3.0.0 [Release Candidate] (unreleased)*
|
||||
|
||||
* Made the rails command work even when you're in a subdirectory [Chad Fowler]
|
||||
|
||||
|
||||
*Rails 3.0.0 [beta 4] (June 8th, 2010)*
|
||||
|
||||
* Version bump
|
||||
|
@ -1,23 +1,5 @@
|
||||
require 'rbconfig'
|
||||
|
||||
module Rails
|
||||
module ScriptRailsLoader
|
||||
RUBY = File.join(*RbConfig::CONFIG.values_at("bindir", "ruby_install_name")) + RbConfig::CONFIG["EXEEXT"]
|
||||
SCRIPT_RAILS = File.join('script', 'rails')
|
||||
|
||||
def self.exec_script_rails!
|
||||
cwd = Dir.pwd
|
||||
exec RUBY, SCRIPT_RAILS, *ARGV if File.exists?(SCRIPT_RAILS)
|
||||
Dir.chdir("..") do
|
||||
# Recurse in a chdir block: if the search fails we want to be sure
|
||||
# the application is generated in the original working directory.
|
||||
exec_script_rails! unless cwd == Dir.pwd
|
||||
end
|
||||
rescue SystemCallError
|
||||
# could not chdir, no problem just return
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'rails/script_rails_loader'
|
||||
|
||||
Rails::ScriptRailsLoader.exec_script_rails!
|
||||
|
||||
|
28
railties/lib/rails/script_rails_loader.rb
Normal file
28
railties/lib/rails/script_rails_loader.rb
Normal file
@ -0,0 +1,28 @@
|
||||
require 'pathname'
|
||||
|
||||
module Rails
|
||||
module ScriptRailsLoader
|
||||
RUBY = File.join(*RbConfig::CONFIG.values_at("bindir", "ruby_install_name")) + RbConfig::CONFIG["EXEEXT"]
|
||||
SCRIPT_RAILS = File.join('script', 'rails')
|
||||
|
||||
def self.exec_script_rails!
|
||||
cwd = Dir.pwd
|
||||
exec RUBY, SCRIPT_RAILS, *ARGV if in_rails_application?
|
||||
Dir.chdir("..") do
|
||||
# Recurse in a chdir block: if the search fails we want to be sure
|
||||
# the application is generated in the original working directory.
|
||||
exec_script_rails! unless cwd == Dir.pwd
|
||||
end
|
||||
rescue SystemCallError
|
||||
# could not chdir, no problem just return
|
||||
end
|
||||
|
||||
def self.in_rails_application?
|
||||
File.exists?(SCRIPT_RAILS) || in_rails_application_subdirectory?
|
||||
end
|
||||
|
||||
def self.in_rails_application_subdirectory?(path = Pathname.new(Dir.pwd))
|
||||
File.exists?(File.join(path, SCRIPT_RAILS)) || !path.root? && in_rails_application_subdirectory?(path.parent)
|
||||
end
|
||||
end
|
||||
end
|
22
railties/test/script_rails_loader_test.rb
Normal file
22
railties/test/script_rails_loader_test.rb
Normal file
@ -0,0 +1,22 @@
|
||||
require 'abstract_unit'
|
||||
require 'rails/script_rails_loader'
|
||||
|
||||
class ScriptRailsLoaderTest < ActiveSupport::TestCase
|
||||
|
||||
test "is in a rails application if script/rails exists" do
|
||||
File.stubs(:exists?).returns(true)
|
||||
assert Rails::ScriptRailsLoader.in_rails_application?
|
||||
end
|
||||
|
||||
test "is in a rails application if parent directory has script/rails" do
|
||||
File.stubs(:exists?).with("/foo/bar/script/rails").returns(false)
|
||||
File.stubs(:exists?).with("/foo/script/rails").returns(true)
|
||||
assert Rails::ScriptRailsLoader.in_rails_application_subdirectory?(Pathname.new("/foo/bar"))
|
||||
end
|
||||
|
||||
test "is not in a rails application if at the root directory and doesn't have script/rails" do
|
||||
Pathname.any_instance.stubs(:root?).returns true
|
||||
assert !Rails::ScriptRailsLoader.in_rails_application?
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user