rubygems-update 3.2.0.rc.2 → 3.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +520 -501
  3. data/Manifest.txt +62 -55
  4. data/POLICIES.md +4 -3
  5. data/Rakefile +23 -7
  6. data/bundler/CHANGELOG.md +84 -19
  7. data/bundler/UPGRADING.md +1 -1
  8. data/bundler/bundler.gemspec +1 -1
  9. data/bundler/lib/bundler.rb +11 -0
  10. data/bundler/lib/bundler/build_metadata.rb +2 -2
  11. data/bundler/lib/bundler/cli.rb +5 -5
  12. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  13. data/bundler/lib/bundler/cli/exec.rb +3 -3
  14. data/bundler/lib/bundler/cli/install.rb +14 -5
  15. data/bundler/lib/bundler/cli/outdated.rb +0 -2
  16. data/bundler/lib/bundler/cli/update.rb +1 -1
  17. data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
  18. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  19. data/bundler/lib/bundler/compact_index_client/updater.rb +5 -5
  20. data/bundler/lib/bundler/definition.rb +23 -25
  21. data/bundler/lib/bundler/dependency.rb +3 -1
  22. data/bundler/lib/bundler/env.rb +1 -1
  23. data/bundler/lib/bundler/feature_flag.rb +0 -1
  24. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  25. data/bundler/lib/bundler/friendly_errors.rb +15 -0
  26. data/bundler/lib/bundler/gem_helpers.rb +30 -24
  27. data/bundler/lib/bundler/index.rb +5 -1
  28. data/bundler/lib/bundler/injector.rb +9 -2
  29. data/bundler/lib/bundler/installer.rb +7 -5
  30. data/bundler/lib/bundler/lazy_specification.rb +20 -9
  31. data/bundler/lib/bundler/man/.document +1 -0
  32. data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
  33. data/bundler/{man → lib/bundler/man}/bundle-add.1.ronn +0 -0
  34. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
  35. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1.ronn +0 -0
  36. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  37. data/bundler/{man → lib/bundler/man}/bundle-cache.1.ronn +0 -0
  38. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  39. data/bundler/{man → lib/bundler/man}/bundle-check.1.ronn +0 -0
  40. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  41. data/bundler/{man → lib/bundler/man}/bundle-clean.1.ronn +0 -0
  42. data/bundler/{man → lib/bundler/man}/bundle-config.1 +2 -5
  43. data/bundler/{man → lib/bundler/man}/bundle-config.1.ronn +1 -9
  44. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  45. data/bundler/{man → lib/bundler/man}/bundle-doctor.1.ronn +0 -0
  46. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  47. data/bundler/{man → lib/bundler/man}/bundle-exec.1.ronn +0 -0
  48. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
  49. data/bundler/{man → lib/bundler/man}/bundle-gem.1.ronn +0 -0
  50. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  51. data/bundler/{man → lib/bundler/man}/bundle-info.1.ronn +0 -0
  52. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  53. data/bundler/{man → lib/bundler/man}/bundle-init.1.ronn +0 -0
  54. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  55. data/bundler/{man → lib/bundler/man}/bundle-inject.1.ronn +0 -0
  56. data/bundler/{man → lib/bundler/man}/bundle-install.1 +2 -2
  57. data/bundler/{man → lib/bundler/man}/bundle-install.1.ronn +1 -1
  58. data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
  59. data/bundler/{man → lib/bundler/man}/bundle-list.1.ronn +0 -0
  60. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  61. data/bundler/{man → lib/bundler/man}/bundle-lock.1.ronn +0 -0
  62. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  63. data/bundler/{man → lib/bundler/man}/bundle-open.1.ronn +0 -0
  64. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  65. data/bundler/{man → lib/bundler/man}/bundle-outdated.1.ronn +0 -0
  66. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  67. data/bundler/{man → lib/bundler/man}/bundle-platform.1.ronn +0 -0
  68. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  69. data/bundler/{man → lib/bundler/man}/bundle-pristine.1.ronn +0 -0
  70. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  71. data/bundler/{man → lib/bundler/man}/bundle-remove.1.ronn +0 -0
  72. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  73. data/bundler/{man → lib/bundler/man}/bundle-show.1.ronn +0 -0
  74. data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
  75. data/bundler/{man → lib/bundler/man}/bundle-update.1.ronn +0 -0
  76. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  77. data/bundler/{man → lib/bundler/man}/bundle-viz.1.ronn +0 -0
  78. data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
  79. data/bundler/{man → lib/bundler/man}/bundle.1.ronn +0 -0
  80. data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
  81. data/bundler/{man → lib/bundler/man}/gemfile.5.ronn +0 -0
  82. data/bundler/lib/bundler/man/index.txt +25 -0
  83. data/bundler/lib/bundler/plugin/api/source.rb +1 -1
  84. data/bundler/lib/bundler/plugin/dsl.rb +1 -1
  85. data/bundler/lib/bundler/resolver.rb +25 -29
  86. data/bundler/lib/bundler/resolver/spec_group.rb +19 -25
  87. data/bundler/lib/bundler/rubygems_integration.rb +4 -6
  88. data/bundler/lib/bundler/settings.rb +0 -1
  89. data/bundler/lib/bundler/source/git/git_proxy.rb +28 -41
  90. data/bundler/lib/bundler/spec_set.rb +6 -8
  91. data/bundler/lib/bundler/stub_specification.rb +0 -2
  92. data/bundler/lib/bundler/templates/newgem/README.md.tt +0 -1
  93. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -2
  94. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -0
  95. data/bundler/lib/bundler/uri_credentials_filter.rb +2 -0
  96. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  97. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  98. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  99. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  100. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  101. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  102. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +12 -8
  103. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  104. data/bundler/lib/bundler/vendored_tmpdir.rb +4 -0
  105. data/bundler/lib/bundler/version.rb +1 -1
  106. data/lib/rubygems.rb +6 -2
  107. data/lib/rubygems/available_set.rb +1 -1
  108. data/lib/rubygems/command_manager.rb +2 -2
  109. data/lib/rubygems/commands/build_command.rb +37 -20
  110. data/lib/rubygems/commands/cert_command.rb +1 -1
  111. data/lib/rubygems/commands/help_command.rb +2 -0
  112. data/lib/rubygems/commands/owner_command.rb +10 -3
  113. data/lib/rubygems/commands/pristine_command.rb +1 -1
  114. data/lib/rubygems/commands/push_command.rb +7 -4
  115. data/lib/rubygems/commands/query_command.rb +17 -0
  116. data/lib/rubygems/commands/server_command.rb +4 -0
  117. data/lib/rubygems/commands/setup_command.rb +26 -90
  118. data/lib/rubygems/commands/sources_command.rb +6 -2
  119. data/lib/rubygems/commands/specification_command.rb +6 -0
  120. data/lib/rubygems/commands/yank_command.rb +4 -5
  121. data/lib/rubygems/core_ext/kernel_require.rb +3 -0
  122. data/lib/rubygems/core_ext/kernel_warn.rb +6 -7
  123. data/lib/rubygems/defaults.rb +2 -2
  124. data/lib/rubygems/dependency.rb +1 -1
  125. data/lib/rubygems/dependency_installer.rb +5 -3
  126. data/lib/rubygems/ext/builder.rb +16 -35
  127. data/lib/rubygems/ext/cmake_builder.rb +5 -6
  128. data/lib/rubygems/ext/configure_builder.rb +5 -6
  129. data/lib/rubygems/ext/ext_conf_builder.rb +19 -14
  130. data/lib/rubygems/ext/rake_builder.rb +4 -4
  131. data/lib/rubygems/gemcutter_utilities.rb +101 -20
  132. data/lib/rubygems/indexer.rb +0 -1
  133. data/lib/rubygems/install_update_options.rb +2 -2
  134. data/lib/rubygems/installer.rb +12 -32
  135. data/lib/rubygems/installer_test_case.rb +7 -6
  136. data/lib/rubygems/name_tuple.rb +1 -1
  137. data/lib/rubygems/openssl.rb +4 -4
  138. data/lib/rubygems/package.rb +3 -2
  139. data/lib/rubygems/package/tar_header.rb +1 -1
  140. data/lib/rubygems/package/tar_test_case.rb +1 -1
  141. data/lib/rubygems/platform.rb +18 -7
  142. data/lib/rubygems/query_utils.rb +0 -9
  143. data/lib/rubygems/remote_fetcher.rb +5 -4
  144. data/lib/rubygems/request.rb +4 -3
  145. data/lib/rubygems/request_set.rb +2 -13
  146. data/lib/rubygems/request_set/gem_dependency_api.rb +4 -4
  147. data/lib/rubygems/requirement.rb +1 -1
  148. data/lib/rubygems/resolver.rb +7 -2
  149. data/lib/rubygems/resolver/activation_request.rb +9 -1
  150. data/lib/rubygems/resolver/api_set.rb +29 -20
  151. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  152. data/lib/rubygems/resolver/api_specification.rb +8 -3
  153. data/lib/rubygems/resolver/best_set.rb +2 -2
  154. data/lib/rubygems/resolver/conflict.rb +1 -1
  155. data/lib/rubygems/resolver/dependency_request.rb +1 -1
  156. data/lib/rubygems/resolver/index_specification.rb +29 -0
  157. data/lib/rubygems/resolver/installer_set.rb +58 -9
  158. data/lib/rubygems/resolver/lock_set.rb +1 -1
  159. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  160. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  161. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  162. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +39 -5
  163. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  164. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -1
  165. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -1
  166. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +2 -1
  167. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +2 -1
  168. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +7 -6
  169. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -1
  170. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +4 -3
  171. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +43 -10
  172. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +75 -7
  173. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  174. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  175. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  176. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +506 -165
  177. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  178. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +8 -4
  179. data/lib/rubygems/resolver/spec_specification.rb +14 -0
  180. data/lib/rubygems/resolver/specification.rb +13 -1
  181. data/lib/rubygems/s3_uri_signer.rb +1 -1
  182. data/lib/rubygems/security.rb +1 -2
  183. data/lib/rubygems/security/policy.rb +1 -1
  184. data/lib/rubygems/security/signer.rb +1 -1
  185. data/lib/rubygems/server.rb +7 -2
  186. data/lib/rubygems/source.rb +20 -9
  187. data/lib/rubygems/spec_fetcher.rb +1 -1
  188. data/lib/rubygems/specification.rb +8 -8
  189. data/lib/rubygems/ssl_certs/{index.rubygems.org → rubygems.org}/GlobalSignRootCA.pem +0 -0
  190. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  191. data/lib/rubygems/stub_specification.rb +1 -1
  192. data/lib/rubygems/test_case.rb +14 -27
  193. data/lib/rubygems/test_utilities.rb +6 -5
  194. data/lib/rubygems/uri_formatter.rb +2 -1
  195. data/lib/rubygems/version_option.rb +6 -0
  196. data/rubygems-update.gemspec +2 -2
  197. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  198. data/test/rubygems/test_bundled_ca.rb +9 -5
  199. data/test/rubygems/test_gem.rb +3 -3
  200. data/test/rubygems/test_gem_commands_build_command.rb +197 -5
  201. data/test/rubygems/test_gem_commands_cert_command.rb +2 -2
  202. data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -1
  203. data/test/rubygems/test_gem_commands_contents_command.rb +2 -2
  204. data/test/rubygems/test_gem_commands_help_command.rb +15 -2
  205. data/test/rubygems/test_gem_commands_install_command.rb +132 -1
  206. data/test/rubygems/test_gem_commands_owner_command.rb +49 -1
  207. data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
  208. data/test/rubygems/test_gem_commands_push_command.rb +70 -5
  209. data/test/rubygems/test_gem_commands_query_command.rb +3 -3
  210. data/test/rubygems/test_gem_commands_setup_command.rb +20 -48
  211. data/test/rubygems/test_gem_commands_signin_command.rb +27 -3
  212. data/test/rubygems/test_gem_commands_sources_command.rb +60 -0
  213. data/test/rubygems/test_gem_commands_specification_command.rb +28 -0
  214. data/test/rubygems/test_gem_commands_update_command.rb +2 -2
  215. data/test/rubygems/test_gem_commands_yank_command.rb +31 -1
  216. data/test/rubygems/test_gem_dependency_installer.rb +63 -49
  217. data/test/rubygems/test_gem_dependency_list.rb +2 -2
  218. data/test/rubygems/test_gem_ext_builder.rb +16 -20
  219. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -13
  220. data/test/rubygems/test_gem_ext_configure_builder.rb +5 -11
  221. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +9 -26
  222. data/test/rubygems/test_gem_ext_rake_builder.rb +30 -13
  223. data/test/rubygems/test_gem_gem_runner.rb +5 -4
  224. data/test/rubygems/test_gem_gemcutter_utilities.rb +3 -3
  225. data/test/rubygems/test_gem_install_update_options.rb +15 -3
  226. data/test/rubygems/test_gem_installer.rb +80 -71
  227. data/test/rubygems/test_gem_package.rb +8 -8
  228. data/test/rubygems/test_gem_package_old.rb +4 -4
  229. data/test/rubygems/test_gem_package_tar_writer.rb +1 -1
  230. data/test/rubygems/test_gem_platform.rb +63 -4
  231. data/test/rubygems/test_gem_remote_fetcher.rb +15 -19
  232. data/test/rubygems/test_gem_request.rb +2 -2
  233. data/test/rubygems/test_gem_request_set_lockfile.rb +4 -4
  234. data/test/rubygems/test_gem_resolver_api_set.rb +58 -55
  235. data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
  236. data/test/rubygems/test_gem_resolver_best_set.rb +26 -3
  237. data/test/rubygems/test_gem_resolver_conflict.rb +1 -1
  238. data/test/rubygems/test_gem_resolver_vendor_set.rb +1 -1
  239. data/test/rubygems/test_gem_security.rb +2 -2
  240. data/test/rubygems/test_gem_security_policy.rb +2 -2
  241. data/test/rubygems/test_gem_security_signer.rb +2 -2
  242. data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
  243. data/test/rubygems/test_gem_source.rb +7 -2
  244. data/test/rubygems/test_gem_source_subpath_problem.rb +49 -0
  245. data/test/rubygems/test_gem_specification.rb +6 -7
  246. data/test/rubygems/test_gem_uninstaller.rb +7 -7
  247. data/test/rubygems/test_gem_validator.rb +1 -1
  248. data/test/rubygems/test_gem_version_option.rb +1 -1
  249. data/test/rubygems/test_require.rb +50 -9
  250. data/test/test_changelog_generator.rb +17 -0
  251. metadata +69 -86
  252. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  253. data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  254. data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
