rubygems-update 3.5.5 → 3.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +606 -1
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +114 -73
  5. data/README.md +16 -11
  6. data/bundler/CHANGELOG.md +506 -6
  7. data/bundler/README.md +2 -2
  8. data/bundler/bundler.gemspec +2 -2
  9. data/bundler/lib/bundler/build_metadata.rb +2 -2
  10. data/bundler/lib/bundler/checksum.rb +22 -12
  11. data/bundler/lib/bundler/cli/add.rb +3 -1
  12. data/bundler/lib/bundler/cli/binstubs.rb +1 -1
  13. data/bundler/lib/bundler/cli/check.rb +3 -3
  14. data/bundler/lib/bundler/cli/console.rb +8 -10
  15. data/bundler/lib/bundler/cli/doctor/diagnose.rb +167 -0
  16. data/bundler/lib/bundler/cli/doctor/ssl.rb +249 -0
  17. data/bundler/lib/bundler/cli/doctor.rb +27 -151
  18. data/bundler/lib/bundler/cli/exec.rb +1 -0
  19. data/bundler/lib/bundler/cli/fund.rb +1 -1
  20. data/bundler/lib/bundler/cli/gem.rb +13 -17
  21. data/bundler/lib/bundler/cli/info.rb +6 -6
  22. data/bundler/lib/bundler/cli/inject.rb +3 -3
  23. data/bundler/lib/bundler/cli/install.rb +14 -5
  24. data/bundler/lib/bundler/cli/issue.rb +3 -3
  25. data/bundler/lib/bundler/cli/lock.rb +32 -11
  26. data/bundler/lib/bundler/cli/outdated.rb +22 -22
  27. data/bundler/lib/bundler/cli/plugin.rb +3 -2
  28. data/bundler/lib/bundler/cli/pristine.rb +1 -1
  29. data/bundler/lib/bundler/cli/show.rb +3 -3
  30. data/bundler/lib/bundler/cli.rb +51 -107
  31. data/bundler/lib/bundler/compact_index_client/cache.rb +48 -73
  32. data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -5
  33. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  34. data/bundler/lib/bundler/compact_index_client/updater.rb +2 -12
  35. data/bundler/lib/bundler/compact_index_client.rb +51 -80
  36. data/bundler/lib/bundler/constants.rb +8 -1
  37. data/bundler/lib/bundler/current_ruby.rb +23 -33
  38. data/bundler/lib/bundler/definition.rb +485 -313
  39. data/bundler/lib/bundler/dependency.rb +92 -46
  40. data/bundler/lib/bundler/dsl.rb +135 -101
  41. data/bundler/lib/bundler/endpoint_specification.rb +30 -3
  42. data/bundler/lib/bundler/env.rb +1 -1
  43. data/bundler/lib/bundler/environment_preserver.rb +5 -23
  44. data/bundler/lib/bundler/errors.rb +53 -5
  45. data/bundler/lib/bundler/feature_flag.rb +3 -6
  46. data/bundler/lib/bundler/fetcher/compact_index.rb +16 -25
  47. data/bundler/lib/bundler/fetcher/downloader.rb +1 -1
  48. data/bundler/lib/bundler/fetcher.rb +14 -7
  49. data/bundler/lib/bundler/force_platform.rb +0 -2
  50. data/bundler/lib/bundler/friendly_errors.rb +1 -1
  51. data/bundler/lib/bundler/gem_helper.rb +1 -1
  52. data/bundler/lib/bundler/gem_helpers.rb +36 -19
  53. data/bundler/lib/bundler/gem_version_promoter.rb +42 -40
  54. data/bundler/lib/bundler/injector.rb +14 -16
  55. data/bundler/lib/bundler/inline.rb +42 -17
  56. data/bundler/lib/bundler/installer/gem_installer.rb +4 -3
  57. data/bundler/lib/bundler/installer/parallel_installer.rb +3 -2
  58. data/bundler/lib/bundler/installer/standalone.rb +2 -5
  59. data/bundler/lib/bundler/installer.rb +17 -41
  60. data/bundler/lib/bundler/lazy_specification.rb +117 -46
  61. data/bundler/lib/bundler/lockfile_generator.rb +1 -1
  62. data/bundler/lib/bundler/lockfile_parser.rb +18 -7
  63. data/bundler/lib/bundler/man/bundle-add.1 +44 -27
  64. data/bundler/lib/bundler/man/bundle-add.1.ronn +52 -23
  65. data/bundler/lib/bundler/man/bundle-binstubs.1 +9 -6
  66. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  67. data/bundler/lib/bundler/man/bundle-cache.1 +32 -4
  68. data/bundler/lib/bundler/man/bundle-cache.1.ronn +31 -2
  69. data/bundler/lib/bundler/man/bundle-check.1 +7 -5
  70. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  71. data/bundler/lib/bundler/man/bundle-clean.1 +3 -3
  72. data/bundler/lib/bundler/man/bundle-config.1 +11 -15
  73. data/bundler/lib/bundler/man/bundle-config.1.ronn +12 -15
  74. data/bundler/lib/bundler/man/bundle-console.1 +4 -6
  75. data/bundler/lib/bundler/man/bundle-console.1.ronn +2 -7
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -4
  77. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  78. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  79. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  80. data/bundler/lib/bundler/man/bundle-exec.1 +9 -6
  81. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -3
  82. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  83. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  84. data/bundler/lib/bundler/man/bundle-gem.1 +25 -7
  85. data/bundler/lib/bundler/man/bundle-gem.1.ronn +38 -6
  86. data/bundler/lib/bundler/man/bundle-help.1 +3 -3
  87. data/bundler/lib/bundler/man/bundle-info.1 +7 -4
  88. data/bundler/lib/bundler/man/bundle-info.1.ronn +6 -2
  89. data/bundler/lib/bundler/man/bundle-init.1 +5 -5
  90. data/bundler/lib/bundler/man/bundle-init.1.ronn +3 -2
  91. data/bundler/lib/bundler/man/bundle-inject.1 +12 -4
  92. data/bundler/lib/bundler/man/bundle-inject.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-install.1 +19 -16
  94. data/bundler/lib/bundler/man/bundle-install.1.ronn +24 -20
  95. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  96. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  97. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  98. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  99. data/bundler/lib/bundler/man/bundle-list.1 +3 -3
  100. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  101. data/bundler/lib/bundler/man/bundle-lock.1 +23 -8
  102. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  103. data/bundler/lib/bundler/man/bundle-open.1 +4 -4
  104. data/bundler/lib/bundler/man/bundle-open.1.ronn +2 -1
  105. data/bundler/lib/bundler/man/bundle-outdated.1 +10 -7
  106. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +8 -4
  107. data/bundler/lib/bundler/man/bundle-platform.1 +3 -3
  108. data/bundler/lib/bundler/man/bundle-plugin.1 +9 -6
  109. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +7 -3
  110. data/bundler/lib/bundler/man/bundle-pristine.1 +3 -3
  111. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  112. data/bundler/lib/bundler/man/bundle-remove.1 +3 -3
  113. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  114. data/bundler/lib/bundler/man/bundle-show.1 +7 -4
  115. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  116. data/bundler/lib/bundler/man/bundle-update.1 +15 -9
  117. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  118. data/bundler/lib/bundler/man/bundle-version.1 +3 -3
  119. data/bundler/lib/bundler/man/bundle-viz.1 +6 -6
  120. data/bundler/lib/bundler/man/bundle-viz.1.ronn +7 -3
  121. data/bundler/lib/bundler/man/bundle.1 +3 -3
  122. data/bundler/lib/bundler/man/gemfile.5 +7 -5
  123. data/bundler/lib/bundler/man/gemfile.5.ronn +8 -2
  124. data/bundler/lib/bundler/man/index.txt +4 -0
  125. data/bundler/lib/bundler/match_metadata.rb +13 -0
  126. data/bundler/lib/bundler/materialization.rb +59 -0
  127. data/bundler/lib/bundler/mirror.rb +3 -3
  128. data/bundler/lib/bundler/plugin/api/source.rb +5 -4
  129. data/bundler/lib/bundler/plugin/events.rb +24 -0
  130. data/bundler/lib/bundler/plugin/index.rb +5 -1
  131. data/bundler/lib/bundler/plugin/installer/path.rb +26 -0
  132. data/bundler/lib/bundler/plugin/installer.rb +37 -17
  133. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  134. data/bundler/lib/bundler/plugin.rb +21 -2
  135. data/bundler/lib/bundler/process_lock.rb +10 -14
  136. data/bundler/lib/bundler/remote_specification.rb +6 -1
  137. data/bundler/lib/bundler/resolver/base.rb +14 -3
  138. data/bundler/lib/bundler/resolver/candidate.rb +18 -27
  139. data/bundler/lib/bundler/resolver/package.rb +20 -3
  140. data/bundler/lib/bundler/resolver/spec_group.rb +22 -27
  141. data/bundler/lib/bundler/resolver/strategy.rb +40 -0
  142. data/bundler/lib/bundler/resolver.rb +114 -50
  143. data/bundler/lib/bundler/retry.rb +1 -1
  144. data/bundler/lib/bundler/ruby_dsl.rb +12 -3
  145. data/bundler/lib/bundler/ruby_version.rb +7 -1
  146. data/bundler/lib/bundler/rubygems_ext.rb +282 -125
  147. data/bundler/lib/bundler/rubygems_gem_installer.rb +40 -5
  148. data/bundler/lib/bundler/rubygems_integration.rb +29 -67
  149. data/bundler/lib/bundler/runtime.rb +48 -35
  150. data/bundler/lib/bundler/self_manager.rb +27 -7
  151. data/bundler/lib/bundler/settings.rb +32 -21
  152. data/bundler/lib/bundler/setup.rb +6 -0
  153. data/bundler/lib/bundler/shared_helpers.rb +39 -21
  154. data/bundler/lib/bundler/source/gemspec.rb +1 -4
  155. data/bundler/lib/bundler/source/git/git_proxy.rb +23 -6
  156. data/bundler/lib/bundler/source/git.rb +113 -41
  157. data/bundler/lib/bundler/source/metadata.rb +4 -3
  158. data/bundler/lib/bundler/source/path.rb +7 -18
  159. data/bundler/lib/bundler/source/rubygems/remote.rb +12 -4
  160. data/bundler/lib/bundler/source/rubygems.rb +54 -48
  161. data/bundler/lib/bundler/source.rb +2 -0
  162. data/bundler/lib/bundler/source_list.rb +53 -7
  163. data/bundler/lib/bundler/spec_set.rb +187 -88
  164. data/bundler/lib/bundler/stub_specification.rb +29 -2
  165. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  166. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -3
  167. data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
  168. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +15 -15
  169. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -7
  170. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  171. data/bundler/lib/bundler/ui/shell.rb +24 -2
  172. data/bundler/lib/bundler/ui/silent.rb +12 -1
  173. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  174. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  175. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  176. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  177. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +15 -13
  178. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +68 -30
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  184. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  185. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  186. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +3 -5
  187. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +11 -0
  188. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +1 -4
  189. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +2 -2
  190. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +2 -1
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +9 -9
  192. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
  193. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +5 -21
  194. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  195. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  196. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +11 -0
  197. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +43 -16
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +3 -3
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +1 -1
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +28 -37
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +2 -2
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -9
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +26 -3
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +9 -9
  207. data/bundler/lib/bundler/vendored_net_http.rb +20 -5
  208. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  209. data/bundler/lib/bundler/vendored_timeout.rb +7 -3
  210. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  211. data/bundler/lib/bundler/version.rb +1 -1
  212. data/bundler/lib/bundler/yaml_serializer.rb +12 -7
  213. data/bundler/lib/bundler.rb +89 -51
  214. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +10 -14
  215. data/{POLICIES.md → doc/rubygems/POLICIES.md} +81 -12
  216. data/exe/update_rubygems +1 -1
  217. data/lib/rubygems/basic_specification.rb +43 -10
  218. data/lib/rubygems/bundler_version_finder.rb +1 -1
  219. data/lib/rubygems/command.rb +1 -4
  220. data/lib/rubygems/command_manager.rb +5 -6
  221. data/lib/rubygems/commands/build_command.rb +2 -11
  222. data/lib/rubygems/commands/cleanup_command.rb +3 -13
  223. data/lib/rubygems/commands/contents_command.rb +17 -10
  224. data/lib/rubygems/commands/environment_command.rb +5 -0
  225. data/lib/rubygems/commands/exec_command.rb +18 -11
  226. data/lib/rubygems/commands/fetch_command.rb +14 -0
  227. data/lib/rubygems/commands/help_command.rb +2 -2
  228. data/lib/rubygems/commands/install_command.rb +0 -4
  229. data/lib/rubygems/commands/pristine_command.rb +30 -17
  230. data/lib/rubygems/commands/push_command.rb +31 -6
  231. data/lib/rubygems/commands/rdoc_command.rb +3 -10
  232. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  233. data/lib/rubygems/commands/setup_command.rb +11 -16
  234. data/lib/rubygems/commands/sources_command.rb +2 -2
  235. data/lib/rubygems/commands/uninstall_command.rb +9 -4
  236. data/lib/rubygems/commands/unpack_command.rb +0 -6
  237. data/lib/rubygems/commands/update_command.rb +10 -17
  238. data/lib/rubygems/config_file.rb +45 -16
  239. data/lib/rubygems/core_ext/kernel_warn.rb +2 -6
  240. data/lib/rubygems/defaults.rb +6 -6
  241. data/lib/rubygems/dependency.rb +12 -16
  242. data/lib/rubygems/dependency_list.rb +1 -1
  243. data/lib/rubygems/deprecate.rb +79 -77
  244. data/lib/rubygems/errors.rb +2 -1
  245. data/lib/rubygems/exceptions.rb +2 -9
  246. data/lib/rubygems/ext/builder.rb +21 -8
  247. data/lib/rubygems/ext/cargo_builder.rb +12 -26
  248. data/lib/rubygems/ext/cmake_builder.rb +7 -2
  249. data/lib/rubygems/ext/configure_builder.rb +7 -2
  250. data/lib/rubygems/ext/ext_conf_builder.rb +9 -5
  251. data/lib/rubygems/ext/rake_builder.rb +7 -4
  252. data/lib/rubygems/gem_runner.rb +9 -0
  253. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +1 -1
  254. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -1
  255. data/lib/rubygems/gemcutter_utilities.rb +52 -26
  256. data/lib/rubygems/gemspec_helpers.rb +19 -0
  257. data/lib/rubygems/install_update_options.rb +5 -0
  258. data/lib/rubygems/installer.rb +31 -40
  259. data/lib/rubygems/local_remote_options.rb +8 -8
  260. data/lib/rubygems/package/tar_header.rb +31 -4
  261. data/lib/rubygems/package/tar_reader/entry.rb +1 -5
  262. data/lib/rubygems/package/tar_writer.rb +5 -4
  263. data/lib/rubygems/package.rb +13 -8
  264. data/lib/rubygems/platform.rb +7 -5
  265. data/lib/rubygems/psych_tree.rb +4 -0
  266. data/lib/rubygems/query_utils.rb +2 -2
  267. data/lib/rubygems/rdoc.rb +16 -3
  268. data/lib/rubygems/remote_fetcher.rb +3 -4
  269. data/lib/rubygems/request.rb +5 -5
  270. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  271. data/lib/rubygems/request_set.rb +1 -1
  272. data/lib/rubygems/requirement.rb +16 -12
  273. data/lib/rubygems/resolver/activation_request.rb +1 -1
  274. data/lib/rubygems/resolver/api_set/gem_parser.rb +2 -5
  275. data/lib/rubygems/resolver/api_set.rb +13 -8
  276. data/lib/rubygems/resolver/best_set.rb +0 -28
  277. data/lib/rubygems/resolver/composed_set.rb +3 -3
  278. data/lib/rubygems/resolver/git_set.rb +0 -1
  279. data/lib/rubygems/resolver/index_set.rb +2 -2
  280. data/lib/rubygems/resolver/spec_specification.rb +7 -0
  281. data/lib/rubygems/resolver.rb +7 -7
  282. data/lib/rubygems/s3_uri_signer.rb +3 -3
  283. data/lib/rubygems/safe_marshal/reader.rb +31 -14
  284. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +29 -16
  285. data/lib/rubygems/safe_yaml.rb +10 -1
  286. data/lib/rubygems/security.rb +1 -1
  287. data/lib/rubygems/source/git.rb +22 -17
  288. data/lib/rubygems/source/installed.rb +3 -1
  289. data/lib/rubygems/source/local.rb +8 -4
  290. data/lib/rubygems/source/specific_file.rb +5 -3
  291. data/lib/rubygems/source.rb +10 -8
  292. data/lib/rubygems/source_list.rb +1 -1
  293. data/lib/rubygems/spec_fetcher.rb +47 -15
  294. data/lib/rubygems/specification.rb +107 -180
  295. data/lib/rubygems/specification_policy.rb +33 -13
  296. data/lib/rubygems/specification_record.rb +212 -0
  297. data/lib/rubygems/stub_specification.rb +32 -10
  298. data/lib/rubygems/target_rbconfig.rb +50 -0
  299. data/lib/rubygems/uninstaller.rb +42 -22
  300. data/lib/rubygems/uri.rb +6 -6
  301. data/lib/rubygems/util/licenses.rb +97 -1
  302. data/lib/rubygems/util.rb +1 -1
  303. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  304. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  305. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  306. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  307. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  308. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  309. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  310. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  311. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  312. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  313. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  314. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  315. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
  316. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  317. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  318. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
  319. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
  320. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
  321. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
  322. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
  323. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  324. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
  325. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +3 -3
  326. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
  327. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +35 -30
  328. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
  329. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
  330. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
  331. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +135 -51
  332. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
  333. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  334. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  335. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  336. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  337. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  338. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +158 -62
  339. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  340. data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +117 -49
  341. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  342. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  343. data/lib/rubygems/vendor/timeout/.document +1 -0
  344. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  345. data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +10 -11
  346. data/lib/rubygems/vendor/tsort/.document +1 -0
  347. data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
  348. data/lib/rubygems/vendor/uri/.document +1 -0
  349. data/lib/rubygems/vendor/uri/COPYING +56 -0
  350. data/lib/rubygems/vendor/uri/lib/uri/common.rb +880 -0
  351. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  352. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  353. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1579 -0
  354. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  355. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  356. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  357. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  358. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  359. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  360. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  361. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  362. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  363. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  364. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  365. data/lib/rubygems/vendored_molinillo.rb +3 -0
  366. data/lib/rubygems/vendored_net_http.rb +5 -0
  367. data/lib/rubygems/vendored_optparse.rb +3 -0
  368. data/lib/rubygems/vendored_securerandom.rb +3 -0
  369. data/lib/rubygems/vendored_timeout.rb +5 -0
  370. data/lib/rubygems/vendored_tsort.rb +3 -0
  371. data/lib/rubygems/version.rb +26 -9
  372. data/lib/rubygems/yaml_serializer.rb +12 -7
  373. data/lib/rubygems.rb +82 -47
  374. data/rubygems-update.gemspec +11 -6
  375. data/setup.rb +1 -1
  376. metadata +131 -86
  377. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +0 -32
  378. data/lib/rubygems/net/http.rb +0 -3
  379. data/lib/rubygems/net-http/LICENSE.txt +0 -22
  380. data/lib/rubygems/net-http/lib/net/http/backward.rb +0 -40
  381. data/lib/rubygems/net-protocol/LICENSE.txt +0 -22
  382. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  383. data/lib/rubygems/optparse.rb +0 -3
  384. data/lib/rubygems/resolv/LICENSE.txt +0 -22
  385. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  386. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  387. data/lib/rubygems/resolver/molinillo.rb +0 -3
  388. data/lib/rubygems/shellwords.rb +0 -3
  389. data/lib/rubygems/timeout/LICENSE.txt +0 -22
  390. data/lib/rubygems/timeout.rb +0 -3
  391. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  392. data/lib/rubygems/tsort.rb +0 -3
  393. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  394. /data/{lib/rubygems/net-http → bundler/lib/bundler/vendor/securerandom}/.document +0 -0
  395. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  396. /data/{bundler → doc/bundler}/UPGRADING.md +0 -0
  397. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  398. /data/lib/rubygems/{net-protocol → vendor/molinillo}/.document +0 -0
  399. /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
  400. /data/lib/rubygems/{optparse → vendor/net-http}/.document +0 -0
  401. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
  402. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
  403. /data/lib/rubygems/{resolv → vendor/net-protocol}/.document +0 -0
  404. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  405. /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
  406. /data/lib/rubygems/{resolver/molinillo → vendor/optparse}/.document +0 -0
  407. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  408. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  409. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  410. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  411. /data/lib/rubygems/{timeout → vendor/resolv}/.document +0 -0
  412. /data/lib/rubygems/{tsort → vendor/securerandom}/.document +0 -0
  413. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -15,41 +15,29 @@ module Bundler
