* 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
This commit is contained in:
nobu 2017-09-21 07:29:20 +00:00
Родитель 5754f15975
Коммит b6d3927e16
3 изменённых файлов: 17 добавлений и 2 удалений

3
load.c
Просмотреть файл

@ -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);

Просмотреть файл

@ -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

Просмотреть файл

@ -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