@@ -72,7 +72,7 @@ in the upcoming 3 version.
72
72
  reference to develop their own plugins. The plugin will contain the same code
73
73
  as the old core command, the only difference being that the command is now
74
74
  implemented as `bundle graph` which is much easier to understand. However, the
75
- details of the plugin are under discussion. See [#7041](https://github.com/rubygems/bundler/issues/7041).
75
+ details of the plugin are under discussion. See [#3333](https://github.com/rubygems/rubygems/issues/3333).
76
76
 
77
77
  * The `bundle console` will be removed and replaced with `bin/console`.
78
78
 
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.required_ruby_version = ">= 2.3.0"
35
35
  s.required_rubygems_version = ">= 2.5.2"
36
36
 
37
- s.files = Dir.glob("{lib,man,exe}/**/*", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
37
+ s.files = Dir.glob("{lib,exe}/**/*", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
38
38
 
39
39
  # Include the CHANGELOG.md, LICENSE.md, README.md manually
40
40
  s.files += %w[CHANGELOG.md LICENSE.md README.md]
@@ -212,6 +212,12 @@ module Bundler
212
212
  end
213
213
  end
214
214
 
215
+ def most_specific_locked_platform?(platform)
216
+ return false unless defined?(@definition) && @definition
217
+
218
+ definition.most_specific_locked_platform == platform
219
+ end
220
+
215
221
  def ruby_scope
216
222
  "#{Bundler.rubygems.ruby_engine}/#{RbConfig::CONFIG["ruby_version"]}"
217
223
  end
@@ -602,6 +608,11 @@ EOF
602
608
  reset_rubygems!
603
609
  end
604
610
 
611
+ def reset_settings_and_root!
612
+ @settings = nil
613
+ @root = nil
614
+ end
615
+
605
616
  def reset_paths!
606
617
  @bin_path = nil
607
618
  @bundler_major_version = nil
@@ -4,8 +4,8 @@ module Bundler
4
4
  # Represents metadata from when the Bundler gem was built.
5
5
  module BuildMetadata
6
6
  # begin ivars
7
- @built_at = "2020-10-08".freeze
8
- @git_commit_sha = "948b579edc".freeze
7
+ @built_at = "2020-12-31".freeze
8
+ @git_commit_sha = "529e536f28".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -57,7 +57,7 @@ module Bundler
57
57
  custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
58
58
  if custom_gemfile && !custom_gemfile.empty?
59
59
  Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
60
- Bundler.reset_paths!
60
+ Bundler.reset_settings_and_root!
61
61
  end
62
62
 
63
63
  Bundler.settings.set_command_option_if_given :retry, options[:retry]
@@ -122,9 +122,7 @@ module Bundler
122
122
  else command = "bundle-#{cli}"
123
123
  end
124
124
 
125
- man_path = File.expand_path("../../../man", __FILE__)
126
- # man files are located under ruby's mandir with the default gems of bundler
127
- man_path = RbConfig::CONFIG["mandir"] unless File.directory?(man_path)
125
+ man_path = File.expand_path("man", __dir__)
128
126
  man_pages = Hash[Dir.glob(File.join(man_path, "**", "*")).grep(/.*\.\d*\Z/).collect do |f|
129
127
  [File.basename(f, ".*"), f]
130
128
  end]
@@ -134,7 +132,7 @@ module Bundler
134
132
  if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+}
135
133
  Kernel.exec "man #{man_page}"
136
134
  else
137
- puts File.read("#{File.dirname(man_page)}/#{File.basename(man_page)}.ronn")
135
+ puts File.read("#{man_path}/#{File.basename(man_page)}.ronn")
138
136
  end
139
137
  elsif command_path = Bundler.which("bundler-#{cli}")
140
138
  Kernel.exec(command_path, "--help")
@@ -380,6 +378,8 @@ module Bundler
380
378
  "Make binstubs that can work without the Bundler runtime"
381
379
  method_option "all", :type => :boolean, :banner =>
382
380
  "Install binstubs for all gems"
381
+ method_option "all-platforms", :type => :boolean, :default => false, :banner =>
382
+ "Install binstubs for all platforms"
383
383
  def binstubs(*gems)
384
384
  require_relative "cli/binstubs"
385
385
  Binstubs.new(options, gems).run
@@ -16,7 +16,11 @@ module Bundler
16
16
  Bundler.settings.set_command_option_if_given :shebang, options["shebang"]
17
17
  installer = Installer.new(Bundler.root, Bundler.definition)
18
18
 
19
- installer_opts = { :force => options[:force], :binstubs_cmd => true }
19
+ installer_opts = {
20
+ :force => options[:force],
21
+ :binstubs_cmd => true,
22
+ :all_platforms => options["all-platforms"],
23
+ }
20
24
 
21
25
  if options[:all]
22
26
  raise InvalidOption, "Cannot specify --all with specific gems" unless gems.empty?
@@ -38,7 +42,7 @@ module Bundler
38
42
  if options[:standalone]
39
43
  next Bundler.ui.warn("Sorry, Bundler can only be run via RubyGems.") if gem_name == "bundler"
40
44
  Bundler.settings.temporary(:path => (Bundler.settings[:path] || Bundler.root)) do
41
- installer.generate_standalone_bundler_executable_stubs(spec)
45
+ installer.generate_standalone_bundler_executable_stubs(spec, installer_opts)
42
46
  end
43
47
  else
44
48
  installer.generate_bundler_executable_stubs(spec, installer_opts)
@@ -63,10 +63,10 @@ module Bundler
63
63
  Kernel.load(file)
64
64
  rescue SystemExit, SignalException
65
65
  raise
66
- rescue Exception => e # rubocop:disable Lint/RescueException
66
+ rescue Exception # rubocop:disable Lint/RescueException
67
67
  Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})"
68
- backtrace = e.backtrace ? e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) } : []
69
- abort "#{e.class}: #{e.message}\n #{backtrace.join("\n ")}"
68
+ Bundler::FriendlyErrors.disable!
69
+ raise
70
70
  end
