bundler 1.16.6 → 1.17.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -18
  3. data/README.md +1 -1
  4. data/bundler.gemspec +1 -1
  5. data/lib/bundler.rb +2 -2
  6. data/lib/bundler/build_metadata.rb +2 -2
  7. data/lib/bundler/cli.rb +32 -18
  8. data/lib/bundler/cli/add.rb +15 -5
  9. data/lib/bundler/cli/doctor.rb +47 -1
  10. data/lib/bundler/cli/install.rb +8 -5
  11. data/lib/bundler/cli/list.rb +41 -5
  12. data/lib/bundler/cli/outdated.rb +7 -1
  13. data/lib/bundler/cli/pristine.rb +4 -0
  14. data/lib/bundler/definition.rb +28 -34
  15. data/lib/bundler/endpoint_specification.rb +1 -1
  16. data/lib/bundler/env.rb +6 -8
  17. data/lib/bundler/feature_flag.rb +5 -0
  18. data/lib/bundler/fetcher.rb +1 -1
  19. data/lib/bundler/gem_helper.rb +1 -1
  20. data/lib/bundler/gem_version_promoter.rb +4 -2
  21. data/lib/bundler/injector.rb +14 -3
  22. data/lib/bundler/installer.rb +29 -6
  23. data/lib/bundler/installer/gem_installer.rb +1 -1
  24. data/lib/bundler/installer/parallel_installer.rb +6 -1
  25. data/lib/bundler/mirror.rb +2 -2
  26. data/lib/bundler/plugin.rb +9 -2
  27. data/lib/bundler/plugin/events.rb +61 -0
  28. data/lib/bundler/plugin/index.rb +1 -1
  29. data/lib/bundler/resolver.rb +2 -2
  30. data/lib/bundler/resolver/spec_group.rb +4 -0
  31. data/lib/bundler/runtime.rb +9 -3
  32. data/lib/bundler/settings.rb +23 -2
  33. data/lib/bundler/settings/validator.rb +23 -0
  34. data/lib/bundler/source.rb +9 -9
  35. data/lib/bundler/source/metadata.rb +1 -1
  36. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  37. data/lib/bundler/templates/newgem/newgem.gemspec.tt +0 -4
  38. data/lib/bundler/version.rb +1 -1
  39. data/man/bundle-add.1 +18 -3
  40. data/man/bundle-add.1.txt +17 -5
  41. data/man/bundle-add.ronn +13 -2
  42. data/man/bundle-binstubs.1 +1 -1
  43. data/man/bundle-binstubs.1.txt +1 -1
  44. data/man/bundle-check.1 +1 -1
  45. data/man/bundle-check.1.txt +1 -1
  46. data/man/bundle-clean.1 +1 -1
  47. data/man/bundle-clean.1.txt +1 -1
  48. data/man/bundle-config.1 +10 -1
  49. data/man/bundle-config.1.txt +22 -10
  50. data/man/bundle-config.ronn +7 -0
  51. data/man/bundle-doctor.1 +1 -1
  52. data/man/bundle-doctor.1.txt +1 -1
  53. data/man/bundle-exec.1 +1 -1
  54. data/man/bundle-exec.1.txt +1 -1
  55. data/man/bundle-gem.1 +1 -1
  56. data/man/bundle-gem.1.txt +1 -1
  57. data/man/bundle-info.1 +1 -1
  58. data/man/bundle-info.1.txt +1 -1
  59. data/man/bundle-init.1 +1 -1
  60. data/man/bundle-init.1.txt +1 -1
  61. data/man/bundle-inject.1 +1 -1
  62. data/man/bundle-inject.1.txt +1 -1
  63. data/man/bundle-install.1 +2 -5
  64. data/man/bundle-install.1.txt +7 -17
  65. data/man/bundle-install.ronn +2 -11
  66. data/man/bundle-list.1 +32 -2
  67. data/man/bundle-list.1.txt +24 -2
  68. data/man/bundle-list.ronn +19 -1
  69. data/man/bundle-lock.1 +1 -1
  70. data/man/bundle-lock.1.txt +1 -1
  71. data/man/bundle-open.1 +1 -1
  72. data/man/bundle-open.1.txt +1 -1
  73. data/man/bundle-outdated.1 +6 -2
  74. data/man/bundle-outdated.1.txt +10 -6
  75. data/man/bundle-outdated.ronn +4 -0
  76. data/man/bundle-package.1 +1 -1
  77. data/man/bundle-package.1.txt +1 -1
  78. data/man/bundle-platform.1 +1 -1
  79. data/man/bundle-platform.1.txt +1 -1
  80. data/man/bundle-pristine.1 +1 -1
  81. data/man/bundle-pristine.1.txt +1 -1
  82. data/man/bundle-show.1 +1 -1
  83. data/man/bundle-show.1.txt +1 -1
  84. data/man/bundle-update.1 +6 -10
  85. data/man/bundle-update.1.txt +14 -16
  86. data/man/bundle-update.ronn +6 -10
  87. data/man/bundle-viz.1 +1 -1
  88. data/man/bundle-viz.1.txt +1 -1
  89. data/man/bundle.1 +1 -1
  90. data/man/bundle.1.txt +1 -1
  91. data/man/gemfile.5 +1 -1
  92. data/man/gemfile.5.txt +1 -1
  93. metadata +3 -3