15
15
  # considered separately.
16
16
  #
17
17
  # Some candidates may also keep some information explicitly about the
18
- # package the refer to. These candidates are referred to as "canonical" and
18
+ # package they refer to. These candidates are referred to as "canonical" and
19
19
  # are used when materializing resolution results back into RubyGems
20
- # specifications that can be installed, written to lock files, and so on.
20
+ # specifications that can be installed, written to lockfiles, and so on.
21
21
  #
22
22
  class Candidate
23
23
  include Comparable
24
24
 
25
25
  attr_reader :version
26
26
 
27
- def initialize(version, specs: [])
28
- @spec_group = Resolver::SpecGroup.new(specs)
27
+ def initialize(version, group: nil, priority: -1)
28
+ @spec_group = group || SpecGroup.new([])
29
29
  @version = Gem::Version.new(version)
30
- @ruby_only = specs.map(&:platform).uniq == [Gem::Platform::RUBY]
30
+ @priority = priority
31
31
  end
32
32
 
33
33
  def dependencies
34
34
  @spec_group.dependencies
35
35
  end
36
36
 
37
- def to_specs(package)
37
+ def to_specs(package, most_specific_locked_platform)
38
38
  return [] if package.meta?
39
39
 
40
- @spec_group.to_specs(package.force_ruby_platform?)
41
- end
42
-
43
- def generic!
44
- @ruby_only = true
45
-
46
- self
47
- end
48
-
49
- def platform_specific!
50
- @ruby_only = false
51
-
52
- self
40
+ @spec_group.to_specs(package.force_ruby_platform?, most_specific_locked_platform)
53
41
  end
