bundler 2.1.2 → 2.2.0

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 (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1575 -1422
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +25 -7
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +58 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +84 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +12 -18
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +88 -67
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +2 -0
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +1 -1
  32. data/lib/bundler/compact_index_client/updater.rb +5 -5
  33. data/lib/bundler/definition.rb +47 -61
  34. data/lib/bundler/dep_proxy.rb +1 -1
  35. data/lib/bundler/dependency.rb +0 -9
  36. data/lib/bundler/dsl.rb +5 -9
  37. data/lib/bundler/endpoint_specification.rb +1 -1
  38. data/lib/bundler/env.rb +1 -1
  39. data/lib/bundler/environment_preserver.rb +26 -2
  40. data/lib/bundler/errors.rb +1 -0
  41. data/lib/bundler/feature_flag.rb +0 -3
  42. data/lib/bundler/fetcher.rb +4 -3
  43. data/lib/bundler/fetcher/base.rb +1 -1
  44. data/lib/bundler/fetcher/compact_index.rb +1 -1
  45. data/lib/bundler/fetcher/downloader.rb +1 -1
  46. data/lib/bundler/fetcher/index.rb +3 -4
  47. data/lib/bundler/friendly_errors.rb +22 -13
  48. data/lib/bundler/gem_helper.rb +33 -19
  49. data/lib/bundler/gem_helpers.rb +6 -1
  50. data/lib/bundler/gem_version_promoter.rb +2 -2
  51. data/lib/bundler/graph.rb +1 -1
  52. data/lib/bundler/index.rb +6 -2
  53. data/lib/bundler/injector.rb +22 -4
  54. data/lib/bundler/inline.rb +2 -2
  55. data/lib/bundler/installer.rb +35 -32
  56. data/lib/bundler/installer/gem_installer.rb +3 -3
  57. data/lib/bundler/installer/parallel_installer.rb +10 -10
  58. data/lib/bundler/installer/standalone.rb +2 -2
  59. data/lib/bundler/lazy_specification.rb +20 -9
  60. data/lib/bundler/lockfile_generator.rb +1 -1
  61. data/lib/bundler/lockfile_parser.rb +1 -1
  62. data/lib/bundler/man/.document +1 -0
  63. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  64. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  65. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  66. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  67. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  68. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  69. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  70. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  71. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  72. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  73. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  74. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  75. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  76. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  77. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  78. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  79. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  80. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  81. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  82. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  83. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  84. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  85. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  86. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  87. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  88. data/lib/bundler/mirror.rb +2 -2
  89. data/lib/bundler/plugin.rb +30 -5
  90. data/lib/bundler/plugin/api/source.rb +1 -1
  91. data/lib/bundler/plugin/dsl.rb +1 -1
  92. data/lib/bundler/plugin/index.rb +10 -1
  93. data/lib/bundler/plugin/installer.rb +1 -1
  94. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  95. data/lib/bundler/plugin/source_list.rb +1 -1
  96. data/lib/bundler/psyched_yaml.rb +0 -15
  97. data/lib/bundler/remote_specification.rb +5 -2
  98. data/lib/bundler/resolver.rb +32 -10
  99. data/lib/bundler/resolver/spec_group.rb +27 -6
  100. data/lib/bundler/retry.rb +1 -1
  101. data/lib/bundler/ruby_version.rb +1 -1
  102. data/lib/bundler/rubygems_ext.rb +53 -9
  103. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  104. data/lib/bundler/rubygems_integration.rb +26 -55
  105. data/lib/bundler/runtime.rb +4 -14
  106. data/lib/bundler/settings.rb +49 -46
  107. data/lib/bundler/shared_helpers.rb +2 -2
  108. data/lib/bundler/similarity_detector.rb +1 -1
  109. data/lib/bundler/source.rb +1 -1
  110. data/lib/bundler/source/git.rb +5 -5
  111. data/lib/bundler/source/git/git_proxy.rb +57 -60
  112. data/lib/bundler/source/path.rb +7 -3
  113. data/lib/bundler/source/path/installer.rb +8 -10
  114. data/lib/bundler/source/rubygems.rb +13 -16
  115. data/lib/bundler/source/rubygems/remote.rb +1 -1
  116. data/lib/bundler/source_list.rb +2 -2
  117. data/lib/bundler/spec_set.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +17 -5
  119. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  120. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  121. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  122. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  123. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  124. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  125. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  126. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  127. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  128. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  129. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  130. data/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -6
  131. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  132. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  133. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  134. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  135. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  136. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  137. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  138. data/lib/bundler/ui/shell.rb +5 -5
  139. data/lib/bundler/uri_credentials_filter.rb +3 -1
  140. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  146. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +72 -208
  147. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  148. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  149. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  150. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  151. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  152. data/lib/bundler/vendored_persistent.rb +0 -7
  153. data/lib/bundler/vendored_tmpdir.rb +4 -0
  154. data/lib/bundler/version.rb +1 -1
  155. data/lib/bundler/worker.rb +1 -1
  156. data/lib/bundler/yaml_serializer.rb +1 -1
  157. data/man/bundle-add.1 +1 -1
  158. data/man/bundle-binstubs.1 +5 -3
  159. data/man/bundle-cache.1 +1 -1
  160. data/man/bundle-check.1 +1 -1
  161. data/man/bundle-clean.1 +1 -1
  162. data/man/bundle-config.1 +16 -25
  163. data/man/bundle-doctor.1 +1 -1
  164. data/man/bundle-exec.1 +1 -1
  165. data/man/bundle-gem.1 +25 -3
  166. data/man/bundle-info.1 +1 -1
  167. data/man/bundle-init.1 +1 -1
  168. data/man/bundle-inject.1 +1 -1
  169. data/man/bundle-install.1 +30 -3
  170. data/man/bundle-list.1 +7 -7
  171. data/man/bundle-lock.1 +1 -1
  172. data/man/bundle-open.1 +1 -1
  173. data/man/bundle-outdated.1 +1 -1
  174. data/man/bundle-platform.1 +1 -1
  175. data/man/bundle-pristine.1 +1 -1
  176. data/man/bundle-remove.1 +1 -1
  177. data/man/bundle-show.1 +1 -1
  178. data/man/bundle-update.1 +1 -1
  179. data/man/bundle-viz.1 +1 -1
  180. data/man/bundle.1 +1 -1
  181. data/man/gemfile.5 +4 -4
  182. metadata +46 -62
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  184. data/man/bundle-add.1.txt +0 -58
  185. data/man/bundle-binstubs.1.txt +0 -48
  186. data/man/bundle-cache.1.txt +0 -78
  187. data/man/bundle-check.1.txt +0 -33
  188. data/man/bundle-clean.1.txt +0 -26
  189. data/man/bundle-config.1.txt +0 -528
  190. data/man/bundle-doctor.1.txt +0 -44
  191. data/man/bundle-exec.1.txt +0 -178
  192. data/man/bundle-gem.1.txt +0 -91
  193. data/man/bundle-info.1.txt +0 -21
  194. data/man/bundle-init.1.txt +0 -34
  195. data/man/bundle-inject.1.txt +0 -32
  196. data/man/bundle-install.1.txt +0 -401
  197. data/man/bundle-list.1.txt +0 -43
  198. data/man/bundle-lock.1.txt +0 -93
  199. data/man/bundle-open.1.txt +0 -29
  200. data/man/bundle-outdated.1.txt +0 -131
  201. data/man/bundle-platform.1.txt +0 -57
  202. data/man/bundle-pristine.1.txt +0 -44
  203. data/man/bundle-remove.1.txt +0 -34
  204. data/man/bundle-show.1.txt +0 -27
  205. data/man/bundle-update.1.txt +0 -390
  206. data/man/bundle-viz.1.txt +0 -39
  207. data/man/bundle.1.txt +0 -116
  208. data/man/gemfile.5.txt +0 -649
@@ -23,6 +23,16 @@ module Bundler
23
23
  Bundler::Plugin.install(plugins, options)
24
24
  end
25
25
 
26
+ desc "uninstall PLUGINS", "Uninstall the plugins"
27
+ long_desc <<-D
28
+ Uninstall given list of plugins. To uninstall all the plugins, use -all option.
29
+ D
30
+ method_option "all", :type => :boolean, :default => nil, :banner =>
31
+ "Uninstall all the installed plugins. If no plugin is installed, then it does nothing."
32
+ def uninstall(*plugins)
33
+ Bundler::Plugin.uninstall(plugins, options)
34
+ end
35
+
26
36
  desc "list", "List the installed plugins and available commands"
27
37
  def list
28
38
  Bundler::Plugin.list
@@ -29,6 +29,11 @@ module Bundler
29
29
 
30
30
  FileUtils.rm_rf spec.full_gem_path
31
31
  when Source::Git
32
+ if source.local?
33
+ Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is locally overridden.")
34
+ next
35
+ end
36
+
32
37
  source.remote!
33
38
  if extension_cache_path = source.extension_cache_path(spec)
34
39
  FileUtils.rm_rf extension_cache_path
@@ -53,7 +53,7 @@ module Bundler
53
53
  end
54
54
  end
55
55
 
56
- private
56
+ private
57
57
 
58
58
  def fetch_latest_specs
59
59
  definition = Bundler.definition(true)
@@ -106,6 +106,8 @@ module Bundler
106
106
  Bundler.ui.confirm "Bundle updated!"
107
107
  Bundler::CLI::Common.output_without_groups_message(:update)
108
108
  Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
109
+
110
+ Bundler::CLI::Common.output_fund_metadata_summary
109
111
  end
110
112
  end
111
113
  end
@@ -87,7 +87,7 @@ module Bundler
87
87
  @parsed_checksums = true
88
88
  end
89
89
 
90
- private
90
+ private
91
91
 
92
92
  def update(local_path, remote_path)
93
93
  Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" }
@@ -83,7 +83,7 @@ module Bundler
83
83
  gem_line ? parse_gem(gem_line) : nil
84
84
  end
85
85
 
86
- private
86
+ private
87
87
 
88
88
  def lines(path)
89
89
  return [] unless path.file?
@@ -22,13 +22,13 @@ module Bundler
22
22
 
23
23
  def initialize(fetcher)
24
24
  @fetcher = fetcher
25
- require "tmpdir"
25
+ require_relative "../vendored_tmpdir"
26
26
  end
27
27
 
28
28
  def update(local_path, remote_path, retrying = nil)
29
29
  headers = {}
30
30
 
31
- Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
31
+ Bundler::Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
32
32
  local_temp_path = Pathname.new(local_temp_dir).join(local_path.basename)
33
33
 
34
34
  # first try to fetch any new bytes on the existing file
@@ -66,8 +66,8 @@ module Bundler
66
66
  end
67
67
  end
68
68
 
69
- response_etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
70
- if etag_for(local_temp_path) == response_etag
69
+ etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
70
+ if etag.length.zero? || etag_for(local_temp_path) == etag
71
71
  SharedHelpers.filesystem_access(local_path) do
72
72
  FileUtils.mv(local_temp_path, local_path)
73
73
  end
@@ -75,7 +75,7 @@ module Bundler
75
75
  end
76
76
 
77
77
  if retrying
78
- raise MisMatchedChecksumError.new(remote_path, response_etag, etag_for(local_temp_path))
78
+ raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
79
79
  end
80
80
 
81
81
  update(local_path, remote_path, :retrying)
@@ -77,12 +77,17 @@ module Bundler
77
77
  @locked_bundler_version = nil
78
78
  @locked_ruby_version = nil
79
79
  @locked_specs_incomplete_for_platform = false
80
+ @new_platform = nil
80
81
 
81
82
  if lockfile && File.exist?(lockfile)
82
83
  @lockfile_contents = Bundler.read_file(lockfile)
83
84
  @locked_gems = LockfileParser.new(@lockfile_contents)
84
85
  @locked_platforms = @locked_gems.platforms
85
- @platforms = @locked_platforms.dup
86
+ if Bundler.settings[:force_ruby_platform]
87
+ @platforms = [Gem::Platform::RUBY]
88
+ else
89
+ @platforms = @locked_platforms.dup
90
+ end
86
91
  @locked_bundler_version = @locked_gems.bundler_version
87
92
  @locked_ruby_version = @locked_gems.ruby_version
88
93
 
@@ -194,10 +199,6 @@ module Bundler
194
199
  @locked_specs - specs
195
200
  end
196
201
 
197
- def new_platform?
198
- @new_platform
199
- end
200
-
201
202
  def missing_specs
202
203
  missing = []
203
204
  resolve.materialize(requested_dependencies, missing)
@@ -227,16 +228,29 @@ module Bundler
227
228
  end
228
229
  end
229
230
 
231
+ def requested_dependencies
232
+ groups = requested_groups
233
+ groups.map!(&:to_sym)
234
+ dependencies_for(groups)
235
+ end
236
+
230
237
  def current_dependencies
231
- dependencies.select(&:should_include?)
238
+ dependencies.select do |d|
239
+ d.should_include? && !d.gem_platforms(@platforms).empty?
240
+ end
232
241
  end
233
242
 
234
243
  def specs_for(groups)
235
- deps = dependencies.select {|d| (d.groups & groups).any? }
236
- deps.delete_if {|d| !d.should_include? }
244
+ deps = dependencies_for(groups)
237
245
  specs.for(expand_dependencies(deps))
238
246
  end
239
247
 
248
+ def dependencies_for(groups)
249
+ current_dependencies.reject do |d|
250
+ (d.groups & groups).empty?
251
+ end
252
+ end
253
+
240
254
  # Resolve all the dependencies specified in Gemfile. It ensures that
241
255
  # dependencies that have been already resolved via locked file and are fresh
242
256
  # are reused when resolving dependencies
@@ -312,10 +326,6 @@ module Bundler
312
326
  sources.rubygems_sources.any? {|s| s.remotes.any? }
313
327
  end
314
328
 
315
- def has_local_dependencies?
316
- !sources.path_sources.empty? || !sources.git_sources.empty?
317
- end
318
-
319
329
  def spec_git_paths
320
330
  sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact
321
331
  end
@@ -396,12 +406,10 @@ module Bundler
396
406
  "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control."
397
407
 
398
408
  unless explicit_flag
399
- suggested_command = if Bundler.settings.locations("frozen")[:global]
409
+ suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
400
410
  "bundle config unset frozen"
401
411
  elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
402
412
  "bundle config unset deployment"
403
- else
404
- "bundle install --no-deployment"
405
413
  end
406
414
  msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \
407
415
  "freeze \nby running `#{suggested_command}`."
@@ -450,9 +458,9 @@ module Bundler
450
458
  @locked_deps.each {|name, d| both_sources[name][1] = d.source }
451
459
 
452
460
  both_sources.each do |name, (dep, lock_source)|
453
- next unless (dep.nil? && !lock_source.nil?) || (!dep.nil? && !lock_source.nil? && !lock_source.can_lock?(dep))
461
+ next if lock_source.nil? || (dep && lock_source.can_lock?(dep))
454
462
  gemfile_source_name = (dep && dep.source) || "no specified source"
455
- lockfile_source_name = lock_source || "no specified source"
463
+ lockfile_source_name = lock_source
456
464
  changed << "* #{name} from `#{gemfile_source_name}` to `#{lockfile_source_name}`"
457
465
  end
458
466
 
@@ -518,10 +526,6 @@ module Bundler
518
526
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
519
527
  end
520
528
 
521
- def add_current_platform
522
- current_platforms.each {|platform| add_platform(platform) }
523
- end
524
-
525
529
  def find_resolved_spec(current_spec)
526
530
  specs.find_by_name_and_platform(current_spec.name, current_spec.platform)
527
531
  end
@@ -541,14 +545,14 @@ module Bundler
541
545
  @unlocking
542
546
  end
543
547
 
544
- private
548
+ private
549
+
550
+ def add_current_platform
551
+ current_platforms.each {|platform| add_platform(platform) }
552
+ end
545
553
 
546
554
  def current_platforms
547
- current_platform = Bundler.local_platform
548
- [].tap do |platforms|
549
- platforms << current_platform if Bundler.feature_flag.specific_platform?
550
- platforms << generic(current_platform)
551
- end
555
+ [local_platform, generic_local_platform].uniq
552
556
  end
553
557
 
554
558
  def change_reason
@@ -706,9 +710,6 @@ module Bundler
706
710
  elsif dep.source
707
711
  dep.source = sources.get(dep.source)
708
712
  end
709
- if dep.source.is_a?(Source::Gemspec)
710
- dep.platforms.concat(@platforms.map {|p| Dependency::REVERSE_PLATFORM_MAP[p] }.flatten(1)).uniq!
711
- end
712
713
  end
713
714
 
714
715
  changes = false
@@ -818,7 +819,7 @@ module Bundler
818
819
  end
819
820
 
820
821
  resolve = SpecSet.new(converged)
821
- @locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(deps), @unlock[:gems], true, true)
822
+ @locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(requested_dependencies & deps), @unlock[:gems], true, true)
822
823
  resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems], false, false, false)