@@ -123,7 +123,7 @@ module Bundler
123
123
  @required_ruby_version = Gem::Requirement.new(v)
124
124
  end
125
125
  end
126
- rescue StandardError => e
126
+ rescue => e
127
127
  raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
128
128
  end
129
129
 
@@ -64,7 +64,7 @@ module Bundler
64
64
  Bundler.read_file(filename.to_s).strip
65
65
  rescue Errno::ENOENT
66
66
  "<No #{filename} found>"
67
- rescue RuntimeError => e
67
+ rescue => e
68
68
  "#{e.class}: #{e.message}"
69
69
  end
70
70
 
@@ -110,13 +110,11 @@ module Bundler
110
110
  out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }]
111
111
  out << [" User Path", Gem.user_dir]
112
112
  out << [" Bin Dir", Gem.bindir]
113
- if defined?(OpenSSL)
114
- out << ["OpenSSL"]
115
- out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
116
- out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
117
- out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
118
- out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
119
- end
113
+ out << ["OpenSSL"] if defined?(OpenSSL)
114
+ out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
115
+ out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
116
+ out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
117
+ out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
120
118
  out << ["Tools"]
121
119
  out << [" Git", git_version]
122
120
  out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
@@ -30,6 +30,7 @@ module Bundler
30
30
  settings_flag(:allow_bundler_dependency_conflicts) { bundler_2_mode? }
31
31
  settings_flag(:allow_offline_install) { bundler_2_mode? }
32
32
  settings_flag(:auto_clean_without_path) { bundler_2_mode? }
33
+ settings_flag(:auto_config_jobs) { bundler_2_mode? }
33
34
  settings_flag(:cache_all) { bundler_2_mode? }
34
35
  settings_flag(:cache_command_is_package) { bundler_2_mode? }
35
36
  settings_flag(:console_command) { !bundler_2_mode? }
@@ -38,11 +39,13 @@ module Bundler
38
39
  settings_flag(:disable_multisource) { bundler_2_mode? }
39
40
  settings_flag(:error_on_stderr) { bundler_2_mode? }
40
41
  settings_flag(:forget_cli_options) { bundler_2_mode? }
42
+ settings_flag(:global_path_appends_ruby_scope) { bundler_2_mode? }
41
43
  settings_flag(:global_gem_cache) { bundler_2_mode? }
42
44
  settings_flag(:init_gems_rb) { bundler_2_mode? }
43
45
  settings_flag(:list_command) { bundler_2_mode? }
44
46
  settings_flag(:lockfile_uses_separate_rubygems_sources) { bundler_2_mode? }
45
47
  settings_flag(:only_update_to_newer_versions) { bundler_2_mode? }
48
+ settings_flag(:path_relative_to_cwd) { bundler_2_mode? }
46
49
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
47
50
  settings_flag(:prefer_gems_rb) { bundler_2_mode? }
48
51
  settings_flag(:print_only_version_number) { bundler_2_mode? }
@@ -52,6 +55,8 @@ module Bundler
52
55
  settings_flag(:suppress_install_using_messages) { bundler_2_mode? }
