rubygems-update 3.3.18 → 3.4.19

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 (615) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1429 -1064
  3. data/CONTRIBUTING.md +31 -8
  4. data/Manifest.txt +61 -36
  5. data/POLICIES.md +55 -20
  6. data/README.md +19 -6
  7. data/bundler/CHANGELOG.md +457 -1
  8. data/bundler/README.md +3 -6
  9. data/bundler/UPGRADING.md +11 -4
  10. data/bundler/bundler.gemspec +8 -10
  11. data/bundler/exe/bundle +5 -16
  12. data/bundler/lib/bundler/build_metadata.rb +2 -2
  13. data/bundler/lib/bundler/cli/add.rb +1 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +2 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/info.rb +1 -1
  21. data/bundler/lib/bundler/cli/init.rb +6 -2
  22. data/bundler/lib/bundler/cli/install.rb +8 -6
  23. data/bundler/lib/bundler/cli/lock.rb +8 -5
  24. data/bundler/lib/bundler/cli/open.rb +6 -4
  25. data/bundler/lib/bundler/cli/outdated.rb +14 -7
  26. data/bundler/lib/bundler/cli/platform.rb +7 -5
  27. data/bundler/lib/bundler/cli/viz.rb +1 -1
  28. data/bundler/lib/bundler/cli.rb +53 -7
  29. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  30. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  31. data/bundler/lib/bundler/constants.rb +1 -1
  32. data/bundler/lib/bundler/current_ruby.rb +16 -5
  33. data/bundler/lib/bundler/definition.rb +262 -133
  34. data/bundler/lib/bundler/dependency.rb +20 -86
  35. data/bundler/lib/bundler/digest.rb +1 -1
  36. data/bundler/lib/bundler/dsl.rb +6 -7
  37. data/bundler/lib/bundler/endpoint_specification.rb +2 -13
  38. data/bundler/lib/bundler/env.rb +2 -2
  39. data/bundler/lib/bundler/environment_preserver.rb +3 -2
  40. data/bundler/lib/bundler/errors.rb +1 -11
  41. data/bundler/lib/bundler/feature_flag.rb +0 -2
  42. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -13
  43. data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
  44. data/bundler/lib/bundler/fetcher/downloader.rb +4 -5
  45. data/bundler/lib/bundler/fetcher/index.rb +1 -2
  46. data/bundler/lib/bundler/fetcher.rb +21 -15
  47. data/bundler/lib/bundler/force_platform.rb +18 -0
  48. data/bundler/lib/bundler/friendly_errors.rb +1 -4
  49. data/bundler/lib/bundler/gem_helper.rb +3 -4
  50. data/bundler/lib/bundler/gem_helpers.rb +7 -2
  51. data/bundler/lib/bundler/gem_version_promoter.rb +53 -98
  52. data/bundler/lib/bundler/graph.rb +3 -3
  53. data/bundler/lib/bundler/index.rb +13 -47
  54. data/bundler/lib/bundler/injector.rb +5 -4
  55. data/bundler/lib/bundler/inline.rb +9 -11
  56. data/bundler/lib/bundler/installer/parallel_installer.rb +4 -34
  57. data/bundler/lib/bundler/installer/standalone.rb +13 -9
  58. data/bundler/lib/bundler/installer.rb +17 -29
  59. data/bundler/lib/bundler/lazy_specification.rb +54 -53
  60. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  61. data/bundler/lib/bundler/lockfile_parser.rb +17 -16
  62. data/bundler/lib/bundler/man/bundle-add.1 +6 -2
  63. data/bundler/lib/bundler/man/bundle-add.1.ronn +4 -1
  64. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-cache.1 +9 -3
  66. data/bundler/lib/bundler/man/bundle-cache.1.ronn +9 -2
  67. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  68. data/bundler/lib/bundler/man/bundle-clean.1 +2 -2
  69. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  70. data/bundler/lib/bundler/man/bundle-config.1 +26 -10
  71. data/bundler/lib/bundler/man/bundle-config.1.ronn +17 -10
  72. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  73. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  74. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-exec.1 +6 -6
  76. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -6
  77. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  78. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  79. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  80. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  81. data/bundler/lib/bundler/man/bundle-info.1 +3 -3
  82. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  83. data/bundler/lib/bundler/man/bundle-init.1 +5 -1
  84. data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
  85. data/bundler/lib/bundler/man/bundle-inject.1 +5 -2
  86. data/bundler/lib/bundler/man/bundle-inject.1.ronn +3 -1
  87. data/bundler/lib/bundler/man/bundle-install.1 +5 -30
  88. data/bundler/lib/bundler/man/bundle-install.1.ronn +6 -29
  89. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  90. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  91. data/bundler/lib/bundler/man/bundle-open.1 +22 -2
  92. data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
  94. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  95. data/bundler/lib/bundler/man/bundle-platform.1 +16 -6
  96. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  97. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  98. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  99. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  100. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  101. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  102. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  103. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  104. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  105. data/bundler/lib/bundler/man/bundle-viz.1 +4 -1
  106. data/bundler/lib/bundler/man/bundle-viz.1.ronn +2 -0
  107. data/bundler/lib/bundler/man/bundle.1 +15 -10
  108. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  109. data/bundler/lib/bundler/man/gemfile.5 +55 -55
  110. data/bundler/lib/bundler/man/gemfile.5.ronn +57 -53
  111. data/bundler/lib/bundler/man/index.txt +4 -0
  112. data/bundler/lib/bundler/match_metadata.rb +13 -0
  113. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  114. data/bundler/lib/bundler/mirror.rb +5 -7
  115. data/bundler/lib/bundler/plugin/index.rb +5 -5
  116. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  117. data/bundler/lib/bundler/plugin/installer.rb +5 -2
  118. data/bundler/lib/bundler/plugin.rb +3 -1
  119. data/bundler/lib/bundler/remote_specification.rb +7 -12
  120. data/bundler/lib/bundler/resolver/base.rb +107 -0
  121. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  122. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  123. data/bundler/lib/bundler/resolver/package.rb +72 -0
  124. data/bundler/lib/bundler/resolver/root.rb +25 -0
  125. data/bundler/lib/bundler/resolver/spec_group.rb +42 -71
  126. data/bundler/lib/bundler/resolver.rb +335 -328
  127. data/bundler/lib/bundler/ruby_dsl.rb +7 -1
  128. data/bundler/lib/bundler/ruby_version.rb +8 -8
  129. data/bundler/lib/bundler/rubygems_ext.rb +100 -9
  130. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -14
  131. data/bundler/lib/bundler/rubygems_integration.rb +11 -15
  132. data/bundler/lib/bundler/runtime.rb +2 -6
  133. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  134. data/bundler/lib/bundler/settings.rb +5 -11
  135. data/bundler/lib/bundler/setup.rb +4 -1
  136. data/bundler/lib/bundler/shared_helpers.rb +3 -3
  137. data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
  138. data/bundler/lib/bundler/source/git.rb +55 -30
  139. data/bundler/lib/bundler/source/metadata.rb +1 -2
  140. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  141. data/bundler/lib/bundler/source/path.rb +6 -6
  142. data/bundler/lib/bundler/source/rubygems.rb +26 -81
  143. data/bundler/lib/bundler/source.rb +1 -1
  144. data/bundler/lib/bundler/source_list.rb +8 -2
  145. data/bundler/lib/bundler/spec_set.rb +60 -37
  146. data/bundler/lib/bundler/templates/Executable +1 -1
  147. data/bundler/lib/bundler/templates/Executable.bundler +5 -10
  148. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  149. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  150. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  151. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  152. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  153. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  154. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  155. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  156. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  157. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  158. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  159. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  160. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  161. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  162. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  163. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
  164. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  165. data/bundler/lib/bundler/ui/shell.rb +35 -12
  166. data/bundler/lib/bundler/ui/silent.rb +21 -5
  167. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  168. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  169. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  170. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  171. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
  172. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  173. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  174. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  175. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  176. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  177. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  178. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  184. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  185. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  186. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  187. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  188. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  189. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  190. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  192. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  193. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  194. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  195. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  196. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  197. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  207. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  208. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  209. data/bundler/lib/bundler/version.rb +5 -1
  210. data/bundler/lib/bundler/worker.rb +5 -7
  211. data/bundler/lib/bundler.rb +25 -77
  212. data/{bin → exe}/gem +4 -5
  213. data/{bin → exe}/update_rubygems +12 -10
  214. data/lib/rubygems/available_set.rb +4 -3
  215. data/lib/rubygems/basic_specification.rb +5 -4
  216. data/lib/rubygems/bundler_version_finder.rb +2 -2
  217. data/lib/rubygems/command.rb +41 -32
  218. data/lib/rubygems/command_manager.rb +30 -15
  219. data/lib/rubygems/commands/build_command.rb +12 -8
  220. data/lib/rubygems/commands/cert_command.rb +34 -33
  221. data/lib/rubygems/commands/check_command.rb +21 -20
  222. data/lib/rubygems/commands/cleanup_command.rb +18 -17
  223. data/lib/rubygems/commands/contents_command.rb +14 -13
  224. data/lib/rubygems/commands/dependency_command.rb +17 -16
  225. data/lib/rubygems/commands/environment_command.rb +6 -5
  226. data/lib/rubygems/commands/exec_command.rb +249 -0
  227. data/lib/rubygems/commands/fetch_command.rb +10 -9
  228. data/lib/rubygems/commands/generate_index_command.rb +18 -17
  229. data/lib/rubygems/commands/help_command.rb +7 -6
  230. data/lib/rubygems/commands/info_command.rb +3 -3
  231. data/lib/rubygems/commands/install_command.rb +28 -23
  232. data/lib/rubygems/commands/list_command.rb +4 -3
  233. data/lib/rubygems/commands/lock_command.rb +5 -4
  234. data/lib/rubygems/commands/mirror_command.rb +4 -3
  235. data/lib/rubygems/commands/open_command.rb +10 -9
  236. data/lib/rubygems/commands/outdated_command.rb +6 -5
  237. data/lib/rubygems/commands/owner_command.rb +17 -14
  238. data/lib/rubygems/commands/pristine_command.rb +46 -36
  239. data/lib/rubygems/commands/push_command.rb +9 -8
  240. data/lib/rubygems/commands/query_command.rb +9 -8
  241. data/lib/rubygems/commands/rdoc_command.rb +21 -19
  242. data/lib/rubygems/commands/search_command.rb +4 -3
  243. data/lib/rubygems/commands/server_command.rb +4 -3
  244. data/lib/rubygems/commands/setup_command.rb +97 -106
  245. data/lib/rubygems/commands/signin_command.rb +10 -9
  246. data/lib/rubygems/commands/signout_command.rb +8 -7
  247. data/lib/rubygems/commands/sources_command.rb +22 -21
  248. data/lib/rubygems/commands/specification_command.rb +14 -13
  249. data/lib/rubygems/commands/stale_command.rb +3 -2
  250. data/lib/rubygems/commands/uninstall_command.rb +44 -40
  251. data/lib/rubygems/commands/unpack_command.rb +14 -13
  252. data/lib/rubygems/commands/update_command.rb +42 -63
  253. data/lib/rubygems/commands/which_command.rb +8 -7
  254. data/lib/rubygems/commands/yank_command.rb +12 -11
  255. data/lib/rubygems/config_file.rb +55 -21
  256. data/lib/rubygems/core_ext/kernel_gem.rb +1 -6
  257. data/lib/rubygems/core_ext/kernel_require.rb +109 -115
  258. data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
  259. data/lib/rubygems/core_ext/tcpsocket_init.rb +3 -1
  260. data/lib/rubygems/defaults.rb +33 -18
  261. data/lib/rubygems/dependency.rb +15 -11
  262. data/lib/rubygems/dependency_installer.rb +38 -37
  263. data/lib/rubygems/dependency_list.rb +7 -6
  264. data/lib/rubygems/deprecate.rb +3 -2
  265. data/lib/rubygems/doctor.rb +19 -18
  266. data/lib/rubygems/errors.rb +3 -2
  267. data/lib/rubygems/exceptions.rb +16 -8
  268. data/lib/rubygems/ext/build_error.rb +2 -1
  269. data/lib/rubygems/ext/builder.rb +37 -21
  270. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  271. data/lib/rubygems/ext/cargo_builder.rb +150 -111
  272. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  273. data/lib/rubygems/ext/configure_builder.rb +2 -1
  274. data/lib/rubygems/ext/ext_conf_builder.rb +11 -9
  275. data/lib/rubygems/ext/rake_builder.rb +7 -5
  276. data/lib/rubygems/ext.rb +8 -7
  277. data/lib/rubygems/gem_runner.rb +6 -5
  278. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  279. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  280. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  281. data/lib/rubygems/gemcutter_utilities.rb +90 -34
  282. data/lib/rubygems/indexer.rb +29 -28
  283. data/lib/rubygems/install_default_message.rb +3 -2
  284. data/lib/rubygems/install_message.rb +3 -2
  285. data/lib/rubygems/install_update_options.rb +56 -55
  286. data/lib/rubygems/installer.rb +54 -46
  287. data/lib/rubygems/installer_uninstaller_utils.rb +2 -2
  288. data/lib/rubygems/local_remote_options.rb +19 -20
  289. data/lib/rubygems/mock_gem_ui.rb +3 -2
  290. data/lib/rubygems/name_tuple.rb +5 -4
  291. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  292. data/lib/rubygems/optparse.rb +1 -1
  293. data/lib/rubygems/package/digest_io.rb +1 -0
  294. data/lib/rubygems/package/file_source.rb +3 -2
  295. data/lib/rubygems/package/io_source.rb +1 -0
  296. data/lib/rubygems/package/old.rb +9 -8
  297. data/lib/rubygems/package/source.rb +1 -0
  298. data/lib/rubygems/package/tar_header.rb +63 -62
  299. data/lib/rubygems/package/tar_reader/entry.rb +91 -9
  300. data/lib/rubygems/package/tar_reader.rb +2 -29
  301. data/lib/rubygems/package/tar_writer.rb +8 -7
  302. data/lib/rubygems/package.rb +64 -48
  303. data/lib/rubygems/package_task.rb +5 -4
  304. data/lib/rubygems/path_support.rb +1 -0
  305. data/lib/rubygems/platform.rb +79 -53
  306. data/lib/rubygems/psych_tree.rb +2 -1
  307. data/lib/rubygems/query_utils.rb +35 -35
  308. data/lib/rubygems/rdoc.rb +3 -2
  309. data/lib/rubygems/remote_fetcher.rb +23 -22
  310. data/lib/rubygems/request/connection_pools.rb +4 -4
  311. data/lib/rubygems/request/http_pool.rb +2 -1
  312. data/lib/rubygems/request/https_pool.rb +1 -0
  313. data/lib/rubygems/request.rb +23 -22
  314. data/lib/rubygems/request_set/gem_dependency_api.rb +123 -123
  315. data/lib/rubygems/request_set/lockfile/parser.rb +28 -27
  316. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -3
  317. data/lib/rubygems/request_set/lockfile.rb +6 -5
  318. data/lib/rubygems/request_set.rb +20 -19
  319. data/lib/rubygems/requirement.rb +15 -14
  320. data/lib/rubygems/resolver/activation_request.rb +4 -3
  321. data/lib/rubygems/resolver/api_set.rb +5 -4
  322. data/lib/rubygems/resolver/api_specification.rb +7 -6
  323. data/lib/rubygems/resolver/best_set.rb +6 -5
  324. data/lib/rubygems/resolver/composed_set.rb +1 -0
  325. data/lib/rubygems/resolver/conflict.rb +11 -10
  326. data/lib/rubygems/resolver/current_set.rb +1 -0
  327. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  328. data/lib/rubygems/resolver/git_set.rb +3 -2
  329. data/lib/rubygems/resolver/git_specification.rb +7 -6
  330. data/lib/rubygems/resolver/index_set.rb +4 -3
  331. data/lib/rubygems/resolver/index_specification.rb +7 -5
  332. data/lib/rubygems/resolver/installed_specification.rb +5 -4
  333. data/lib/rubygems/resolver/installer_set.rb +15 -17
  334. data/lib/rubygems/resolver/local_specification.rb +3 -2
  335. data/lib/rubygems/resolver/lock_set.rb +5 -4
  336. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  337. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  338. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  339. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  340. data/lib/rubygems/resolver/molinillo.rb +2 -1
  341. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  342. data/lib/rubygems/resolver/set.rb +1 -0
  343. data/lib/rubygems/resolver/source_set.rb +2 -0
  344. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  345. data/lib/rubygems/resolver/specification.rb +2 -1
  346. data/lib/rubygems/resolver/stats.rb +2 -1
  347. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  348. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  349. data/lib/rubygems/resolver.rb +41 -40
  350. data/lib/rubygems/s3_uri_signer.rb +10 -8
  351. data/lib/rubygems/safe_yaml.rb +4 -2
  352. data/lib/rubygems/security/policies.rb +48 -47
  353. data/lib/rubygems/security/policy.rb +19 -18
  354. data/lib/rubygems/security/signer.rb +6 -5
  355. data/lib/rubygems/security/trust_dir.rb +5 -4
  356. data/lib/rubygems/security.rb +30 -42
  357. data/lib/rubygems/security_option.rb +6 -5
  358. data/lib/rubygems/shellwords.rb +3 -0
  359. data/lib/rubygems/source/git.rb +22 -22
  360. data/lib/rubygems/source/installed.rb +2 -1
  361. data/lib/rubygems/source/local.rb +3 -2
  362. data/lib/rubygems/source/lock.rb +1 -0
  363. data/lib/rubygems/source/specific_file.rb +2 -1
  364. data/lib/rubygems/source/vendor.rb +1 -0
  365. data/lib/rubygems/source.rb +16 -16
  366. data/lib/rubygems/spec_fetcher.rb +10 -9
  367. data/lib/rubygems/specification.rb +121 -114
  368. data/lib/rubygems/specification_policy.rb +36 -15
  369. data/lib/rubygems/stub_specification.rb +11 -9
  370. data/lib/rubygems/text.rb +2 -2
  371. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  372. data/lib/rubygems/tsort.rb +1 -1
  373. data/lib/rubygems/uninstaller.rb +19 -18
  374. data/lib/rubygems/update_suggestion.rb +69 -0
  375. data/lib/rubygems/uri.rb +4 -4
  376. data/lib/rubygems/uri_formatter.rb +1 -1
  377. data/lib/rubygems/user_interaction.rb +37 -21
  378. data/lib/rubygems/util/licenses.rb +4 -3
  379. data/lib/rubygems/util/list.rb +1 -0
  380. data/lib/rubygems/util.rb +12 -15
  381. data/lib/rubygems/validator.rb +7 -6
  382. data/lib/rubygems/version.rb +17 -11
  383. data/lib/rubygems/version_option.rb +4 -3
  384. data/lib/rubygems.rb +89 -68
  385. data/rubygems-update.gemspec +10 -8
  386. data/setup.rb +10 -9
  387. data/test/rubygems/alternate_cert.pem +14 -14
  388. data/test/rubygems/alternate_cert_32.pem +15 -15
  389. data/test/rubygems/alternate_key.pem +25 -25
  390. data/test/rubygems/bad_rake.rb +1 -0
  391. data/test/rubygems/bundler_test_gem.rb +421 -0
  392. data/test/rubygems/child_cert.pem +15 -16
  393. data/test/rubygems/child_cert_32.pem +15 -16
  394. data/test/rubygems/child_key.pem +25 -25
  395. data/test/rubygems/encrypted_private_key.pem +26 -26
  396. data/test/rubygems/expired_cert.pem +15 -15
  397. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  398. data/test/rubygems/future_cert.pem +15 -15
  399. data/test/rubygems/future_cert_32.pem +15 -15
  400. data/test/rubygems/good_rake.rb +1 -0
  401. data/test/rubygems/grandchild_cert.pem +15 -16
  402. data/test/rubygems/grandchild_cert_32.pem +15 -16
  403. data/test/rubygems/grandchild_key.pem +25 -25
  404. data/test/rubygems/helper.rb +172 -151
  405. data/test/rubygems/installer_test_case.rb +14 -13
  406. data/test/rubygems/invalid_issuer_cert.pem +16 -16
  407. data/test/rubygems/invalid_issuer_cert_32.pem +16 -16
  408. data/test/rubygems/invalid_key.pem +25 -25
  409. data/test/rubygems/invalid_signer_cert.pem +15 -15
  410. data/test/rubygems/invalid_signer_cert_32.pem +15 -15
  411. data/test/rubygems/invalidchild_cert.pem +15 -16
  412. data/test/rubygems/invalidchild_cert_32.pem +15 -16
  413. data/test/rubygems/invalidchild_key.pem +25 -25
  414. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  415. data/test/rubygems/package/tar_test_case.rb +53 -17
  416. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  417. data/test/rubygems/plugin/exception/rubygems_plugin.rb +2 -1
  418. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  419. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +2 -1
  420. data/test/rubygems/private_key.pem +25 -25
  421. data/test/rubygems/public_cert.pem +16 -16
  422. data/test/rubygems/public_cert_32.pem +15 -15
  423. data/test/rubygems/public_key.pem +7 -7
  424. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  425. data/test/rubygems/rubygems_plugin.rb +3 -2
  426. data/test/rubygems/simple_gem.rb +2 -1
  427. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  428. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +6 -4
  429. data/test/rubygems/test_bundled_ca.rb +13 -12
  430. data/test/rubygems/test_config.rb +5 -4
  431. data/test/rubygems/test_deprecate.rb +5 -4
  432. data/test/rubygems/test_exit.rb +9 -3
  433. data/test/rubygems/test_gem.rb +339 -677
  434. data/test/rubygems/test_gem_available_set.rb +22 -21
  435. data/test/rubygems/test_gem_bundler_version_finder.rb +6 -4
  436. data/test/rubygems/test_gem_command.rb +45 -44
  437. data/test/rubygems/test_gem_command_manager.rb +96 -30
  438. data/test/rubygems/test_gem_commands_build_command.rb +74 -63
  439. data/test/rubygems/test_gem_commands_cert_command.rb +98 -99
  440. data/test/rubygems/test_gem_commands_check_command.rb +5 -4
  441. data/test/rubygems/test_gem_commands_cleanup_command.rb +41 -40
  442. data/test/rubygems/test_gem_commands_contents_command.rb +28 -27
  443. data/test/rubygems/test_gem_commands_dependency_command.rb +37 -36
  444. data/test/rubygems/test_gem_commands_environment_command.rb +17 -16
  445. data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
  446. data/test/rubygems/test_gem_commands_fetch_command.rb +38 -37
  447. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -7
  448. data/test/rubygems/test_gem_commands_help_command.rb +14 -13
  449. data/test/rubygems/test_gem_commands_info_command.rb +29 -2
  450. data/test/rubygems/test_gem_commands_install_command.rb +152 -132
  451. data/test/rubygems/test_gem_commands_list_command.rb +5 -4
  452. data/test/rubygems/test_gem_commands_lock_command.rb +11 -10
  453. data/test/rubygems/test_gem_commands_mirror.rb +3 -2
  454. data/test/rubygems/test_gem_commands_open_command.rb +5 -4
  455. data/test/rubygems/test_gem_commands_outdated_command.rb +10 -9
  456. data/test/rubygems/test_gem_commands_owner_command.rb +227 -50
  457. data/test/rubygems/test_gem_commands_pristine_command.rb +142 -93
  458. data/test/rubygems/test_gem_commands_push_command.rb +189 -64
  459. data/test/rubygems/test_gem_commands_query_command.rb +74 -73
  460. data/test/rubygems/test_gem_commands_search_command.rb +3 -2
  461. data/test/rubygems/test_gem_commands_server_command.rb +3 -2
  462. data/test/rubygems/test_gem_commands_setup_command.rb +123 -96
  463. data/test/rubygems/test_gem_commands_signin_command.rb +71 -31
  464. data/test/rubygems/test_gem_commands_signout_command.rb +3 -3
  465. data/test/rubygems/test_gem_commands_sources_command.rb +29 -29
  466. data/test/rubygems/test_gem_commands_specification_command.rb +33 -32
  467. data/test/rubygems/test_gem_commands_stale_command.rb +5 -4
  468. data/test/rubygems/test_gem_commands_uninstall_command.rb +99 -81
  469. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -31
  470. data/test/rubygems/test_gem_commands_update_command.rb +96 -95
  471. data/test/rubygems/test_gem_commands_which_command.rb +7 -6
  472. data/test/rubygems/test_gem_commands_yank_command.rb +162 -43
  473. data/test/rubygems/test_gem_config_file.rb +94 -81
  474. data/test/rubygems/test_gem_dependency.rb +76 -73
  475. data/test/rubygems/test_gem_dependency_installer.rb +200 -165
  476. data/test/rubygems/test_gem_dependency_list.rb +48 -47
  477. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -4
  478. data/test/rubygems/test_gem_doctor.rb +27 -26
  479. data/test/rubygems/test_gem_ext_builder.rb +60 -61
  480. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
  481. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +23 -33
  482. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
  483. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
  484. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
  485. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +37 -33
  486. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  487. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  488. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  489. data/test/rubygems/test_gem_ext_cargo_builder.rb +48 -59
  490. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +20 -19
  491. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +21 -36
  492. data/test/rubygems/test_gem_ext_cmake_builder.rb +16 -15
  493. data/test/rubygems/test_gem_ext_configure_builder.rb +14 -13
  494. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +51 -52
  495. data/test/rubygems/test_gem_ext_rake_builder.rb +16 -15
  496. data/test/rubygems/test_gem_gem_runner.rb +15 -9
  497. data/test/rubygems/test_gem_gemcutter_utilities.rb +170 -84
  498. data/test/rubygems/test_gem_impossible_dependencies_error.rb +5 -4
  499. data/test/rubygems/test_gem_indexer.rb +87 -67
  500. data/test/rubygems/test_gem_install_update_options.rb +17 -16
  501. data/test/rubygems/test_gem_installer.rb +422 -304
  502. data/test/rubygems/test_gem_local_remote_options.rb +11 -10
  503. data/test/rubygems/test_gem_name_tuple.rb +5 -4
  504. data/test/rubygems/test_gem_package.rb +243 -231
  505. data/test/rubygems/test_gem_package_old.rb +14 -13
  506. data/test/rubygems/test_gem_package_tar_header.rb +48 -47
  507. data/test/rubygems/test_gem_package_tar_reader.rb +56 -8
  508. data/test/rubygems/test_gem_package_tar_reader_entry.rb +162 -16
  509. data/test/rubygems/test_gem_package_tar_writer.rb +77 -76
  510. data/test/rubygems/test_gem_package_task.rb +19 -18
  511. data/test/rubygems/test_gem_path_support.rb +15 -14
  512. data/test/rubygems/test_gem_platform.rb +333 -227
  513. data/test/rubygems/test_gem_rdoc.rb +15 -14
  514. data/test/rubygems/test_gem_remote_fetcher.rb +155 -154
  515. data/test/rubygems/test_gem_request.rb +64 -58
  516. data/test/rubygems/test_gem_request_connection_pools.rb +30 -29
  517. data/test/rubygems/test_gem_request_set.rb +101 -100
  518. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +210 -211
  519. data/test/rubygems/test_gem_request_set_lockfile.rb +87 -86
  520. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +58 -57
  521. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +63 -62
  522. data/test/rubygems/test_gem_requirement.rb +48 -41
  523. data/test/rubygems/test_gem_resolver.rb +167 -99
  524. data/test/rubygems/test_gem_resolver_activation_request.rb +7 -6
  525. data/test/rubygems/test_gem_resolver_api_set.rb +34 -33
  526. data/test/rubygems/test_gem_resolver_api_specification.rb +48 -47
  527. data/test/rubygems/test_gem_resolver_best_set.rb +23 -22
  528. data/test/rubygems/test_gem_resolver_composed_set.rb +2 -1
  529. data/test/rubygems/test_gem_resolver_conflict.rb +13 -12
  530. data/test/rubygems/test_gem_resolver_dependency_request.rb +16 -15
  531. data/test/rubygems/test_gem_resolver_git_set.rb +22 -21
  532. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -21
  533. data/test/rubygems/test_gem_resolver_index_set.rb +13 -12
  534. data/test/rubygems/test_gem_resolver_index_specification.rb +17 -16
  535. data/test/rubygems/test_gem_resolver_installed_specification.rb +6 -5
  536. data/test/rubygems/test_gem_resolver_installer_set.rb +79 -34
  537. data/test/rubygems/test_gem_resolver_local_specification.rb +8 -7
  538. data/test/rubygems/test_gem_resolver_lock_set.rb +13 -12
  539. data/test/rubygems/test_gem_resolver_lock_specification.rb +18 -17
  540. data/test/rubygems/test_gem_resolver_requirement_list.rb +2 -1
  541. data/test/rubygems/test_gem_resolver_specification.rb +9 -8
  542. data/test/rubygems/test_gem_resolver_vendor_set.rb +7 -6
  543. data/test/rubygems/test_gem_resolver_vendor_specification.rb +11 -10
  544. data/test/rubygems/test_gem_security.rb +69 -68
  545. data/test/rubygems/test_gem_security_policy.rb +72 -72
  546. data/test/rubygems/test_gem_security_signer.rb +35 -34
  547. data/test/rubygems/test_gem_security_trust_dir.rb +7 -6
  548. data/test/rubygems/test_gem_silent_ui.rb +39 -32
  549. data/test/rubygems/test_gem_source.rb +45 -44
  550. data/test/rubygems/test_gem_source_fetch_problem.rb +10 -9
  551. data/test/rubygems/test_gem_source_git.rb +69 -62
  552. data/test/rubygems/test_gem_source_installed.rb +17 -16
  553. data/test/rubygems/test_gem_source_list.rb +6 -5
  554. data/test/rubygems/test_gem_source_local.rb +15 -14
  555. data/test/rubygems/test_gem_source_lock.rb +32 -31
  556. data/test/rubygems/test_gem_source_specific_file.rb +18 -17
  557. data/test/rubygems/test_gem_source_subpath_problem.rb +8 -7
  558. data/test/rubygems/test_gem_source_vendor.rb +14 -13
  559. data/test/rubygems/test_gem_spec_fetcher.rb +73 -72
  560. data/test/rubygems/test_gem_specification.rb +533 -469
  561. data/test/rubygems/test_gem_stream_ui.rb +53 -22
  562. data/test/rubygems/test_gem_stub_specification.rb +33 -32
  563. data/test/rubygems/test_gem_text.rb +2 -1
  564. data/test/rubygems/test_gem_uninstaller.rb +118 -117
  565. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +4 -3
  566. data/test/rubygems/test_gem_update_suggestion.rb +209 -0
  567. data/test/rubygems/test_gem_uri.rb +6 -4
  568. data/test/rubygems/test_gem_uri_formatter.rb +15 -14
  569. data/test/rubygems/test_gem_util.rb +24 -23
  570. data/test/rubygems/test_gem_validator.rb +8 -8
  571. data/test/rubygems/test_gem_version.rb +24 -16
  572. data/test/rubygems/test_gem_version_option.rb +16 -15
  573. data/test/rubygems/test_kernel.rb +43 -48
  574. data/test/rubygems/test_project_sanity.rb +32 -3
  575. data/test/rubygems/test_remote_fetch_error.rb +8 -7
  576. data/test/rubygems/test_require.rb +118 -103
  577. data/test/rubygems/test_rubygems.rb +10 -8
  578. data/test/rubygems/test_webauthn_listener.rb +143 -0
  579. data/test/rubygems/test_webauthn_listener_response.rb +93 -0
  580. data/test/rubygems/test_webauthn_poller.rb +124 -0
  581. data/test/rubygems/utilities.rb +98 -34
  582. data/test/rubygems/wrong_key_cert.pem +15 -15
  583. data/test/rubygems/wrong_key_cert_32.pem +15 -15
  584. data/test/test_changelog_generator.rb +1 -1
  585. metadata +99 -46
  586. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  587. data/bundler/lib/bundler/templates/gems.rb +0 -5
  588. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  589. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  590. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  591. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  592. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  593. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  594. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  595. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  596. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  597. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  598. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  599. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  600. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  601. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  602. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  603. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  604. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  605. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  606. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  607. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  608. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  609. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  610. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  611. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  612. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  613. data/bundler/lib/bundler/version_ranges.rb +0 -122
  614. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  615. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -1,420 +1,427 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bundler
