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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -18
- data/README.md +1 -1
- data/bundler.gemspec +1 -1
- data/lib/bundler.rb +2 -2
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli.rb +32 -18
- data/lib/bundler/cli/add.rb +15 -5
- data/lib/bundler/cli/doctor.rb +47 -1
- data/lib/bundler/cli/install.rb +8 -5
- data/lib/bundler/cli/list.rb +41 -5
- data/lib/bundler/cli/outdated.rb +7 -1
- data/lib/bundler/cli/pristine.rb +4 -0
- data/lib/bundler/definition.rb +28 -34
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +6 -8
- data/lib/bundler/feature_flag.rb +5 -0
- data/lib/bundler/fetcher.rb +1 -1
- data/lib/bundler/gem_helper.rb +1 -1
- data/lib/bundler/gem_version_promoter.rb +4 -2
- data/lib/bundler/injector.rb +14 -3
- data/lib/bundler/installer.rb +29 -6
- data/lib/bundler/installer/gem_installer.rb +1 -1
- data/lib/bundler/installer/parallel_installer.rb +6 -1
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin.rb +9 -2
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +1 -1
- data/lib/bundler/resolver.rb +2 -2
- data/lib/bundler/resolver/spec_group.rb +4 -0
- data/lib/bundler/runtime.rb +9 -3
- data/lib/bundler/settings.rb +23 -2
- data/lib/bundler/settings/validator.rb +23 -0
- data/lib/bundler/source.rb +9 -9
- data/lib/bundler/source/metadata.rb +1 -1
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +0 -4
- data/lib/bundler/version.rb +1 -1
- data/man/bundle-add.1 +18 -3
- data/man/bundle-add.1.txt +17 -5
- data/man/bundle-add.ronn +13 -2
- data/man/bundle-binstubs.1 +1 -1
- data/man/bundle-binstubs.1.txt +1 -1
- data/man/bundle-check.1 +1 -1
- data/man/bundle-check.1.txt +1 -1
- data/man/bundle-clean.1 +1 -1
- data/man/bundle-clean.1.txt +1 -1
- data/man/bundle-config.1 +10 -1
- data/man/bundle-config.1.txt +22 -10
- data/man/bundle-config.ronn +7 -0
- data/man/bundle-doctor.1 +1 -1
- data/man/bundle-doctor.1.txt +1 -1
- data/man/bundle-exec.1 +1 -1
- data/man/bundle-exec.1.txt +1 -1
- data/man/bundle-gem.1 +1 -1
- data/man/bundle-gem.1.txt +1 -1
- data/man/bundle-info.1 +1 -1
- data/man/bundle-info.1.txt +1 -1
- data/man/bundle-init.1 +1 -1
- data/man/bundle-init.1.txt +1 -1
- data/man/bundle-inject.1 +1 -1
- data/man/bundle-inject.1.txt +1 -1
- data/man/bundle-install.1 +2 -5
- data/man/bundle-install.1.txt +7 -17
- data/man/bundle-install.ronn +2 -11
- data/man/bundle-list.1 +32 -2
- data/man/bundle-list.1.txt +24 -2
- data/man/bundle-list.ronn +19 -1
- data/man/bundle-lock.1 +1 -1
- data/man/bundle-lock.1.txt +1 -1
- data/man/bundle-open.1 +1 -1
- data/man/bundle-open.1.txt +1 -1
- data/man/bundle-outdated.1 +6 -2
- data/man/bundle-outdated.1.txt +10 -6
- data/man/bundle-outdated.ronn +4 -0
- data/man/bundle-package.1 +1 -1
- data/man/bundle-package.1.txt +1 -1
- data/man/bundle-platform.1 +1 -1
- data/man/bundle-platform.1.txt +1 -1
- data/man/bundle-pristine.1 +1 -1
- data/man/bundle-pristine.1.txt +1 -1
- data/man/bundle-show.1 +1 -1
- data/man/bundle-show.1.txt +1 -1
- data/man/bundle-update.1 +6 -10
- data/man/bundle-update.1.txt +14 -16
- data/man/bundle-update.ronn +6 -10
- data/man/bundle-viz.1 +1 -1
- data/man/bundle-viz.1.txt +1 -1
- data/man/bundle.1 +1 -1
- data/man/bundle.1.txt +1 -1
- data/man/gemfile.5 +1 -1
- data/man/gemfile.5.txt +1 -1
- 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
|
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
|
|
data/lib/bundler/env.rb
CHANGED
@@ -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
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
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") }]
|
data/lib/bundler/feature_flag.rb
CHANGED
@@ -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
|
|
data/lib/bundler/fetcher.rb
CHANGED
data/lib/bundler/gem_helper.rb
CHANGED
@@ -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
|
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
|
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
|
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
|
data/lib/bundler/injector.rb
CHANGED
@@ -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
|
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
|
-
"
|
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.
|
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?
|
data/lib/bundler/installer.rb
CHANGED
@@ -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(
|
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
|
196
|
-
|
197
|
-
|
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
|
-
|
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
|
@@ -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
|
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
|
data/lib/bundler/mirror.rb
CHANGED
@@ -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
|
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
|
175
|
+
rescue # Connection failed
|
176
176
|
false
|
177
177
|
end
|
178
178
|
end
|
data/lib/bundler/plugin.rb
CHANGED
@@ -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
|
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
|
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
|
data/lib/bundler/plugin/index.rb
CHANGED
data/lib/bundler/resolver.rb
CHANGED
@@ -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
|
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 &&
|
data/lib/bundler/runtime.rb
CHANGED
@@ -79,7 +79,7 @@ module Bundler
|
|
79
79
|
required_file = file
|
80
80
|
begin
|
81
81
|
Kernel.require file
|
82
|
-
rescue
|
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
|
-
|
208
|
-
|
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
|