53
56
  settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? }
54
57
  settings_flag(:update_requires_all_flag) { bundler_2_mode? }
58
+ settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_2_mode? }
59
+ settings_flag(:viz_command) { !bundler_2_mode? }
55
60
 
56
61
  settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install }
57
62
 
@@ -178,7 +178,7 @@ module Bundler
178
178
  # engine_version raises on unknown engines
179
179
  engine_version = begin
180
180
  ruby.engine_versions
181
- rescue RuntimeError
181
+ rescue
182
182
  "???"
183
183
  end
184
184
  agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
@@ -153,7 +153,7 @@ module Bundler
153
153
  sh "git tag -m \"Version #{version}\" #{version_tag}"
154
154
  Bundler.ui.confirm "Tagged #{version_tag}."
155
155
  yield if block_given?
156
- rescue RuntimeError
156
+ rescue
157
157
  Bundler.ui.error "Untagging #{version_tag} due to error."
158
158
  sh_with_code "git tag -d #{version_tag}"
159
159
  raise
@@ -7,6 +7,8 @@ module Bundler
7
7
  # available dependency versions as found in its index, before returning it to
8
8
  # to the resolution engine to select the best version.
9
9
  class GemVersionPromoter
10
+ DEBUG = ENV["DEBUG_RESOLVER"]
11
+
10
12
  attr_reader :level, :locked_specs, :unlock_gems
11
13
 
12
14
  # By default, strict is false, meaning every available version of a gem
@@ -64,7 +66,7 @@ module Bundler
64
66
  # @return [SpecGroup] A new instance of the SpecGroup Array sorted and
65
67
  # possibly filtered.
66
68
  def sort_versions(dep, spec_groups)
67
- before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if ENV["DEBUG_RESOLVER"]
69
+ before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
68
70
 
69
71
  @sort_versions[dep] ||= begin
70
72
  gem_name = dep.name
@@ -78,7 +80,7 @@ module Bundler
78
80
  else
79
81
  sort_dep_specs(spec_groups, locked_spec)
80
82
  end.tap do |specs|
81
- if ENV["DEBUG_RESOLVER"]
83
+ if DEBUG
82
84
  STDERR.puts before_result
83
85
  STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
84
86
  end
@@ -31,7 +31,8 @@ module Bundler
31
31
  @new_deps -= builder.dependencies
32
32
 
33
33
  # add new deps to the end of the in-memory Gemfile
34
- # Set conservative versioning to false because we want to let the resolver resolve the version first
34
+ # Set conservative versioning to false because
35
+ # we want to let the resolver resolve the version first
35
36
  builder.eval_gemfile("injected gems", build_gem_lines(false)) if @new_deps.any?
36
37
 
37
38
  # resolve to see if the new deps broke anything
@@ -61,7 +62,17 @@ module Bundler
61
62
  seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
62
63
 
63
64
  prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease?
64
- "~> #{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
65
+ "#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
66
+ end
67
+
68
+ def version_prefix
69
+ if @options[:strict]
70
+ "= "
71
+ elsif @options[:optimistic]
72
+ ">= "
73
+ else
74
+ "~> "
75
+ end
65
76
  end
66
77
 
67
78
  def build_gem_lines(conservative_versioning)
@@ -75,7 +86,7 @@ module Bundler
75
86
  end
76
87
 
77
88
  if d.groups != Array(:default)
78
- group = d.groups.size == 1 ? ", :group => #{d.groups.first.inspect}" : ", :groups => #{d.groups.inspect}"
89
+ group = d.groups.size == 1 ? ", :group => #{d.groups.inspect}" : ", :groups => #{d.groups.inspect}"
79
90
  end
80
91
 
81
92
  source = ", :source => \"#{d.source}\"" unless d.source.nil?
@@ -21,8 +21,9 @@ module Bundler
21
21
  # For more information see the #run method on this class.
22
22
  def self.install(root, definition, options = {})
23
23
  installer = new(root, definition)
24
- Plugin.hook("before-install-all", definition.dependencies)
24
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL_ALL, definition.dependencies)
25
25
  installer.run(options)
26
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL_ALL, definition.dependencies)
26
27
  installer
27
28
  end