4
+ #
5
+ # This class implements the interface needed by PubGrub for resolution. It is
6
+ # equivalent to the `PubGrub::BasicPackageSource` class provided by PubGrub by
7
+ # default and used by the most simple PubGrub consumers.
8
+ #
4
9
  class Resolver
5
- require_relative "vendored_molinillo"
6
- require_relative "resolver/spec_group"
10
+ require_relative "vendored_pub_grub"
11
+ require_relative "resolver/base"
12
+ require_relative "resolver/candidate"
13
+ require_relative "resolver/incompatibility"
14
+ require_relative "resolver/root"
7
15
 
8
16
  include GemHelpers
9
17
 
10
- # Figures out the best possible configuration of gems that satisfies
11
- # the list of passed dependencies and any child dependencies without
12
- # causing any gem activation errors.
13
- #
14
- # ==== Parameters
15
- # *dependencies<Gem::Dependency>:: The list of dependencies to resolve
16
- #
17
- # ==== Returns
18
- # <GemBundle>,nil:: If the list of dependencies can be resolved, a
19
- # collection of gemspecs is returned. Otherwise, nil is returned.
20
- def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
21
- base = SpecSet.new(base) unless base.is_a?(SpecSet)
22
- metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }
23
- resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
24
- result = resolver.start(requirements)
25
- SpecSet.new(SpecSet.new(result).for(regular_requirements))
26
- end
27
-
28
- def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
29
- @source_requirements = source_requirements
30
- @metadata_requirements = metadata_requirements
18
+ def initialize(base, gem_version_promoter)
19
+ @source_requirements = base.source_requirements
31
20
  @base = base