71
71
 
72
72
  def process_title(file, args)
@@ -152,18 +152,27 @@ module Bundler
152
152
 
153
153
  check_for_group_conflicts_in_cli_options
154
154
 
155
+ Bundler.settings.set_command_option :with, nil if options[:with] == []
156
+ Bundler.settings.set_command_option :without, nil if options[:without] == []
157
+
155
158
  with = options.fetch(:with, [])
156
159
  with |= Bundler.settings[:with].map(&:to_s)
157
160
  with -= options[:without] if options[:without]
158
- with = nil if options[:with] == []
159
161
 
160
162
  without = options.fetch(:without, [])
161
163
  without |= Bundler.settings[:without].map(&:to_s)
162
164
  without -= options[:with] if options[:with]
163
- without = nil if options[:without] == []
164
165
 
165
- Bundler.settings.set_command_option :without, without
166
- Bundler.settings.set_command_option :with, with
166
+ options[:with] = with
167
+ options[:without] = without
168
+
169
+ unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
170
+ # need to nil them out first to get around validation for backwards compatibility
171
+ Bundler.settings.set_command_option :without, nil
172
+ Bundler.settings.set_command_option :with, nil
173
+ Bundler.settings.set_command_option :without, options[:without] - options[:with]
174
+ Bundler.settings.set_command_option :with, options[:with]
175
+ end
167
176
  end
