Skip to content

HTTPS clone URL

Subversion checkout URL

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