Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

detect being inside a rails application even from a subdirectory

Signed-off-by: David Heinemeier Hansson <david@loudthinking.com>
  • Loading branch information...
commit dcc758acb0bf210ec8a1c25afeafb7da0334f0b9 1 parent 330a890
@chad chad authored dhh committed
View
5 railties/CHANGELOG
@@ -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
View
20 railties/lib/rails/cli.rb
@@ -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!
View
28 railties/lib/rails/script_rails_loader.rb
@@ -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
View
22 railties/test/script_rails_loader_test.rb
@@ -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
Please sign in to comment.
Something went wrong with that request. Please try again.