168
177
 
169
178
  def normalize_settings
@@ -190,7 +199,7 @@ module Bundler
190
199
 
191
200
  Bundler.settings.set_command_option_if_given :clean, options["clean"]
192
201
 
193
- normalize_groups if options[:without] || options[:with]
202
+ normalize_groups
194
203
 
195
204
  options[:force] = options[:redownload]
196
205
  end
@@ -146,8 +146,6 @@ module Bundler
146
146
  end
147
147
 
148
148
  def retrieve_active_spec(definition, current_spec)
149
- return unless current_spec.match_platform(Bundler.local_platform)
150
-
151
149
  if strict
152
150
  active_spec = definition.find_resolved_spec(current_spec)
153
151
  else
@@ -82,7 +82,7 @@ module Bundler
82
82
  locked_spec = locked_info[:spec]
83
83
  new_spec = Bundler.definition.specs[name].first
84
84
  unless new_spec
85
- if Bundler.rubygems.platforms.none? {|p| locked_spec.match_platform(p) }
85
+ unless locked_spec.match_platform(Bundler.local_platform)
86
86
  Bundler.ui.warn "Bundler attempted to update #{name} but it was not considered because it is for a different platform from the current one"
87
87
  end
88
88
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "gem_parser"
4
+
3
5
  module Bundler