54
42
 
55
43
  def prerelease?
@@ -60,35 +48,38 @@ module Bundler
60
48
  @version.segments
61
49
  end
62
50
 
63
- def sort_obj
64
- [@version, @ruby_only ? -1 : 1]
65
- end
66
-
67
51
  def <=>(other)
68
52
  return unless other.is_a?(self.class)
69
53
 
70
- sort_obj <=> other.sort_obj
54
+ version_comparison = version <=> other.version
55
+ return version_comparison unless version_comparison.zero?
56
+
57
+ priority <=> other.priority
71
58
  end
72
59
 
73
60
  def ==(other)
74
61
  return unless other.is_a?(self.class)
75
62
 
76
- sort_obj == other.sort_obj
63
+ version == other.version && priority == other.priority
77
64
  end
78
65
 
79
66
  def eql?(other)
80
67
  return unless other.is_a?(self.class)
81
68
 
82
- sort_obj.eql?(other.sort_obj)
69
+ version.eql?(other.version) && priority.eql?(other.priority)
83
70
  end
84
71
 
85
72
  def hash
86
- sort_obj.hash
73
+ [@version, @priority].hash
87
74
  end
88
75
 
89
76
  def to_s
90
77
  @version.to_s
91
78
  end
79
+
80
+ protected
81
+
82
+ attr_reader :priority
92
83
  end