28
29
 
@@ -192,14 +193,36 @@ module Bundler
192
193
  # installation is SO MUCH FASTER. so we let people opt in.
193
194
  def install(options)
194
195
  force = options["force"]
195
- jobs = options.delete(:jobs) do
196
- if can_install_in_parallel?
197
- [Bundler.settings[:jobs].to_i - 1, 1].max
196
+ jobs = installation_parallelization(options)
197
+ install_in_parallel jobs, options[:standalone], force
198
+ end
199
+
200
+ def installation_parallelization(options)
201
+ if jobs = options.delete(:jobs)
202
+ return jobs
203
+ end
204
+
205
+ return 1 unless can_install_in_parallel?
206
+
207
+ auto_config_jobs = Bundler.feature_flag.auto_config_jobs?
208
+ if jobs = Bundler.settings[:jobs]
209
+ if auto_config_jobs
210
+ jobs
198
211
  else
199
- 1
212
+ [jobs.pred, 1].max
200
213
  end
214
+ elsif auto_config_jobs
215
+ processor_count
216
+ else
217
+ 1
201
218
  end
202
- install_in_parallel jobs, options[:standalone], force
219
+ end
220
+
221
+ def processor_count
222
+ require "etc"
223
+ Etc.nprocessors
224
+ rescue
225
+ 1
203
226
  end
204
227
 
205
228
  def load_plugins
@@ -21,7 +21,7 @@ module Bundler
21
21
  raise
22
22
  rescue Errno::ENOSPC
23
23
  return false, out_of_space_message
24
- rescue StandardError => e
24
+ rescue => e
25
25
  return false, specific_failure_message(e)
26
26
  end
27
27
 
@@ -87,6 +87,7 @@ module Bundler
87
87
  @force = force
88
88
  @specs = all_specs.map {|s| SpecInstallation.new(s) }
89
89
  @spec_set = all_specs
90
+ @rake = @specs.find {|s| s.name == "rake" }
90
91
  end
91
92
 
92
93
  def call
@@ -155,12 +156,13 @@ module Bundler
155
156
  end
156
157
 
157
158
  def do_install(spec_install, worker_num)
159
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
158
160
  gem_installer = Bundler::GemInstaller.new(
159
161
  spec_install.spec, @installer, @standalone, worker_num, @force
160
162
  )
161
163
  success, message = begin
162
164
  gem_installer.install_from_spec
163
- rescue RuntimeError => e
165
+ rescue => e
164
166
  raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
165
167
  end
166
168
  if success
@@ -170,6 +172,7 @@ module Bundler
170
172
  spec_install.state = :failed
171
173
  spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
172
174
  end
175
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
173
176
  spec_install
174
177
  end
175
178
 
@@ -218,6 +221,8 @@ module Bundler
218
221
  # are installed.
219
222
  def enqueue_specs
220
223
  @specs.select(&:ready_to_enqueue?).each do |spec|
224
+ next if @rake && !@rake.installed? && spec.name != @rake.name
225
+
221
226
  if spec.dependencies_installed? @specs
222
227
  spec.state = :enqueued
223
228
  worker_pool.enq spec
@@ -152,7 +152,7 @@ module Bundler
152
152
  socket.connect_nonblock(address)
153
153
  rescue Errno::EINPROGRESS
154
154
  wait_for_writtable_socket(socket, address, timeout)
155
- rescue RuntimeError # Connection failed somehow, again
155
+ rescue # Connection failed somehow, again
156
156
  false
157
157
  end
158
158
  end
@@ -172,7 +172,7 @@ module Bundler
172
172
  socket.connect_nonblock(address)
173
173
  rescue Errno::EISCONN
174
174
  true
175
- rescue StandardError # Connection failed
175
+ rescue # Connection failed
176
176
  false
177
177
  end
178
178
  end
@@ -5,6 +5,7 @@ require "bundler/plugin/api"
5
5
  module Bundler
6
6
  module Plugin
7
7
  autoload :DSL, "bundler/plugin/dsl"
8
+ autoload :Events, "bundler/plugin/events"
8
9
  autoload :Index, "bundler/plugin/index"
9
10
  autoload :Installer, "bundler/plugin/installer"
