Bug #16680

Updated by sawa (Tsuyoshi Sawada) almost 2 years ago

The following Following is a full reproducible process. I procees, i will use a gem named 'looksee' to reproduce this. 

 1. Do `gem gem install looksee` looksee 

 2. Go to `gem` folder and goto gem folder, copy `lib` lib content into `/tmp/test_looksee` so that /tmp/tesst_looksee 
 so, for now, we have a folder like this: 

  ╰─ $ tree /tmp/test_looksee 
 └── lib 
     ├── looksee 
     │   ├── adapter 
     │   │   ├── base.rb 
     │   │   └── rubinius.rb 
     │   ├── adapter.rb 
     │   ├── clean.rb 
     │   ├── columnizer.rb 
     │   ├── core_ext.rb 
     │   ├── editor.rb 
     │   ├── help.rb 
     │   ├── inspector.rb 
     │   ├── lookup_path.rb 
     │   ├── 
     │   └── version.rb 
     └── looksee.rb 

 3.    Create create a new symlink symlinks to this folder. 


  ╰─ $ln -s /tmp/test_looksee /tmp/test_looksee1 


   ╰─ $ ls -alhd /tmp/test_looksee* 
 drwxr-xr-x 3 zw963 zw963 60 2020-03-08 01:39 /tmp/test_looksee/ 
 lrwxrwxrwx 1 zw963 zw963 13 2020-03-08 02:08 /tmp/test_looksee1 ->  

 4. Run the run following command to reproduce this issue. 


  ╰─ $ ruby -I/tmp/test_looksee1/lib/ -rlooksee -e 'puts 100' 
 Traceback (most recent call last): 
         10: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          9: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          8: from /tmp/test_looksee1/lib/looksee.rb:1:in `<top (required)>' 
          7: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          6: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          5: from /tmp/test_looksee1/lib/looksee/clean.rb:4:in `<top (required)>' 
          4: from /tmp/test_looksee1/lib/looksee/clean.rb:171:in `<module:Looksee>' 
          3: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          2: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 
          1: from /tmp/test_looksee1/lib/looksee/adapter.rb:1:in `<top (required)>' 
 /tmp/test_looksee1/lib/looksee/adapter.rb:2:in `<module:Looksee>': uninitialized constant Looksee::Adapter (NameError) 

 You may So, maybe you want to ask why use symlinks folder in `$LOAD_PATH`. I $LOAD_PATH, but, i think this is should be a quite common case; case,  
 many ruby developers developer have a local gem not managed manager by `Rubygems` or `Bundler`. They `Bundler`,    it just use `$LOAD_PATH` 
 to `require`/`load` require/load it, and it is hard to ensure everyone's everyone folder is not a symlink. 

 I think this is a ** breaking change. All change** , becuase all those codes worked code is work quite well before 2.7 2.7, because old codes code always  
 follow symlinks. The following symlinks,    following is an a example from ruby 2.6.3, which works. it working. 

  ╰─ $ ruby -I/tmp/test_looksee1/lib/ -rlooksee -e 'puts 100' 
 Traceback (most recent call last): 
         8: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
         7: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
         6: from /tmp/test_looksee/lib/looksee.rb:1:in `<top (required)>' 
         5: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
         4: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
         3: from /tmp/test_looksee/lib/looksee/clean.rb:4:in `<top (required)>' 
         2: from /tmp/test_looksee/lib/looksee/clean.rb:171:in `<module:Looksee>' 
         1: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
 /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': incompatible library version - /tmp/test_looksee/lib/looksee/ (LoadError) 

 As we can seen, see, those breaking codes code come from `autoload :Adapter, 'looksee/adapter'`. I 'looksee/adapter'`,    i suspect 
 maybe this is caused by nested autoload. But autoload cause this is new issue, but only a guess, please check. Thank check, thank you.