32
- @resolver = Molinillo::Resolver.new(self, self)
33
- @search_for = {}
34
- @base_dg = Molinillo::DependencyGraph.new
35
- @base.each do |ls|
36
- dep = Dependency.new(ls.name, ls.version)
37
- @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
38
- end
39
- additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
40
- @platforms = platforms.reject {|p| p != Gem::Platform::RUBY && (platforms - [p]).any? {|pl| generic(pl) == p } }
41
- @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
42
21
  @gem_version_promoter = gem_version_promoter
43
- @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
44
22
  end
45
23
 
46
- def start(requirements)
47
- @gem_version_promoter.prerelease_specified = @prerelease_specified = {}
48
- requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
49
-
50
- verify_gemfile_dependencies_are_found!(requirements)
51
- dg = @resolver.resolve(requirements, @base_dg)
52
- dg.
53
- map(&:payload).
54
- reject {|sg| sg.name.end_with?("\0") }.
55
- map(&:to_specs).
56
- flatten
57
- rescue Molinillo::VersionConflict => e
58
- message = version_conflict_message(e)
59
- raise VersionConflict.new(e.conflicts.keys.uniq, message)
60
- rescue Molinillo::CircularDependencyError => e
61
- names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" }
62
- raise CyclicDependencyError, "Your bundle requires gems that depend" \
63
- " on each other, creating an infinite loop. Please remove" \
64
- " #{names.count > 1 ? "either " : ""}#{names.join(" or ")}" \
65
- " and try again."
66
- end
24
+ def start
25
+ @requirements = @base.requirements
26
+ @packages = @base.packages
67
27
 
