Bug 2229153

Summary: Lots of "already initialized constant" messages issued when rubygem-irb is used in scripts
Product: Red Hat Enterprise Linux 9 Reporter: Carlos Santos <casantos>
Component: rubyAssignee: ruby maint <ruby-maint>
Status: NEW --- QA Contact: RHEL CS Apps Subsystem QE <rhel-cs-apps-subsystem-qe>
Severity: low Docs Contact:
Priority: low    
Version: 9.2   
Target Milestone: rc   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Carlos Santos 2023-08-04 13:05:17 UTC
Description of problem:

Messages like this are issued when a ruby script uses "require 'irb'":

/usr/share/ruby/irb/ruby-lex.rb:123: warning: already initialized constant RubyLex::ERROR_TOKENS
/usr/share/gems/gems/irb-1.3.5/lib/irb/ruby-lex.rb:123: warning: previous definition of ERROR_TOKENS was here

Version-Release number of selected component (if applicable):

RHEL 9.2
rubygem-irb-1.3.5-160.el9_0.noarch

How reproducible:

Always

Steps to Reproduce:

1. Install rubygem-irb

   # yum install rubygem-irb

2. Invoke irb via binding.irb

   $ ruby -e binding.irb

Actual results:

/usr/share/ruby/irb/ruby-lex.rb:123: warning: already initialized constant RubyLex::ERROR_TOKENS
/usr/share/gems/gems/irb-1.3.5/lib/irb/ruby-lex.rb:123: warning: previous definition of ERROR_TOKENS was here
/usr/share/ruby/irb/color.rb:8: warning: already initialized constant IRB::Color::CLEAR
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:8: warning: previous definition of CLEAR was here
/usr/share/ruby/irb/color.rb:9: warning: already initialized constant IRB::Color::BOLD
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:9: warning: previous definition of BOLD was here
/usr/share/ruby/irb/color.rb:10: warning: already initialized constant IRB::Color::UNDERLINE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:10: warning: previous definition of UNDERLINE was here
/usr/share/ruby/irb/color.rb:11: warning: already initialized constant IRB::Color::REVERSE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:11: warning: previous definition of REVERSE was here
/usr/share/ruby/irb/color.rb:12: warning: already initialized constant IRB::Color::RED
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:12: warning: previous definition of RED was here
/usr/share/ruby/irb/color.rb:13: warning: already initialized constant IRB::Color::GREEN
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:13: warning: previous definition of GREEN was here
/usr/share/ruby/irb/color.rb:14: warning: already initialized constant IRB::Color::YELLOW
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:14: warning: previous definition of YELLOW was here
/usr/share/ruby/irb/color.rb:15: warning: already initialized constant IRB::Color::BLUE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:15: warning: previous definition of BLUE was here
/usr/share/ruby/irb/color.rb:16: warning: already initialized constant IRB::Color::MAGENTA
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:16: warning: previous definition of MAGENTA was here
/usr/share/ruby/irb/color.rb:17: warning: already initialized constant IRB::Color::CYAN
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:17: warning: previous definition of CYAN was here
/usr/share/ruby/irb/color.rb:19: warning: already initialized constant IRB::Color::TOKEN_KEYWORDS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:19: warning: previous definition of TOKEN_KEYWORDS was here
/usr/share/ruby/irb/color.rb:26: warning: already initialized constant IRB::Color::ALL
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:26: warning: previous definition of ALL was here
/usr/share/ruby/irb/color.rb:32: warning: already initialized constant IRB::Color::TOKEN_SEQ_EXPRS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:32: warning: previous definition of TOKEN_SEQ_EXPRS was here
/usr/share/ruby/irb/color.rb:75: warning: already initialized constant IRB::Color::ERROR_TOKENS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:75: warning: previous definition of ERROR_TOKENS was here
irb(main):001:0> 

Expected results:

No warning

Additional info:

The warnings appear because rubygThe messages appear because of the way ruby searches for libraries when
"-r <library>" is passed. It looks at

    $ ruby -e 'puts $:'
    /usr/local/share/ruby/site_ruby
    /usr/local/lib64/ruby/site_ruby
    /usr/share/ruby/vendor_ruby
    /usr/lib64/ruby/vendor_ruby
    /usr/share/rubygems
    /usr/share/ruby
    /usr/lib64/ruby

So it looks at /usr/share/ruby/, where the rubygem-irb package installs
symbolic links to the files under /usr/share/gems/gems:

    $ file  /usr/share/ruby/irb*
    /usr/share/ruby/irb:    symbolic link to /usr/share/gems/gems/irb-1.3.5/lib/irb
    /usr/share/ruby/irb.rb: symbolic link to /usr/share/gems/gems/irb-1.3.5/lib/irb.rb

But rubygem-irb adds a gemspec at /usr/share/gems/specifications/, so irb
(and therefore color.rb) ends up loaded twice.

In order to avoid this, you'd need to "load" irb, instead of "require" it as
/usr/bin/irb does. Something like this:

    $ ruby -r rubygems -e "load Gem.activate_bin_path('irb', 'irb', '>= 0.a')"

But this does not solve the problem with existing gems, e.g.