823
824
  diff = nil
824
825
 
@@ -856,11 +857,7 @@ module Bundler
856
857
 
857
858
  def metadata_dependencies
858
859
  @metadata_dependencies ||= begin
859
- ruby_versions = concat_ruby_version_requirements(@ruby_version)
860
- if ruby_versions.empty? || !@ruby_version.exact?
861
- concat_ruby_version_requirements(RubyVersion.system)
862
- concat_ruby_version_requirements(locked_ruby_version_object) unless @unlock[:ruby]
863
- end
860
+ ruby_versions = ruby_version_requirements(@ruby_version)
864
861
  [
865
862
  Dependency.new("Ruby\0", ruby_versions),
866
863
  Dependency.new("RubyGems\0", Gem::VERSION),
@@ -868,49 +865,37 @@ module Bundler
868
865
  end
869
866
  end
870
867
 
871
- def concat_ruby_version_requirements(ruby_version, ruby_versions = [])
872
- return ruby_versions unless ruby_version
868
+ def ruby_version_requirements(ruby_version)
869
+ return [] unless ruby_version
873
870
  if ruby_version.patchlevel
874
- ruby_versions << ruby_version.to_gem_version_with_patchlevel
871
+ [ruby_version.to_gem_version_with_patchlevel]
875
872
  else
876
- ruby_versions.concat(ruby_version.versions.map do |version|
873
+ ruby_version.versions.map do |version|
877
874
  requirement = Gem::Requirement.new(version)
878
875
  if requirement.exact?
879
876
  "~> #{version}.0"
880
877
  else
881
878
  requirement
882
879
  end
883
- end)
880
+ end
884
881
  end
885
882
  end
886
883
 
887
884
  def expand_dependencies(dependencies, remote = false)
888
- sorted_platforms = Resolver.sort_platforms(@platforms)
889
885
  deps = []
890
886
  dependencies.each do |dep|
891
887
  dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
892
- next if !remote && !dep.current_platform?
893
- platforms = dep.gem_platforms(sorted_platforms)
894
- if platforms.empty? && !Bundler.settings[:disable_platform_warnings]
895
- mapped_platforms = dep.expanded_platforms
896
- Bundler.ui.warn \
897
- "The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \
898
- "Bundler is installing for #{@platforms.join ", "} but the dependency " \
899
- "is only for #{mapped_platforms.join ", "}. " \
900
- "To add those platforms to the bundle, " \
901
- "run `bundle lock --add-platform #{mapped_platforms.join " "}`."
902
- end
903
- platforms.each do |p|
904
- deps << DepProxy.new(dep, p) if remote || p == generic_local_platform
905
- end
888
+ next unless remote || dep.current_platform?
889
+ target_platforms = dep.gem_platforms(remote ? Resolver.sort_platforms(@platforms) : [generic_local_platform])
890
+ deps += expand_dependency_with_platforms(dep, target_platforms)
906
891
  end
907
892
  deps
908
893
  end
909
894
 
910
- def requested_dependencies
911
- groups = requested_groups
912
- groups.map!(&:to_sym)
913
- dependencies.reject {|d| !d.should_include? || (d.groups & groups).empty? }
895
+ def expand_dependency_with_platforms(dep, platforms)
896
+ platforms.map do |p|
897
+ DepProxy.new(dep, p)
898
+ end
914
899
  end
915
900
 
916
901
  def source_requirements
@@ -985,8 +970,9 @@ module Bundler
985
970
  @locked_gems.specs.reduce({}) do |requirements, locked_spec|
986
971
  name = locked_spec.name
987
972
  dependency = dependencies_by_name[name]
973
+ next requirements unless dependency
988
974
  next requirements if @locked_gems.dependencies[name] != dependency
989
- next requirements if dependency && dependency.source.is_a?(Source::Path)
975
+ next requirements if dependency.source.is_a?(Source::Path)
990
976
  dep = Gem::Dependency.new(name, ">= #{locked_spec.version}")
991
977
  requirements[name] = DepProxy.new(dep, locked_spec.platform)
992
978
  requirements
@@ -39,7 +39,7 @@ module Bundler
39
39
  s
40
40
  end
41
41
 
42
- private
42
+ private
43
43
 
44
44
  def method_missing(*args, &blk)
45
45
  @dep.send(*args, &blk)
@@ -74,15 +74,6 @@ module Bundler
74
74
  :x64_mingw_26 => Gem::Platform::X64_MINGW,
75
75
  }.freeze