68
- include Molinillo::UI
69
-
70
- # Conveys debug information to the user.
71
- #
72
- # @param [Integer] depth the current depth of the resolution process.
73
- # @return [void]
74
- def debug(depth = 0)
75
- return unless debug?
76
- debug_info = yield
77
- debug_info = debug_info.inspect unless debug_info.is_a?(String)
78
- puts debug_info.split("\n").map {|s| depth == 0 ? "BUNDLER: #{s}" : "BUNDLER(#{depth}): #{s}" }
79
- end
28
+ root, logger = setup_solver
80
29
 
81
- def debug?
82
- return @debug_mode if defined?(@debug_mode)
83
- @debug_mode =
84
- ENV["BUNDLER_DEBUG_RESOLVER"] ||
85
- ENV["BUNDLER_DEBUG_RESOLVER_TREE"] ||
86
- ENV["DEBUG_RESOLVER"] ||
87
- ENV["DEBUG_RESOLVER_TREE"] ||
88
- false
89
- end
30
+ Bundler.ui.info "Resolving dependencies...", true
90
31
 
91
- def before_resolution
92
- Bundler.ui.info "Resolving dependencies...", debug?
32
+ solve_versions(:root => root, :logger => logger)
93
33
  end
94
34
 
95
- def after_resolution
96
- Bundler.ui.info ""
97
- end
35
+ def setup_solver
36
+ root = Resolver::Root.new(name_for_explicit_dependency_source)
37
+ root_version = Resolver::Candidate.new(0)
98
38
 
