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