93
84
  end
94
85
  end
@@ -15,14 +15,23 @@ module Bundler
15
15
  class Package
16
16
  attr_reader :name, :platforms, :dependency, :locked_version
17
17
 
18
- def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, dependency: nil)
18
+ def initialize(name, platforms, locked_specs:, unlock:, prerelease: false, prefer_local: false, dependency: nil, new_platforms: [])
19
19
  @name = name
20
20
  @platforms = platforms
21
- @locked_version = locked_specs[name].first&.version
21
+ @locked_version = locked_specs.version_for(name)
22
22
  @unlock = unlock
23
23
  @dependency = dependency || Dependency.new(name, @locked_version)
24
24
  @top_level = !dependency.nil?
25
25
  @prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
26
+ @prefer_local = prefer_local
27
+ @new_platforms = new_platforms
28
+ end
29
+
30
+ def platform_specs(specs)
31
+ platforms.map do |platform|
32
+ prefer_locked = @new_platforms.include?(platform) ? false : !unlock?
33
+ GemHelpers.select_best_platform_match(specs, platform, prefer_locked: prefer_locked)
34
+ end
26
35
  end
27
36
 
28
37
  def to_s
@@ -50,7 +59,7 @@ module Bundler
50
59
  end
51
60
 
52
61
  def unlock?