99
- def indicate_progress
100
- Bundler.ui.info ".", false unless debug?
101
- end
39
+ @all_specs = Hash.new do |specs, name|
40
+ specs[name] = source_for(name).specs.search(name).reject do |s|
41
+ s.dependencies.any? {|d| d.name == name && !d.requirement.satisfied_by?(s.version) } # ignore versions that depend on themselves incorrectly
42
+ end.sort_by {|s| [s.version, s.platform.to_s] }
43
+ end
44
+
45
+ @sorted_versions = Hash.new do |candidates, package|
46
+ candidates[package] = if package.root?
47
+ [root_version]
48
+ else
49
+ all_versions_for(package).sort
50
+ end
51
+ end
102
52
 
103
- include Molinillo::SpecificationProvider
53
+ root_dependencies = prepare_dependencies(@requirements, @packages)
104
54
 
105
- def dependencies_for(specification)
106
- specification.dependencies_for_activated_platforms
55
+ @cached_dependencies = Hash.new do |dependencies, package|
56
+ dependencies[package] = if package.root?
57
+ { root_version => root_dependencies }
58
+ else
59
+ Hash.new do |versions, version|
60
+ versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
61
+ end
62
+ end
63
+ end
64
+
65
+ logger = Bundler::UI::Shell.new
66
+ logger.level = debug? ? "debug" : "warn"
67
+
68
+ [root, logger]
107
69
  end
108
70
 
109
- def search_for(dependency_proxy)
110
- platform = dependency_proxy.__platform
111
- dependency = dependency_proxy.dep
112
- name = dependency.name
113
- @search_for[dependency_proxy] ||= begin
114
- results = results_for(dependency, @base[name])
71
+ def solve_versions(root:, logger:)
72
+ solver = PubGrub::VersionSolver.new(:source => self, :root => root, :logger => logger)
73
+ result = solver.solve
74
+ result.map {|package, version| version.to_specs(package) }.flatten.uniq
75
+ rescue PubGrub::SolveFailure => e
76
+ incompatibility = e.incompatibility
77
+
78
+ names_to_unlock, names_to_allow_prereleases_for, extended_explanation = find_names_to_relax(incompatibility)
79
+
80
+ names_to_relax = names_to_unlock + names_to_allow_prereleases_for
81
+
82
+ if names_to_relax.any?
83
+ if names_to_unlock.any?
84
+ Bundler.ui.debug "Found conflicts with locked dependencies. Will retry with #{names_to_unlock.join(", ")} unlocked...", true
115
85
 