# yum install ruby-devel
# gem install rest-client -v 2.1.0
Building native extensions. This could take a while...
Successfully installed unf_ext-0.0.8.2
Fetching unf-0.1.4.gem
Successfully installed unf-0.1.4
Fetching domain_name-0.5.20190701.gem
Successfully installed domain_name-0.5.20190701
Fetching http-cookie-1.0.5.gem
Successfully installed http-cookie-1.0.5
Fetching http-accept-1.7.0.gem
Successfully installed http-accept-1.7.0
Fetching rest-client-2.1.0.gem
Successfully installed rest-client-2.1.0
Parsing documentation for unf_ext-0.0.8.2
Installing ri documentation for unf_ext-0.0.8.2
Parsing documentation for unf-0.1.4
Installing ri documentation for unf-0.1.4
Parsing documentation for domain_name-0.5.20190701
Installing ri documentation for domain_name-0.5.20190701
Parsing documentation for http-cookie-1.0.5
Installing ri documentation for http-cookie-1.0.5
Parsing documentation for http-accept-1.7.0
unknown encoding name "header" for lib/http/accept.rb, skipping
Installing ri documentation for http-accept-1.7.0
Parsing documentation for rest-client-2.1.0
Installing ri documentation for rest-client-2.1.0
Done installing documentation for unf_ext, unf, domain_name, http-cookie, http-accept, rest-client after 2 seconds
6 gems installed

$ which restclient
/usr/local/bin/restclient
[bashuser@rhel-9-1 ~]$ restclient
/usr/local/share/gems/gems/rest-client-2.1.0/bin/restclient:64: warning: redefining Object#method_missing may cause infinite loop
/usr/share/ruby/irb/ruby-lex.rb:123: warning: already initialized constant RubyLex::ERROR_TOKENS
/usr/share/gems/gems/irb-1.3.5/lib/irb/ruby-lex.rb:123: warning: previous definition of ERROR_TOKENS was here
/usr/share/ruby/irb/completion.rb:18: warning: already initialized constant IRB::InputCompletor::ReservedWords
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:18: warning: previous definition of ReservedWords was here
/usr/share/ruby/irb/completion.rb:39: warning: already initialized constant IRB::InputCompletor::BASIC_WORD_BREAK_CHARACTERS
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:39: warning: previous definition of BASIC_WORD_BREAK_CHARACTERS was here
/usr/share/ruby/irb/completion.rb:59: warning: already initialized constant IRB::InputCompletor::CompletionRequireProc
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:59: warning: previous definition of CompletionRequireProc was here
/usr/share/ruby/irb/completion.rb:94: warning: already initialized constant IRB::InputCompletor::CompletionProc
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:94: warning: previous definition of CompletionProc was here
/usr/share/ruby/irb/completion.rb:329: warning: already initialized constant IRB::InputCompletor::PerfectMatchedProc
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:329: warning: previous definition of PerfectMatchedProc was here
/usr/share/ruby/irb/completion.rb:364: warning: already initialized constant IRB::InputCompletor::Operators
/usr/share/gems/gems/irb-1.3.5/lib/irb/completion.rb:364: warning: previous definition of Operators was here
/usr/share/ruby/irb/color.rb:8: warning: already initialized constant IRB::Color::CLEAR
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:8: warning: previous definition of CLEAR was here
/usr/share/ruby/irb/color.rb:9: warning: already initialized constant IRB::Color::BOLD
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:9: warning: previous definition of BOLD was here
/usr/share/ruby/irb/color.rb:10: warning: already initialized constant IRB::Color::UNDERLINE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:10: warning: previous definition of UNDERLINE was here
/usr/share/ruby/irb/color.rb:11: warning: already initialized constant IRB::Color::REVERSE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:11: warning: previous definition of REVERSE was here
/usr/share/ruby/irb/color.rb:12: warning: already initialized constant IRB::Color::RED
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:12: warning: previous definition of RED was here
/usr/share/ruby/irb/color.rb:13: warning: already initialized constant IRB::Color::GREEN
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:13: warning: previous definition of GREEN was here
/usr/share/ruby/irb/color.rb:14: warning: already initialized constant IRB::Color::YELLOW
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:14: warning: previous definition of YELLOW was here
/usr/share/ruby/irb/color.rb:15: warning: already initialized constant IRB::Color::BLUE
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:15: warning: previous definition of BLUE was here
/usr/share/ruby/irb/color.rb:16: warning: already initialized constant IRB::Color::MAGENTA
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:16: warning: previous definition of MAGENTA was here
/usr/share/ruby/irb/color.rb:17: warning: already initialized constant IRB::Color::CYAN
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:17: warning: previous definition of CYAN was here
/usr/share/ruby/irb/color.rb:19: warning: already initialized constant IRB::Color::TOKEN_KEYWORDS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:19: warning: previous definition of TOKEN_KEYWORDS was here
/usr/share/ruby/irb/color.rb:26: warning: already initialized constant IRB::Color::ALL
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:26: warning: previous definition of ALL was here
/usr/share/ruby/irb/color.rb:32: warning: already initialized constant IRB::Color::TOKEN_SEQ_EXPRS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:32: warning: previous definition of TOKEN_SEQ_EXPRS was here
/usr/share/ruby/irb/color.rb:75: warning: already initialized constant IRB::Color::ERROR_TOKENS
/usr/share/gems/gems/irb-1.3.5/lib/irb/color.rb:75: warning: previous definition of ERROR_TOKENS was here