module Bundler

def bundle_path

def bundle_path
  @bundle_path ||= begin
    path = settings[:path] || "#{Gem.user_home}/.bundle/#{Gem.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}"
    Pathname.new(path).expand_path(root)
  end
end

def cache

def cache
  bundle_path.join("cache/bundler")
end

def configure

def configure
  @configured ||= begin
    configure_gem_home_and_path
    true
  end
end

def configure_gem_home_and_path

def configure_gem_home_and_path
  if settings[:disable_shared_gems]
    ENV['GEM_PATH'] = ''
    ENV['GEM_HOME'] = File.expand_path(bundle_path, root)
  else
    paths = [Gem.dir, Gem.path].flatten.compact.uniq.reject{|p| p.empty? }
    ENV["GEM_PATH"] = paths.join(File::PATH_SEPARATOR)
    ENV["GEM_HOME"] = bundle_path.to_s
  end
  Gem.clear_paths
end

def current_env_file?

def current_env_file?
  env_file.exist? && (env_file.read(100) =~ /Bundler #{Bundler::VERSION}/)
end

def default_gemfile

def default_gemfile
  SharedHelpers.default_gemfile
end

def definition

def definition
  configure
  lockfile = root.join("Gemfile.lock")
  if lockfile.exist?
    Definition.from_lock(lockfile)
  else
    Definition.from_gemfile(default_gemfile)
  end
end

def env_file

def env_file
  SharedHelpers.env_file
end

def gem_require(*groups)

def gem_require(*groups)
  setup(*groups).require(*groups)
end

def gem_setup(*groups)

def gem_setup(*groups)
  return @setup if @setup
  begin
    if groups.empty?
      # Load all groups, but only once
      @setup = load.setup
    else
      # Figure out which groups haven't been loaded yet
      unloaded = groups - (@completed_groups || [])
      # Record groups that are now loaded
      @completed_groups = groups | (@completed_groups || [])
      # Load any groups that are not yet loaded
      unloaded.any? ? load.setup(*unloaded) : load
    end
  rescue Bundler::GemNotFound => e
    STDERR.puts e.message
    STDERR.puts "Try running `bundle install`."
    exit!
  end
end

def home

def home
  bundle_path.join("bundler")
end

def install_path

def install_path
  home.join("gems")
end

def load

def load
  @load ||= begin
    if current_env_file?
      @gem_loaded = true
      Kernel.require env_file
      Bundler
    else
      runtime
    end
  end
end

def root

def root
  default_gemfile.dirname
end

def runtime

def runtime
  @runtime ||= Runtime.new(root, definition)
end

def settings

def settings
  @settings ||= Settings.new(root)
end

def specs_path

def specs_path
  bundle_path.join("specifications")
end

def ui

def ui
  @ui ||= UI.new
end

def with_clean_env

def with_clean_env
  bundled_env = ENV.to_hash
  ENV.replace(ORIGINAL_ENV)
  yield
ensure
  ENV.replace(bundled_env.to_hash)
end