4
6
  class CompactIndexClient
5
7
  class Cache
@@ -92,19 +94,9 @@ module Bundler
92
94
  header ? lines[header + 1..-1] : lines
93
95
  end
94
96
 
95
- def parse_gem(string)
96
- version_and_platform, rest = string.split(" ", 2)
97
- version, platform = version_and_platform.split("-", 2)
98
- dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
99
- dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
100
- requirements = requirements ? requirements.map {|r| parse_dependency(r) } : []
101
- [version, platform, dependencies, requirements]
102
- end
103
-
104
- def parse_dependency(string)
105
- dependency = string.split(":")
106
- dependency[-1] = dependency[-1].split("&") if dependency.size > 1
107
- dependency
97
+ def parse_gem(line)
98
+ @dependency_parser ||= GemParser.new
99
+ @dependency_parser.parse(line)
108
100
  end
109
101
 
110
102
  def info_roots
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CompactIndexClient
5
+ if defined?(Gem::Resolver::APISet::GemParser)
6
+ GemParser = Gem::Resolver::APISet::GemParser
7
+ else
8
+ class GemParser
9
+ def parse(line)
10
+ version_and_platform, rest = line.split(" ", 2)
11
+ version, platform = version_and_platform.split("-", 2)
12
+ dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
13
+ dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
14
+ requirements = requirements ? requirements.map {|d| parse_dependency(d) } : []
15
+ [version, platform, dependencies, requirements]
16
+ end
17
+
18
+ private
19
+
20
+ def parse_dependency(string)
21
+ dependency = string.split(":")
22
+ dependency[-1] = dependency[-1].split("&") if dependency.size > 1
23
+ dependency
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -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)
@@ -118,7 +118,7 @@ module Bundler
118
118
  end