116
- if vertex = @base_dg.vertex_named(name)
117
- locked_requirement = vertex.payload.requirement
86
+ @base.unlock_names(names_to_unlock)
118
87
  end
119
88
 
120
- if !@prerelease_specified[name] && (!@use_gvp || locked_requirement.nil?)
121
- # Move prereleases to the beginning of the list, so they're considered
122
- # last during resolution.
123
- pre, results = results.partition {|spec| spec.version.prerelease? }
124
- results = pre + results
89
+ if names_to_allow_prereleases_for.any?
90
+ Bundler.ui.debug "Found conflicts with dependencies with prereleases. Will retrying considering prereleases for #{names_to_allow_prereleases_for.join(", ")}...", true
91
+
92
+ @base.include_prereleases(names_to_allow_prereleases_for)
125
93
  end
126
94
 
127
- spec_groups = if results.any?
128
- nested = []
129
- results.each do |spec|
130
- version, specs = nested.last
131
- if version == spec.version
132
- specs << spec
133
- else
134
- nested << [spec.version, [spec]]
135
- end
136
- end
137
- nested.reduce([]) do |groups, (version, specs)|
138
- next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
139
- next groups unless specs.any? {|spec| spec.match_platform(platform) }
95
+ root, logger = setup_solver
140
96
 
141
- specs_by_platform = Hash.new do |current_specs, current_platform|
142
- current_specs[current_platform] = select_best_platform_match(specs, current_platform)
143
- end
97
+ Bundler.ui.debug "Retrying resolution...", true
98
+ retry
99
+ end
144
100
 
145
- spec_group_ruby = SpecGroup.create_for(specs_by_platform, [Gem::Platform::RUBY], Gem::Platform::RUBY)
146
- if spec_group_ruby
147
- spec_group_ruby.force_ruby_platform = dependency.force_ruby_platform
148
- groups << spec_group_ruby
149
- end
101
+ explanation = e.message
150
102
 
151
- next groups if @resolving_only_for_ruby || dependency.force_ruby_platform
103
+ if extended_explanation
104
+ explanation << "\n\n"
105
+ explanation << extended_explanation
106
+ end
152
107
 
153
- spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform)
154
- groups << spec_group
108
+ raise SolveFailure.new(explanation)
109
+ end
155
110
 
156
- groups
111
+ def find_names_to_relax(incompatibility)
112
+ names_to_unlock = []
113
+ names_to_allow_prereleases_for = []
114
+ extended_explanation = nil
115
+
116
+ while incompatibility.conflict?
117
+ cause = incompatibility.cause
118
+ incompatibility = cause.incompatibility
119
+
120
+ incompatibility.terms.each do |term|
121
+ package = term.package
122
+ name = package.name
123
+
124
+ if base_requirements[name]
125
+ names_to_unlock << name
126
+ elsif package.ignores_prereleases?
127
+ names_to_allow_prereleases_for << name
157
128
  end
158
- else
159
- []
160
- end
161
- # GVP handles major itself, but it's still a bit risky to trust it with it
162
- # until we get it settled with new behavior. For 2.x it can take over all cases.
163
- if !@use_gvp
164
- spec_groups
165
- else
166
- @gem_version_promoter.sort_versions(dependency, spec_groups)
129
+
130
+ no_versions_incompat = [cause.incompatibility, cause.satisfier].find {|incompat| incompat.cause.is_a?(PubGrub::Incompatibility::NoVersions) }
131
+ next unless no_versions_incompat
132
+
133
+ extended_explanation = no_versions_incompat.extended_explanation
167
134
  end
168
135
  end
169
- end
170
136
 
171
- def index_for(dependency)
172
- source_for(dependency.name).specs
137
+ [names_to_unlock.uniq, names_to_allow_prereleases_for.uniq, extended_explanation]
173
138
  end
174
139
 
175
- def source_for(name)
176
- @source_requirements[name] || @source_requirements[:default]
177
- end
140
+ def parse_dependency(package, dependency)
141
+ range = if repository_for(package).is_a?(Source::Gemspec)
142
+ PubGrub::VersionRange.any
143
+ else
144
+ requirement_to_range(dependency)
145
+ end
178
146
 
179
- def results_for(dependency, base)
180
- index_for(dependency).search(dependency, base)
147
+ PubGrub::VersionConstraint.new(package, :range => range)
181
148
  end
182
149
 
183
- def name_for(dependency)
184
- dependency.name
185
- end
150
+ def versions_for(package, range=VersionRange.any)
151
+ versions = range.select_versions(@sorted_versions[package])
186
152
 
187
- def name_for_explicit_dependency_source
188
- Bundler.default_gemfile.basename.to_s
189
- rescue StandardError
190
- "Gemfile"
153
+ sort_versions(package, versions)
191
154
  end
192
155
 
193
- def name_for_locking_dependency_source
194
- Bundler.default_lockfile.basename.to_s
195
- rescue StandardError
196
- "Gemfile.lock"
197
- end
156
+ def no_versions_incompatibility_for(package, unsatisfied_term)
157
+ cause = PubGrub::Incompatibility::NoVersions.new(unsatisfied_term)
158
+ name = package.name
159
+ constraint = unsatisfied_term.constraint
160
+ constraint_string = constraint.constraint_string
161
+ requirements = constraint_string.split(" OR ").map {|req| Gem::Requirement.new(req.split(",")) }
198
162
 
199
- def requirement_satisfied_by?(requirement, activated, spec)
200
- requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
201
- end
163
+ if name == "bundler" && bundler_pinned_to_current_version?
164
+ custom_explanation = "the current Bundler version (#{Bundler::VERSION}) does not satisfy #{constraint}"
165
+ extended_explanation = bundler_not_found_message(requirements)
166
+ else
167
+ specs_matching_other_platforms = filter_matching_specs(@all_specs[name], requirements)
202
168
 
203
- def dependencies_equal?(dependencies, other_dependencies)
204
- dependencies.map(&:dep) == other_dependencies.map(&:dep)
205
- end
169
+ platforms_explanation = specs_matching_other_platforms.any? ? " for any resolution platforms (#{package.platforms.join(", ")})" : ""
170
+ custom_explanation = "#{constraint} could not be found in #{repository_for(package)}#{platforms_explanation}"
206
171
 
207
- def sort_dependencies(dependencies, activated, conflicts)
208
- dependencies.sort_by do |dependency|
209
- name = name_for(dependency)
210
- vertex = activated.vertex_named(name)
211
- [
212
- @base_dg.vertex_named(name) ? 0 : 1,
213
- vertex.payload ? 0 : 1,
214
- vertex.root? ? 0 : 1,
215
- amount_constrained(dependency),
216
- conflicts[name] ? 0 : 1,
217
- vertex.payload ? 0 : search_for(dependency).count,
218
- self.class.platform_sort_key(dependency.__platform),
219
- ]
172
+ label = "#{name} (#{constraint_string})"
173
+ extended_explanation = other_specs_matching_message(specs_matching_other_platforms, label) if specs_matching_other_platforms.any?
220
174
  end
175
+
176
+ Incompatibility.new([unsatisfied_term], :cause => cause, :custom_explanation => custom_explanation, :extended_explanation => extended_explanation)
221
177
  end
222
178
 