10
11
  autoload :SourceList, "bundler/plugin/source_list"
@@ -66,7 +67,7 @@ module Bundler
66
67
  installed_specs = Installer.new.install_definition(definition)
67
68
 
68
69
  save_plugins plugins, installed_specs, builder.inferred_plugins
69
- rescue RuntimeError => e
70
+ rescue => e
70
71
  unless e.is_a?(GemfileError)
71
72
  Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
72
73
  end
@@ -155,6 +156,9 @@ module Bundler
155
156
  # To be called via the API to register a hooks and corresponding block that
156
157
  # will be called to handle the hook
157
158
  def add_hook(event, &block)
159
+ unless Events.defined_event?(event)
160
+ raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
161
+ end
158
162
  @hooks_by_event[event.to_s] << block
159
163
  end
160
164
 
@@ -166,6 +170,9 @@ module Bundler
166
170
  # @param [String] event
167
171
  def hook(event, *args, &arg_blk)
168
172
  return unless Bundler.feature_flag.plugins?
173
+ unless Events.defined_event?(event)
174
+ raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
175
+ end
169
176
 
170
177
  plugins = index.hook_plugins(event)
171
178
  return unless plugins.any?
@@ -264,7 +271,7 @@ module Bundler
264
271
  load path.join(PLUGIN_FILE_NAME)
265
272
 
266
273
  @loaded_plugin_names << name
267
- rescue RuntimeError => e
274
+ rescue => e
268
275
  Bundler.ui.error "Failed loading plugin #{name}: #{e.message}"
269
276
  raise
270
277
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module Plugin
5
+ module Events
6
+ def self.define(const, event)
7
+ const = const.to_sym.freeze
8
+ if const_defined?(const) && const_get(const) != event
9
+ raise ArgumentError, "Attempting to reassign #{const} to a different value"
10
+ end
11
+ const_set(const, event) unless const_defined?(const)
12
+ @events ||= {}
13
+ @events[event] = const
14
+ end
15
+ private_class_method :define
16
+
17
+ def self.reset
18
+ @events.each_value do |const|
19
+ remove_const(const)
20
+ end
21
+ @events = nil
22
+ end
23
+ private_class_method :reset
24
+
25
+ # Check if an event has been defined
26
+ # @param event [String] An event to check
27
+ # @return [Boolean] A boolean indicating if the event has been defined
28
+ def self.defined_event?(event)
29
+ @events ||= {}
30
+ @events.key?(event)
31
+ end
32
+
33
+ # @!parse
34
+ # A hook called before each individual gem is installed
35
+ # Includes a Bundler::ParallelInstaller::SpecInstallation.
36
+ # No state, error, post_install_message will be present as nothing has installed yet
37
+ # GEM_BEFORE_INSTALL = "before-install"
38
+ define :GEM_BEFORE_INSTALL, "before-install"
39
+
40
+ # @!parse
41
+ # A hook called after each individual gem is installed
42
+ # Includes a Bundler::ParallelInstaller::SpecInstallation.
43
+ # - If state is failed, an error will be present.
44
+ # - If state is success, a post_install_message may be present.
45
+ # GEM_AFTER_INSTALL = "after-install"
46
+ define :GEM_AFTER_INSTALL, "after-install"
47
+
48
+ # @!parse
49
+ # A hook called before any gems install
50
+ # Includes an Array of Bundler::Dependency objects
51
+ # GEM_BEFORE_INSTALL_ALL = "before-install-all"
52
+ define :GEM_BEFORE_INSTALL_ALL, "before-install-all"
53
+
54
+ # @!parse
55
+ # A hook called after any gems install
56
+ # Includes an Array of Bundler::Dependency objects
57
+ # GEM_AFTER_INSTALL_ALL = "after-install-all"
58
+ define :GEM_AFTER_INSTALL_ALL, "after-install-all"
59
+ end
60
+ end
61
+ end
@@ -63,7 +63,7 @@ module Bundler
63
63
  @plugin_paths[name] = path
64
64
  @load_paths[name] = load_paths
65
65
  save_index
66
- rescue StandardError
66
+ rescue
67
67
  @commands = old_commands
68
68
  raise
69
69
  end