119
119
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
120
120
 
121
- add_platforms unless Bundler.frozen_bundle?
121
+ add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
122
122
 
123
123
  converge_path_sources_to_gemspec_sources
124
124
  @path_changes = converge_paths
@@ -157,7 +157,7 @@ module Bundler
157
157
  end
158
158
 
159
159
  def resolve_remotely!
160
- raise "Specs already loaded" if @specs
160
+ return if @specs
161
161
  @remote = true
162
162
  sources.remote!
163
163
  specs
@@ -269,6 +269,7 @@ module Bundler
269
269
  else
270
270
  # Run a resolve against the locally available gems
271
271
  Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
272
+ expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, @remote)
272
273
  last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
273
274
  end
274
275
 
@@ -505,15 +506,11 @@ module Bundler
505
506
  end
506
507
 
507
508
  def validate_platforms!
508
- return if @platforms.any? do |bundle_platform|
509
- Bundler.rubygems.platforms.any? do |local_platform|
510
- MatchPlatform.platforms_match?(bundle_platform, local_platform)
511
- end
512
- end
509
+ return if current_platform_locked?
513
510
 
514
511
  raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
515
- "but your local platforms are #{Bundler.rubygems.platforms.map(&:to_s)}, and " \
516
- "there's no compatible match between those two lists."
512
+ "but your local platform is #{Bundler.local_platform}. " \
513
+ "Add the current platform to the lockfile with `bundle lock --add-platform #{Bundler.local_platform}` and try again."
517
514
  end