76
76
 
77
- REVERSE_PLATFORM_MAP = {}.tap do |reverse_platform_map|
78
- PLATFORM_MAP.each do |key, value|
79
- reverse_platform_map[value] ||= []
80
- reverse_platform_map[value] << key
81
- end
82
-
83
- reverse_platform_map.each {|_, platforms| platforms.freeze }
84
- end.freeze
85
-
86
77
  def initialize(name, version, options = {}, &blk)
87
78
  type = options["type"] || :runtime
88
79
  super(name, version, type)
@@ -63,7 +63,7 @@ module Bundler
63
63
  development_group = opts[:development_group] || :development
64
64
  expanded_path = gemfile_root.join(path)
65
65
 
66
- gemspecs = Dir[File.join(expanded_path, "{,*}.gemspec")].map {|g| Bundler.load_gemspec(g) }.compact
66
+ gemspecs = Gem::Util.glob_files_in_dir("{,*}.gemspec", expanded_path).map {|g| Bundler.load_gemspec(g) }.compact
67
67
  gemspecs.reject! {|s| s.name != name } if name
68
68
  Index.sort_specs(gemspecs)
69
69
  specs_by_name_and_version = gemspecs.group_by {|s| [s.name, s.version] }
@@ -75,8 +75,7 @@ module Bundler
75
75
 