53
- @unlock.empty? || @unlock.include?(name)
62
+ @unlock == true || @unlock.include?(name)
54
63
  end
55
64
 
56
65
  def ignores_prereleases?
@@ -65,6 +74,14 @@ module Bundler
65
74
  @prerelease = :consider_last
66
75
  end
67
76
 
77
+ def prefer_local?
78
+ @prefer_local
79
+ end
80
+
81
+ def consider_remote_versions!
82
+ @prefer_local = false
83
+ end
84
+
68
85
  def force_ruby_platform?
69
86
  @dependency.force_ruby_platform
70
87
  end
@@ -3,6 +3,8 @@
3
3
  module Bundler
4
4
  class Resolver
5
5
  class SpecGroup
6
+ attr_reader :specs
7
+
6
8
  def initialize(specs)
7
9
  @specs = specs
8
10
  end
@@ -23,10 +25,11 @@ module Bundler
23
25
  @source ||= exemplary_spec.source
24
26
  end
25
27
 
26
- def to_specs(force_ruby_platform)
28
+ def to_specs(force_ruby_platform, most_specific_locked_platform)
27
29
  @specs.map do |s|
28
30
  lazy_spec = LazySpecification.from_spec(s)
29
31
  lazy_spec.force_ruby_platform = force_ruby_platform
32
+ lazy_spec.most_specific_locked_platform = most_specific_locked_platform
30
33
  lazy_spec
31
34
  end
32
35
  end
@@ -36,43 +39,35 @@ module Bundler
36
39
  end
37
40
 
38
41
  def dependencies
39
- @dependencies ||= @specs.map do |spec|
40
- __dependencies(spec) + metadata_dependencies(spec)
41
- end.flatten.uniq
42
+ @dependencies ||= @specs.flat_map(&:expanded_dependencies).uniq.sort
42
43
  end
43
44
 
44
- protected
45
-
46
- def sorted_spec_names
47
- @sorted_spec_names ||= @specs.map(&:full_name).sort
45
+ def ==(other)
46
+ sorted_spec_names == other.sorted_spec_names
48
47
  end
49
48
 
50
- private
49
+ def merge(other)
50
+ return false unless equivalent?(other)
51
51
 
52
- def exemplary_spec
53
- @specs.first
54
- end
52
+ @specs |= other.specs
55
53
 
56
- def __dependencies(spec)
57
- dependencies = []
58
- spec.dependencies.each do |dep|
59
- next if dep.type == :development
60
- dependencies << Dependency.new(dep.name, dep.requirement)
61
- end
62
- dependencies
54
+ true
63
55
  end
64
56
 
65
- def metadata_dependencies(spec)
66
- [
67
- metadata_dependency("Ruby", spec.required_ruby_version),
68
- metadata_dependency("RubyGems", spec.required_rubygems_version),
69
- ].compact
57
+ protected
58
+
59
+ def sorted_spec_names
60
+ @specs.map(&:full_name).sort
70
61
  end
71
62
 
72
- def metadata_dependency(name, requirement)
73
- return if requirement.nil? || requirement.none?
63
+ private
64
+
65
+ def equivalent?(other)
66
+ name == other.name && version == other.version && source == other.source && dependencies == other.dependencies
67
+ end
74
68
 
75
- Dependency.new("#{name}\0", requirement)
69
+ def exemplary_spec
70
+ @specs.first
76
71
  end
77
72
  end