518
515
 
519
516
  def add_platform(platform)
@@ -526,6 +523,12 @@ module Bundler
526
523
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
527
524
  end
528
525
 
526
+ def most_specific_locked_platform
527
+ @platforms.min_by do |bundle_platform|
528
+ platform_specificity_match(bundle_platform, local_platform)
529
+ end
530
+ end
531
+
529
532
  def find_resolved_spec(current_spec)
530
533
  specs.find_by_name_and_platform(current_spec.name, current_spec.platform)
531
534
  end
@@ -547,19 +550,22 @@ module Bundler
547
550
 
548
551
  private
549
552
 
550
- def add_platforms
551
- (@dependencies.flat_map(&:expanded_platforms) + current_platforms).uniq.each do |platform|
552
- add_platform(platform)
553
- end
553
+ def current_ruby_platform_locked?
554
+ return false unless generic_local_platform == Gem::Platform::RUBY
555
+
556
+ current_platform_locked?
554
557
  end
555
558
 
556
- def current_platforms
557
- [].tap do |platforms|
558
- platforms << local_platform if Bundler.feature_flag.specific_platform?
559
- platforms << generic_local_platform
559
+ def current_platform_locked?
560
+ @platforms.any? do |bundle_platform|
561
+ MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
560
562
  end
561
563
  end
