module Bundler

Some versions of the Bundler 1.1 RC series introduced corrupted lockfiles. There were two major problems:

As a result, Bundler 1.1 contains code that fixes the earlier corruption. We will remove this fix-up code in Bundler 1.2.

Constants

Deprecate
FREEBSD
NULL
ORIGINAL_ENV
VERSION

We're doing this because we might write tests that deal with other versions of bundler and we are unsure how to handle this better.

WINDOWS
YamlSyntaxError

Attributes

bundle_path[W]
rubygems[R]
ui[W]

Public Class Methods

app_cache() click to toggle source
# File lib/bundler.rb, line 186
def app_cache
  root.join("vendor/cache")
end
app_config_path() click to toggle source
# File lib/bundler.rb, line 180
def app_config_path
  ENV['BUNDLE_APP_CONFIG'] ?
    Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
    root.join('.bundle')
end
bin_path() click to toggle source

Returns absolute location of where binstubs are installed to.

# File lib/bundler.rb, line 103
def bin_path
  @bin_path ||= begin
    path = settings[:bin] || "bin"
    path = Pathname.new(path).expand_path(root).expand_path
    FileUtils.mkdir_p(path)
    path
  end
end
bundle_path() click to toggle source

Returns absolute path of where gems are installed on the filesystem.

# File lib/bundler.rb, line 98
def bundle_path
  @bundle_path ||= Pathname.new(settings.path).expand_path(root)
end
cache() click to toggle source
# File lib/bundler.rb, line 172
def cache
  bundle_path.join("cache/bundler")
end
clean_exec(*args) click to toggle source
# File lib/bundler.rb, line 226
def clean_exec(*args)
  with_clean_env { Kernel.exec(*args) }
end
clean_system(*args) click to toggle source
# File lib/bundler.rb, line 222
def clean_system(*args)
  with_clean_env { Kernel.system(*args) }
end
clear_gemspec_cache() click to toggle source
# File lib/bundler.rb, line 317
def clear_gemspec_cache
  @gemspec_cache = {}
end
configure() click to toggle source
# File lib/bundler.rb, line 89
def configure
  @configured ||= configure_gem_home_and_path
end
default_gemfile() click to toggle source
# File lib/bundler.rb, line 230
def default_gemfile
  SharedHelpers.default_gemfile
end
default_lockfile() click to toggle source
# File lib/bundler.rb, line 234
def default_lockfile
  SharedHelpers.default_lockfile
end
definition(unlock = nil) click to toggle source
# File lib/bundler.rb, line 143
def definition(unlock = nil)
  @definition = nil if unlock
  @definition ||= begin
    configure
    upgrade_lockfile
    Definition.build(default_gemfile, default_lockfile, unlock)
  end
end
environment() click to toggle source
# File lib/bundler.rb, line 139
def environment
  Bundler::Environment.new(root, definition)
end
home() click to toggle source
# File lib/bundler.rb, line 160
def home
  bundle_path.join("bundler")
end
install_path() click to toggle source
# File lib/bundler.rb, line 164
def install_path
  home.join("gems")
end
load() click to toggle source
# File lib/bundler.rb, line 135
def load
  @load ||= Runtime.new(root, definition)
end
load_gemspec(file) click to toggle source
# File lib/bundler.rb, line 294
def load_gemspec(file)
  @gemspec_cache ||= {}
  key = File.expand_path(file)
  spec = ( @gemspec_cache[key] ||= load_gemspec_uncached(file) )
  # Protect against caching side-effected gemspecs by returning a
  # new instance each time.
  spec.dup if spec
end
load_gemspec_uncached(file) click to toggle source
# File lib/bundler.rb, line 303
def load_gemspec_uncached(file)
  path = Pathname.new(file)
  # Eval the gemspec from its parent directory, because some gemspecs
  # depend on "./" relative paths.
  Dir.chdir(path.dirname.to_s) do
    contents = path.read
    if contents[0..2] == "---" # YAML header
      eval_yaml_gemspec(path, contents)
    else
      eval_gemspec(path, contents)
    end
  end
end
load_marshal(data) click to toggle source
# File lib/bundler.rb, line 288
def load_marshal(data)
  Marshal.load(data)
rescue => e
  raise MarshalError, "#{e.class}: #{e.message}"
end
mkdir_p(path) click to toggle source
# File lib/bundler.rb, line 261
def mkdir_p(path)
  if requires_sudo?
    sudo "mkdir -p '#{path}'" unless File.exist?(path)
  else
    FileUtils.mkdir_p(path)
  end
end
preserve_gem_path() click to toggle source
# File lib/bundler/gem_path_manipulation.rb, line 2
def self.preserve_gem_path
  original_gem_path = ENV["_ORIGINAL_GEM_PATH"]
  gem_path          = ENV["GEM_PATH"]
  ENV["_ORIGINAL_GEM_PATH"] = gem_path          if original_gem_path.nil? || original_gem_path == ""
  ENV["GEM_PATH"]           = original_gem_path if gem_path.nil? || gem_path == ""
end
read_file(file) click to toggle source
# File lib/bundler.rb, line 284
def read_file(file)
  File.open(file, "rb") { |f| f.read }
end
require(*groups) click to toggle source
# File lib/bundler.rb, line 131
def require(*groups)
  setup(*groups).require(*groups)
end
requires_sudo?() click to toggle source
# File lib/bundler.rb, line 247
def requires_sudo?
  return @requires_sudo if defined?(@checked_for_sudo)

  path = bundle_path
  path = path.parent until path.exist?
  sudo_present = which "sudo"
  bin_dir = Pathname.new(Bundler.system_bindir)
  bin_dir = bin_dir.parent until bin_dir.exist?

  @checked_for_sudo = true
  sudo_gems = !File.writable?(path) || !File.writable?(bin_dir)
  @requires_sudo = settings.allow_sudo? && sudo_gems && sudo_present
