Skip to content

Commit d57d302

Browse files
Merge pull request #7639 from sarahsehr/improveErrorForLoadingBrokenPlugin
Add useful error message for plugin load
2 parents 5265e07 + 0c6ad3e commit d57d302

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

bundler/lib/bundler/plugin.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,26 @@ def load_plugin(name)
342342
# done to avoid conflicts
343343
path = index.plugin_path(name)
344344

345-
Gem.add_to_load_path(*index.load_paths(name))
345+
paths = index.load_paths(name)
346+
invalid_paths = paths.reject {|p| File.directory?(p) }
347+
348+
if invalid_paths.any?
349+
Bundler.ui.warn <<~MESSAGE
350+
The following plugin paths don't exist: #{invalid_paths.join(", ")}.
351+
352+
This can happen if the plugin was installed with a different version of Ruby that has since been uninstalled.
353+
354+
If you would like to reinstall the plugin, run:
355+
356+
bundler plugin uninstall #{name} && bundler plugin install #{name}
357+
358+
Continuing without installing plugin #{name}.
359+
MESSAGE
360+
361+
return
362+
end
363+
364+
Gem.add_to_load_path(*paths)
346365

347366
load path.join(PLUGIN_FILE_NAME)
348367

bundler/spec/bundler/plugin_spec.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,5 +333,28 @@
333333
end.to output("win\n").to_stdout
334334
end
335335
end
336+
337+
context "the plugin load_path is invalid" do
338+
before do
339+
allow(index).to receive(:load_paths).with("foo-plugin").
340+
and_return(["invalid-file-name1", "invalid-file-name2"])
341+
end
342+
343+
it "outputs a useful warning" do
344+
msg =
345+
"The following plugin paths don't exist: invalid-file-name1, invalid-file-name2.\n\n" \
346+
"This can happen if the plugin was " \
347+
"installed with a different version of Ruby that has since been uninstalled.\n\n" \
348+
"If you would like to reinstall the plugin, run:\n\n" \
349+
"bundler plugin uninstall foo-plugin && bundler plugin install foo-plugin\n\n" \
350+
"Continuing without installing plugin foo-plugin.\n"
351+
352+
expect(Bundler.ui).to receive(:warn).with(msg)
353+
354+
Plugin.hook(Bundler::Plugin::Events::EVENT1)
355+
356+
expect(subject.loaded?("foo-plugin")).to be_falsey
357+
end
358+
end
336359
end
337360
end

0 commit comments

Comments
 (0)