76
76
  @gemspecs << spec
77
77
 
78
- gem_platforms = Bundler::Dependency::REVERSE_PLATFORM_MAP[Bundler::GemHelpers.generic_local_platform]
79
- gem spec.name, :name => spec.name, :path => path, :glob => glob, :platforms => gem_platforms
78
+ gem spec.name, :name => spec.name, :path => path, :glob => glob
80
79
 
81
80
  group(development_group) do
82
81
  spec.development_dependencies.each do |dep|
@@ -223,7 +222,6 @@ module Bundler
223
222
 
224
223
  def github(repo, options = {})
225
224
  raise ArgumentError, "GitHub sources require a block" unless block_given?
226
- raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
227
225
  github_uri = @git_sources["github"].call(repo)
228
226
  git_options = normalize_hash(options).merge("uri" => github_uri)
229
227
  git_source = @sources.add_git_source(git_options)
@@ -281,11 +279,9 @@ module Bundler
281
279
  raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile"
282
280
  end
283
281
 
284
- private
282
+ private
285
283
 
286
284
  def add_git_sources
287
- return if Bundler.feature_flag.skip_default_git_sources?
288
-
289
285
  git_source(:github) do |repo_name|
290
286
  warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
291
287
  "https://github.com/#{repo_name}.git"
