Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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