Skip to content

Commit 2528d54

Browse files
Merge pull request #6673 from kou/plugin-immediately
Load plugin immediately (cherry picked from commit 09e839c)
1 parent 08f46be commit 2528d54

File tree

6 files changed

+78
-8
lines changed

6 files changed

+78
-8
lines changed

lib/rubygems/installer.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ def install
342342

343343
Gem::Specification.add_spec(spec)
344344

345+
load_plugin
346+
345347
run_post_install_hooks
346348

347349
spec
@@ -1002,4 +1004,17 @@ def bash_prolog_script
10021004
""
10031005
end
10041006
end
1007+
1008+
def load_plugin
1009+
specs = Gem::Specification.find_all_by_name(spec.name)
1010+
# If old version already exists, this plugin isn't loaded
1011+
# immediately. It's for avoiding a case that multiple versions
1012+
# are loaded at the same time.
1013+
return unless specs.size == 1
1014+
1015+
plugin_files = spec.plugins.map do |plugin|
1016+
File.join(@plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}")
1017+
end
1018+
Gem.load_plugin_files(plugin_files)
1019+
end
10051020
end

test/rubygems/test_gem.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,8 @@ def test_self_vendor_dir_missing
14351435
def test_load_plugins
14361436
plugin_path = File.join "lib", "rubygems_plugin.rb"
14371437

1438+
foo1_plugin_path = nil
1439+
foo2_plugin_path = nil
14381440
Dir.chdir @tempdir do
14391441
FileUtils.mkdir_p "lib"
14401442
File.open plugin_path, "w" do |fp|
@@ -1444,17 +1446,22 @@ def test_load_plugins
14441446
foo1 = util_spec "foo", "1" do |s|
14451447
s.files << plugin_path
14461448
end
1449+
foo1_plugin_path = File.join(foo1.gem_dir, plugin_path)
14471450

14481451
install_gem foo1
14491452

14501453
foo2 = util_spec "foo", "2" do |s|
14511454
s.files << plugin_path
14521455
end
1456+
foo2_plugin_path = File.join(foo2.gem_dir, plugin_path)
14531457

14541458
install_gem foo2
14551459
end
14561460

14571461
Gem::Specification.reset
1462+
PLUGINS_LOADED.clear
1463+
$LOADED_FEATURES.delete(foo1_plugin_path)
1464+
$LOADED_FEATURES.delete(foo2_plugin_path)
14581465

14591466
gem "foo"
14601467

test/rubygems/test_gem_commands_pristine_command.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ def test_execute_only_plugins
545545
fp.puts "puts __FILE__"
546546
end
547547
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |fp|
548-
fp.puts "puts __FILE__"
548+
fp.puts "# do nothing"
549549
end
550550
write_file File.join(@tempdir, "bin", "foo") do |fp|
551551
fp.puts "#!/usr/bin/ruby"

test/rubygems/test_gem_commands_setup_command.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ def gem_install_with_plugin(name)
433433
s.files = %W[lib/rubygems_plugin.rb]
434434
end
435435
write_file File.join @tempdir, "lib", "rubygems_plugin.rb" do |f|
436-
f.puts "require '#{gem.plugins.first}'"
436+
f.puts "# do nothing"
437437
end
438438
install_gem gem
439439

test/rubygems/test_gem_installer.rb

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

772772
spec.files += %w[lib/rubygems_plugin.rb]
@@ -853,11 +853,59 @@ def test_generate_plugins_with_build_root
853853
refute_includes File.read(build_root_path), build_root
854854
end
855855

856+
class << self
857+
attr_accessor :plugin_loaded
858+
attr_accessor :post_install_is_called
859+
end
860+
861+
def test_use_plugin_immediately
862+
self.class.plugin_loaded = false
863+
self.class.post_install_is_called = false
864+
spec_version = nil
865+
plugin_path = nil
866+
installer = util_setup_installer do |spec|
867+
spec_version = spec.version
868+
plugin_path = File.join("lib", "rubygems_plugin.rb")
869+
write_file File.join(@tempdir, plugin_path) do |io|
870+
io.write <<-PLUGIN
871+
#{self.class}.plugin_loaded = true
872+
Gem.post_install do
873+
#{self.class}.post_install_is_called = true
874+
end
875+
PLUGIN
876+
end
877+
spec.files += [plugin_path]
878+
plugin_path = File.join(spec.gem_dir, plugin_path)
879+
end
880+
build_rake_in do
881+
installer.install
882+
end
883+
assert self.class.plugin_loaded, "plugin is not loaded"
884+
assert self.class.post_install_is_called,
885+
"post install hook registered by plugin is not called"
886+
887+
self.class.plugin_loaded = false
888+
$LOADED_FEATURES.delete(plugin_path)
889+
installer_new = util_setup_installer do |spec_new|
890+
spec_new.version = spec_version.version.succ
891+
plugin_path = File.join("lib", "rubygems_plugin.rb")
892+
write_file File.join(@tempdir, plugin_path) do |io|
893+
io.write "#{self.class}.plugin_loaded = true"
894+
end
895+
spec_new.files += [plugin_path]
896+
end
897+
build_rake_in do
898+
installer_new.install
899+
end
900+
assert !self.class.plugin_loaded,
901+
"plugin is loaded even when old version is already loaded"
902+
end
903+
856904
def test_keeps_plugins_up_to_date
857905
# NOTE: version a-2 is already installed by setup hooks
858906

859907
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
860-
io.write "puts __FILE__"
908+
io.write "# do nothing"
861909
end
862910

863911
build_rake_in do

test/rubygems/test_gem_uninstaller.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def test_remove_symlinked_gem_home
172172

173173
def test_remove_plugins
174174
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
175-
io.write "puts __FILE__"
175+
io.write "# do nothing"
176176
end
177177

178178
@spec.files += %w[lib/rubygems_plugin.rb]
@@ -189,7 +189,7 @@ def test_remove_plugins
189189

190190
def test_remove_plugins_with_install_dir
191191
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
192-
io.write "puts __FILE__"
192+
io.write "# do nothing"
193193
end
194194

195195
@spec.files += %w[lib/rubygems_plugin.rb]
@@ -207,7 +207,7 @@ def test_remove_plugins_with_install_dir
207207

208208
def test_regenerate_plugins_for
209209
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
210-
io.write "puts __FILE__"
210+
io.write "# do nothing"
211211
end
212212

213213
@spec.files += %w[lib/rubygems_plugin.rb]
@@ -634,7 +634,7 @@ def test_uninstall_no_permission
634634

635635
def test_uninstall_keeps_plugins_up_to_date
636636
write_file File.join(@tempdir, "lib", "rubygems_plugin.rb") do |io|
637-
io.write "puts __FILE__"
637+
io.write "# do nothing"
638638
end
639639

640640
plugin_path = File.join Gem.plugindir, "a_plugin.rb"

0 commit comments

Comments
 (0)