Skip to content

Commit ef48b92

Browse files
committed
Load plugin immediately
We can install RubyGems plugin by "gem install XXX". The installed plugin is used from the NEXT "gem ...". For example, "gem install gem-src kaminari" doesn't use gem-src plugin for kaminari. "gem install gem-src && gem install kaminari" uses gem-src plugin for kaminari. How about loading a plugin immediately when the plugin is installed? If this proposal is implemented, "gem install gem-src kaminari" works like "gem install gem-src && gem install kaminari".
1 parent c6e399a commit ef48b92

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

lib/rubygems/installer.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@ def install
345345

346346
run_post_install_hooks
347347

348+
load_plugin
349+
348350
spec
349351

350352
# TODO: This rescue is in the wrong place. What is raising this exception?
@@ -1006,4 +1008,16 @@ def bash_prolog_script
10061008
""
10071009
end
10081010
end
1011+
1012+
def load_plugin
1013+
latest = Gem::Specification.latest_spec_for(spec.name)
1014+
# If pre-release version is only installed, latest is nil.
1015+
# In this case, we use pre-release version.
1016+
return if latest && latest.version != spec.version
1017+
1018+
plugin_files = spec.plugins.map do |plugin|
1019+
File.join(@plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}")
1020+
end
1021+
Gem.load_plugin_files(plugin_files)
1022+
end
10091023
end

test/rubygems/test_gem.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,8 @@ def test_self_vendor_dir_missing
14491449
def test_load_plugins
14501450
plugin_path = File.join "lib", "rubygems_plugin.rb"
14511451

1452+
foo1_plugin_path = nil
1453+
foo2_plugin_path = nil
14521454
Dir.chdir @tempdir do
14531455
FileUtils.mkdir_p "lib"
14541456
File.open plugin_path, "w" do |fp|
@@ -1458,17 +1460,22 @@ def test_load_plugins
14581460
foo1 = util_spec "foo", "1" do |s|
14591461
s.files << plugin_path
14601462
end
1463+
foo1_plugin_path = File.join(foo1.gem_dir, plugin_path)
14611464

14621465
install_gem foo1
14631466

14641467
foo2 = util_spec "foo", "2" do |s|
14651468
s.files << plugin_path
14661469
end
1470+
foo2_plugin_path = File.join(foo2.gem_dir, plugin_path)
14671471

14681472
install_gem foo2
14691473
end
14701474

14711475
Gem::Specification.reset
1476+
PLUGINS_LOADED.clear
1477+
$LOADED_FEATURES.delete(foo1_plugin_path)
1478+
$LOADED_FEATURES.delete(foo2_plugin_path)
14721479

14731480
gem "foo"
14741481

test/rubygems/test_gem_installer.rb

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ def test_generate_bin_with_dangling_symlink
769769
def test_generate_plugins
770770
installer = util_setup_installer do |spec|
771771
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
772-
io.write "puts __FILE__"
772+
io.write "# do nothing"
773773
end
774774

775775
spec.files += %w[lib/rubygems_plugin.rb]
@@ -856,11 +856,32 @@ def test_generate_plugins_with_build_root
856856
refute_includes File.read(build_root_path), build_root
857857
end
858858

859+
class << self
860+
attr_accessor :plugin_loaded
861+
end
862+
863+
def test_use_plugin_immediately
864+
self.class.plugin_loaded = false
865+
installer = util_setup_installer do |spec|
866+
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
867+
io.write "#{self.class}.plugin_loaded = true"
868+
end
869+
870+
spec.files += %w[lib/rubygems_plugin.rb]
871+
end
872+
873+
build_rake_in do
874+
installer.install
875+
end
876+
877+
assert self.class.plugin_loaded, "plugin is not loaded"
878+
end
879+
859880
def test_keeps_plugins_up_to_date
860881
# NOTE: version a-2 is already installed by setup hooks
861882

862883
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
863-
io.write "puts __FILE__"
884+
io.write "# do nothing"
864885
end
865886

866887
build_rake_in do

0 commit comments

Comments
 (0)