@@ -39,7 +39,7 @@ module Bundler
39
39
  @gem_version_promoter = gem_version_promoter
40
40
  @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
41
41
  @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
42
- @use_gvp = !@gem_version_promoter.major?
42
+ @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
43
43
  end
44
44
 
45
45
  def start(requirements)
@@ -137,7 +137,7 @@ module Bundler
137
137
  end
138
138
  # GVP handles major itself, but it's still a bit risky to trust it with it
139
139
  # until we get it settled with new behavior. For 2.x it can take over all cases.
140
- if @gem_version_promoter.major?
140
+ if !@use_gvp
141
141
  spec_groups
142
142
  else
143
143
  @gem_version_promoter.sort_versions(dependency, spec_groups)
@@ -54,6 +54,10 @@ module Bundler
54
54
  dependencies.concat(metadata_dependencies).flatten
55
55
  end
56
56
 
57
+ def platforms_for_dependency_named(dependency)
58
+ __dependencies.select {|_, deps| deps.map(&:name).include? dependency }.keys
59
+ end
60
+
57
61
  def ==(other)
58
62
  return unless other.is_a?(SpecGroup)
59
63
  name == other.name &&
@@ -79,7 +79,7 @@ module Bundler
79
79
  required_file = file
80
80
  begin
81
81
  Kernel.require file
82
- rescue RuntimeError => e
82
+ rescue => e
83
83
  raise e if e.is_a?(LoadError) # we handle this a little later
84
84
  raise Bundler::GemRequireError.new e,
85
85
  "There was an error while trying to load the gem '#{file}'."
@@ -163,6 +163,7 @@ module Bundler
163
163
  gem_dirs = Dir["#{Gem.dir}/gems/*"]
164
164
  gem_files = Dir["#{Gem.dir}/cache/*.gem"]
165
165
  gemspec_files = Dir["#{Gem.dir}/specifications/*.gemspec"]
166
+ extension_dirs = Dir["#{Gem.dir}/extensions/*/*/*"]
166
167
  spec_gem_paths = []
167
168
  # need to keep git sources around
168
169
  spec_git_paths = @definition.spec_git_paths
@@ -170,6 +171,7 @@ module Bundler
170
171
  spec_gem_executables = []
171
172
  spec_cache_paths = []
172
173
  spec_gemspec_paths = []
174
+ spec_extension_paths = []
173
175
  specs.each do |spec|
174
176
  spec_gem_paths << spec.full_gem_path
175
177
  # need to check here in case gems are nested like for the rails git repo
@@ -181,6 +183,7 @@ module Bundler
181
183
  end
182
184
  spec_cache_paths << spec.cache_file
183
185
  spec_gemspec_paths << spec.spec_file
186
+ spec_extension_paths << spec.extension_dir if spec.respond_to?(:extension_dir)
184
187
  spec_git_cache_dirs << spec.source.cache_path.to_s if spec.source.is_a?(Bundler::Source::Git)
185
188
  end
186
189
  spec_gem_paths.uniq!
@@ -192,6 +195,7 @@ module Bundler
192
195
  stale_gem_dirs = gem_dirs - spec_gem_paths
193
196
  stale_gem_files = gem_files - spec_cache_paths
194
197
  stale_gemspec_files = gemspec_files - spec_gemspec_paths
198
+ stale_extension_dirs = extension_dirs - spec_extension_paths
195
199
 
196
200
  removed_stale_gem_dirs = stale_gem_dirs.collect {|dir| remove_dir(dir, dry_run) }
197
201
  removed_stale_git_dirs = stale_git_dirs.collect {|dir| remove_dir(dir, dry_run) }
@@ -204,8 +208,10 @@ module Bundler
204
208
  FileUtils.rm(file) if File.exist?(file)
205
209
  end
206
210
  end
207
- stale_git_cache_dirs.each do |cache_dir|
208
- SharedHelpers.filesystem_access(cache_dir) do |dir|
211
+
212
+ stale_dirs = stale_git_cache_dirs + stale_extension_dirs
213
+ stale_dirs.each do |stale_dir|
214
+ SharedHelpers.filesystem_access(stale_dir) do |dir|
209
215
  FileUtils.rm_rf(dir) if File.exist?(dir)
210
216
  end
211
217
  end