223
- def self.platform_sort_key(platform)
224
- # Prefer specific platform to not specific platform
225
- return ["99-LAST", "", "", ""] if Gem::Platform::RUBY == platform
226
- ["00", *platform.to_a.map {|part| part || "" }]
179
+ def debug?
180
+ ENV["BUNDLER_DEBUG_RESOLVER"] ||
181
+ ENV["BUNDLER_DEBUG_RESOLVER_TREE"] ||
182
+ ENV["DEBUG_RESOLVER"] ||
183
+ ENV["DEBUG_RESOLVER_TREE"] ||
184
+ false
227
185
  end
228
186
 
229
- private
187
+ def incompatibilities_for(package, version)
188
+ package_deps = @cached_dependencies[package]
189
+ sorted_versions = @sorted_versions[package]
190
+ package_deps[version].map do |dep_package, dep_constraint|
191
+ low = high = sorted_versions.index(version)
230
192
 
231
- # returns an integer \in (-\infty, 0]
232
- # a number closer to 0 means the dependency is less constraining
233
- #
234
- # dependencies w/ 0 or 1 possibilities (ignoring version requirements)
235
- # are given very negative values, so they _always_ sort first,
236
- # before dependencies that are unconstrained
237
- def amount_constrained(dependency)
238
- @amount_constrained ||= {}
239
- @amount_constrained[dependency.name] ||= if (base = @base[dependency.name]) && !base.empty?
240
- dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1
241
- else
242
- all = index_for(dependency).search(dependency.name).size
193
+ # find version low such that all >= low share the same dep
194
+ while low > 0 && package_deps[sorted_versions[low - 1]][dep_package] == dep_constraint
195
+ low -= 1
196
+ end
197
+ low =
198
+ if low == 0
199
+ nil
200
+ else
201
+ sorted_versions[low]
202
+ end
243
203
 
244
- if all <= 1
245
- all - 1_000_000
246
- else
247
- search = search_for(dependency)
248
- search = @prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? }
249
- search - all
204
+ # find version high such that all < high share the same dep
205
+ while high < sorted_versions.length && package_deps[sorted_versions[high]][dep_package] == dep_constraint
206
+ high += 1
207
+ end
208
+ high =
209
+ if high == sorted_versions.length
210
+ nil
211
+ else
212
+ sorted_versions[high]
213
+ end
214
+
215
+ range = PubGrub::VersionRange.new(:min => low, :max => high, :include_min => true)
216
+
217
+ self_constraint = PubGrub::VersionConstraint.new(package, :range => range)
218
+
219
+ dep_term = PubGrub::Term.new(dep_constraint, false)
220
+ self_term = PubGrub::Term.new(self_constraint, true)
221
+
222
+ custom_explanation = if dep_package.meta? && package.root?
223
+ "current #{dep_package} version is #{dep_constraint.constraint_string}"
250
224
  end
225
+
226
+ PubGrub::Incompatibility.new([self_term, dep_term], :cause => :dependency, :custom_explanation => custom_explanation)
251
227
  end
252
228
  end
253
229
 
254
- def verify_gemfile_dependencies_are_found!(requirements)
255
- requirements.map! do |requirement|
256
- name = requirement.name
257
- next requirement if name == "bundler"
258
- next requirement unless search_for(requirement).empty?
259
- next unless requirement.current_platform?
260
-
261
- if (base = @base[name]) && !base.empty?
262
- version = base.first.version
263
- message = "You have requested:\n" \
264
- " #{name} #{requirement.requirement}\n\n" \
265
- "The bundle currently has #{name} locked at #{version}.\n" \
266
- "Try running `bundle update #{name}`\n\n" \
267
- "If you are updating multiple gems in your Gemfile at once,\n" \
268
- "try passing them all to `bundle update`"
269
- else
270
- message = gem_not_found_message(name, requirement, source_for(name))
271
- end
272
- raise GemNotFound, message
273
- end.compact!
230
+ def all_versions_for(package)
231
+ name = package.name
232
+ results = (@base[name] + filter_prereleases(@all_specs[name], package)).uniq {|spec| [spec.version.hash, spec.platform] }
233
+
234
+ if name == "bundler" && !bundler_pinned_to_current_version?
235
+ bundler_spec = Gem.loaded_specs["bundler"]
236
+ results << bundler_spec if bundler_spec
237
+ end
238
+
239
+ locked_requirement = base_requirements[name]
240
+ results = filter_matching_specs(results, locked_requirement) if locked_requirement
241
+
242
+ versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)|
243
+ platform_specs = package.platforms.flat_map {|platform| select_best_platform_match(specs, platform) }
244
+ next groups if platform_specs.empty?
245
+
246
+ ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
247
+ groups << Resolver::Candidate.new(version, :specs => ruby_specs) if ruby_specs.any?
248
+
249
+ next groups if platform_specs == ruby_specs || package.force_ruby_platform?
250
+
251
+ groups << Resolver::Candidate.new(version, :specs => platform_specs)
252
+
253
+ groups
254
+ end
255
+
256
+ sort_versions(package, versions)
257
+ end
258
+
259
+ def source_for(name)
260
+ @source_requirements[name] || @source_requirements[:default]
261
+ end
262
+
263
+ def default_bundler_source
264
+ @source_requirements[:default_bundler]
265
+ end
266
+
267
+ def bundler_pinned_to_current_version?
268
+ !default_bundler_source.nil?
269
+ end
270
+
271
+ def name_for_explicit_dependency_source
272
+ Bundler.default_gemfile.basename.to_s
273
+ rescue StandardError
274
+ "Gemfile"
274
275
  end
275
276
 
276
- def gem_not_found_message(name, requirement, source, extra_message = "")
277
- specs = source.specs.search(name)
277
+ def raise_not_found!(package)
278
+ name = package.name
279
+ source = source_for(name)
280
+ specs = @all_specs[name]
278
281
  matching_part = name
279
- requirement_label = SharedHelpers.pretty_dependency(requirement)
282
+ requirement_label = SharedHelpers.pretty_dependency(package.dependency)
280
283
  cache_message = begin
281
284
  " or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
282
285
  rescue GemfileNotFound
283
286
  nil
284
287
  end
285
- specs_matching_requirement = specs.select {| spec| requirement.matches_spec?(spec) }
288
+ specs_matching_requirement = filter_matching_specs(specs, package.dependency.requirement)
286
289
 
287
290
  if specs_matching_requirement.any?
288
291
  specs = specs_matching_requirement
289
292
  matching_part = requirement_label
290
- requirement_label = "#{requirement_label}' with platform '#{requirement.__platform}"
293
+ platforms = package.platforms
294
+ platform_label = platforms.size == 1 ? "platform '#{platforms.first}" : "platforms '#{platforms.join("', '")}"
295
+ requirement_label = "#{requirement_label}' with #{platform_label}"
291
296
  end
292
297
 
293
- message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")
298
+ message = String.new("Could not find gem '#{requirement_label}' in #{source}#{cache_message}.\n")
294
299
 
295
300
  if specs.any?
296
- message << "\nThe source contains the following gems matching '#{matching_part}':\n"
297
- message << specs.map {|s| " * #{s.full_name}" }.join("\n")
301
+ message << "\n#{other_specs_matching_message(specs, matching_part)}"
298
302
  end
299
303
 
300
- message
304
+ raise GemNotFound, message
301
305
  end
302
306
 
303
- def version_conflict_message(e)
304
- # only show essential conflicts, if possible
305
- conflicts = e.conflicts.dup
307
+ private
308
+
309
+ def filter_matching_specs(specs, requirements)
310
+ Array(requirements).flat_map do |requirement|
311
+ specs.select {| spec| requirement_satisfied_by?(requirement, spec) }
312
+ end
313
+ end
306
314
 
307
- if conflicts["bundler"]
308
- conflicts.replace("bundler" => conflicts["bundler"])
315
+ def filter_prereleases(specs, package)
316
+ return specs unless package.ignores_prereleases? && specs.size > 1
317
+
318
+ specs.reject {|s| s.version.prerelease? }
319
+ end
320
+
321
+ def requirement_satisfied_by?(requirement, spec)
322
+ requirement.satisfied_by?(spec.version) || spec.source.is_a?(Source::Gemspec)
323
+ end
324
+
325
+ def sort_versions(package, versions)
326
+ if versions.size > 1
327
+ @gem_version_promoter.sort_versions(package, versions).reverse
309
328
  else
