Created
February 20, 2010 17:09
-
-
Save johnlauck/309777 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# DO NOT MODIFY THIS FILE | |
require 'digest/sha1' | |
require "rubygems" | |
module Bundler | |
module SharedHelpers | |
def default_gemfile | |
gemfile = find_gemfile | |
gemfile or raise GemfileNotFound, "The default Gemfile was not found" | |
Pathname.new(gemfile) | |
end | |
def in_bundle? | |
find_gemfile | |
end | |
private | |
def find_gemfile | |
return ENV['BUNDLE_GEMFILE'] if ENV['BUNDLE_GEMFILE'] | |
previous = nil | |
current = File.expand_path(Dir.pwd) | |
until !File.directory?(current) || current == previous | |
filename = File.join(current, 'Gemfile') | |
return filename if File.file?(filename) | |
current, previous = File.expand_path("..", current), current | |
end | |
end | |
def clean_load_path | |
# handle 1.9 where system gems are always on the load path | |
if defined?(::Gem) | |
me = File.expand_path("../../", __FILE__) | |
$LOAD_PATH.reject! do |p| | |
next if File.expand_path(p).include?(me) | |
p != File.dirname(__FILE__) && | |
Gem.path.any? { |gp| p.include?(gp) } | |
end | |
$LOAD_PATH.uniq! | |
end | |
end | |
def reverse_rubygems_kernel_mixin | |
# Disable rubygems' gem activation system | |
::Kernel.class_eval do | |
if private_method_defined?(:gem_original_require) | |
alias rubygems_require require | |
alias require gem_original_require | |
end | |
undef gem | |
end | |
end | |
def cripple_rubygems(specs) | |
reverse_rubygems_kernel_mixin | |
executables = specs.map { |s| s.executables }.flatten | |
:: Kernel.class_eval do | |
private | |
def gem(*) ; end | |
end | |
Gem.source_index # ensure RubyGems is fully loaded | |
::Kernel.send(:define_method, :gem) do |dep, *reqs| | |
if executables.include? File.basename(caller.first.split(':').first) | |
return | |
end | |
opts = reqs.last.is_a?(Hash) ? reqs.pop : {} | |
unless dep.respond_to?(:name) && dep.respond_to?(:version_requirements) | |
dep = Gem::Dependency.new(dep, reqs) | |
end | |
spec = specs.find { |s| s.name == dep.name } | |
if spec.nil? | |
e = Gem::LoadError.new "#{dep.name} is not part of the bundle. Add it to Gemfile." | |
e.name = dep.name | |
e.version_requirement = dep.version_requirements | |
raise e | |
elsif dep !~ spec | |
e = Gem::LoadError.new "can't activate #{dep}, already activated #{spec.full_name}. " \ | |
"Make sure all dependencies are added to Gemfile." | |
e.name = dep.name | |
e.version_requirement = dep.version_requirements | |
raise e | |
end | |
true | |
end | |
# === Following hacks are to improve on the generated bin wrappers === | |
# Yeah, talk about a hack | |
source_index_class = (class << Gem::SourceIndex ; self ; end) | |
source_index_class.send(:define_method, :from_gems_in) do |*args| | |
source_index = Gem::SourceIndex.new | |
source_index.spec_dirs = *args | |
source_index.add_specs(*specs) | |
source_index | |
end | |
# OMG more hacks | |
gem_class = (class << Gem ; self ; end) | |
gem_class.send(:define_method, :bin_path) do |name, *args| | |
exec_name, *reqs = args | |
spec = nil | |
if exec_name | |
spec = specs.find { |s| s.executables.include?(exec_name) } | |
spec or raise Gem::Exception, "can't find executable #{exec_name}" | |
else | |
spec = specs.find { |s| s.name == name } | |
exec_name = spec.default_executable or raise Gem::Exception, "no default executable for #{spec.full_name}" | |
end | |
File.join(spec.full_gem_path, spec.bindir, exec_name) | |
end | |
end | |
extend self | |
end | |
end | |
module Bundler | |
LOCKED_BY = '0.9.7' | |
FINGERPRINT = "277e35169d621ff4d5a1da58d247d345a56b3e9b" | |
AUTOREQUIRES = {:test=>[["shoulda", true], ["pickle", false], ["cucumber-rails", false], ["factory_girl", false], ["database_cleaner", false], ["sqlite3", true], ["mocha", false], ["rspec", false], ["webrat", false], ["rspec-rails", false], ["cucumber", false]], :default=>[["acl9", false], ["pacecar", false], ["authlogic_oauth", true], ["oauth", false], ["authlogic", false], ["haml", false], ["twitter", false], ["rails", false]], :development=>[["mysql", false], ["mongrel", false]]} | |
SPECS = [ | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/nokogiri-1.4.1.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/nokogiri-1.4.1/lib", "/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/nokogiri-1.4.1/ext"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/activesupport-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/activesupport-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/builder-2.1.2.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/builder-2.1.2/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/thoughtbot-shoulda-2.10.2.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/thoughtbot-shoulda-2.10.2/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/acl9-0.12.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/acl9-0.12.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/json_pure-1.2.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/json_pure-1.2.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/daemons-1.0.10.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/daemons-1.0.10/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/pickle-0.2.1.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/pickle-0.2.1/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/cucumber-rails-0.2.4.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/cucumber-rails-0.2.4/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/factory_girl-1.2.3.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/factory_girl-1.2.3/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/cgi_multipart_eof_fix-2.5.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/cgi_multipart_eof_fix-2.5.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/gem_plugin-0.2.3.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/gem_plugin-0.2.3/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/pacecar-1.2.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/pacecar-1.2.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/database_cleaner-0.4.3.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/database_cleaner-0.4.3/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/authlogic-oauth-1.0.8.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/authlogic-oauth-1.0.8/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/ruby-hmac-0.4.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/ruby-hmac-0.4.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/crack-0.1.6.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/crack-0.1.6/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/oauth-0.3.6.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/oauth-0.3.6/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/hashie-0.1.8.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/hashie-0.1.8/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/authlogic-2.1.3.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/authlogic-2.1.3/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/haml-2.2.20.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/haml-2.2.20/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/sqlite3-ruby-1.2.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/sqlite3-ruby-1.2.5/lib", "/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/sqlite3-ruby-1.2.5/ext"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/mysql-2.8.1.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/mysql-2.8.1/lib", "/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/mysql-2.8.1/ext"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rake-0.8.7.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rake-0.8.7/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/mocha-0.9.8.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/mocha-0.9.8/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/diff-lcs-1.1.2.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/diff-lcs-1.1.2/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rspec-1.3.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rspec-1.3.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/polyglot-0.3.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/polyglot-0.3.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/treetop-1.4.4.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/treetop-1.4.4/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/activerecord-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/activerecord-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/fastthread-1.0.7.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/fastthread-1.0.7/lib", "/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/fastthread-1.0.7/ext"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/mongrel-1.1.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/mongrel-1.1.5/lib", "/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/mongrel-1.1.5/ext"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rack-1.0.1.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rack-1.0.1/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/actionpack-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/actionpack-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/actionmailer-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/actionmailer-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rack-test-0.5.3.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rack-test-0.5.3/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/webrat-0.7.0.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/webrat-0.7.0/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rspec-rails-1.3.2.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rspec-rails-1.3.2/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/httparty-0.4.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/httparty-0.4.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/twitter-0.8.4.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/twitter-0.8.4/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/activeresource-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/activeresource-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/rails-2.3.5.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/rails-2.3.5/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/term-ansicolor-1.0.4.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/term-ansicolor-1.0.4/lib"]}, | |
{:loaded_from=>"/Users/john/.rvm/gems/ree-1.8.7-2010.01/specifications/cucumber-0.6.2.gemspec", :load_paths=>["/Users/john/.rvm/gems/ree-1.8.7-2010.01/gems/cucumber-0.6.2/lib"]}, | |
].map do |hash| | |
spec = eval(File.read(hash[:loaded_from]), binding, hash[:loaded_from]) | |
spec.loaded_from = hash[:loaded_from] | |
spec.require_paths = hash[:load_paths] | |
spec | |
end | |
extend SharedHelpers | |
def self.match_fingerprint | |
print = Digest::SHA1.hexdigest(File.read(File.expand_path('../../Gemfile', __FILE__))) | |
unless print == FINGERPRINT | |
abort 'Gemfile changed since you last locked. Please `bundle lock` to relock.' | |
end | |
end | |
def self.setup(*groups) | |
match_fingerprint | |
clean_load_path | |
cripple_rubygems(SPECS) | |
SPECS.each do |spec| | |
Gem.loaded_specs[spec.name] = spec | |
$LOAD_PATH.unshift(*spec.require_paths) | |
end | |
end | |
def self.require(*groups) | |
groups = [:default] if groups.empty? | |
groups.each do |group| | |
(AUTOREQUIRES[group] || []).each do |file, explicit| | |
if explicit | |
Kernel.require file | |
else | |
begin | |
Kernel.require file | |
rescue LoadError | |
end | |
end | |
end | |
end | |
end | |
# Setup bundle when it's required. | |
setup | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment