diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2016-09-06 14:22:29 -0400 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2016-09-07 14:22:08 +0200 |
commit | 02e7f67727b45f59ec0aec4df410e05921d94928 (patch) | |
tree | 37f4a195c9b29e9c6bfdd1a1812ca0f3bf9b048b /lib/bundler.rb | |
parent | 002939bbba581d38ba788016f893a79bca87f855 (diff) | |
download | bundler-02e7f67727b45f59ec0aec4df410e05921d94928.tar.gz |
Fallback to a temp dir when the home directory is not usable
Diffstat (limited to 'lib/bundler.rb')
-rw-r--r-- | lib/bundler.rb | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/bundler.rb b/lib/bundler.rb index 8806ae01ef..2be1eee69f 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -143,8 +143,41 @@ module Bundler "#{Bundler.rubygems.ruby_engine}/#{Bundler.rubygems.config_map[:ruby_version]}" end + def user_home + @user_home ||= begin + home = Bundler.rubygems.user_home + warning = "Your home directory is not set properly:" + if home.nil? + warning += "\n * It is not set at all" + elsif !File.directory?(home) + warning += "\n * `#{home}` is not a directory" + elsif !File.writable?(home) + warning += "\n * `#{home}` is not writable" + else + return Pathname.new(home) + end + + login = Etc.getlogin || "unknown" + + tmp_home = Pathname.new(Dir.tmpdir).join("bundler", "home", login) + begin + SharedHelpers.filesystem_access(tmp_home, :write) do |p| + FileUtils.mkdir_p(p) + end + rescue => e + warning += "\n\nBundler also failed to create a temporary home directory at `#{tmp_home}`:\n#{e}" + raise warning + end + + warning += "\n\nBundler will use `#{tmp_home}` as your home directory temporarily" + + Bundler.ui.warn(warning) + tmp_home + end + end + def user_bundle_path - Pathname.new(Bundler.rubygems.user_home).join(".bundle") + Pathname.new(user_home).join(".bundle") end def home @@ -403,6 +436,7 @@ EOF @locked_gems = nil @bundle_path = nil @bin_path = nil + @user_home = nil Plugin.reset! |