310
- conflicts.delete_if do |_name, conflict|
311
- deps = conflict.requirement_trees.map(&:last).flatten(1)
312
- !Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
313
- end
329
+ versions
314
330
  end
331
+ end
315
332
 
316
- e = Molinillo::VersionConflict.new(conflicts, e.specification_provider) unless conflicts.empty?
333
+ def repository_for(package)
334
+ source_for(package.name)
335
+ end
317
336
 
318
- e.message_with_trees(
319
- :full_message_for_conflict => lambda do |name, conflict|
320
- o = if name.end_with?("\0")
321
- String.new("Bundler found conflicting requirements for the #{name} version:")
322
- else
323
- String.new("Bundler could not find compatible versions for gem \"#{name}\":")
324
- end
325
- o << %(\n)
326
- if conflict.locked_requirement
327
- o << %( In snapshot (#{name_for_locking_dependency_source}):\n)
328
- o << %( #{SharedHelpers.pretty_dependency(conflict.locked_requirement)}\n)
329
- o << %(\n)
330
- end
331
- o << %( In #{name_for_explicit_dependency_source}:\n)
332
- trees = conflict.requirement_trees
337
+ def base_requirements
338
+ @base.base_requirements
339
+ end
333
340
 
334
- # called first, because we want to reduce the amount of work required to find maximal empty sets
335
- trees = trees.uniq {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }
341
+ def prepare_dependencies(requirements, packages)
342
+ to_dependency_hash(requirements, packages).map do |dep_package, dep_constraint|
343
+ name = dep_package.name
336
344
 
337
- # bail out if tree size is too big for Array#combination to make any sense
338
- if trees.size <= 15
339
- maximal = 1.upto(trees.size).map do |size|
340
- trees.map(&:last).flatten(1).combination(size).to_a
341
- end.flatten(1).select do |deps|
342
- Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
343
- end.min_by(&:size)
345
+ next [dep_package, dep_constraint] if name == "bundler"
344
346
 
345
- trees.reject! {|t| !maximal.include?(t.last) } if maximal
347
+ versions = versions_for(dep_package, dep_constraint.range)
348
+ if versions.empty? && dep_package.ignores_prereleases?
349
+ @sorted_versions.delete(dep_package)
350
+ dep_package.consider_prereleases!
351
+ versions = versions_for(dep_package, dep_constraint.range)
352
+ end
353
+ next [dep_package, dep_constraint] unless versions.empty?
346
354
 
347
- trees.sort_by! {|t| t.reverse.map(&:name) }
348
- end
355
+ next unless dep_package.current_platform?
349
356
 
350
- o << trees.map do |tree|
351
- t = "".dup
352
- depth = 2
353
-
354
- base_tree = tree.first
355
- base_tree_name = base_tree.name
356
-
357
- if base_tree_name.end_with?("\0")
358
- t = nil
359
- else
360
- tree.each do |req|
361
- t << " " * depth << SharedHelpers.pretty_dependency(req)
362
- unless tree.last == req
363
- if spec = conflict.activated_by_name[req.name]
364
- t << %( was resolved to #{spec.version}, which)
365
- end
366
- t << %( depends on)
367
- end
368
- t << %(\n)
369
- depth += 1
370
- end
371
- end
372
- t
373
- end.compact.join("\n")
374
-
375
- if name == "bundler"
376
- o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
377
-
378
- conflict_dependency = conflict.requirement
379
- conflict_requirement = conflict_dependency.requirement
380
- other_bundler_required = !conflict_requirement.satisfied_by?(Gem::Version.new(Bundler::VERSION))
381
-
382
- if other_bundler_required
383
- o << "\n\n"
384
-
385
- candidate_specs = source_for(:default_bundler).specs.search(conflict_dependency)
386
- if candidate_specs.any?
387
- target_version = candidate_specs.last.version
388
- new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
389
- o << "Your bundle requires a different version of Bundler than the one you're running.\n"
390
- o << "Install the necessary version with `gem install bundler:#{target_version}` and rerun bundler using `#{new_command}`\n"
391
- else
392
- o << "Your bundle requires a different version of Bundler than the one you're running, and that version could not be found.\n"
393
- end
394
- end
395
- elsif name.end_with?("\0")
396
- o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
397
- elsif conflict.locked_requirement
398
- o << "\n"
399
- o << %(Deleting your #{name_for_locking_dependency_source} file and running `bundle install` will rebuild your snapshot from scratch, using only\n)
400
- o << %(the gems in your Gemfile, which may resolve the conflict.\n)
401
- elsif !conflict.existing
402
- o << "\n"
403
-
404
- relevant_source = conflict.requirement.source || source_for(name)
405
-
406
- extra_message = if conflict.requirement_trees.first.size > 1
407
- ", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
408
- else
409
- ""
410
- end
411
-
412
- o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
413
- end
357
+ raise_not_found!(dep_package)
358
+ end.compact.to_h
359
+ end
414
360
 
415
- o
361
+ def other_specs_matching_message(specs, requirement)
362
+ message = String.new("The source contains the following gems matching '#{requirement}':\n")
363
+ message << specs.map {|s| " * #{s.full_name}" }.join("\n")
364
+ message
365
+ end
366
+
367
+ def requirement_to_range(requirement)
368
+ ranges = requirement.requirements.map do |(op, version)|
369
+ ver = Resolver::Candidate.new(version).generic!
370
+ platform_ver = Resolver::Candidate.new(version).platform_specific!
371
+
372
+ case op
373
+ when "~>"
374
+ name = "~> #{ver}"
375
+ bump = Resolver::Candidate.new(version.bump.to_s + ".A")
376
+ PubGrub::VersionRange.new(:name => name, :min => ver, :max => bump, :include_min => true)
377
+ when ">"
378
+ PubGrub::VersionRange.new(:min => platform_ver)
379
+ when ">="
380
+ PubGrub::VersionRange.new(:min => ver, :include_min => true)
381
+ when "<"
382
+ PubGrub::VersionRange.new(:max => ver)
383
+ when "<="
384
+ PubGrub::VersionRange.new(:max => platform_ver, :include_max => true)
385
+ when "="
386
+ PubGrub::VersionRange.new(:min => ver, :max => platform_ver, :include_min => true, :include_max => true)
387
+ when "!="
388
+ PubGrub::VersionRange.new(:min => ver, :max => platform_ver, :include_min => true, :include_max => true).invert
389
+ else
390
+ raise "bad version specifier: #{op}"
416
391
  end
417
- )
392
+ end
393
+
394
+ ranges.inject(&:intersect)
395
+ end
396
+
397
+ def to_dependency_hash(dependencies, packages)
398
+ dependencies.inject({}) do |deps, dep|
399
+ package = packages[dep.name]
400
+
401
+ current_req = deps[package]
402
+ new_req = parse_dependency(package, dep.requirement)
403
+
404
+ deps[package] = if current_req
405
+ current_req.intersect(new_req)
406
+ else
407
+ new_req
408
+ end
409
+
410
+ deps
411
+ end
412
+ end
413
+
414
+ def bundler_not_found_message(conflict_dependencies)
415
+ candidate_specs = filter_matching_specs(default_bundler_source.specs.search("bundler"), conflict_dependencies)
416
+
417
+ if candidate_specs.any?
418
+ target_version = candidate_specs.last.version
419
+ new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
420
+ "Your bundle requires a different version of Bundler than the one you're running.\n" \
421
+ "Install the necessary version with `gem install bundler:#{target_version}` and rerun bundler using `#{new_command}`\n"
422
+ else
423
+ "Your bundle requires a different version of Bundler than the one you're running, and that version could not be found.\n"
424
+ end
418
425
  end
419
426
  end
420
427
  end