diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-21 07:29:20 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-21 07:29:20 +0000 |
commit | b6d3927e16357408720203a949cfa8741b9ebf6c (patch) | |
tree | d26aaf1f7a35f7714142c027e24711f5696ae89d | |
parent | 5754f15975d82896c2566ca01b9ce7b3122d67ec (diff) |
load.c: real path to load
* load.c (rb_construct_expanded_load_path): expand load paths to
real paths to get rid of duplicate loading from symbolic-linked
directories. [Feature #10222]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | load.c | 3 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_require.rb | 14 |
3 files changed, 17 insertions, 2 deletions
@@ -85,7 +85,8 @@ rb_construct_expanded_load_path(enum expand_type type, int *has_relative, int *h if (is_string) rb_str_freeze(path); as_str = rb_get_path_check_convert(path, as_str, level); - expanded_path = rb_file_expand_path_fast(as_str, Qnil); + expanded_path = rb_check_realpath(Qnil, as_str); + if (NIL_P(expanded_path)) expanded_path = as_str; rb_ary_push(ary, rb_fstring(expanded_path)); } rb_obj_freeze(ary); diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 6955118de7..bcad728789 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1019,7 +1019,7 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| warning = nil path = nil Tempfile.create(%w[circular .rb]) do |t| - path = t.path + path = File.realpath(t.path) basename = File.basename(path) t.puts "require '#{basename}'" t.close diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index 1bed6c4f64..28cf686a26 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -881,4 +881,18 @@ class TestRequire < Test::Unit::TestCase end; end end + + def test_symlink_load_path + Dir.mktmpdir {|tmp| + Dir.mkdir(File.join(tmp, "real")) + begin + File.symlink "real", File.join(tmp, "symlink") + rescue NotImplementedError, Errno::EACCES + skip "File.symlink is not implemented" + end + File.write(File.join(tmp, "real/a.rb"), "print __FILE__") + result = IO.popen([EnvUtil.rubybin, "-I#{tmp}/symlink", "-e", "require 'a.rb'"], &:read) + assert_operator(result, :end_with?, "/real/a.rb") + } + end end |