Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 313 lines (258 sloc) 9.197 kb
dfe5d10 @spastorino Config is deprecated on 1.8.8 and 1.9.3, use RbConfig
spastorino authored
1 require 'rbconfig'
63b636b First pass at gemfile pack
Carlhuda authored
2 require 'fileutils'
ce350cc Get a simple bbl install working
Carlhuda authored
3 require 'pathname'
0171be6 @indirect extract the complex Psych-loading process
indirect authored
4 require 'bundler/psyched_yaml'
820bb93 Rename rubygems-ext to rubygems_ext
Carl Lerche authored
5 require 'bundler/rubygems_ext'
5f4a8f3 Phase 1 of rubygems/bundler reintegration
Evan Phoenix authored
6 require 'bundler/rubygems_integration'
1da7eb3 Don't generate bundler.gemspec anymore
Carlhuda authored
7 require 'bundler/version'
33154fd @joshbuddy Add Bundler.with_clean_env for blocks of ruby without a bundled env
joshbuddy authored
8
152a50a Rename gemfile back to bundler
Carl Lerche authored
9 module Bundler
33154fd @joshbuddy Add Bundler.with_clean_env for blocks of ruby without a bundled env
joshbuddy authored
10 ORIGINAL_ENV = ENV.to_hash
67859e4 Moving in thor
Carlhuda authored
11
207179d @hone put endpoint dependency info into a bundler spec
hone authored
12 autoload :Definition, 'bundler/definition'
13 autoload :Dependency, 'bundler/dependency'
2cc305a @indirect pull GemHelpers and MatchPlatform modules into files
indirect authored
14 autoload :DepProxy, 'bundler/dep_proxy'
207179d @hone put endpoint dependency info into a bundler spec
hone authored
15 autoload :Dsl, 'bundler/dsl'
16 autoload :EndpointSpecification, 'bundler/endpoint_specification'
17 autoload :Environment, 'bundler/environment'
18 autoload :Fetcher, 'bundler/fetcher'
19 autoload :GemHelper, 'bundler/gem_helper'
2cc305a @indirect pull GemHelpers and MatchPlatform modules into files
indirect authored
20 autoload :GemHelpers, 'bundler/gem_helpers'
ccfa996 @indirect Merge fixes for Rubygems 1.8.10.dev from branch '1-0-stable'
indirect authored
21 autoload :GemInstaller, 'bundler/gem_installer'
207179d @hone put endpoint dependency info into a bundler spec
hone authored
22 autoload :Graph, 'bundler/graph'
23 autoload :Index, 'bundler/index'
24 autoload :Installer, 'bundler/installer'
25 autoload :LazySpecification, 'bundler/lazy_specification'
26 autoload :LockfileParser, 'bundler/lockfile_parser'
2cc305a @indirect pull GemHelpers and MatchPlatform modules into files
indirect authored
27 autoload :MatchPlatform, 'bundler/match_platform'
207179d @hone put endpoint dependency info into a bundler spec
hone authored
28 autoload :RemoteSpecification, 'bundler/remote_specification'
29 autoload :Resolver, 'bundler/resolver'
30 autoload :Runtime, 'bundler/runtime'
31 autoload :Settings, 'bundler/settings'
32 autoload :SharedHelpers, 'bundler/shared_helpers'
33 autoload :SpecSet, 'bundler/spec_set'
34 autoload :Source, 'bundler/source'
35 autoload :Specification, 'bundler/shared_helpers'
36 autoload :UI, 'bundler/ui'
67859e4 Moving in thor
Carlhuda authored
37
de5054a Rescue all Bundler exceptions and exit with appropriate error code
Carlhuda authored
38 class BundlerError < StandardError
7c5e545 @indirect Better gem install failure error, no backtrace
indirect authored
39 def self.status_code(code)
0ae574c DslError should inherit from Bundler::Error so its exceptions are caught...
Carlhuda authored
40 define_method(:status_code) { code }
de5054a Rescue all Bundler exceptions and exit with appropriate error code
Carlhuda authored
41 end
42 end
43
5894862 Print useful warnings when deprecated options are used
Yehuda Katz authored
44 class GemfileNotFound < BundlerError; status_code(10) ; end
45 class GemNotFound < BundlerError; status_code(7) ; end
46 class GemfileError < BundlerError; status_code(4) ; end
7c5e545 @indirect Better gem install failure error, no backtrace
indirect authored
47 class InstallError < BundlerError; status_code(5) ; end
248ca34 Raise a better error in the case that a git repo is not cloned yet.
Carl Lerche authored
48 class PathError < BundlerError; status_code(13) ; end
5894862 Print useful warnings when deprecated options are used
Yehuda Katz authored
49 class GitError < BundlerError; status_code(11) ; end
d7e1dc1 @wycats Remove standalone #git in the DSL. Instead, use the block form of #git a...
wycats authored
50 class DeprecatedError < BundlerError; status_code(12) ; end
2a24019 @indirect Print a useful error if a gemspec require fails
indirect authored
51 class GemspecError < BundlerError; status_code(14) ; end
0ae574c DslError should inherit from Bundler::Error so its exceptions are caught...
Carlhuda authored
52 class DslError < BundlerError; status_code(15) ; end
cb3ec8e Update --production to yell if the user changed their Gemfile without up...
Carlhuda authored
53 class ProductionError < BundlerError; status_code(16) ; end
0ae574c DslError should inherit from Bundler::Error so its exceptions are caught...
Carlhuda authored
54 class InvalidOption < DslError ; end
8a3e4bc @hone move HTTPError to lib/bundler.rb
hone authored
55 class HTTPError < BundlerError; status_code(17) ; end
67859e4 Moving in thor
Carlhuda authored
56
67e3310 Integrate the new bundler man pages with bundle help
Carl Lerche authored
57
58 WINDOWS = RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
9db9102 @indirect Install with RB_USER_INSTALL on BSDs
indirect authored
59 FREEBSD = RbConfig::CONFIG["host_os"] =~ /bsd/
67e3310 Integrate the new bundler man pages with bundle help
Carl Lerche authored
60 NULL = WINDOWS ? "NUL" : "/dev/null"
61
4c3b339 @indirect Fantastic and also useful update instructions for outdated Bundler confl...
indirect authored
62 # Internal errors, should be rescued
3edfddb Hacked together some crap that doesn't really work
Carl Lerche authored
63 class VersionConflict < BundlerError
64 attr_reader :conflicts
65
66 def initialize(conflicts, msg = nil)
67 super(msg)
68 @conflicts = conflicts
69 end
70
71 status_code(6)
72 end
73
cf736cf Use the Lockfile's specs as LazySpecifications instead of converting the...
Carl Lerche authored
74 class InvalidSpecSet < StandardError; end
75
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
76 class << self
78a6b48 Rename vendor/lock.yml to Gemfile.lock
Carl Lerche authored
77 attr_writer :ui, :bundle_path
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
78
79 def configure
80 @configured ||= begin
739c0f3 Install bundles to ~/.bundle by default
Carlhuda authored
81 configure_gem_home_and_path
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
82 true
83 end
84 end
434fb42 First pass at output
Carlhuda authored
85
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
86 def ui
87 @ui ||= UI.new
88 end
434fb42 First pass at output
Carlhuda authored
89
5ad1279 Add the ability to set bundle env settings in a .bundleconfig file
Carl Lerche authored
90 def bundle_path
5b2d02f Make bundle install [PATH] namespace its gems to specific rubies
Carlhuda authored
91 @bundle_path ||= Pathname.new(settings.path).expand_path(root)
5ad1279 Add the ability to set bundle env settings in a .bundleconfig file
Carl Lerche authored
92 end
93
5f26a03 Have bundler generate executable stubs into ~/.bundler/bin that will aut...
Carl Lerche authored
94 def bin_path
95 @bin_path ||= begin
25ab2dc Make generating bin stubs an option
Carl Lerche authored
96 path = settings[:bin] || "bin"
97 path = Pathname.new(path).expand_path(root)
0891a38 @spastorino Revert "Don't try to create dirs if they already exists"
spastorino authored
98 FileUtils.mkdir_p(path)
5f26a03 Have bundler generate executable stubs into ~/.bundler/bin that will aut...
Carl Lerche authored
99 Pathname.new(path).expand_path
100 end
101 end
102
1674aef No need to alias setup and require in Bundler
Carl Lerche authored
103 def setup(*groups)
5ff5cbc @indirect Tests and fix for Bundler.require removing gems from
indirect authored
104 # Just return if all groups are already loaded
105 return @setup if defined?(@setup)
2c8d6ae @indirect Don't call #setup after loading env.rb in Bundler.load
indirect authored
106
5dfc54c @indirect Don't call exit! if Bundler.setup has an exception
indirect authored
107 if groups.empty?
108 # Load all groups, but only once
109 @setup = load.setup
110 else
e2e60c2 @indirect clean up setup
indirect authored
111 @completed_groups ||= []
5dfc54c @indirect Don't call exit! if Bundler.setup has an exception
indirect authored
112 # Figure out which groups haven't been loaded yet
e2e60c2 @indirect clean up setup
indirect authored
113 unloaded = groups - @completed_groups
5dfc54c @indirect Don't call exit! if Bundler.setup has an exception
indirect authored
114 # Record groups that are now loaded
c3b93d3 @indirect Allow groups to be loaded again if they been cleared
indirect authored
115 @completed_groups = groups
671141d @radsaq Don't hose existing load paths if Bundle.setup is called a multiple time...
radsaq authored
116 unloaded.any? ? load.setup(*groups) : load
4980111 @indirect Fix Bundler.setup so it can be called more than once safely
indirect authored
117 end
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
118 end
ce350cc Get a simple bbl install working
Carlhuda authored
119
1674aef No need to alias setup and require in Bundler
Carl Lerche authored
120 def require(*groups)
69acfd8 @indirect Call Bundler.setup from Bundler.require, only set up each group once
indirect authored
121 setup(*groups).require(*groups)
a8cbf77 @jeremy Group autorequire: pass :require => 'autorequire' option to gem dependen...
jeremy authored
122 end
123
625818a @indirect Clean up bundler.rb a bit
indirect authored
124 def load
91c74f4 Bundle.load and Bundle.runtime are the same thing again.
Carl Lerche authored
125 @load ||= Runtime.new(root, definition)
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
126 end
67859e4 Moving in thor
Carlhuda authored
127
3687843 @kevmoo check only needs Environment (not Runtime)
kevmoo authored
128 def environment
129 Bundler::Environment.new(root, definition)
130 end
131
8a4dc7a Remove a little bit of crazy from Definition
Carl Lerche authored
132 def definition(unlock = nil)
133 @definition = nil if unlock
2b9094e Scope specs in the lock file by source
Carl Lerche authored
134 @definition ||= begin
135 configure
e0e79df @indirect Upgrade 0.9 lockfiles to 1.0 lockfiles in-place
indirect authored
136 upgrade_lockfile
251b9c7 Use the Gemfile's name as a base for Gemfile.lock
Carl Lerche authored
137 Definition.build(default_gemfile, default_lockfile, unlock)
2b9094e Scope specs in the lock file by source
Carl Lerche authored
138 end
ab5b1fc Add Bundler.flexdef, move locking into Environment, and lock from flex_i...
Carlhuda authored
139 end
140
eda7324 @wycats Git should never use sudo
wycats authored
141 def ruby_scope
5f4a8f3 Phase 1 of rubygems/bundler reintegration
Evan Phoenix authored
142 "#{Bundler.rubygems.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}"
eda7324 @wycats Git should never use sudo
wycats authored
143 end
144
145 def user_bundle_path
5f4a8f3 Phase 1 of rubygems/bundler reintegration
Evan Phoenix authored
146 Pathname.new(Bundler.rubygems.user_home).join(".bundler")
eda7324 @wycats Git should never use sudo
wycats authored
147 end
148
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
149 def home
625818a @indirect Clean up bundler.rb a bit
indirect authored
150 bundle_path.join("bundler")
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
151 end
f31835e More work towards awesomeness
Carlhuda authored
152
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
153 def install_path
154 home.join("gems")
155 end
0d2492d Add more stuff for git
Carl Lerche authored
156
0d92de7 @indirect Add Bundler::Source::BundlerGems, to distingush from SystemGems.
indirect authored
157 def specs_path
158 bundle_path.join("specifications")
159 end
160
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
161 def cache
0d92de7 @indirect Add Bundler::Source::BundlerGems, to distingush from SystemGems.
indirect authored
162 bundle_path.join("cache/bundler")
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
163 end
ee0e2c1 Start working on the environment.rb lock file
Carl Lerche authored
164
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
165 def root
2d87c36 Move <root>/vendor/cache to a Bundler class method
Carl Lerche authored
166 default_gemfile.dirname.expand_path
167 end
168
27800e7 Provide an environment variable to allow customizing the location of <ap...
Carl Lerche authored
169 def app_config_path
170 ENV['BUNDLE_APP_CONFIG'] ?
171 Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
172 root.join('.bundle')
173 end
174
2d87c36 Move <root>/vendor/cache to a Bundler class method
Carl Lerche authored
175 def app_cache
176 root.join("vendor/cache")
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
177 end
178
32a2eb2 First pass at getting bundler to play well when $GEM_HOME is owned by ro...
Carl Lerche authored
179 def tmp
7432798 @joshbuddy use Process.pid in the tmp directory
joshbuddy authored
180 user_bundle_path.join("tmp", Process.pid.to_s)
32a2eb2 First pass at getting bundler to play well when $GEM_HOME is owned by ro...
Carl Lerche authored
181 end
182
ea08895 Add the ability to specify a location with bundle install
Carl Lerche authored
183 def settings
27800e7 Provide an environment variable to allow customizing the location of <ap...
Carl Lerche authored
184 @settings ||= Settings.new(app_config_path)
ea08895 Add the ability to specify a location with bundle install
Carl Lerche authored
185 end
186
5cf3fde @wuputah with_clean_env clears bundler env vars
wuputah authored
187 def with_original_env
33154fd @joshbuddy Add Bundler.with_clean_env for blocks of ruby without a bundled env
joshbuddy authored
188 bundled_env = ENV.to_hash
189 ENV.replace(ORIGINAL_ENV)
190 yield
191 ensure
192 ENV.replace(bundled_env.to_hash)
193 end
194
5cf3fde @wuputah with_clean_env clears bundler env vars
wuputah authored
195 def with_clean_env
196 with_original_env do
197 ENV.delete_if { |k,_| k[0,7] == 'BUNDLE_' }
198 yield
199 end
200 end
201
926836d @wuputah add Bundler.clean_system and Bundler.clean_exec
wuputah authored
202 def clean_system(*args)
203 with_clean_env { Kernel.system(*args) }
204 end
205
206 def clean_exec(*args)
207 with_clean_env { Kernel.exec(*args) }
208 end
209
fb1e725 Make bundler/setup something you can add to your .profile. To do this, a...
Carlhuda authored
210 def default_gemfile
211 SharedHelpers.default_gemfile
ee0e2c1 Start working on the environment.rb lock file
Carl Lerche authored
212 end
213
251b9c7 Use the Gemfile's name as a base for Gemfile.lock
Carl Lerche authored
214 def default_lockfile
215 SharedHelpers.default_lockfile
216 end
217
af6badf @indirect Add Bundler.system_bindir, defaulted to Gem.bindir
indirect authored
218 def system_bindir
219 # Gem.bindir doesn't always return the location that Rubygems will install
80b2d24 @indirect use Bundler.system_gems even when sudo is needed
indirect authored
220 # system binaries. If you put '-n foo' in your .gemrc, Rubygems will
af6badf @indirect Add Bundler.system_bindir, defaulted to Gem.bindir
indirect authored
221 # install binstubs there instead. Unfortunately, Rubygems doesn't expose
222 # that directory at all, so rather than parse .gemrc ourselves, we allow
223 # the directory to be set as well, via `bundle config bindir foo`.
80b2d24 @indirect use Bundler.system_gems even when sudo is needed
indirect authored
224 Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
af6badf @indirect Add Bundler.system_bindir, defaulted to Gem.bindir
indirect authored
225 end
226
32a2eb2 First pass at getting bundler to play well when $GEM_HOME is owned by ro...
Carl Lerche authored
227 def requires_sudo?
b07cf5a @indirect it can just be defined, it doesn't have to be true
indirect authored
228 return @requires_sudo if defined?(@checked_for_sudo)
47e08d4 @indirect Memoize Bundler#requires_sudo? (thanks @tmm1)
indirect authored
229
3f350e0 Add more sanity to the cases where bundler runs commands with sudo
Carlhuda authored
230 path = bundle_path
231 path = path.parent until path.exist?
7585837 @indirect fix checking for sudo, and use !(`which foo` rescue '').empty? everywher...
indirect authored
232 sudo_present = !(`which sudo` rescue '').empty?
af6badf @indirect Add Bundler.system_bindir, defaulted to Gem.bindir
indirect authored
233 bin_dir = Pathname.new(Bundler.system_bindir)
d3291ee @hone require_sudo when Gem.bindir isn't writeable
hone authored
234 bin_dir = bin_dir.parent until bin_dir.exist?
3f350e0 Add more sanity to the cases where bundler runs commands with sudo
Carlhuda authored
235
47e08d4 @indirect Memoize Bundler#requires_sudo? (thanks @tmm1)
indirect authored
236 @checked_for_sudo = true
80b2d24 @indirect use Bundler.system_gems even when sudo is needed
indirect authored
237 sudo_gems = !File.writable?(path) || !File.writable?(bin_dir)
238 @requires_sudo = settings.allow_sudo? && sudo_gems && sudo_present
3f350e0 Add more sanity to the cases where bundler runs commands with sudo
Carlhuda authored
239 end
240
241 def mkdir_p(path)
242 if requires_sudo?
5bad314 @spastorino Avoid calling mkdir with sudo when not needed, you don't want to be aske...
spastorino authored
243 sudo "mkdir -p '#{path}'" unless File.exist?(path)
3f350e0 Add more sanity to the cases where bundler runs commands with sudo
Carlhuda authored
244 else
245 FileUtils.mkdir_p(path)
0891a38 @spastorino Revert "Don't try to create dirs if they already exists"
spastorino authored
246 end
3f350e0 Add more sanity to the cases where bundler runs commands with sudo
Carlhuda authored
247 end
248
249 def sudo(str)
c5f25d6 Remove sudo -E, which never actually worked for what we wanted, and does...
Carlhuda authored
250 `sudo -p 'Enter your password to install the bundled RubyGems to your system: ' #{str}`
32a2eb2 First pass at getting bundler to play well when $GEM_HOME is owned by ro...
Carl Lerche authored
251 end
252
94bad63 @wycats 1.8 doesn't support :mode
wycats authored
253 def read_file(file)
1837d67 @wycats Fix warnings in bundler
wycats authored
254 File.open(file, "rb") { |f| f.read }
94bad63 @wycats 1.8 doesn't support :mode
wycats authored
255 end
256
681a5cb @indirect Factor out Bundler.load_gemspec so Source::Path and GemHelper can use it
indirect authored
257 def load_gemspec(file)
258 path = Pathname.new(file)
259 # Eval the gemspec from its parent directory
c5af1b0 @indirect Stringify some paths for MacRuby
indirect authored
260 Dir.chdir(path.dirname.to_s) do
f0e9ca3 @sumbach Pass Gem::Specification.from_yaml a string containing the gemspec (inste...
sumbach authored
261 contents = File.read(path.basename.to_s)
681a5cb @indirect Factor out Bundler.load_gemspec so Source::Path and GemHelper can use it
indirect authored
262 begin
f0e9ca3 @sumbach Pass Gem::Specification.from_yaml a string containing the gemspec (inste...
sumbach authored
263 Gem::Specification.from_yaml(contents)
681a5cb @indirect Factor out Bundler.load_gemspec so Source::Path and GemHelper can use it
indirect authored
264 # Raises ArgumentError if the file is not valid YAML
265 rescue ArgumentError, SyntaxError, Gem::EndOfYAMLException, Gem::Exception
266 begin
f0e9ca3 @sumbach Pass Gem::Specification.from_yaml a string containing the gemspec (inste...
sumbach authored
267 eval(contents, TOPLEVEL_BINDING, path.expand_path.to_s)
681a5cb @indirect Factor out Bundler.load_gemspec so Source::Path and GemHelper can use it
indirect authored
268 rescue LoadError => e
269 original_line = e.backtrace.find { |line| line.include?(path.to_s) }
270 msg = "There was a LoadError while evaluating #{path.basename}:\n #{e.message}"
271 msg << " from\n #{original_line}" if original_line
272 msg << "\n"
273
b6bf2af @indirect standardize on >= "1.9"
indirect authored
274 if RUBY_VERSION >= "1.9"
681a5cb @indirect Factor out Bundler.load_gemspec so Source::Path and GemHelper can use it
indirect authored
275 msg << "\nDoes it try to require a relative path? That doesn't work in Ruby 1.9."
276 end
277
278 raise GemspecError, msg
279 end
280 end
281 end
282 end
283
9ef6aa6 @indirect Disable rubygems more fully when unlocked
indirect authored
284 private
285
739c0f3 Install bundles to ~/.bundle by default
Carlhuda authored
286 def configure_gem_home_and_path
3d82929 Separate bundle install foo and bundle install --disable-shared-gems.
Carl Lerche authored
287 if settings[:disable_shared_gems]
739c0f3 Install bundles to ~/.bundle by default
Carlhuda authored
288 ENV['GEM_PATH'] = ''
9ef6aa6 @indirect Disable rubygems more fully when unlocked
indirect authored
289 ENV['GEM_HOME'] = File.expand_path(bundle_path, root)
5f4a8f3 Phase 1 of rubygems/bundler reintegration
Evan Phoenix authored
290 elsif Bundler.rubygems.gem_dir != bundle_path.to_s
291 possibles = [Bundler.rubygems.gem_dir, Bundler.rubygems.gem_path]
292 paths = possibles.flatten.compact.uniq.reject { |p| p.empty? }
55509f2 @indirect Ignore paths like GEM_HOME that are empty strings
indirect authored
293 ENV["GEM_PATH"] = paths.join(File::PATH_SEPARATOR)
739c0f3 Install bundles to ~/.bundle by default
Carlhuda authored
294 ENV["GEM_HOME"] = bundle_path.to_s
295 end
296
f43bfe6 @nicksieger Rescue from mkdir_p errors in configure_gem_home_and_path
nicksieger authored
297 # TODO: This mkdir_p is only needed for JRuby <= 1.5 and should go away (GH #602)
298 FileUtils.mkdir_p bundle_path.to_s rescue nil
299
5f4a8f3 Phase 1 of rubygems/bundler reintegration
Evan Phoenix authored
300 Bundler.rubygems.clear_paths
bc310f7 First pass at being able to set the bundle install path.
Carl Lerche authored
301 end
e0e79df @indirect Upgrade 0.9 lockfiles to 1.0 lockfiles in-place
indirect authored
302
303 def upgrade_lockfile
251b9c7 Use the Gemfile's name as a base for Gemfile.lock
Carl Lerche authored
304 lockfile = default_lockfile
e0e79df @indirect Upgrade 0.9 lockfiles to 1.0 lockfiles in-place
indirect authored
305 if lockfile.exist? && lockfile.read(3) == "---"
91c3beb @indirect Back to deleting old lockfiles for the beta release
indirect authored
306 Bundler.ui.warn "Detected Gemfile.lock generated by 0.9, deleting..."
307 lockfile.rmtree
e0e79df @indirect Upgrade 0.9 lockfiles to 1.0 lockfiles in-place
indirect authored
308 end
309 end
310
ee0e2c1 Start working on the environment.rb lock file
Carl Lerche authored
311 end
a8cbf77 @jeremy Group autorequire: pass :require => 'autorequire' option to gem dependen...
jeremy authored
312 end
Something went wrong with that request. Please try again.