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