78
73
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Resolver
5
+ class Strategy
6
+ def initialize(source)
7
+ @source = source
8
+ end
9
+
10
+ def next_package_and_version(unsatisfied)
11
+ package, range = next_term_to_try_from(unsatisfied)
12
+
13
+ [package, most_preferred_version_of(package, range).first]
14
+ end
15
+
16
+ private
17
+
18
+ def next_term_to_try_from(unsatisfied)
19
+ unsatisfied.min_by do |package, range|
20
+ matching_versions = @source.versions_for(package, range)
21
+ higher_versions = @source.versions_for(package, range.upper_invert)
22
+
23
+ [matching_versions.count <= 1 ? 0 : 1, higher_versions.count]
24
+ end
25
+ end
26
+
27
+ def most_preferred_version_of(package, range)
28
+ versions = @source.versions_for(package, range)
29
+
30
+ # Conditional avoids (among other things) calling
31
+ # sort_versions_by_preferred with the root package
32
+ if versions.size > 1
33
+ @source.sort_versions_by_preferred(package, versions)
34
+ else
35
+ versions
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -12,13 +12,15 @@ module Bundler
12
12
  require_relative "resolver/candidate"
13
13
  require_relative "resolver/incompatibility"
14
14
  require_relative "resolver/root"
15
+ require_relative "resolver/strategy"
15
16
 
16
17
  include GemHelpers
17
18
 
18
- def initialize(base, gem_version_promoter)
19
+ def initialize(base, gem_version_promoter, most_specific_locked_platform = nil)
19
20
  @source_requirements = base.source_requirements
20
21
  @base = base
21
22
  @gem_version_promoter = gem_version_promoter
23
+ @most_specific_locked_platform = most_specific_locked_platform
22
24
  end
23
25
 
24
26
  def start
@@ -50,26 +52,26 @@ module Bundler
50
52
  specs[name] = matches.sort_by {|s| [s.version, s.platform.to_s] }
51
53
  end
52
54
 
55
+ @all_versions = Hash.new do |candidates, package|
56
+ candidates[package] = all_versions_for(package)
57
+ end
58
+
53
59
  @sorted_versions = Hash.new do |candidates, package|
54
- candidates[package] = if package.root?
55
- [root_version]
56
- else
57
- all_versions_for(package).sort
58
- end
60
+ candidates[package] = filtered_versions_for(package).sort
59
61
  end
60
62
 
63
+ @sorted_versions[root] = [root_version]
64
+
61
65
  root_dependencies = prepare_dependencies(@requirements, @packages)
62
66
 
63
67
  @cached_dependencies = Hash.new do |dependencies, package|
64
- dependencies[package] = if package.root?
65
- { root_version => root_dependencies }
66
- else
67
- Hash.new do |versions, version|
68
- versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
69
- end
68
+ dependencies[package] = Hash.new do |versions, version|
69
+ versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
70
70
  end
71
71
  end
72
72
 
73
+ @cached_dependencies[root] = { root_version => root_dependencies }
74
+
73
75
  logger = Bundler::UI::Shell.new
74
76
  logger.level = debug? ? "debug" : "warn"
75
77
 
@@ -77,15 +79,16 @@ module Bundler
77
79
  end
78
80
 
79
81
  def solve_versions(root:, logger:)
80
- solver = PubGrub::VersionSolver.new(source: self, root: root, logger: logger)
82
+ solver = PubGrub::VersionSolver.new(source: self, root: root, strategy: Strategy.new(self), logger: logger)
81
83
  result = solver.solve
82
- result.map {|package, version| version.to_specs(package) }.flatten.uniq
84
+ resolved_specs = result.flat_map {|package, version| version.to_specs(package, @most_specific_locked_platform) }
85
+ SpecSet.new(resolved_specs).specs_with_additional_variants_from(@base.locked_specs)
83
86
  rescue PubGrub::SolveFailure => e
84
87
  incompatibility = e.incompatibility
85
88
 
86
- names_to_unlock, names_to_allow_prereleases_for, extended_explanation = find_names_to_relax(incompatibility)
89
+ names_to_unlock, names_to_allow_prereleases_for, names_to_allow_remote_specs_for, extended_explanation = find_names_to_relax(incompatibility)
87
90
 
88
- names_to_relax = names_to_unlock + names_to_allow_prereleases_for
91
+ names_to_relax = names_to_unlock + names_to_allow_prereleases_for + names_to_allow_remote_specs_for
89
92
 
90
93
  if names_to_relax.any?
91
94
  if names_to_unlock.any?
@@ -95,11 +98,17 @@ module Bundler
95
98
  end
96
99
 
97
100
  if names_to_allow_prereleases_for.any?
98
- Bundler.ui.debug "Found conflicts with dependencies with prereleases. Will retrying considering prereleases for #{names_to_allow_prereleases_for.join(", ")}...", true
101
+ Bundler.ui.debug "Found conflicts with dependencies with prereleases. Will retry considering prereleases for #{names_to_allow_prereleases_for.join(", ")}...", true
99
102
 
100
103
  @base.include_prereleases(names_to_allow_prereleases_for)
101
104
  end
102
105
 
106
+ if names_to_allow_remote_specs_for.any?
107
+ Bundler.ui.debug "Found conflicts with local versions of #{names_to_allow_remote_specs_for.join(", ")}. Will retry considering remote versions...", true
108
+
109
+ @base.include_remote_specs(names_to_allow_remote_specs_for)
110
+ end
111
+
103
112
  root, logger = setup_solver
104
113
 
105
114
  Bundler.ui.debug "Retrying resolution...", true
@@ -119,6 +128,7 @@ module Bundler
119
128
  def find_names_to_relax(incompatibility)
120
129
  names_to_unlock = []
121
130
  names_to_allow_prereleases_for = []
131
+ names_to_allow_remote_specs_for = []
122
132
  extended_explanation = nil
123
133
 
124
134
  while incompatibility.conflict?
@@ -133,6 +143,8 @@ module Bundler
133
143
  names_to_unlock << name