562
564
 
565
+ def add_current_platform
566
+ add_platform(local_platform)
567
+ end
568
+
563
569
  def change_reason
564
570
  if unlocking?
565
571
  unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v|
@@ -852,14 +858,6 @@ module Bundler
852
858
  @locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
853
859
  end
854
860
 
855
- # This list of dependencies is only used in #resolve, so it's OK to add
856
- # the metadata dependencies here
857
- def expanded_dependencies
858
- @expanded_dependencies ||= begin
859
- expand_dependencies(dependencies + metadata_dependencies, @remote)
860
- end
861
- end
862
-
863
861
  def metadata_dependencies
864
862
  @metadata_dependencies ||= begin
865
863
  ruby_versions = ruby_version_requirements(@ruby_version)
@@ -96,9 +96,11 @@ module Bundler
96
96
  def gem_platforms(valid_platforms)
97
97
  return valid_platforms if @platforms.empty?
98
98
 
99
+ valid_generic_platforms = valid_platforms.map {|p| [p, GemHelpers.generic(p)] }.to_h
99
100
  @gem_platforms ||= expanded_platforms.compact.uniq
100
101
 
101
- valid_platforms & @gem_platforms
102
+ filtered_generic_platforms = valid_generic_platforms.values & @gem_platforms
103
+ valid_generic_platforms.select {|_, v| filtered_generic_platforms.include?(v) }.keys
102
104
  end
103
105
 
104
106
  def expanded_platforms
@@ -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)
@@ -41,7 +41,6 @@ module Bundler
41
41
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
42
42
  settings_flag(:print_only_version_number) { bundler_3_mode? }
43
43
  settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
44
- settings_flag(:specific_platform) { bundler_3_mode? }
45
44
  settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
46
45
  settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
47
46
  settings_flag(:update_requires_all_flag) { bundler_4_mode? }
@@ -8,7 +8,7 @@ module Bundler
8
8
  class Index < Base
9
9
  def specs(_gem_names)
10
10
  Bundler.rubygems.fetch_all_remote_specs(remote)
11
- rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError, Net::HTTPFatalError => e
11
+ rescue Gem::RemoteFetcher::FetchError => e
12
12
  case e.message
13
13
  when /certificate verify failed/
14
14
  raise CertificateFailureError.new(display_uri)
@@ -19,8 +19,7 @@ module Bundler
19
19
  raise BadAuthenticationError, remote_uri if remote_uri.userinfo
20
20
  raise AuthenticationRequiredError, remote_uri
21
21
  else
22
- Bundler.ui.trace e
23
- raise HTTPError, "Could not fetch specs from #{display_uri}"
22
+ raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
24
23
  end
25
24
  end
26
25
 
@@ -6,6 +6,18 @@ module Bundler
6
6
  module FriendlyErrors
7
7
  module_function
8
8
 
9
+ def enable!
10
+ @disabled = false
11
+ end
12
+
13
+ def disabled?
14
+ @disabled
15
+ end
16
+
17
+ def disable!
18
+ @disabled = true
19
+ end
20
+
9
21
  def log_error(error)
10
22
  case error
11
23
  when YamlSyntaxError
@@ -114,10 +126,13 @@ module Bundler
114
126
  end
115
127
 
116
128
  def self.with_friendly_errors
129
+ FriendlyErrors.enable!
117
130
  yield
118
131
  rescue SignalException
119
132
  raise
120
133
  rescue Exception => e # rubocop:disable Lint/RescueException
134
+ raise if FriendlyErrors.disabled?
135
+
121
136
  FriendlyErrors.log_error(e)
122
137
  exit FriendlyErrors.exit_status(e)
123
138
  end