@@ -461,7 +457,7 @@ repo_name ||= user_name
461
457
  "Using `source` more than once without a block is a security risk, and " \
462
458
  "may result in installing unexpected gems. To resolve this warning, use " \
463
459
  "a block to indicate which gems should come from the secondary source. " \
464
- "To upgrade this warning to an error, run `bundle config set " \
460
+ "To upgrade this warning to an error, run `bundle config set --local " \
465
461
  "disable_multisource true`."
466
462
  end
467
463
  end
@@ -571,7 +567,7 @@ The :#{name} git source is deprecated, and will be removed in the future.#{addit
571
567
  end
572
568
  end
573
569
 
574
- private
570
+ private
575
571
 
576
572
  def parse_line_number_from_description
577
573
  description = self.description
@@ -104,7 +104,7 @@ module Bundler
104
104
  @remote_specification = spec
105
105
  end
106
106
 
107
- private
107
+ private
108
108
 
109
109
  def local_specification_path
110
110
  "#{base_dir}/specifications/#{full_name}.gemspec"
@@ -105,7 +105,7 @@ module Bundler
105
105
  out << [" User Home", Gem.user_home]
106
106
  out << [" User Path", Gem.user_dir]
107
107
  out << [" Bin Dir", Gem.bindir]
108
- if defined?(OpenSSL)
108
+ if defined?(OpenSSL::SSL)
109
109
  out << ["OpenSSL"]
