diff --git a/lib/vagrant/bundler.rb b/lib/vagrant/bundler.rb index 28ec66674..6124eb181 100644 --- a/lib/vagrant/bundler.rb +++ b/lib/vagrant/bundler.rb @@ -40,6 +40,20 @@ module Vagrant def initialize @plugin_gem_path = Vagrant.user_data_path.join("gems", RUBY_VERSION).freeze @logger = Log4r::Logger.new("vagrant::bundler") + + # TODO: Remove fix when https://github.com/rubygems/rubygems/pull/2735 + # gets merged and released + # + # Because of a rubygems bug, we need to set the gemrc file path + # through this method rather than relying on the environment varible + # GEMRC. On windows, that path gets split on `:`: and `;`, which means + # the drive letter gets treated as its own path. If that path exists locally, + # (like having a random folder called `c` where the library was invoked), + # it fails thinking the folder `c` is a gemrc file. + gemrc_val = ENV["GEMRC"] + ENV["GEMRC"] = "" + Gem.configuration = Gem::ConfigFile.new(["--config-file", gemrc_val]) + ENV["GEMRC"] = gemrc_val end # Enable Vagrant environment specific plugins at given data path diff --git a/test/unit/vagrant/bundler_test.rb b/test/unit/vagrant/bundler_test.rb index 4428be470..99fe9d0cd 100644 --- a/test/unit/vagrant/bundler_test.rb +++ b/test/unit/vagrant/bundler_test.rb @@ -28,6 +28,19 @@ describe Vagrant::Bundler do expect(subject.env_plugin_gem_path).to be_nil end + describe "#initialize" do + let(:gemrc_location) { "C:\\My\\Config\\File" } + + it "should set up GEMRC through a flag instead of GEMRC" do + allow(ENV).to receive(:[]).with("VAGRANT_HOME") + allow(ENV).to receive(:[]).with("USERPROFILE") + + allow(ENV).to receive(:[]).with("GEMRC").and_return(gemrc_location) + expect(Gem::ConfigFile).to receive(:new).with(["--config-file", gemrc_location]) + init_subject = described_class.new + end + end + describe "#deinit" do it "should provide method for backwards compatibility" do subject.deinit