lib/bundler.rb in bundler-1.10.6 vs lib/bundler.rb in bundler-1.11.0.pre.1
- old
+ new
@@ -1,92 +1,57 @@
-require 'fileutils'
-require 'pathname'
-require 'rbconfig'
-require 'bundler/gem_path_manipulation'
-require 'bundler/rubygems_ext'
-require 'bundler/rubygems_integration'
-require 'bundler/version'
-require 'bundler/constants'
-require 'bundler/current_ruby'
+require "fileutils"
+require "pathname"
+require "rbconfig"
+require "thread"
+require "bundler/gem_path_manipulation"
+require "bundler/gem_remote_fetcher"
+require "bundler/rubygems_ext"
+require "bundler/rubygems_integration"
+require "bundler/version"
+require "bundler/constants"
+require "bundler/current_ruby"
+require "bundler/errors"
module Bundler
preserve_gem_path
ORIGINAL_ENV = ENV.to_hash
+ SUDO_MUTEX = Mutex.new
- autoload :Definition, 'bundler/definition'
- autoload :Dependency, 'bundler/dependency'
- autoload :DepProxy, 'bundler/dep_proxy'
- autoload :Deprecate, 'bundler/deprecate'
- autoload :Dsl, 'bundler/dsl'
- autoload :EndpointSpecification, 'bundler/endpoint_specification'
- autoload :Environment, 'bundler/environment'
- autoload :Env, 'bundler/env'
- autoload :Fetcher, 'bundler/fetcher'
- autoload :GemHelper, 'bundler/gem_helper'
- autoload :GemHelpers, 'bundler/gem_helpers'
- autoload :GemInstaller, 'bundler/gem_installer'
- autoload :Graph, 'bundler/graph'
- autoload :Index, 'bundler/index'
- autoload :Installer, 'bundler/installer'
- autoload :Injector, 'bundler/injector'
- autoload :LazySpecification, 'bundler/lazy_specification'
- autoload :LockfileParser, 'bundler/lockfile_parser'
- autoload :MatchPlatform, 'bundler/match_platform'
- autoload :RemoteSpecification, 'bundler/remote_specification'
- autoload :Resolver, 'bundler/resolver'
- autoload :Retry, 'bundler/retry'
- autoload :RubyVersion, 'bundler/ruby_version'
- autoload :RubyDsl, 'bundler/ruby_dsl'
- autoload :Runtime, 'bundler/runtime'
- autoload :Settings, 'bundler/settings'
- autoload :SharedHelpers, 'bundler/shared_helpers'
- autoload :SpecSet, 'bundler/spec_set'
- autoload :StubSpecification, 'bundler/stub_specification'
- autoload :Source, 'bundler/source'
- autoload :SourceList, 'bundler/source_list'
- autoload :Specification, 'bundler/shared_helpers'
- autoload :SystemRubyVersion, 'bundler/ruby_version'
- autoload :UI, 'bundler/ui'
+ autoload :Definition, "bundler/definition"
+ autoload :Dependency, "bundler/dependency"
+ autoload :DepProxy, "bundler/dep_proxy"
+ autoload :Deprecate, "bundler/deprecate"
+ autoload :Dsl, "bundler/dsl"
+ autoload :EndpointSpecification, "bundler/endpoint_specification"
+ autoload :Environment, "bundler/environment"
+ autoload :Env, "bundler/env"
+ autoload :Fetcher, "bundler/fetcher"
+ autoload :GemHelper, "bundler/gem_helper"
+ autoload :GemHelpers, "bundler/gem_helpers"
+ autoload :RubyGemsGemInstaller, "bundler/rubygems_gem_installer"
+ autoload :Graph, "bundler/graph"
+ autoload :Index, "bundler/index"
+ autoload :Installer, "bundler/installer"
+ autoload :Injector, "bundler/injector"
+ autoload :LazySpecification, "bundler/lazy_specification"
+ autoload :LockfileParser, "bundler/lockfile_parser"
+ autoload :MatchPlatform, "bundler/match_platform"
+ autoload :RemoteSpecification, "bundler/remote_specification"
+ autoload :Resolver, "bundler/resolver"
+ autoload :Retry, "bundler/retry"
+ autoload :RubyVersion, "bundler/ruby_version"
+ autoload :RubyDsl, "bundler/ruby_dsl"
+ autoload :Runtime, "bundler/runtime"
+ autoload :Settings, "bundler/settings"
+ autoload :SharedHelpers, "bundler/shared_helpers"
+ autoload :SpecSet, "bundler/spec_set"
+ autoload :StubSpecification, "bundler/stub_specification"
+ autoload :Source, "bundler/source"
+ autoload :SourceList, "bundler/source_list"
+ autoload :SystemRubyVersion, "bundler/ruby_version"
+ autoload :UI, "bundler/ui"
- class BundlerError < StandardError
- def self.status_code(code)
- define_method(:status_code) { code }
- end
- end
-
- class GemfileNotFound < BundlerError; status_code(10) ; end
- class GemNotFound < BundlerError; status_code(7) ; end
- class GemfileError < BundlerError; status_code(4) ; end
- class InstallError < BundlerError; status_code(5) ; end
- class InstallHookError < BundlerError; status_code(8) ; end
- class PathError < BundlerError; status_code(13) ; end
- class GitError < BundlerError; status_code(11) ; end
- class DeprecatedError < BundlerError; status_code(12) ; end
- class GemspecError < BundlerError; status_code(14) ; end
- class InvalidOption < BundlerError; status_code(15) ; end
- class ProductionError < BundlerError; status_code(16) ; end
- class HTTPError < BundlerError; status_code(17) ; end
- class RubyVersionMismatch < BundlerError; status_code(18) ; end
- class SecurityError < BundlerError; status_code(19) ; end
- class LockfileError < BundlerError; status_code(20) ; end
- class CyclicDependencyError < BundlerError; status_code(21) ; end
- class GemfileLockNotFound < BundlerError; status_code(22) ; end
-
- # Internal errors, should be rescued
- class VersionConflict < BundlerError
- attr_reader :conflicts
-
- def initialize(conflicts, msg = nil)
- super(msg)
- @conflicts = conflicts
- end
-
- status_code(6)
- end
-
- class MarshalError < StandardError; end
-
class << self
attr_writer :bundle_path
def configure
@configured ||= configure_gem_home_and_path
@@ -109,11 +74,11 @@
# Returns absolute location of where binstubs are installed to.
def bin_path
@bin_path ||= begin
path = settings[:bin] || "bin"
path = Pathname.new(path).expand_path(root).expand_path
- FileUtils.mkdir_p(path)
+ SharedHelpers.filesystem_access(path) {|p| FileUtils.mkdir_p(p) }
path
end
end
def setup(*groups)
@@ -199,18 +164,20 @@
Pathname.new(File.expand_path("..", bundle_dir))
end
end
def app_config_path
- ENV['BUNDLE_APP_CONFIG'] ?
- Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
- root.join('.bundle')
+ if ENV["BUNDLE_APP_CONFIG"]
+ Pathname.new(ENV["BUNDLE_APP_CONFIG"]).expand_path(root)
+ else
+ root.join(".bundle")
+ end
end
def app_cache(custom_path = nil)
path = custom_path || root
- path.join(self.settings.app_cache_path)
+ path.join(settings.app_cache_path)
end
def tmp(name = Process.pid.to_s)
Pathname.new(Dir.mktmpdir(["bundler", name]))
end
@@ -234,16 +201,23 @@
ENV.replace(bundled_env.to_hash)
end
def with_clean_env
with_original_env do
- ENV['MANPATH'] = ENV['BUNDLE_ORIG_MANPATH']
- ENV.delete_if { |k,_| k[0,7] == 'BUNDLE_' }
- if ENV.has_key? 'RUBYOPT'
- ENV['RUBYOPT'] = ENV['RUBYOPT'].sub '-rbundler/setup', ''
- ENV['RUBYOPT'] = ENV['RUBYOPT'].sub "-I#{File.expand_path('..', __FILE__)}", ''
+ ENV["MANPATH"] = ENV["BUNDLE_ORIG_MANPATH"]
+ ENV.delete_if {|k, _| k[0, 7] == "BUNDLE_" }
+
+ if ENV.key?("RUBYOPT")
+ ENV["RUBYOPT"] = ENV["RUBYOPT"].sub "-rbundler/setup", ""
end
+
+ if ENV.key?("RUBYLIB")
+ rubylib = ENV["RUBYLIB"].split(File::PATH_SEPARATOR)
+ rubylib.delete(File.expand_path("..", __FILE__))
+ ENV["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR)
+ end
+
yield
end
end
def clean_system(*args)
@@ -276,13 +250,11 @@
end
def requires_sudo?
return @requires_sudo if defined?(@requires_sudo_ran)
- if settings.allow_sudo?
- sudo_present = which "sudo"
- end
+ sudo_present = which "sudo" if settings.allow_sudo?
if sudo_present
# the bundle path and subdirectories need to be writable for Rubygems
# to be able to unpack and install gems without exploding
path = bundle_path
@@ -291,56 +263,60 @@
# bins are written to a different location on OS X
bin_dir = Pathname.new(Bundler.system_bindir)
bin_dir = bin_dir.parent until bin_dir.exist?
# if any directory is not writable, we need sudo
- files = [path, bin_dir] | Dir[path.join('build_info/*').to_s] | Dir[path.join('*').to_s]
- sudo_needed = files.any?{|f| !File.writable?(f) }
+ files = [path, bin_dir] | Dir[path.join("build_info/*").to_s] | Dir[path.join("*").to_s]
+ sudo_needed = files.any? {|f| !File.writable?(f) }
end
@requires_sudo_ran = true
@requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
end
def mkdir_p(path)
if requires_sudo?
sudo "mkdir -p '#{path}'" unless File.exist?(path)
else
- FileUtils.mkdir_p(path)
+ SharedHelpers.filesystem_access(path, :write) do |p|
+ FileUtils.mkdir_p(p)
+ end
end
end
def which(executable)
if File.file?(executable) && File.executable?(executable)
executable
- elsif ENV['PATH']
- path = ENV['PATH'].split(File::PATH_SEPARATOR).find do |p|
+ elsif ENV["PATH"]
+ path = ENV["PATH"].split(File::PATH_SEPARATOR).find do |p|
abs_path = File.join(p, executable)
File.file?(abs_path) && File.executable?(abs_path)
end
path && File.expand_path(executable, path)
end
end
def sudo(str)
- prompt = "\n\n" + <<-PROMPT.gsub(/^ {6}/, '').strip + " "
- Your user account isn't allowed to install to the system Rubygems.
- You can cancel this installation and run:
+ SUDO_MUTEX.synchronize do
+ prompt = "\n\n" + <<-PROMPT.gsub(/^ {6}/, "").strip + " "
+ Your user account isn't allowed to install to the system Rubygems.
+ You can cancel this installation and run:
- bundle install --path vendor/bundle
+ bundle install --path vendor/bundle
- to install the gems into ./vendor/bundle/, or you can enter your password
- and install the bundled gems to Rubygems using sudo.
+ to install the gems into ./vendor/bundle/, or you can enter your password
+ and install the bundled gems to Rubygems using sudo.
- Password:
- PROMPT
+ Password:
+ PROMPT
- `sudo -p "#{prompt}" #{str}`
+ `sudo -p "#{prompt}" #{str}`
+ end
end
def read_file(file)
- File.open(file, "rb") { |f| f.read }
+ File.open(file, "rb", &:read)
end
def load_marshal(data)
Marshal.load(data)
rescue => e
@@ -369,11 +345,11 @@
end
Bundler.rubygems.validate(spec) if spec && validate
spec
end
rescue Gem::InvalidSpecificationException => e
- Bundler.ui.warn "The gemspec at #{file} is not valid. " \
+ UI::Shell.new.warn "The gemspec at #{file} is not valid. " \
"The validation error was '#{e.message}'"
nil
end
def clear_gemspec_cache
@@ -404,12 +380,12 @@
end
def eval_gemspec(path, contents)
eval(contents, TOPLEVEL_BINDING, path.expand_path.to_s)
rescue ScriptError, StandardError => e
- original_line = e.backtrace.find { |line| line.include?(path.to_s) }
- msg = "There was a #{e.class} while loading #{path.basename}: \n#{e.message}"
+ original_line = e.backtrace.find {|line| line.include?(path.to_s) }
+ msg = "There was a #{e.class} while loading #{path.basename}: \n#{e.message}"
msg << " from\n #{original_line}" if original_line
msg << "\n"
if e.is_a?(LoadError) && RUBY_VERSION >= "1.9"
msg << "\nDoes it try to require a relative path? That's been removed in Ruby 1.9."
@@ -417,36 +393,39 @@
raise GemspecError, msg
end
def configure_gem_home_and_path
- blank_home = ENV['GEM_HOME'].nil? || ENV['GEM_HOME'].empty?
+ blank_home = ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
if settings[:disable_shared_gems]
- ENV['GEM_PATH'] = ''
+ ENV["GEM_PATH"] = ""
elsif blank_home || Bundler.rubygems.gem_dir != bundle_path.to_s
possibles = [Bundler.rubygems.gem_dir, Bundler.rubygems.gem_path]
- paths = possibles.flatten.compact.uniq.reject { |p| p.empty? }
+ paths = possibles.flatten.compact.uniq.reject(&:empty?)
ENV["GEM_PATH"] = paths.join(File::PATH_SEPARATOR)
end
configure_gem_home
bundle_path
end
def configure_gem_home
# TODO: This mkdir_p is only needed for JRuby <= 1.5 and should go away (GH #602)
- FileUtils.mkdir_p bundle_path.to_s rescue nil
+ begin
+ FileUtils.mkdir_p bundle_path.to_s
+ rescue
+ nil
+ end
- ENV['GEM_HOME'] = File.expand_path(bundle_path, root)
+ ENV["GEM_HOME"] = File.expand_path(bundle_path, root)
Bundler.rubygems.clear_paths
end
def upgrade_lockfile
lockfile = default_lockfile
if lockfile.exist? && lockfile.read(3) == "---"
Bundler.ui.warn "Detected Gemfile.lock generated by 0.9, deleting..."
lockfile.rmtree
end
end
-
end
end