110
110
  out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
111
111
  out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
@@ -17,14 +17,38 @@ module Bundler
17
17
  ].map(&:freeze).freeze
18
18
  BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze
19
19
 
20
- # @param env [ENV]
20
+ def self.from_env
21
+ new(env_to_hash(ENV), BUNDLER_KEYS)
22
+ end
23
+
24
+ def self.env_to_hash(env)
25
+ to_hash = env.to_hash
26
+ return to_hash unless Gem.win_platform?
27
+
28
+ to_hash.each_with_object({}) {|(k,v), a| a[k.upcase] = v }
29
+ end
30
+
31
+ # @param env [Hash]
21
32
  # @param keys [Array<String>]
22
33
  def initialize(env, keys)
23
- @original = env.to_hash
34
+ @original = env
24
35
  @keys = keys
25
36
  @prefix = BUNDLER_PREFIX
26
37
  end
27
38
 
39
+ # Replaces `ENV` with the bundler environment variables backed up
40
+ def replace_with_backup
41
+ ENV.replace(backup) unless Gem.win_platform?
42
+
43
+ # Fallback logic for Windows below to workaround
44
+ # https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
45
+ # supported rubies include the fix for that.
46
+
47
+ ENV.clear
48
+
49
+ backup.each {|k, v| ENV[k] = v }
50
+ end
51
+
28
52
  # @return [Hash]
29
53
  def backup
30
54
  env = @original.clone