bundler 2.1.4 → 2.2.17
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 +1774 -1430
- data/README.md +6 -8
- data/bundler.gemspec +4 -4
- data/exe/bundle +3 -0
- data/lib/bundler.rb +33 -9
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli.rb +59 -23
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +2 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +29 -2
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +1 -1
- data/lib/bundler/cli/exec.rb +4 -4
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +129 -28
- data/lib/bundler/cli/info.rb +15 -4
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/inject.rb +1 -1
- data/lib/bundler/cli/install.rb +13 -11
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +88 -67
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +3 -1
- data/lib/bundler/compact_index_client.rb +1 -1
- data/lib/bundler/compact_index_client/cache.rb +6 -14
- data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/lib/bundler/compact_index_client/updater.rb +13 -17
- data/lib/bundler/current_ruby.rb +1 -0
- data/lib/bundler/definition.rb +121 -131
- data/lib/bundler/dep_proxy.rb +16 -9
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +40 -33
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -5
- data/lib/bundler/fetcher.rb +5 -4
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +9 -5
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +51 -18
- data/lib/bundler/gem_helpers.rb +36 -25
- data/lib/bundler/gem_version_promoter.rb +4 -4
- data/lib/bundler/graph.rb +1 -1
- data/lib/bundler/index.rb +12 -7
- data/lib/bundler/injector.rb +23 -5
- data/lib/bundler/inline.rb +3 -2
- data/lib/bundler/installer.rb +37 -49
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +46 -25
- data/lib/bundler/installer/standalone.rb +17 -2
- data/lib/bundler/lazy_specification.rb +45 -25
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +4 -14
- data/lib/bundler/man/.document +1 -0
- data/{man → lib/bundler/man}/bundle-add.1 +1 -1
- data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
- data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
- data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
- data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-check.1 +1 -1
- data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
- data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-config.1 +42 -34
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +51 -43
- data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
- data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
- data/{man → lib/bundler/man}/bundle-info.1 +1 -1
- data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-init.1 +1 -1
- data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
- data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-install.1 +30 -3
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
- data/{man → lib/bundler/man}/bundle-list.1 +7 -7
- data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
- data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-open.1 +1 -1
- data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
- data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
- data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
- data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-show.1 +1 -1
- data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-update.1 +1 -1
- data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
- data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle.1 +1 -1
- data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
- data/{man → lib/bundler/man}/gemfile.5 +4 -4
- data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
- data/{man → lib/bundler/man}/index.txt +0 -0
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin.rb +33 -7
- data/lib/bundler/plugin/api/source.rb +8 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer.rb +9 -11
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/source_list.rb +5 -1
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver.rb +133 -77
- data/lib/bundler/resolver/spec_group.rb +75 -48
- data/lib/bundler/retry.rb +2 -2
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +69 -9
- data/lib/bundler/rubygems_gem_installer.rb +50 -9
- data/lib/bundler/rubygems_integration.rb +25 -60
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +107 -54
- data/lib/bundler/shared_helpers.rb +3 -3
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source.rb +7 -1
- data/lib/bundler/source/git.rb +24 -22
- data/lib/bundler/source/git/git_proxy.rb +82 -80
- data/lib/bundler/source/metadata.rb +0 -4
- data/lib/bundler/source/path.rb +10 -4
- data/lib/bundler/source/path/installer.rb +10 -10
- data/lib/bundler/source/rubygems.rb +45 -24
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source_list.rb +31 -26
- data/lib/bundler/spec_set.rb +29 -17
- data/lib/bundler/stub_specification.rb +25 -7
- data/lib/bundler/templates/Gemfile +1 -1
- data/lib/bundler/templates/gems.rb +1 -1
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/README.md.tt +6 -5
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
- data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/shell.rb +5 -5
- data/lib/bundler/uri_credentials_filter.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +3 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
- data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendored_persistent.rb +0 -7
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +1 -1
- metadata +71 -85
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/man/bundle-add.1.txt +0 -58
- data/man/bundle-binstubs.1.txt +0 -48
- data/man/bundle-cache.1.txt +0 -78
- data/man/bundle-check.1.txt +0 -33
- data/man/bundle-clean.1.txt +0 -26
- data/man/bundle-config.1.txt +0 -528
- data/man/bundle-doctor.1.txt +0 -44
- data/man/bundle-exec.1.txt +0 -178
- data/man/bundle-gem.1.txt +0 -91
- data/man/bundle-info.1.txt +0 -21
- data/man/bundle-init.1.txt +0 -34
- data/man/bundle-inject.1.txt +0 -32
- data/man/bundle-install.1.txt +0 -401
- data/man/bundle-list.1.txt +0 -43
- data/man/bundle-lock.1.txt +0 -93
- data/man/bundle-open.1.txt +0 -29
- data/man/bundle-outdated.1.txt +0 -131
- data/man/bundle-platform.1.txt +0 -57
- data/man/bundle-pristine.1.txt +0 -44
- data/man/bundle-remove.1.txt +0 -34
- data/man/bundle-show.1.txt +0 -27
- data/man/bundle-update.1.txt +0 -390
- data/man/bundle-viz.1.txt +0 -39
- data/man/bundle.1.txt +0 -116
- data/man/gemfile.5.txt +0 -649
data/lib/bundler/inline.rb
CHANGED
@@ -50,15 +50,16 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
50
50
|
Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
|
51
51
|
builder = Bundler::Dsl.new
|
52
52
|
builder.instance_eval(&gemfile)
|
53
|
+
builder.check_primary_source_safety
|
53
54
|
|
54
|
-
Bundler.settings.temporary(:frozen => false) do
|
55
|
+
Bundler.settings.temporary(:deployment => false, :frozen => false) do
|
55
56
|
definition = builder.to_definition(nil, true)
|
56
57
|
def definition.lock(*); end
|
57
58
|
definition.validate_runtime!
|
58
59
|
|
59
60
|
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
60
61
|
if install || definition.missing_specs?
|
61
|
-
Bundler.settings.temporary(:inline => true
|
62
|
+
Bundler.settings.temporary(:inline => true) do
|
62
63
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
63
64
|
installer.post_install_messages.each do |name, message|
|
64
65
|
Bundler.ui.info "Post-install message from #{name}:\n#{message}"
|
data/lib/bundler/installer.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "erb"
|
4
3
|
require "rubygems/dependency_installer"
|
5
4
|
require_relative "worker"
|
6
5
|
require_relative "installer/parallel_installer"
|
@@ -83,7 +82,6 @@ module Bundler
|
|
83
82
|
|
84
83
|
if resolve_if_needed(options)
|
85
84
|
ensure_specs_are_compatible!
|
86
|
-
warn_on_incompatible_bundler_deps
|
87
85
|
load_plugins
|
88
86
|
options.delete(:jobs)
|
89
87
|
else
|
@@ -91,6 +89,8 @@ module Bundler
|
|
91
89
|
end
|
92
90
|
install(options)
|
93
91
|
|
92
|
+
Gem::Specification.reset # invalidate gem specification cache so that installed gems are immediately available
|
93
|
+
|
94
94
|
lock unless Bundler.frozen_bundle?
|
95
95
|
Standalone.new(options[:standalone], @definition).generate if options[:standalone]
|
96
96
|
end
|
@@ -135,12 +135,18 @@ module Bundler
|
|
135
135
|
next
|
136
136
|
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
138
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
139
|
+
require "erb"
|
140
|
+
content = if RUBY_VERSION >= "2.6"
|
141
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
142
|
+
else
|
143
|
+
ERB.new(template, nil, "-").result(binding)
|
144
|
+
end
|
145
|
+
|
146
|
+
File.write(binstub_path, content, :mode => mode, :perm => 0o777 & ~File.umask)
|
147
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
148
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
149
|
+
File.write("#{binstub_path}.cmd", prefix + content, :mode => mode)
|
144
150
|
end
|
145
151
|
end
|
146
152
|
|
@@ -159,7 +165,7 @@ module Bundler
|
|
159
165
|
end
|
160
166
|
end
|
161
167
|
|
162
|
-
def generate_standalone_bundler_executable_stubs(spec)
|
168
|
+
def generate_standalone_bundler_executable_stubs(spec, options = {})
|
163
169
|
# double-assignment to avoid warnings about variables that will be used by ERB
|
164
170
|
bin_path = Bundler.bin_path
|
165
171
|
unless path = Bundler.settings[:path]
|
@@ -175,17 +181,24 @@ module Bundler
|
|
175
181
|
next if executable == "bundle"
|
176
182
|
executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
|
177
183
|
executable_path = executable_path
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
+
|
185
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
186
|
+
require "erb"
|
187
|
+
content = if RUBY_VERSION >= "2.6"
|
188
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
189
|
+
else
|
190
|
+
ERB.new(template, nil, "-").result(binding)
|
191
|
+
end
|
192
|
+
|
193
|
+
File.write("#{bin_path}/#{executable}", content, :mode => mode, :perm => 0o755)
|
194
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
195
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
196
|
+
File.write("#{bin_path}/#{executable}.cmd", prefix + content, :mode => mode)
|
184
197
|
end
|
185
198
|
end
|
186
199
|
end
|
187
200
|
|
188
|
-
|
201
|
+
private
|
189
202
|
|
190
203
|
# the order that the resolver provides is significant, since
|
191
204
|
# dependencies might affect the installation of a gem.
|
@@ -202,20 +215,14 @@ module Bundler
|
|
202
215
|
return jobs
|
203
216
|
end
|
204
217
|
|
205
|
-
return 1 unless can_install_in_parallel?
|
206
|
-
|
207
|
-
auto_config_jobs = Bundler.feature_flag.auto_config_jobs?
|
208
218
|
if jobs = Bundler.settings[:jobs]
|
209
|
-
|
210
|
-
jobs
|
211
|
-
else
|
212
|
-
[jobs.pred, 1].max
|
213
|
-
end
|
214
|
-
elsif auto_config_jobs
|
215
|
-
processor_count
|
216
|
-
else
|
217
|
-
1
|
219
|
+
return jobs
|
218
220
|
end
|
221
|
+
|
222
|
+
# Parallelization has some issues on Windows, so it's not yet the default
|
223
|
+
return 1 if Gem.win_platform?
|
224
|
+
|
225
|
+
processor_count
|
219
226
|
end
|
220
227
|
|
221
228
|
def processor_count
|
@@ -238,6 +245,7 @@ module Bundler
|
|
238
245
|
end
|
239
246
|
end.flatten
|
240
247
|
Bundler.rubygems.load_plugin_files(path_plugin_files)
|
248
|
+
Bundler.rubygems.load_env_plugins
|
241
249
|
end
|
242
250
|
|
243
251
|
def ensure_specs_are_compatible!
|
@@ -258,26 +266,6 @@ module Bundler
|
|
258
266
|
end
|
259
267
|
end
|
260
268
|
|
261
|
-
def warn_on_incompatible_bundler_deps
|
262
|
-
bundler_version = Gem::Version.create(Bundler::VERSION)
|
263
|
-
@definition.specs.each do |spec|
|
264
|
-
spec.dependencies.each do |dep|
|
265
|
-
next if dep.type == :development
|
266
|
-
next unless dep.name == "bundler".freeze
|
267
|
-
next if dep.requirement.satisfied_by?(bundler_version)
|
268
|
-
|
269
|
-
Bundler.ui.warn "#{spec.name} (#{spec.version}) has dependency" \
|
270
|
-
" #{SharedHelpers.pretty_dependency(dep)}" \
|
271
|
-
", which is unsatisfied by the current bundler version #{VERSION}" \
|
272
|
-
", so the dependency is being ignored"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def can_install_in_parallel?
|
278
|
-
true
|
279
|
-
end
|
280
|
-
|
281
269
|
def install_in_parallel(size, standalone, force = false)
|
282
270
|
spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
|
283
271
|
spec_installations.each do |installation|
|
@@ -296,7 +284,7 @@ module Bundler
|
|
296
284
|
|
297
285
|
# returns whether or not a re-resolve was needed
|
298
286
|
def resolve_if_needed(options)
|
299
|
-
if !@definition.unlocking? && !options["force"] && !
|
287
|
+
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
300
288
|
return false if @definition.nothing_changed? && !@definition.missing_specs?
|
301
289
|
end
|
302
290
|
|
@@ -19,15 +19,15 @@ module Bundler
|
|
19
19
|
Bundler.ui.debug "#{worker}: #{spec.name} (#{spec.version}) from #{spec.loaded_from}"
|
20
20
|
generate_executable_stubs
|
21
21
|
return true, post_install_message
|
22
|
-
rescue Bundler::InstallHookError, Bundler::SecurityError, APIResponseMismatchError
|
22
|
+
rescue Bundler::InstallHookError, Bundler::SecurityError, Bundler::APIResponseMismatchError
|
23
23
|
raise
|
24
24
|
rescue Errno::ENOSPC
|
25
25
|
return false, out_of_space_message
|
26
|
-
rescue
|
26
|
+
rescue Bundler::BundlerError, Gem::InstallError, Bundler::APIResponseInvalidDependenciesError => e
|
27
27
|
return false, specific_failure_message(e)
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
private
|
31
31
|
|
32
32
|
def specific_failure_message(e)
|
33
33
|
message = "#{e.class}: #{e.message}\n"
|
@@ -6,10 +6,11 @@ require_relative "gem_installer"
|
|
6
6
|
module Bundler
|
7
7
|
class ParallelInstaller
|
8
8
|
class SpecInstallation
|
9
|
-
attr_accessor :spec, :name, :post_install_message, :state, :error
|
9
|
+
attr_accessor :spec, :name, :full_name, :post_install_message, :state, :error
|
10
10
|
def initialize(spec)
|
11
11
|
@spec = spec
|
12
12
|
@name = spec.name
|
13
|
+
@full_name = spec.full_name
|
13
14
|
@state = :none
|
14
15
|
@post_install_message = ""
|
15
16
|
@error = nil
|
@@ -27,13 +28,8 @@ module Bundler
|
|
27
28
|
state == :failed
|
28
29
|
end
|
29
30
|
|
30
|
-
def installation_attempted?
|
31
|
-
installed? || failed?
|
32
|
-
end
|
33
|
-
|
34
|
-
# Only true when spec in neither installed nor already enqueued
|
35
31
|
def ready_to_enqueue?
|
36
|
-
|
32
|
+
state == :none
|
37
33
|
end
|
38
34
|
|
39
35
|
def has_post_install_message?
|
@@ -54,14 +50,11 @@ module Bundler
|
|
54
50
|
# Represents only the non-development dependencies, the ones that are
|
55
51
|
# itself and are in the total list.
|
56
52
|
def dependencies
|
57
|
-
@dependencies ||=
|
58
|
-
all_dependencies.reject {|dep| ignorable_dependency? dep }
|
59
|
-
end
|
53
|
+
@dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep }
|
60
54
|
end
|
61
55
|
|
62
56
|
def missing_lockfile_dependencies(all_spec_names)
|
63
|
-
|
64
|
-
deps.reject {|dep| all_spec_names.include? dep.name }
|
57
|
+
dependencies.reject {|dep| all_spec_names.include? dep.name }
|
65
58
|
end
|
66
59
|
|
67
60
|
# Represents all dependencies
|
@@ -70,7 +63,7 @@ module Bundler
|
|
70
63
|
end
|
71
64
|
|
72
65
|
def to_s
|
73
|
-
"#<#{self.class} #{
|
66
|
+
"#<#{self.class} #{full_name} (#{state})>"
|
74
67
|
end
|
75
68
|
end
|
76
69
|
|
@@ -93,18 +86,48 @@ module Bundler
|
|
93
86
|
def call
|
94
87
|
check_for_corrupt_lockfile
|
95
88
|
|
89
|
+
if @rake
|
90
|
+
do_install(@rake, 0)
|
91
|
+
Gem::Specification.reset
|
92
|
+
end
|
93
|
+
|
96
94
|
if @size > 1
|
97
95
|
install_with_worker
|
98
96
|
else
|
99
97
|
install_serially
|
100
98
|
end
|
101
99
|
|
102
|
-
|
100
|
+
check_for_unmet_dependencies
|
101
|
+
|
102
|
+
handle_error if failed_specs.any?
|
103
103
|
@specs
|
104
104
|
ensure
|
105
105
|
worker_pool && worker_pool.stop
|
106
106
|
end
|
107
107
|
|
108
|
+
def check_for_unmet_dependencies
|
109
|
+
unmet_dependencies = @specs.map do |s|
|
110
|
+
[
|
111
|
+
s,
|
112
|
+
s.dependencies.reject {|dep| @specs.any? {|spec| dep.matches_spec?(spec.spec) } },
|
113
|
+
]
|
114
|
+
end.reject {|a| a.last.empty? }
|
115
|
+
return if unmet_dependencies.empty?
|
116
|
+
|
117
|
+
warning = []
|
118
|
+
warning << "Your lockfile doesn't include a valid resolution."
|
119
|
+
warning << "You can fix this by regenerating your lockfile or trying to manually editing the bad locked gems to a version that satisfies all dependencies."
|
120
|
+
warning << "The unmet dependencies are:"
|
121
|
+
|
122
|
+
unmet_dependencies.each do |spec, unmet_spec_dependencies|
|
123
|
+
unmet_spec_dependencies.each do |unmet_spec_dependency|
|
124
|
+
warning << "* #{unmet_spec_dependency}, depended upon #{spec.full_name}, unsatisfied by #{@specs.find {|s| s.name == unmet_spec_dependency.name && !unmet_spec_dependency.matches_spec?(s.spec) }.full_name}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
Bundler.ui.warn(warning.join("\n"))
|
129
|
+
end
|
130
|
+
|
108
131
|
def check_for_corrupt_lockfile
|
109
132
|
missing_dependencies = @specs.map do |s|
|
110
133
|
[
|
@@ -130,7 +153,11 @@ module Bundler
|
|
130
153
|
Bundler.ui.warn(warning.join("\n"))
|
131
154
|
end
|
132
155
|
|
133
|
-
|
156
|
+
private
|
157
|
+
|
158
|
+
def failed_specs
|
159
|
+
@specs.select(&:failed?)
|
160
|
+
end
|
134
161
|
|
135
162
|
def install_with_worker
|
136
163
|
enqueue_specs
|
@@ -156,17 +183,13 @@ module Bundler
|
|
156
183
|
gem_installer = Bundler::GemInstaller.new(
|
157
184
|
spec_install.spec, @installer, @standalone, worker_num, @force
|
158
185
|
)
|
159
|
-
success, message =
|
160
|
-
gem_installer.install_from_spec
|
161
|
-
rescue RuntimeError => e
|
162
|
-
raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
163
|
-
end
|
186
|
+
success, message = gem_installer.install_from_spec
|
164
187
|
if success
|
165
188
|
spec_install.state = :installed
|
166
189
|
spec_install.post_install_message = message unless message.nil?
|
167
190
|
else
|
168
|
-
spec_install.state = :failed
|
169
191
|
spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
192
|
+
spec_install.state = :failed
|
170
193
|
end
|
171
194
|
Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
|
172
195
|
spec_install
|
@@ -190,11 +213,11 @@ module Bundler
|
|
190
213
|
end
|
191
214
|
|
192
215
|
def handle_error
|
193
|
-
errors =
|
216
|
+
errors = failed_specs.map(&:error)
|
194
217
|
if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
|
195
218
|
raise exception
|
196
219
|
end
|
197
|
-
raise Bundler::InstallError, errors.
|
220
|
+
raise Bundler::InstallError, errors.join("\n\n")
|
198
221
|
end
|
199
222
|
|
200
223
|
def require_tree_for_spec(spec)
|
@@ -217,8 +240,6 @@ module Bundler
|
|
217
240
|
# are installed.
|
218
241
|
def enqueue_specs
|
219
242
|
@specs.select(&:ready_to_enqueue?).each do |spec|
|
220
|
-
next if @rake && !@rake.installed? && spec.name != @rake.name
|
221
|
-
|
222
243
|
if spec.dependencies_installed? @specs
|
223
244
|
spec.state = :enqueued
|
224
245
|
worker_pool.enq spec
|
@@ -15,13 +15,14 @@ module Bundler
|
|
15
15
|
file.puts "ruby_engine = RUBY_ENGINE"
|
16
16
|
file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
|
17
17
|
file.puts "path = File.expand_path('..', __FILE__)"
|
18
|
+
file.puts reverse_rubygems_kernel_mixin
|
18
19
|
paths.each do |path|
|
19
|
-
file.puts %($:.unshift "\#{path}/#{path}")
|
20
|
+
file.puts %($:.unshift File.expand_path("\#{path}/#{path}"))
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
+
private
|
25
26
|
|
26
27
|
def paths
|
27
28
|
@specs.map do |spec|
|
@@ -48,5 +49,19 @@ module Bundler
|
|
48
49
|
error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
|
49
50
|
raise Gem::InvalidSpecificationException.new(error_message)
|
50
51
|
end
|
52
|
+
|
53
|
+
def reverse_rubygems_kernel_mixin
|
54
|
+
<<~END
|
55
|
+
kernel = (class << ::Kernel; self; end)
|
56
|
+
[kernel, ::Kernel].each do |k|
|
57
|
+
if k.private_method_defined?(:gem_original_require)
|
58
|
+
private_require = k.private_method_defined?(:require)
|
59
|
+
k.send(:remove_method, :require)
|
60
|
+
k.send(:define_method, :require, k.instance_method(:gem_original_require))
|
61
|
+
k.send(:private, :require) if private_require
|
62
|
+
end
|
63
|
+
end
|
64
|
+
END
|
65
|
+
end
|
51
66
|
end
|
52
67
|
end
|
@@ -4,22 +4,6 @@ require_relative "match_platform"
|
|
4
4
|
|
5
5
|
module Bundler
|
6
6
|
class LazySpecification
|
7
|
-
Identifier = Struct.new(:name, :version, :source, :platform, :dependencies)
|
8
|
-
class Identifier
|
9
|
-
include Comparable
|
10
|
-
def <=>(other)
|
11
|
-
return unless other.is_a?(Identifier)
|
12
|
-
[name, version, platform_string] <=> [other.name, other.version, other.platform_string]
|
13
|
-
end
|
14
|
-
|
15
|
-
protected
|
16
|
-
|
17
|
-
def platform_string
|
18
|
-
platform_string = platform.to_s
|
19
|
-
platform_string == Index::RUBY ? Index::NULL : platform_string
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
7
|
include MatchPlatform
|
24
8
|
|
25
9
|
attr_reader :name, :version, :dependencies, :platform
|
@@ -46,6 +30,14 @@ module Bundler
|
|
46
30
|
identifier == other.identifier
|
47
31
|
end
|
48
32
|
|
33
|
+
def eql?(other)
|
34
|
+
identifier.eql?(other.identifier)
|
35
|
+
end
|
36
|
+
|
37
|
+
def hash
|
38
|
+
identifier.hash
|
39
|
+
end
|
40
|
+
|
49
41
|
def satisfies?(dependency)
|
50
42
|
@name == dependency.name && dependency.requirement.satisfied_by?(Gem::Version.new(@version))
|
51
43
|
end
|
@@ -68,17 +60,25 @@ module Bundler
|
|
68
60
|
end
|
69
61
|
|
70
62
|
def __materialize__
|
71
|
-
search_object = Bundler.feature_flag.specific_platform? || Bundler.settings[:force_ruby_platform] ? self : Dependency.new(name, version)
|
72
63
|
@specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name
|
73
64
|
source.gemspec.tap {|s| s.source = source }
|
74
65
|
else
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
66
|
+
search_object = if source.is_a?(Source::Path)
|
67
|
+
Dependency.new(name, version)
|
68
|
+
else
|
69
|
+
ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version)
|
70
|
+
end
|
71
|
+
platform_object = Gem::Platform.new(platform)
|
72
|
+
candidates = source.specs.search(search_object)
|
73
|
+
same_platform_candidates = candidates.select do |spec|
|
74
|
+
MatchPlatform.platforms_match?(spec.platform, platform_object)
|
75
|
+
end
|
76
|
+
installable_candidates = same_platform_candidates.select do |spec|
|
77
|
+
!spec.is_a?(EndpointSpecification) ||
|
78
|
+
(spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
|
79
|
+
spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version))
|
81
80
|
end
|
81
|
+
search = installable_candidates.last || same_platform_candidates.last
|
82
82
|
search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
83
83
|
search
|
84
84
|
end
|
@@ -97,7 +97,7 @@ module Bundler
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def identifier
|
100
|
-
@__identifier ||=
|
100
|
+
@__identifier ||= [name, version, platform_string]
|
101
101
|
end
|
102
102
|
|
103
103
|
def git_version
|
@@ -105,7 +105,14 @@ module Bundler
|
|
105
105
|
" #{source.revision[0..6]}"
|
106
106
|
end
|
107
107
|
|
108
|
-
|
108
|
+
protected
|
109
|
+
|
110
|
+
def platform_string
|
111
|
+
platform_string = platform.to_s
|
112
|
+
platform_string == Index::RUBY ? Index::NULL : platform_string
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
109
116
|
|
110
117
|
def to_ary
|
111
118
|
nil
|
@@ -118,5 +125,18 @@ module Bundler
|
|
118
125
|
|
119
126
|
@specification.send(method, *args, &blk)
|
120
127
|
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# For backwards compatibility with existing lockfiles, if the most specific
|
131
|
+
# locked platform is RUBY, we keep the previous behaviour of resolving the
|
132
|
+
# best platform variant at materiliazation time. For previous bundler
|
133
|
+
# versions (before 2.2.0) this was always the case (except when the lockfile
|
134
|
+
# only included non-ruby platforms), but we're also keeping this behaviour
|
135
|
+
# on newer bundlers unless users generate the lockfile from scratch or
|
136
|
+
# explicitly add a more specific platform.
|
137
|
+
#
|
138
|
+
def ruby_platform_materializes_to_ruby_platform?
|
139
|
+
!Bundler.most_specific_locked_platform?(Gem::Platform::RUBY) || Bundler.settings[:force_ruby_platform]
|
140
|
+
end
|
121
141
|
end
|
122
142
|
end
|