Skip to content

Instantly share code, notes, and snippets.

@joshk
Created March 9, 2010 19:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joshk/327032 to your computer and use it in GitHub Desktop.
Save joshk/327032 to your computer and use it in GitHub Desktop.
# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
module Rails
class << self
def boot!
unless booted?
preinitialize
pick_boot.run
end
end
def booted?
defined? Rails::Initializer
end
def pick_boot
(vendor_rails? ? VendorBoot : GemBoot).new
end
def vendor_rails?
File.exist?("#{RAILS_ROOT}/vendor/rails")
end
def preinitialize
load(preinitializer_path) if File.exist?(preinitializer_path)
end
def preinitializer_path
"#{RAILS_ROOT}/config/preinitializer.rb"
end
end
class Boot
def run
load_initializer
Rails::Initializer.run(:set_load_path)
end
end
class VendorBoot < Boot
def load_initializer
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
Rails::Initializer.run(:install_gem_spec_stubs)
Rails::GemDependency.add_frozen_gem_path
end
end
class GemBoot < Boot
def load_initializer
self.class.load_rubygems
load_rails_gem
require 'initializer'
end
def load_rails_gem
if version = self.class.gem_version
gem 'rails', version
else
gem 'rails'
end
rescue Gem::LoadError => load_error
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
exit 1
end
class << self
def rubygems_version
Gem::RubyGemsVersion rescue nil
end
def gem_version
if defined? RAILS_GEM_VERSION
RAILS_GEM_VERSION
elsif ENV.include?('RAILS_GEM_VERSION')
ENV['RAILS_GEM_VERSION']
else
parse_gem_version(read_environment_rb)
end
end
def load_rubygems
min_version = '1.3.2'
require 'rubygems'
unless rubygems_version >= min_version
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
exit 1
end
rescue LoadError
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
exit 1
end
def parse_gem_version(text)
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
end
private
def read_environment_rb
File.read("#{RAILS_ROOT}/config/environment.rb")
end
end
end
end
# required for bundler
class Rails::Boot
def run
load_initializer
extend_environment
Rails::Initializer.run(:set_load_path)
end
def extend_environment
Rails::Initializer.class_eval do
old_load = instance_method(:load_environment)
define_method(:load_environment) do
Bundler.require :default, Rails.env.to_sym
old_load.bind(self).call
end
end
end
end
# All that for this:
Rails.boot!
# this is the generated environment file (bundler)
# DO NOT MODIFY THIS FILE
require 'digest/sha1'
require "rubygems"
module Gem
class Dependency
if !instance_methods.map { |m| m.to_s }.include?("requirement")
def requirement
version_requirements
end
end
end
end
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?(:requirement)
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.requirement
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.requirement
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.10'
FINGERPRINT = "db4abb560d2d27539be4342a921f55c516b4b273"
AUTOREQUIRES = {:default=>[["mysql", false]]}
SPECS = [
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activesupport-2.3.4.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/actionmailer-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/actionmailer-2.3.4.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rack-1.0.1/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rack-1.0.1.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/actionpack-2.3.4.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/mysql-2.8.1/lib", "/opt/local/lib/ruby/gems/1.8/gems/mysql-2.8.1/ext"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/mysql-2.8.1.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rake-0.8.7.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activerecord-2.3.4.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/activeresource-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/activeresource-2.3.4.gemspec"},
{:load_paths=>["/opt/local/lib/ruby/gems/1.8/gems/rails-2.3.4/lib"], :loaded_from=>"/opt/local/lib/ruby/gems/1.8/specifications/rails-2.3.4.gemspec"},
].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
source :gemcutter
gem 'rails', '2.3.4', :require => nil
gem 'mysql'
➜ bundler_test bundle lock
The bundle is now locked. Use `bundle show` to list the gems in the environment.
➜ bundler_test bundle install
Installing actionmailer (2.3.4) from system gems
Installing actionpack (2.3.4) from system gems
Installing activerecord (2.3.4) from system gems
Installing activeresource (2.3.4) from system gems
Installing activesupport (2.3.4) from system gems
Installing mysql (2.8.1) from system gems
Installing rack (1.0.1) from system gems
Installing rails (2.3.4) from system gems
Installing rake (0.8.7) from system gems
Your bundle is complete!
➜ bundler_test bundle exec rake routes
/opt/local/bin/rake:19:in `load': no such file to load -- rake (LoadError)
from /opt/local/bin/rake:19
begin
# Require the preresolved locked set of gems.
require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
# Fallback on doing the resolve at runtime.
require "rubygems"
require "bundler"
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.5")
raise RuntimeError, "Bundler incompatible.\n" +
"Your bundler version is incompatible with Rails 2.3 and an unlocked bundle.\n" +
"Run `gem install bundler` to upgrade or `bundle lock` to lock."
else
Bundler.setup
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment