From 5db8f999431b22b31c4feecbabb498047bc3e6d2 Mon Sep 17 00:00:00 2001 From: drbrain Date: Sat, 1 Dec 2012 00:42:36 +0000 Subject: [PATCH] * lib/rubygems.rb: Search for gem deps file up the directory tree. * test/rubygems/test_gem.rb: Test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/rubygems.rb | 23 +++++++++++++++++++++-- test/rubygems/test_gem.rb | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index e1fef523aa..b702f8e399 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Dec 1 09:42:13 2012 Eric Hodel + + * lib/rubygems.rb: Search for gem deps file up the directory tree. + * test/rubygems/test_gem.rb: Test for above. + Sat Dec 1 09:33:32 2012 Eric Hodel * test/runner.rb: Set GEM_HOME, GEM_PATH and GEM_SKIP to empty set. diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 89f718da24..914204858c 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -187,9 +187,28 @@ module Gem path = path.dup.untaint if path == "-" - path = GEM_DEP_FILES.find { |f| File.exists?(f) } + here = Dir.pwd + start = here - return unless path + begin + while true + path = GEM_DEP_FILES.find { |f| File.exists?(f) } + + if path + path = File.join here, path + break + end + + Dir.chdir ".." + + # If we're at a toplevel, stop. + return if Dir.pwd == here + + here = Dir.pwd + end + ensure + Dir.chdir start + end end return unless File.exists? path diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index bbc18d42f0..20e411a7e4 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -1402,6 +1402,41 @@ class TestGem < Gem::TestCase assert_equal '["a-1", "b-1", "c-1"]', out.strip end + def test_looks_for_gemdeps_files_automatically_on_start_in_parent_dir + util_clear_gems + + a = new_spec "a", "1", nil, "lib/a.rb" + b = new_spec "b", "1", nil, "lib/b.rb" + c = new_spec "c", "1", nil, "lib/c.rb" + + install_specs a, b, c + + path = File.join @tempdir, "gem.deps.rb" + + File.open path, "w" do |f| + f.puts "gem 'a'" + f.puts "gem 'b'" + f.puts "gem 'c'" + end + + path = File.join(@tempdir, "gd-tmp") + install_gem a, :install_dir => path + install_gem b, :install_dir => path + install_gem c, :install_dir => path + + ENV['GEM_PATH'] = path + ENV['RUBYGEMS_GEMDEPS'] = "-" + + Dir.mkdir "sub1" + out = Dir.chdir "sub1" do + `#{Gem.ruby.untaint} -I #{LIB_PATH.untaint} -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"` + end + + Dir.rmdir "sub1" + + assert_equal '["a-1", "b-1", "c-1"]', out.strip + end + def with_plugin(path) test_plugin_path = File.expand_path("test/rubygems/plugin/#{path}", @@project_dir)