134
144
  elsif package.ignores_prereleases? && @all_specs[name].any? {|s| s.version.prerelease? }
135
145
  names_to_allow_prereleases_for << name
146
+ elsif package.prefer_local? && @all_specs[name].any? {|s| !s.is_a?(StubSpecification) }
147
+ names_to_allow_remote_specs_for << name
136
148
  end
137
149
 
138
150
  no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(PubGrub::Incompatibility::NoVersions) }
@@ -142,7 +154,7 @@ module Bundler
142
154
  end
143
155
  end
144
156
 
145
- [names_to_unlock.uniq, names_to_allow_prereleases_for.uniq, extended_explanation]
157
+ [names_to_unlock.uniq, names_to_allow_prereleases_for.uniq, names_to_allow_remote_specs_for.uniq, extended_explanation]
146
158
  end
147
159
 
148
160
  def parse_dependency(package, dependency)
@@ -156,9 +168,7 @@ module Bundler
156
168
  end
157
169
 
158
170
  def versions_for(package, range=VersionRange.any)
159
- versions = range.select_versions(@sorted_versions[package])
160
-
161
- sort_versions(package, versions)
171
+ range.select_versions(@sorted_versions[package])
162
172
  end
163
173
 
164
174
  def no_versions_incompatibility_for(package, unsatisfied_term)
@@ -220,7 +230,7 @@ module Bundler
220
230
  sorted_versions[high]
221
231
  end
222
232
 
223
- range = PubGrub::VersionRange.new(min: low, max: high, include_min: true)
233
+ range = PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
224
234
 
225
235
  self_constraint = PubGrub::VersionConstraint.new(package, range: range)
226
236
 
@@ -237,7 +247,7 @@ module Bundler
237
247
 
238
248
  def all_versions_for(package)
239
249
  name = package.name
240
- results = (@base[name] + filter_prereleases(@all_specs[name], package)).uniq {|spec| [spec.version.hash, spec.platform] }
250
+ results = (@base[name] + filter_specs(@all_specs[name], package)).uniq {|spec| [spec.version.hash, spec.platform] }
241
251
 
242
252
  if name == "bundler" && !bundler_pinned_to_current_version?
243
253
  bundler_spec = Gem.loaded_specs["bundler"]
@@ -247,8 +257,8 @@ module Bundler
247
257
  locked_requirement = base_requirements[name]
248
258
  results = filter_matching_specs(results, locked_requirement) if locked_requirement
249
259
 
250
- versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)|
251
- platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) }
260
+ results.group_by(&:version).reduce([]) do |groups, (version, specs)|
261
+ platform_specs = package.platform_specs(specs)
252
262
 
253
263
  # If package is a top-level dependency,
254
264
  # candidate is only valid if there are matching versions for all resolution platforms.
@@ -263,19 +273,25 @@ module Bundler
263
273
  next groups if platform_specs.all?(&:empty?)
264
274
  end
265
275
 
266
- platform_specs.flatten!
267
-
268
276
  ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
269
- groups << Resolver::Candidate.new(version, specs: ruby_specs) if ruby_specs.any?
277
+ ruby_group = Resolver::SpecGroup.new(ruby_specs)
270
278
 
271
- next groups if platform_specs == ruby_specs || package.force_ruby_platform?
279
+ unless ruby_group.empty?
280
+ platform_specs.each do |s|
281
+ ruby_group.merge(Resolver::SpecGroup.new(s))
282
+ end
283
+
284
+ groups << Resolver::Candidate.new(version, group: ruby_group, priority: -1)
285
+ next groups if package.force_ruby_platform?
286
+ end
272
287
 
273
- groups << Resolver::Candidate.new(version, specs: platform_specs)
288
+ platform_group = Resolver::SpecGroup.new(platform_specs.flatten.uniq)
289
+ next groups if platform_group == ruby_group
290
+
291
+ groups << Resolver::Candidate.new(version, group: platform_group, priority: 1)
274
292
 
275
293
  groups
276
294
  end
277
-
278
- sort_versions(package, versions)
279
295
  end
280
296
 
281
297
  def source_for(name)
@@ -296,6 +312,16 @@ module Bundler
296
312
  "Gemfile"
297
313
  end
298
314
 
315
+ def raise_incomplete!(incomplete_specs)
316
+ raise_not_found!(@base.get_package(incomplete_specs.first.name))
317
+ end
318
+
319
+ def sort_versions_by_preferred(package, versions)
320
+ @gem_version_promoter.sort_versions(package, versions)
321
+ end
322
+
323
+ private
324
+
299
325
  def raise_not_found!(package)
300
326
  name = package.name
301
327
  source = source_for(name)
@@ -332,7 +358,20 @@ module Bundler
332
358
  raise GemNotFound, message
333
359
  end
334
360
 
335
- private
361
+ def filtered_versions_for(package)
362
+ @gem_version_promoter.filter_versions(package, @all_versions[package])
363
+ end
364
+
365
+ def raise_all_versions_filtered_out!(package)
366
+ level = @gem_version_promoter.level
367
+ name = package.name
368
+ locked_version = package.locked_version
369
+ requirement = package.dependency
370
+
371
+ raise GemNotFound,
372
+ "#{name} is locked to #{locked_version}, while Gemfile is requesting #{requirement}. " \
373
+ "--strict --#{level} was specified, but there are no #{level} level upgrades from #{locked_version} satisfying #{requirement}, so version solving has failed"
374
+ end
336
375
 
337
376
  def filter_matching_specs(specs, requirements)
338
377
  Array(requirements).flat_map do |requirement|
@@ -340,12 +379,31 @@ module Bundler
340
379
  end
341
380
  end
342
381
 
382
+ def filter_specs(specs, package)
383
+ filter_remote_specs(filter_prereleases(specs, package), package)
384
+ end
385
+
343
386
  def filter_prereleases(specs, package)
