summaryrefslogtreecommitdiff
path: root/lib/bundler.rb
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2016-09-06 14:22:29 -0400
committerSamuel Giddins <segiddins@segiddins.me>2016-09-07 14:22:08 +0200
commit02e7f67727b45f59ec0aec4df410e05921d94928 (patch)
tree37f4a195c9b29e9c6bfdd1a1812ca0f3bf9b048b /lib/bundler.rb
parent002939bbba581d38ba788016f893a79bca87f855 (diff)
downloadbundler-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.rb36
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!