end
root() click to toggle source
# File lib/bundler.rb, line 176
def root
  default_gemfile.dirname.expand_path
end
ruby_scope() click to toggle source
# File lib/bundler.rb, line 152
def ruby_scope
  "#{Bundler.rubygems.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}"
end
settings() click to toggle source
# File lib/bundler.rb, line 194
def settings
  @settings ||= begin
    Settings.new(app_config_path)
  rescue GemfileNotFound
    Settings.new
  end
end
setup(*groups) click to toggle source
# File lib/bundler.rb, line 112
def setup(*groups)
  # Just return if all groups are already loaded
  return @setup if defined?(@setup)

  definition.validate_ruby!

  if groups.empty?
    # Load all groups, but only once
    @setup = load.setup
  else
    @completed_groups ||= []
    # Figure out which groups haven't been loaded yet
    unloaded = groups - @completed_groups
    # Record groups that are now loaded
    @completed_groups = groups
    unloaded.any? ? load.setup(*groups) : load
  end
end
specs_path() click to toggle source
# File lib/bundler.rb, line 168
def specs_path
  bundle_path.join("specifications")
end
sudo(str) click to toggle source
# File lib/bundler.rb, line 280
def sudo(str)
  %xsudo -p 'Enter your password to install the bundled RubyGems to your system: ' #{str}`
end
system_bindir() click to toggle source
# File lib/bundler.rb, line 238
def system_bindir
  # Gem.bindir doesn't always return the location that Rubygems will install
  # system binaries. If you put '-n foo' in your .gemrc, Rubygems will
  # install binstubs there instead. Unfortunately, Rubygems doesn't expose
  # that directory at all, so rather than parse .gemrc ourselves, we allow
  # the directory to be set as well, via `bundle config bindir foo`.
  Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
end
tmp() click to toggle source
# File lib/bundler.rb, line 190
def tmp
  user_bundle_path.join("tmp", Process.pid.to_s)
end
ui() click to toggle source
# File lib/bundler.rb, line 93
def ui
  @ui ||= UI.new
end
user_bundle_path() click to toggle source
# File lib/bundler.rb, line 156
def user_bundle_path
  Pathname.new(Bundler.rubygems.user_home).join(".bundler")
end
which(executable) click to toggle source
# File lib/bundler.rb, line 269
def which(executable)
  if File.executable?(executable)
    executable
  elsif ENV['PATH']
    path = ENV['PATH'].split(File::PATH_SEPARATOR).find do |p|
      File.executable?(File.join(p, executable))
    end
    path && File.expand_path(executable, path)
  end
end
with_clean_env() { || ... } click to toggle source
# File lib/bundler.rb, line 210
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__)}", ''
    end
    yield
  end
end
with_friendly_errors() { || ... } click to toggle source
# File lib/bundler/friendly_errors.rb, line 2
  def self.with_friendly_errors
    yield
  rescue Bundler::BundlerError => e
    Bundler.ui.error e.message, :wrap => true
    Bundler.ui.trace e
    exit e.status_code
  rescue LoadError => e
    raise e unless e.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
    Bundler.ui.error "\nCould not load OpenSSL."
    Bundler.ui.warn "You must recompile Ruby with OpenSSL support or change the sources in your"        "\nGemfile from 'https' to 'http'. Instructions for compiling with OpenSSL"        "\nusing RVM are available at rvm.io/packages/openssl."
    Bundler.ui.trace e
    exit 1
  rescue Interrupt => e
    Bundler.ui.error "\nQuitting..."
    Bundler.ui.trace e
    exit 1
  rescue SystemExit => e
    exit e.status
  rescue Exception => e
    Bundler.ui.error "      Unfortunately, a fatal error has occurred. Please see the Bundler
      troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!

", :wrap => true
    raise e
  end
with_original_env() { || ... } click to toggle source
# File lib/bundler.rb, line 202
def with_original_env
  bundled_env = ENV.to_hash
  ENV.replace(ORIGINAL_ENV)
  yield
ensure
  ENV.replace(bundled_env.to_hash)
end

Private Class Methods

configure_gem_home() click to toggle source
# File lib/bundler.rb, line 362
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

  ENV['GEM_HOME'] = File.expand_path(bundle_path, root)
  Bundler.rubygems.clear_paths
end
configure_gem_home_and_path() click to toggle source
# File lib/bundler.rb, line 346
def configure_gem_home_and_path
  blank_home = ENV['GEM_HOME'].nil? || ENV['GEM_HOME'].empty?
  if settings[:disable_shared_gems]
    ENV['GEM_PATH'] = ''
    configure_gem_home
  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? }
    ENV["GEM_PATH"] = paths.join(File::PATH_SEPARATOR)
    configure_gem_home
  end

  Bundler.rubygems.refresh
  bundle_path
end
eval_gemspec(path, contents) click to toggle source
# File lib/bundler.rb, line 331
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}"
  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."
  end

  raise GemspecError, msg
end
eval_yaml_gemspec(path, contents) click to toggle source
# File lib/bundler.rb, line 323
def eval_yaml_gemspec(path, contents)
  # If the YAML is invalid, Syck raises an ArgumentError, and Psych
  # raises a Psych::SyntaxError. See psyched_yaml.rb for more info.
  Gem::Specification.from_yaml(contents)
rescue YamlSyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception
  eval_gemspec(path, contents)
end
upgrade_lockfile() click to toggle source
# File lib/bundler.rb, line 370
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