344
387
  return specs unless package.ignores_prereleases? && specs.size > 1
345
388
 
346
389
  specs.reject {|s| s.version.prerelease? }
347
390
  end
348
391
 
392
+ def filter_remote_specs(specs, package)
393
+ if package.prefer_local?
394
+ local_specs = specs.select {|s| s.is_a?(StubSpecification) }
395
+
396
+ if local_specs.empty?
397
+ package.consider_remote_versions!
398
+ specs
399
+ else
400
+ local_specs
401
+ end
402
+ else
403
+ specs
404
+ end
405
+ end
406
+
349
407
  # Ignore versions that depend on themselves incorrectly
350
408
  def filter_invalid_self_dependencies(specs, name)
351
409
  specs.reject do |s|
@@ -357,14 +415,6 @@ module Bundler
357
415
  requirement.satisfied_by?(spec.version) || spec.source.is_a?(Source::Gemspec)
358
416
  end
359
417
 
360
- def sort_versions(package, versions)
361
- if versions.size > 1
362
- @gem_version_promoter.sort_versions(package, versions).reverse
363
- else
364
- versions
365
- end
366
- end
367
-
368
418
  def repository_for(package)
369
419
  source_for(package.name)
370
420
  end
@@ -374,23 +424,37 @@ module Bundler
374
424
  end
375
425
 
376
426
  def prepare_dependencies(requirements, packages)
377
- to_dependency_hash(requirements, packages).map do |dep_package, dep_constraint|
427
+ to_dependency_hash(requirements, packages).filter_map do |dep_package, dep_constraint|
378
428
  name = dep_package.name
379
429
 
380
430
  next [dep_package, dep_constraint] if name == "bundler"
381
431
 
382
- versions = versions_for(dep_package, dep_constraint.range)
383
- if versions.empty? && dep_package.ignores_prereleases?
384
- @sorted_versions.delete(dep_package)
385
- dep_package.consider_prereleases!
386
- versions = versions_for(dep_package, dep_constraint.range)
432
+ dep_range = dep_constraint.range
433
+ versions = versions_for(dep_package, dep_range)
434
+ if versions.empty?
435
+ if dep_package.ignores_prereleases? || dep_package.prefer_local?
436
+ @all_versions.delete(dep_package)
437
+ @sorted_versions.delete(dep_package)
438
+ end
439
+ dep_package.consider_prereleases! if dep_package.ignores_prereleases?
440
+ dep_package.consider_remote_versions! if dep_package.prefer_local?
441
+ versions = versions_for(dep_package, dep_range)
442
+ end
443
+
444
+ if versions.empty? && select_all_versions(dep_package, dep_range).any?
445
+ raise_all_versions_filtered_out!(dep_package)
387
446
  end
447
+
388
448
  next [dep_package, dep_constraint] unless versions.empty?
389
449
 
390
450
  next unless dep_package.current_platform?
391
451
 
392
452
  raise_not_found!(dep_package)
393
- end.compact.to_h
453
+ end.to_h
454
+ end
455
+
456
+ def select_all_versions(package, range)
457
+ range.select_versions(@all_versions[package])
394
458
  end
395
459
 
396
460
  def other_specs_matching_message(specs, requirement)
@@ -401,8 +465,8 @@ module Bundler
401
465
 
402
466
  def requirement_to_range(requirement)
403
467
  ranges = requirement.requirements.map do |(op, version)|
404
- ver = Resolver::Candidate.new(version).generic!
405
- platform_ver = Resolver::Candidate.new(version).platform_specific!
468
+ ver = Resolver::Candidate.new(version, priority: -1)
469
+ platform_ver = Resolver::Candidate.new(version, priority: 1)
406
470
 
407
471
  case op
408
472
  when "~>"
@@ -50,7 +50,7 @@ module Bundler
50
50
  end
51
51
  return true unless name
52
52
  Bundler.ui.info "" unless Bundler.ui.debug? # Add new line in case dots preceded this
53
- Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
53
+ Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", true
54
54
  end
55
55
 
56
56
  def keep_trying?
@@ -42,9 +42,18 @@ module Bundler
42
42
  # Loads the file relative to the dirname of the Gemfile itself.
43
43
  def normalize_ruby_file(filename)
44
44
  file_content = Bundler.read_file(gemfile.dirname.join(filename))
45
- # match "ruby-3.2.2" or "ruby 3.2.2" capturing version string up to the first space or comment
46
- if /^ruby(-|\s+)([^\s#]+)/.match(file_content)
47
- $2
45
+ # match "ruby-3.2.2", ruby = "3.2.2" or "ruby 3.2.2" capturing version string up to the first space or comment
46
+ if /^ # Start of line
47
+ ruby # Literal "ruby"
48
+ [\s-]* # Optional whitespace or hyphens (for "ruby-3.2.2" format)
49
+ (?:=\s*)? # Optional equals sign with whitespace (for ruby = "3.2.2" format)
50
+ "? # Optional opening quote
51
+ ( # Start capturing group
52
+ [^\s#"]+ # One or more chars that aren't spaces, #, or quotes
53
+ ) # End capturing group
54
+ "? # Optional closing quote
55
+ /x.match(file_content)
56
+ $1
48
57
  else
49
58
  file_content.strip
50
59
  end
@@ -23,7 +23,13 @@ module Bundler
23
23
  # specified must match the version.
24
24
 
25
25
  @versions = Array(versions).map do |v|
26
- op, v = Gem::Requirement.parse(normalize_version(v))
26
+ normalized_v = normalize_version(v)
27
+
28
+ unless Gem::Requirement::PATTERN.match?(normalized_v)
29
+ raise InvalidArgumentError, "#{v} is not a valid requirement on the Ruby version"
30
+ end
31
+
32
+ op, v = Gem::Requirement.parse(normalized_v)
27
33
  op == "=" ? v.to_s : "#{op} #{v}"
28
34
  end
29
35