rubygems-update 4.0.21 → 4.1.0.beta1

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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +590 -53
  3. data/CONTRIBUTING.md +66 -5
  4. data/MIT.txt +4 -3
  5. data/Manifest.txt +332 -375
  6. data/README.md +26 -6
  7. data/bundler.gemspec +63 -0
  8. data/doc/POLICIES.md +147 -0
  9. data/doc/UPGRADING.md +4 -4
  10. data/{bundler/lib → lib}/bundler/build_metadata.rb +2 -2
  11. data/{bundler/lib → lib}/bundler/checksum.rb +40 -25
  12. data/{bundler/lib → lib}/bundler/ci_detector.rb +1 -1
  13. data/{bundler/lib → lib}/bundler/cli/add.rb +3 -4
  14. data/{bundler/lib → lib}/bundler/cli/cache.rb +4 -0
  15. data/{bundler/lib → lib}/bundler/cli/clean.rb +5 -0
  16. data/{bundler/lib → lib}/bundler/cli/common.rb +37 -1
  17. data/{bundler/lib → lib}/bundler/cli/config.rb +4 -2
  18. data/{bundler/lib → lib}/bundler/cli/gem.rb +0 -17
  19. data/{bundler/lib → lib}/bundler/cli/install.rb +4 -5
  20. data/{bundler/lib → lib}/bundler/cli/lock.rb +1 -2
  21. data/{bundler/lib → lib}/bundler/cli/outdated.rb +8 -3
  22. data/{bundler/lib → lib}/bundler/cli/pristine.rb +2 -1
  23. data/{bundler/lib → lib}/bundler/cli/update.rb +21 -12
  24. data/{bundler/lib → lib}/bundler/cli.rb +14 -11
  25. data/{bundler/lib → lib}/bundler/definition.rb +61 -24
  26. data/{bundler/lib → lib}/bundler/dependency.rb +4 -0
  27. data/{bundler/lib → lib}/bundler/dsl.rb +77 -11
  28. data/{bundler/lib → lib}/bundler/endpoint_specification.rb +51 -14
  29. data/{bundler/lib → lib}/bundler/env.rb +7 -24
  30. data/{bundler/lib → lib}/bundler/errors.rb +34 -5
  31. data/{bundler/lib → lib}/bundler/fetcher/compact_index.rb +14 -5
  32. data/lib/bundler/fetcher/connection_pools.rb +150 -0
  33. data/{bundler/lib → lib}/bundler/fetcher/downloader.rb +31 -16
  34. data/{bundler/lib → lib}/bundler/fetcher.rb +8 -47
  35. data/{bundler/lib → lib}/bundler/injector.rb +3 -3
  36. data/{bundler/lib → lib}/bundler/inline.rb +44 -4
  37. data/{bundler/lib → lib}/bundler/installer/parallel_installer.rb +25 -30
  38. data/{bundler/lib → lib}/bundler/installer.rb +20 -6
  39. data/{bundler/lib → lib}/bundler/lazy_specification.rb +44 -17
  40. data/{bundler/lib → lib}/bundler/lockfile_generator.rb +24 -2
  41. data/{bundler/lib → lib}/bundler/lockfile_parser.rb +43 -5
  42. data/{bundler/lib → lib}/bundler/man/bundle-add.1 +7 -4
  43. data/{bundler/lib → lib}/bundler/man/bundle-add.1.ronn +8 -4
  44. data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1 +1 -1
  45. data/{bundler/lib → lib}/bundler/man/bundle-cache.1 +2 -2
  46. data/{bundler/lib → lib}/bundler/man/bundle-cache.1.ronn +2 -2
  47. data/{bundler/lib → lib}/bundler/man/bundle-check.1 +1 -1
  48. data/{bundler/lib → lib}/bundler/man/bundle-clean.1 +1 -1
  49. data/{bundler/lib → lib}/bundler/man/bundle-config.1 +38 -6
  50. data/{bundler/lib → lib}/bundler/man/bundle-config.1.ronn +143 -10
  51. data/{bundler/lib → lib}/bundler/man/bundle-console.1 +1 -1
  52. data/{bundler/lib → lib}/bundler/man/bundle-doctor.1 +1 -1
  53. data/{bundler/lib → lib}/bundler/man/bundle-env.1 +1 -1
  54. data/{bundler/lib → lib}/bundler/man/bundle-exec.1 +1 -1
  55. data/{bundler/lib → lib}/bundler/man/bundle-fund.1 +1 -1
  56. data/{bundler/lib → lib}/bundler/man/bundle-gem.1 +1 -1
  57. data/{bundler/lib → lib}/bundler/man/bundle-help.1 +1 -1
  58. data/{bundler/lib → lib}/bundler/man/bundle-info.1 +1 -1
  59. data/{bundler/lib → lib}/bundler/man/bundle-init.1 +1 -1
  60. data/{bundler/lib → lib}/bundler/man/bundle-install.1 +2 -2
  61. data/{bundler/lib → lib}/bundler/man/bundle-install.1.ronn +4 -4
  62. data/{bundler/lib → lib}/bundler/man/bundle-issue.1 +1 -1
  63. data/{bundler/lib → lib}/bundler/man/bundle-licenses.1 +1 -1
  64. data/{bundler/lib → lib}/bundler/man/bundle-list.1 +1 -1
  65. data/{bundler/lib → lib}/bundler/man/bundle-lock.1 +3 -3
  66. data/{bundler/lib → lib}/bundler/man/bundle-lock.1.ronn +5 -5
  67. data/{bundler/lib → lib}/bundler/man/bundle-open.1 +1 -1
  68. data/{bundler/lib → lib}/bundler/man/bundle-outdated.1 +1 -1
  69. data/{bundler/lib → lib}/bundler/man/bundle-platform.1 +1 -1
  70. data/{bundler/lib → lib}/bundler/man/bundle-plugin.1 +1 -1
  71. data/{bundler/lib → lib}/bundler/man/bundle-pristine.1 +1 -1
  72. data/{bundler/lib → lib}/bundler/man/bundle-remove.1 +1 -1
  73. data/{bundler/lib → lib}/bundler/man/bundle-show.1 +1 -1
  74. data/{bundler/lib → lib}/bundler/man/bundle-update.1 +3 -3
  75. data/{bundler/lib → lib}/bundler/man/bundle-update.1.ronn +3 -5
  76. data/{bundler/lib → lib}/bundler/man/bundle-version.1 +1 -1
  77. data/{bundler/lib → lib}/bundler/man/bundle.1 +1 -1
  78. data/{bundler/lib → lib}/bundler/man/gemfile.5 +45 -1
  79. data/{bundler/lib → lib}/bundler/man/gemfile.5.ronn +53 -0
  80. data/lib/bundler/match_metadata.rb +50 -0
  81. data/{bundler/lib → lib}/bundler/match_platform.rb +25 -2
  82. data/lib/bundler/match_remote_metadata.rb +44 -0
  83. data/{bundler/lib → lib}/bundler/materialization.rb +2 -1
  84. data/lib/bundler/override.rb +69 -0
  85. data/{bundler/lib → lib}/bundler/plugin/dsl.rb +3 -5
  86. data/{bundler/lib → lib}/bundler/plugin/events.rb +55 -13
  87. data/{bundler/lib → lib}/bundler/plugin/index.rb +87 -11
  88. data/{bundler/lib → lib}/bundler/plugin/installer/path.rb +1 -1
  89. data/{bundler/lib → lib}/bundler/plugin/installer.rb +13 -5
  90. data/{bundler/lib → lib}/bundler/plugin.rb +58 -30
  91. data/{bundler/lib → lib}/bundler/remote_specification.rb +6 -3
  92. data/{bundler/lib → lib}/bundler/resolver/base.rb +2 -1
  93. data/{bundler/lib → lib}/bundler/resolver/incompatibility.rb +1 -1
  94. data/{bundler/lib → lib}/bundler/resolver.rb +73 -23
  95. data/{bundler/lib → lib}/bundler/ruby_version.rb +0 -2
  96. data/{bundler/lib → lib}/bundler/rubygems_ext.rb +71 -1
  97. data/{bundler/lib → lib}/bundler/rubygems_gem_installer.rb +41 -2
  98. data/{bundler/lib → lib}/bundler/rubygems_integration.rb +7 -2
  99. data/{bundler/lib → lib}/bundler/runtime.rb +69 -2
  100. data/{bundler/lib → lib}/bundler/self_manager.rb +9 -15
  101. data/{bundler/lib → lib}/bundler/settings.rb +373 -30
  102. data/{bundler/lib → lib}/bundler/shared_helpers.rb +2 -1
  103. data/{bundler/lib → lib}/bundler/source/git/git_proxy.rb +2 -10
  104. data/{bundler/lib → lib}/bundler/source/git.rb +15 -6
  105. data/{bundler/lib → lib}/bundler/source/path/installer.rb +1 -1
  106. data/{bundler/lib → lib}/bundler/source/rubygems/remote.rb +10 -5
  107. data/{bundler/lib → lib}/bundler/source/rubygems.rb +48 -12
  108. data/{bundler/lib → lib}/bundler/spec_set.rb +16 -4
  109. data/{bundler/lib → lib}/bundler/stub_specification.rb +2 -1
  110. data/{bundler/lib → lib}/bundler/templates/newgem/Gemfile.tt +4 -4
  111. data/{bundler/lib → lib}/bundler/templates/newgem/newgem.gemspec.tt +3 -3
  112. data/{bundler/lib → lib}/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
  113. data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
  114. data/{bundler/lib → lib}/bundler/ui/shell.rb +0 -4
  115. data/{bundler/lib → lib}/bundler/ui/silent.rb +0 -4
  116. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +35 -2
  117. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/base.rb +2 -1
  118. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/basic.rb +14 -6
  119. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/color.rb +2 -0
  120. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/version.rb +1 -1
  121. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor.rb +34 -1
  122. data/lib/bundler/vendored_pub_grub.rb +7 -0
  123. data/lib/bundler/vendored_securerandom.rb +15 -0
  124. data/lib/bundler/vendored_uri.rb +21 -0
  125. data/{bundler/lib → lib}/bundler/version.rb +1 -1
  126. data/{bundler/lib → lib}/bundler/worker.rb +3 -2
  127. data/{bundler/lib → lib}/bundler.rb +1 -1
  128. data/lib/rubygems/basic_specification.rb +15 -14
  129. data/lib/rubygems/bundler_settings.rb +137 -0
  130. data/lib/rubygems/bundler_version_finder.rb +13 -55
  131. data/lib/rubygems/ci_detector.rb +1 -1
  132. data/lib/rubygems/commands/build_command.rb +8 -1
  133. data/lib/rubygems/commands/cert_command.rb +9 -7
  134. data/lib/rubygems/commands/contents_command.rb +1 -1
  135. data/lib/rubygems/commands/dependency_command.rb +15 -3
  136. data/lib/rubygems/commands/environment_command.rb +1 -0
  137. data/lib/rubygems/commands/exec_command.rb +3 -0
  138. data/lib/rubygems/commands/fetch_command.rb +1 -1
  139. data/lib/rubygems/commands/help_command.rb +3 -1
  140. data/lib/rubygems/commands/install_command.rb +13 -3
  141. data/lib/rubygems/commands/lock_command.rb +2 -2
  142. data/lib/rubygems/commands/outdated_command.rb +77 -2
  143. data/lib/rubygems/commands/owner_command.rb +1 -1
  144. data/lib/rubygems/commands/push_command.rb +159 -21
  145. data/lib/rubygems/commands/setup_command.rb +20 -23
  146. data/lib/rubygems/commands/signin_command.rb +3 -1
  147. data/lib/rubygems/commands/signout_command.rb +26 -6
  148. data/lib/rubygems/commands/specification_command.rb +1 -1
  149. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  150. data/lib/rubygems/commands/update_command.rb +84 -2
  151. data/lib/rubygems/commands/yank_command.rb +10 -7
  152. data/lib/rubygems/compact_index_client/cache.rb +122 -0
  153. data/lib/rubygems/compact_index_client/cache_file.rb +147 -0
  154. data/lib/rubygems/compact_index_client/http_fetcher.rb +88 -0
  155. data/lib/rubygems/compact_index_client/parser.rb +90 -0
  156. data/lib/rubygems/compact_index_client/updater.rb +113 -0
  157. data/lib/rubygems/compact_index_client.rb +111 -0
  158. data/lib/rubygems/config_file.rb +304 -22
  159. data/lib/rubygems/content_address.rb +194 -0
  160. data/lib/rubygems/cooldown.rb +173 -0
  161. data/lib/rubygems/cooldown_option.rb +27 -0
  162. data/lib/rubygems/cooldown_settings.rb +57 -0
  163. data/lib/rubygems/credential_store/native/linux.rb +97 -0
  164. data/lib/rubygems/credential_store/native/macos.rb +88 -0
  165. data/lib/rubygems/credential_store/native/windows.rb +130 -0
  166. data/lib/rubygems/credential_store.rb +332 -0
  167. data/lib/rubygems/defaults.rb +9 -0
  168. data/lib/rubygems/dependency_installer.rb +15 -0
  169. data/lib/rubygems/doctor.rb +23 -6
  170. data/lib/rubygems/exceptions.rb +11 -43
  171. data/lib/rubygems/ext/builder.rb +70 -5
  172. data/lib/rubygems/ext/cargo_builder.rb +0 -9
  173. data/lib/rubygems/ext/ext_conf_builder.rb +8 -15
  174. data/lib/rubygems/gemcutter_utilities.rb +44 -2
  175. data/lib/rubygems/install_update_options.rb +16 -0
  176. data/lib/rubygems/installer.rb +90 -11
  177. data/lib/rubygems/installer_uninstaller_utils.rb +24 -3
  178. data/lib/rubygems/name_tuple.rb +55 -18
  179. data/lib/rubygems/package/old.rb +1 -1
  180. data/lib/rubygems/package.rb +200 -47
  181. data/lib/rubygems/package_task.rb +2 -2
  182. data/lib/rubygems/platform.rb +2 -2
  183. data/lib/rubygems/query_utils.rb +84 -24
  184. data/lib/rubygems/remote_fetcher.rb +65 -17
  185. data/lib/rubygems/request/connection_pools.rb +3 -0
  186. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  187. data/lib/rubygems/request_set/lockfile.rb +0 -2
  188. data/lib/rubygems/request_set.rb +105 -17
  189. data/lib/rubygems/resolver/api_set.rb +14 -26
  190. data/lib/rubygems/resolver/api_specification.rb +56 -15
  191. data/lib/rubygems/resolver/incompatibility.rb +10 -0
  192. data/lib/rubygems/resolver/index_specification.rb +6 -4
  193. data/lib/rubygems/resolver/installer_set.rb +2 -2
  194. data/lib/rubygems/resolver/lock_specification.rb +5 -1
  195. data/lib/rubygems/resolver/spec_specification.rb +4 -0
  196. data/lib/rubygems/resolver/specification.rb +16 -1
  197. data/lib/rubygems/resolver/strategy.rb +44 -0
  198. data/lib/rubygems/resolver.rb +471 -145
  199. data/lib/rubygems/safe_marshal.rb +2 -1
  200. data/lib/rubygems/safe_yaml.rb +20 -3
  201. data/lib/rubygems/security/policy.rb +11 -3
  202. data/lib/rubygems/security/signer.rb +15 -7
  203. data/lib/rubygems/security.rb +111 -17
  204. data/lib/rubygems/source/local.rb +7 -2
  205. data/lib/rubygems/source.rb +270 -23
  206. data/lib/rubygems/spec_fetcher.rb +47 -12
  207. data/lib/rubygems/specification.rb +76 -32
  208. data/lib/rubygems/specification_policy.rb +33 -6
  209. data/lib/rubygems/specification_record.rb +41 -2
  210. data/lib/rubygems/stub_specification.rb +39 -16
  211. data/lib/rubygems/uninstaller.rb +2 -0
  212. data/lib/rubygems/util/atomic_file_writer.rb +109 -0
  213. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +2 -1
  214. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +5 -6
  215. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +8 -4
  216. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +15 -1
  217. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +2 -1
  218. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +68 -0
  219. data/lib/rubygems/vendor/net-http/lib/net/http.rb +60 -49
  220. data/lib/rubygems/vendor/optparse/lib/optparse.rb +23 -30
  221. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/assignment.rb +1 -1
  222. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +7 -7
  223. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/failure_writer.rb +1 -1
  224. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/incompatibility.rb +4 -4
  225. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/package.rb +1 -1
  226. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/partial_solution.rb +1 -1
  227. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/rubygems.rb +3 -3
  228. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/solve_failure.rb +1 -1
  229. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/static_package_source.rb +3 -3
  230. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/strategy.rb +2 -2
  231. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/term.rb +1 -1
  232. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version.rb +1 -1
  233. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_constraint.rb +3 -3
  234. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_range.rb +1 -1
  235. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_solver.rb +2 -2
  236. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_union.rb +1 -1
  237. data/lib/rubygems/vendor/pub_grub/lib/pub_grub.rb +57 -0
  238. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3508 -0
  239. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +4 -0
  240. data/lib/rubygems/vendor/timeout/lib/timeout.rb +190 -77
  241. data/lib/rubygems/vendor/uri/lib/uri.rb +4 -0
  242. data/{bundler/lib/bundler → lib/rubygems}/vendored_pub_grub.rb +0 -1
  243. data/lib/rubygems/version.rb +129 -111
  244. data/lib/rubygems/version_option.rb +14 -0
  245. data/lib/rubygems/yaml_serializer.rb +853 -71
  246. data/lib/rubygems.rb +45 -11
  247. data/rubygems-update.gemspec +3 -4
  248. data/setup.rb +1 -0
  249. metadata +365 -410
  250. data/bundler/CHANGELOG.md +0 -5784
  251. data/bundler/LICENSE.md +0 -22
  252. data/bundler/README.md +0 -58
  253. data/bundler/bundler.gemspec +0 -46
  254. data/bundler/lib/bundler/compact_index_client/cache.rb +0 -107
  255. data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -148
  256. data/bundler/lib/bundler/compact_index_client/parser.rb +0 -87
  257. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -105
  258. data/bundler/lib/bundler/compact_index_client.rb +0 -92
  259. data/bundler/lib/bundler/match_metadata.rb +0 -30
  260. data/bundler/lib/bundler/match_remote_metadata.rb +0 -29
  261. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +0 -20
  262. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +0 -227
  263. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +0 -3
  264. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -56
  265. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +0 -230
  266. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +0 -82
  267. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +0 -41
  268. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +0 -65
  269. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +0 -80
  270. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +0 -1153
  271. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +0 -31
  272. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +0 -102
  273. data/bundler/lib/bundler/vendor/uri/COPYING +0 -56
  274. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +0 -922
  275. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +0 -100
  276. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -267
  277. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +0 -1592
  278. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -137
  279. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -23
  280. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +0 -261
  281. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +0 -22
  282. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -293
  283. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +0 -547
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +0 -206
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +0 -6
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +0 -83
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +0 -23
  288. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -104
  289. data/bundler/lib/bundler/vendored_persistent.rb +0 -11
  290. data/bundler/lib/bundler/vendored_securerandom.rb +0 -12
  291. data/bundler/lib/bundler/vendored_uri.rb +0 -21
  292. data/bundler/lib/bundler/yaml_serializer.rb +0 -98
  293. data/doc/rubygems/CONTRIBUTING.md +0 -231
  294. data/doc/rubygems/POLICIES.md +0 -60
  295. data/lib/rubygems/request_set/lockfile/parser.rb +0 -344
  296. data/lib/rubygems/request_set/lockfile/tokenizer.rb +0 -122
  297. data/lib/rubygems/resolver/conflict.rb +0 -146
  298. data/lib/rubygems/resolver/stats.rb +0 -46
  299. data/lib/rubygems/util/list.rb +0 -40
  300. data/lib/rubygems/vendor/molinillo/LICENSE +0 -9
  301. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  302. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  303. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  304. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  305. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  306. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  307. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  308. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  309. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  310. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  311. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  312. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  313. data/lib/rubygems/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  314. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  315. data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  316. data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  317. data/lib/rubygems/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  318. data/lib/rubygems/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  319. data/lib/rubygems/vendor/molinillo/lib/molinillo/state.rb +0 -58
  320. data/lib/rubygems/vendor/molinillo/lib/molinillo.rb +0 -11
  321. data/lib/rubygems/vendored_molinillo.rb +0 -3
  322. /data/{bundler/exe → exe}/bundle +0 -0
  323. /data/{bundler/exe → exe}/bundler +0 -0
  324. /data/{bundler/lib → lib}/bundler/.document +0 -0
  325. /data/{bundler/lib → lib}/bundler/capistrano.rb +0 -0
  326. /data/{bundler/lib → lib}/bundler/cli/binstubs.rb +0 -0
  327. /data/{bundler/lib → lib}/bundler/cli/check.rb +0 -0
  328. /data/{bundler/lib → lib}/bundler/cli/console.rb +0 -0
  329. /data/{bundler/lib → lib}/bundler/cli/doctor/diagnose.rb +0 -0
  330. /data/{bundler/lib → lib}/bundler/cli/doctor/ssl.rb +0 -0
  331. /data/{bundler/lib → lib}/bundler/cli/doctor.rb +0 -0
  332. /data/{bundler/lib → lib}/bundler/cli/exec.rb +0 -0
  333. /data/{bundler/lib → lib}/bundler/cli/fund.rb +0 -0
  334. /data/{bundler/lib → lib}/bundler/cli/info.rb +0 -0
  335. /data/{bundler/lib → lib}/bundler/cli/init.rb +0 -0
  336. /data/{bundler/lib → lib}/bundler/cli/issue.rb +0 -0
  337. /data/{bundler/lib → lib}/bundler/cli/list.rb +0 -0
  338. /data/{bundler/lib → lib}/bundler/cli/open.rb +0 -0
  339. /data/{bundler/lib → lib}/bundler/cli/platform.rb +0 -0
  340. /data/{bundler/lib → lib}/bundler/cli/plugin.rb +0 -0
  341. /data/{bundler/lib → lib}/bundler/cli/remove.rb +0 -0
  342. /data/{bundler/lib → lib}/bundler/cli/show.rb +0 -0
  343. /data/{bundler/lib → lib}/bundler/constants.rb +0 -0
  344. /data/{bundler/lib → lib}/bundler/current_ruby.rb +0 -0
  345. /data/{bundler/lib → lib}/bundler/deployment.rb +0 -0
  346. /data/{bundler/lib → lib}/bundler/deprecate.rb +0 -0
  347. /data/{bundler/lib → lib}/bundler/digest.rb +0 -0
  348. /data/{bundler/lib → lib}/bundler/environment_preserver.rb +0 -0
  349. /data/{bundler/lib → lib}/bundler/feature_flag.rb +0 -0
  350. /data/{bundler/lib → lib}/bundler/fetcher/base.rb +0 -0
  351. /data/{bundler/lib → lib}/bundler/fetcher/dependency.rb +0 -0
  352. /data/{bundler/lib → lib}/bundler/fetcher/gem_remote_fetcher.rb +0 -0
  353. /data/{bundler/lib → lib}/bundler/fetcher/index.rb +0 -0
  354. /data/{bundler/lib → lib}/bundler/force_platform.rb +0 -0
  355. /data/{bundler/lib → lib}/bundler/friendly_errors.rb +0 -0
  356. /data/{bundler/lib → lib}/bundler/gem_helper.rb +0 -0
  357. /data/{bundler/lib → lib}/bundler/gem_tasks.rb +0 -0
  358. /data/{bundler/lib → lib}/bundler/gem_version_promoter.rb +0 -0
  359. /data/{bundler/lib → lib}/bundler/index.rb +0 -0
  360. /data/{bundler/lib → lib}/bundler/installer/gem_installer.rb +0 -0
  361. /data/{bundler/lib → lib}/bundler/installer/standalone.rb +0 -0
  362. /data/{bundler/lib → lib}/bundler/man/.document +0 -0
  363. /data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1.ronn +0 -0
  364. /data/{bundler/lib → lib}/bundler/man/bundle-check.1.ronn +0 -0
  365. /data/{bundler/lib → lib}/bundler/man/bundle-clean.1.ronn +0 -0
  366. /data/{bundler/lib → lib}/bundler/man/bundle-console.1.ronn +0 -0
  367. /data/{bundler/lib → lib}/bundler/man/bundle-doctor.1.ronn +0 -0
  368. /data/{bundler/lib → lib}/bundler/man/bundle-env.1.ronn +0 -0
  369. /data/{bundler/lib → lib}/bundler/man/bundle-exec.1.ronn +0 -0
  370. /data/{bundler/lib → lib}/bundler/man/bundle-fund.1.ronn +0 -0
  371. /data/{bundler/lib → lib}/bundler/man/bundle-gem.1.ronn +0 -0
  372. /data/{bundler/lib → lib}/bundler/man/bundle-help.1.ronn +0 -0
  373. /data/{bundler/lib → lib}/bundler/man/bundle-info.1.ronn +0 -0
  374. /data/{bundler/lib → lib}/bundler/man/bundle-init.1.ronn +0 -0
  375. /data/{bundler/lib → lib}/bundler/man/bundle-issue.1.ronn +0 -0
  376. /data/{bundler/lib → lib}/bundler/man/bundle-licenses.1.ronn +0 -0
  377. /data/{bundler/lib → lib}/bundler/man/bundle-list.1.ronn +0 -0
  378. /data/{bundler/lib → lib}/bundler/man/bundle-open.1.ronn +0 -0
  379. /data/{bundler/lib → lib}/bundler/man/bundle-outdated.1.ronn +0 -0
  380. /data/{bundler/lib → lib}/bundler/man/bundle-platform.1.ronn +0 -0
  381. /data/{bundler/lib → lib}/bundler/man/bundle-plugin.1.ronn +0 -0
  382. /data/{bundler/lib → lib}/bundler/man/bundle-pristine.1.ronn +0 -0
  383. /data/{bundler/lib → lib}/bundler/man/bundle-remove.1.ronn +0 -0
  384. /data/{bundler/lib → lib}/bundler/man/bundle-show.1.ronn +0 -0
  385. /data/{bundler/lib → lib}/bundler/man/bundle-version.1.ronn +0 -0
  386. /data/{bundler/lib → lib}/bundler/man/bundle.1.ronn +0 -0
  387. /data/{bundler/lib → lib}/bundler/man/index.txt +0 -0
  388. /data/{bundler/lib → lib}/bundler/mirror.rb +0 -0
  389. /data/{bundler/lib → lib}/bundler/plugin/api/source.rb +0 -0
  390. /data/{bundler/lib → lib}/bundler/plugin/api.rb +0 -0
  391. /data/{bundler/lib → lib}/bundler/plugin/installer/git.rb +0 -0
  392. /data/{bundler/lib → lib}/bundler/plugin/installer/rubygems.rb +0 -0
  393. /data/{bundler/lib → lib}/bundler/plugin/source_list.rb +0 -0
  394. /data/{bundler/lib → lib}/bundler/plugin/unloaded_source.rb +0 -0
  395. /data/{bundler/lib → lib}/bundler/process_lock.rb +0 -0
  396. /data/{bundler/lib → lib}/bundler/resolver/candidate.rb +0 -0
  397. /data/{bundler/lib → lib}/bundler/resolver/package.rb +0 -0
  398. /data/{bundler/lib → lib}/bundler/resolver/root.rb +0 -0
  399. /data/{bundler/lib → lib}/bundler/resolver/spec_group.rb +0 -0
  400. /data/{bundler/lib → lib}/bundler/resolver/strategy.rb +0 -0
  401. /data/{bundler/lib → lib}/bundler/retry.rb +0 -0
  402. /data/{bundler/lib → lib}/bundler/ruby_dsl.rb +0 -0
  403. /data/{bundler/lib → lib}/bundler/safe_marshal.rb +0 -0
  404. /data/{bundler/lib → lib}/bundler/settings/validator.rb +0 -0
  405. /data/{bundler/lib → lib}/bundler/setup.rb +0 -0
  406. /data/{bundler/lib → lib}/bundler/source/gemspec.rb +0 -0
  407. /data/{bundler/lib → lib}/bundler/source/metadata.rb +0 -0
  408. /data/{bundler/lib → lib}/bundler/source/path.rb +0 -0
  409. /data/{bundler/lib → lib}/bundler/source/rubygems_aggregate.rb +0 -0
  410. /data/{bundler/lib → lib}/bundler/source.rb +0 -0
  411. /data/{bundler/lib → lib}/bundler/source_list.rb +0 -0
  412. /data/{bundler/lib → lib}/bundler/source_map.rb +0 -0
  413. /data/{bundler/lib → lib}/bundler/templates/.document +0 -0
  414. /data/{bundler/lib → lib}/bundler/templates/Executable +0 -0
  415. /data/{bundler/lib → lib}/bundler/templates/Executable.standalone +0 -0
  416. /data/{bundler/lib → lib}/bundler/templates/Gemfile +0 -0
  417. /data/{bundler/lib → lib}/bundler/templates/newgem/CHANGELOG.md.tt +0 -0
  418. /data/{bundler/lib → lib}/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +0 -0
  419. /data/{bundler/lib → lib}/bundler/templates/newgem/Cargo.toml.tt +0 -0
  420. /data/{bundler/lib → lib}/bundler/templates/newgem/LICENSE.txt.tt +0 -0
  421. /data/{bundler/lib → lib}/bundler/templates/newgem/README.md.tt +0 -0
  422. /data/{bundler/lib → lib}/bundler/templates/newgem/Rakefile.tt +0 -0
  423. /data/{bundler/lib → lib}/bundler/templates/newgem/bin/console.tt +0 -0
  424. /data/{bundler/lib → lib}/bundler/templates/newgem/bin/setup.tt +0 -0
  425. /data/{bundler/lib → lib}/bundler/templates/newgem/circleci/config.yml.tt +0 -0
  426. /data/{bundler/lib → lib}/bundler/templates/newgem/exe/newgem.tt +0 -0
  427. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +0 -0
  428. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/build.rs.tt +0 -0
  429. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +0 -0
  430. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +0 -0
  431. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +0 -0
  432. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/go.mod.tt +0 -0
  433. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +0 -0
  434. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.c.tt +0 -0
  435. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.go.tt +0 -0
  436. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.h.tt +0 -0
  437. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +0 -0
  438. /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/build-gems.yml.tt +0 -0
  439. /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/main.yml.tt +0 -0
  440. /data/{bundler/lib → lib}/bundler/templates/newgem/gitignore.tt +0 -0
  441. /data/{bundler/lib → lib}/bundler/templates/newgem/gitlab-ci.yml.tt +0 -0
  442. /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem/version.rb.tt +0 -0
  443. /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem.rb.tt +0 -0
  444. /data/{bundler/lib → lib}/bundler/templates/newgem/rspec.tt +0 -0
  445. /data/{bundler/lib → lib}/bundler/templates/newgem/rubocop.yml.tt +0 -0
  446. /data/{bundler/lib → lib}/bundler/templates/newgem/sig/newgem.rbs.tt +0 -0
  447. /data/{bundler/lib → lib}/bundler/templates/newgem/spec/spec_helper.rb.tt +0 -0
  448. /data/{bundler/lib → lib}/bundler/templates/newgem/standard.yml.tt +0 -0
  449. /data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_helper.rb.tt +0 -0
  450. /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +0 -0
  451. /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +0 -0
  452. /data/{bundler/lib → lib}/bundler/ui/rg_proxy.rb +0 -0
  453. /data/{bundler/lib → lib}/bundler/ui.rb +0 -0
  454. /data/{bundler/lib → lib}/bundler/uri_credentials_filter.rb +0 -0
  455. /data/{bundler/lib → lib}/bundler/uri_normalizer.rb +0 -0
  456. /data/{bundler/lib → lib}/bundler/vendor/.document +0 -0
  457. /data/{bundler/lib → lib}/bundler/vendor/fileutils/COPYING +0 -0
  458. /data/{bundler/lib → lib}/bundler/vendor/fileutils/lib/fileutils.rb +0 -0
  459. /data/{bundler/lib → lib}/bundler/vendor/thor/LICENSE.md +0 -0
  460. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_file.rb +0 -0
  461. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_link.rb +0 -0
  462. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/directory.rb +0 -0
  463. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +0 -0
  464. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +0 -0
  465. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions.rb +0 -0
  466. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/command.rb +0 -0
  467. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -0
  468. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/error.rb +0 -0
  469. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/group.rb +0 -0
  470. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/invocation.rb +0 -0
  471. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/basic.rb +0 -0
  472. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/readline.rb +0 -0
  473. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor.rb +0 -0
  474. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/nested_context.rb +0 -0
  475. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/argument.rb +0 -0
  476. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/arguments.rb +0 -0
  477. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/option.rb +0 -0
  478. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/options.rb +0 -0
  479. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser.rb +0 -0
  480. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/rake_compat.rb +0 -0
  481. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/runner.rb +0 -0
  482. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/column_printer.rb +0 -0
  483. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/html.rb +0 -0
  484. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/table_printer.rb +0 -0
  485. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/terminal.rb +0 -0
  486. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +0 -0
  487. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell.rb +0 -0
  488. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/util.rb +0 -0
  489. /data/{bundler/lib → lib}/bundler/vendored_fileutils.rb +0 -0
  490. /data/{bundler/lib → lib}/bundler/vendored_net_http.rb +0 -0
  491. /data/{bundler/lib → lib}/bundler/vendored_thor.rb +0 -0
  492. /data/{bundler/lib → lib}/bundler/vendored_timeout.rb +0 -0
  493. /data/{bundler/lib → lib}/bundler/vendored_tsort.rb +0 -0
  494. /data/{bundler/lib → lib}/bundler/vlad.rb +0 -0
  495. /data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/LICENSE.txt +0 -0
  496. /data/{bundler/lib/bundler/vendor/securerandom → lib/rubygems/vendor/resolv}/COPYING +0 -0
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative "dependency"
4
4
  require_relative "exceptions"
5
- require_relative "util/list"
6
5
 
7
6
  ##
8
7
  # Given a set of Gem::Dependency objects as +needed+ and a way to query the
@@ -11,7 +10,7 @@ require_relative "util/list"
11
10
  # all the requirements.
12
11
 
13
12
  class Gem::Resolver
14
- require_relative "vendored_molinillo"
13
+ require_relative "vendored_pub_grub"
15
14
 
16
15
  ##
17
16
  # If the DEBUG_RESOLVER environment variable is set then debugging mode is
@@ -36,9 +35,17 @@ class Gem::Resolver
36
35
  attr_accessor :ignore_dependencies
37
36
 
38
37
  ##
39
- # List of dependencies that could not be found in the configured sources.
38
+ # The Gem::Cooldown applied to release candidates, if any.
40
39
 
41
- attr_reader :stats
40
+ attr_accessor :cooldown
41
+
42
+ ##
43
+ # Per-gem summary entries for the newest versions the cooldown kept out
44
+ # of a successful resolution. See Gem::Cooldown.output_skipped_summary.
45
+
46
+ def cooldown_skipped
47
+ @cooldown_skipped || []
48
+ end
42
49
 
43
50
  ##
44
51
  # Hash of gems to skip resolution. Keyed by gem name, with arrays of
@@ -100,224 +107,543 @@ class Gem::Resolver
100
107
  @set = set || Gem::Resolver::IndexSet.new
101
108
  @needed = needed
102
109
 
110
+ @cooldown = nil
103
111
  @development = false
104
112
  @development_shallow = false
105
113
  @ignore_dependencies = false
106
114
  @skip_gems = {}
107
115
  @soft_missing = false
108
- @stats = Gem::Resolver::Stats.new
109
- end
110
116
 
111
- def explain(stage, *data) # :nodoc:
112
- return unless DEBUG_RESOLVER
117
+ @root_package = RootPackage.new
118
+ @root_version = Gem::PubGrub::Package.root_version
119
+
120
+ @packages = {}
113
121
 
114
- d = data.map(&:pretty_inspect).join(", ")
115
- $stderr.printf "%10s %s\n", stage.to_s.upcase, d
122
+ @unfiltered_specs = Hash.new {|h, name| h[name] = find_unfiltered_specs_for(name) }
123
+ @all_specs = Hash.new {|h, name| h[name] = filter_specs(@unfiltered_specs[name]) }
124
+ @all_versions = Hash.new {|h, pkg| h[pkg] = @all_specs[pkg.to_s].map(&:version).uniq.sort }
125
+ @sorted_versions = Hash.new do |h, pkg|
126
+ h[pkg] = Gem::PubGrub::Package.root?(pkg) ? [@root_version] : @all_versions[pkg]
127
+ end
128
+ @cached_dependencies = Hash.new do |h, pkg|
129
+ h[pkg] = if Gem::PubGrub::Package.root?(pkg)
130
+ { @root_version => root_dependencies }
131
+ else
132
+ Hash.new {|v, ver| v[ver] = compute_dependencies(pkg, ver) }
133
+ end
134
+ end
135
+ @version_to_index = Hash.new {|h, pkg| h[pkg] = @sorted_versions[pkg].each_with_index.to_h }
136
+ @versions_for_cache = Hash.new {|h, pkg| h[pkg] = {} }
137
+ @spec_for_cache = Hash.new {|h, name| h[name] = build_spec_for_cache(name) }
116
138
  end
117
139
 
118
- def explain_list(stage) # :nodoc:
119
- return unless DEBUG_RESOLVER
140
+ ##
141
+ # Proceed with resolution! Returns an array of ActivationRequest objects.
120
142
 
121
- data = yield
122
- $stderr.printf "%10s (%d entries)\n", stage.to_s.upcase, data.size
123
- unless data.empty?
124
- require "pp"
125
- PP.pp data, $stderr
143
+ def resolve
144
+ # Pre-check: raise UnsatisfiableDependencyError for root deps with no
145
+ # platform match. We filter by platform ONLY here (not required_ruby_version
146
+ # / required_rubygems_version): a foreign-platform gem is genuinely "not
147
+ # found", but a gem that exists yet is incompatible with the running Ruby
148
+ # should flow through the solver to a DependencyResolutionError that names
149
+ # the Ruby requirement. That matches Bundler (which models Ruby as a
150
+ # synthetic dependency, so this surfaces as a solve failure) and gives a
151
+ # clearer message than the platform-oriented UnsatisfiableDependencyError.
152
+ @needed.each do |dep|
153
+ next if @soft_missing
154
+ dep_request = DependencyRequest.new(dep, nil)
155
+ all = @set.find_all(dep_request)
156
+ matching = select_local_platforms(all)
157
+
158
+ next unless matching.empty?
159
+
160
+ exc = Gem::UnsatisfiableDependencyError.new(dep_request, all)
161
+ exc.errors = @set.errors
162
+ raise exc
163
+ end
164
+
165
+ solver = Gem::PubGrub::VersionSolver.new(
166
+ source: self,
167
+ root: @root_package,
168
+ strategy: Gem::Resolver::Strategy.new(self),
169
+ logger: make_logger
170
+ )
171
+ result = solver.solve
172
+
173
+ # Convert to Array<ActivationRequest>
174
+ needed_by_name = @needed.group_by(&:name)
175
+ requests = result.filter_map do |package, version|
176
+ next if Gem::PubGrub::Package.root?(package)
177
+ spec = spec_for(package.to_s, version)
178
+ dep = needed_by_name[package.to_s]&.first || Gem::Dependency.new(package.to_s)
179
+ dep_request = DependencyRequest.new(dep, nil)
180
+ ActivationRequest.new(spec, dep_request)
181
+ end
182
+
183
+ @cooldown_skipped = cooldown_skipped_summary(requests) if @cooldown&.active?
184
+
185
+ requests
186
+ rescue Gem::PubGrub::SolveFailure => e
187
+ extended = extract_extended_explanation(e.incompatibility)
188
+ if extended
189
+ message = "#{e.explanation}\n\n#{extended}"
190
+ raise Gem::DependencyResolutionError, Struct.new(:explanation).new(message)
191
+ else
192
+ raise Gem::DependencyResolutionError, e
126
193
  end
127
194
  end
128
195
 
129
- ##
130
- # Creates an ActivationRequest for the given +dep+ and the last +possible+
131
- # specification.
132
- #
133
- # Returns the Specification and the ActivationRequest
196
+ # PubGrub source interface methods
197
+
198
+ def all_versions_for(package)
199
+ versions = @sorted_versions[package].reverse # highest first
200
+ name = package.to_s
201
+
202
+ if (skip_dep_gems = skip_gems[name]) && !skip_dep_gems.empty?
203
+ # Conservative mode: float the already-installed (skip) versions to the
204
+ # front so the solver prefers them. This sets *preference* only (it feeds
205
+ # the strategy's version-index map); it does not restrict availability, so
206
+ # every version stays selectable via versions_for. When an installed
207
+ # version is made impossible by a downstream conflict, the solver
208
+ # backtracks to a newer version instead of failing. Molinillo instead
209
+ # hard-restricted the candidate set to skip versions and raised.
210
+ #
211
+ # This reaches the same outcome as Bundler (upgrade-over-raise) for the
212
+ # common single-blocked-gem case, though the mechanism differs: Bundler
213
+ # hard-pins locked gems and selectively unlocks + re-solves on conflict,
214
+ # whereas we float as a preference and let PubGrub backtrack in one solve.
215
+ # The float can therefore over-upgrade when several installed gems are
216
+ # jointly involved in a conflict; that outcome-level divergence is
217
+ # accepted (see test_conservative_upgrades_when_installed_blocked).
218
+ skip_versions = skip_dep_gems.map(&:version)
219
+ preferred, rest = versions.partition {|v| skip_versions.include?(v) }
220
+ preferred + rest
221
+ else
222
+ # Prefer already-installed versions to avoid unnecessary upgrades
223
+ installed_versions = @all_specs[name].
224
+ select {|s| s.is_a?(Gem::Resolver::InstalledSpecification) }.
225
+ map(&:version)
226
+ if installed_versions.any?
227
+ preferred, rest = versions.partition {|v| installed_versions.include?(v) }
228
+ preferred + rest
229
+ else
230
+ versions
231
+ end
232
+ end
233
+ end
134
234
 
135
- def activation_request(dep, possible) # :nodoc:
136
- spec = possible.pop
235
+ def versions_for(package, range = Gem::PubGrub::VersionRange.any)
236
+ @versions_for_cache[package][range] ||= begin
237
+ candidates = range.select_versions(@sorted_versions[package])
137
238
 
138
- explain :activate, [spec.full_name, possible.size]
139
- explain :possible, possible
239
+ if Gem::PubGrub::Package.root?(package) ||
240
+ (@set.respond_to?(:prerelease) && @set.prerelease) ||
241
+ range_admits_prerelease?(range)
242
+ candidates
243
+ elsif @all_versions[package].any? {|v| !v.prerelease? }
244
+ candidates.reject(&:prerelease?)
245
+ else
246
+ # Only prereleases exist for this gem; fall back to them so
247
+ # dependencies like `>= 1.0` can still be satisfied.
248
+ candidates
249
+ end
250
+ end
251
+ end
252
+
253
+ def no_versions_incompatibility_for(_package, unsatisfied_term)
254
+ cause = Gem::PubGrub::Incompatibility::NoVersions.new(unsatisfied_term)
140
255
 
141
- activation_request =
142
- Gem::Resolver::ActivationRequest.new spec, dep, possible
256
+ name = unsatisfied_term.package.to_s
257
+ constraint = unsatisfied_term.constraint
258
+ extended_explanation = build_extended_explanation(name, constraint)
143
259
 
144
- [spec, activation_request]
260
+ custom_explanation = if extended_explanation
261
+ "#{constraint} could not be found in any repository"
262
+ end
263
+
264
+ Gem::Resolver::Incompatibility.new(
265
+ [unsatisfied_term],
266
+ cause: cause,
267
+ custom_explanation: custom_explanation,
268
+ extended_explanation: extended_explanation
269
+ )
145
270
  end
146
271
 
147
- def requests(s, act, reqs = []) # :nodoc:
148
- return reqs if @ignore_dependencies
272
+ def incompatibilities_for(package, version)
273
+ package_deps = @cached_dependencies[package]
274
+ sorted_versions = @sorted_versions[package]
275
+ package_deps[version].filter_map do |dep_package_name, dep_constraint|
276
+ dep_package = dep_constraint.package
149
277
 
150
- s.fetch_development_dependencies if @development
278
+ low = high = @version_to_index[package][version]
151
279
 
152
- s.dependencies.reverse_each do |d|
153
- next if d.type == :development && !@development
154
- next if d.type == :development && @development_shallow &&
155
- act.development?
156
- next if d.type == :development && @development_shallow &&
157
- act.parent
280
+ # find version low such that all >= low share the same dep
281
+ while low > 0 &&
282
+ package_deps[sorted_versions[low - 1]][dep_package_name] == dep_constraint
283
+ low -= 1
284
+ end
285
+ low =
286
+ if low == 0
287
+ nil
288
+ else
289
+ sorted_versions[low]
290
+ end
291
+
292
+ # find version high such that all < high share the same dep
293
+ while high < sorted_versions.length &&
294
+ package_deps[sorted_versions[high]][dep_package_name] == dep_constraint
295
+ high += 1
296
+ end
297
+ high =
298
+ if high == sorted_versions.length
299
+ nil
300
+ else
301
+ sorted_versions[high]
302
+ end
303
+
304
+ range = Gem::PubGrub::VersionRange.new(min: low, max: high, include_min: !low.nil?)
305
+ self_constraint = Gem::PubGrub::VersionConstraint.new(package, range: range)
306
+
307
+ # No specs anywhere means an unknown package. Check @unfiltered_specs, not
308
+ # the filtered set, so a dep filtered out by platform/Ruby/prerelease falls
309
+ # through to NoVersions for proper hints instead. The band-scoped
310
+ # self_constraint lets clean sibling versions still resolve via backtracking.
311
+ if @unfiltered_specs[dep_package_name].empty?
312
+ cause = Gem::PubGrub::Incompatibility::InvalidDependency.new(dep_package, dep_constraint)
313
+ self_term = Gem::PubGrub::Term.new(self_constraint, true)
314
+ # PubGrub's default InvalidDependency rendering drops the version
315
+ # requirement ("depends on unknown package bar"). Supply a custom
316
+ # explanation so the missing dependency's constraint is preserved
317
+ # ("depends on bar = 0.5 which could not be found in any repository"),
318
+ # matching Molinillo's diagnostics.
319
+ return [Gem::PubGrub::Incompatibility.new(
320
+ [self_term],
321
+ cause: cause,
322
+ custom_explanation: "#{self_term.to_s(allow_every: true)} depends on #{dep_constraint} which could not be found in any repository"
323
+ )]
324
+ end
158
325
 
159
- reqs << Gem::Resolver::DependencyRequest.new(d, act)
160
- @stats.requirement!
326
+ # An empty range means the requirement is self-contradictory (e.g. `> 2, < 1`).
327
+ if dep_constraint.range.empty?
328
+ return [Gem::Resolver::Incompatibility.new(
329
+ [Gem::PubGrub::Term.new(self_constraint, true)],
330
+ cause: Gem::PubGrub::Incompatibility::NoVersions.new(dep_constraint),
331
+ custom_explanation: "#{dep_package_name} cannot satisfy contradictory requirements #{dep_constraint.constraint_string}"
332
+ )]
333
+ end
334
+
335
+ Gem::PubGrub::Incompatibility.new(
336
+ [Gem::PubGrub::Term.new(self_constraint, true), Gem::PubGrub::Term.new(dep_constraint, false)],
337
+ cause: :dependency
338
+ )
161
339
  end
340
+ end
341
+
342
+ ##
343
+ # Returns the gems in +specs+ that match the local platform.
162
344
 
163
- @set.prefetch reqs
345
+ def select_local_platforms(specs) # :nodoc:
346
+ specs.select do |spec|
347
+ Gem::Platform.installable? spec
348
+ end
349
+ end
164
350
 
165
- @stats.record_requirements reqs
351
+ private
166
352
 
167
- reqs
353
+ def package_for(name)
354
+ @packages[name] ||= Gem::PubGrub::Package.new(name)
168
355
  end
169
356
 
170
- include Gem::Molinillo::UI
357
+ def root_dependencies
358
+ deps = {}
359
+ @needed.each do |dep|
360
+ constraint = Gem::PubGrub::RubyGems.requirement_to_constraint(package_for(dep.name), dep.requirement)
361
+ deps[dep.name] = deps.key?(dep.name) ? deps[dep.name].intersect(constraint) : constraint
362
+ end
363
+ deps
364
+ end
171
365
 
172
- def output
173
- @output ||= debug? ? $stdout : File.open(IO::NULL, "w")
366
+ # Only the min bound is inspected: `~>` synthesises a max like `X.A`
367
+ # whose suffix looks prerelease to Gem::Version but is not the user's
368
+ # intent, so checking max would mis-admit prereleases for every `~>`.
369
+ def range_admits_prerelease?(range)
370
+ range.ranges.any? do |r|
371
+ next false if r.empty?
372
+ r.min&.prerelease?
373
+ end
174
374
  end
175
375
 
176
- def debug?
177
- DEBUG_RESOLVER
376
+ def find_unfiltered_specs_for(name)
377
+ dep = Gem::Dependency.new(name, ">= 0.a")
378
+ dep_request = DependencyRequest.new(dep, nil)
379
+ @set.find_all(dep_request)
178
380
  end
179
381
 
180
- include Gem::Molinillo::SpecificationProvider
382
+ def filter_specs(specs)
383
+ filtered = select_local_platforms(specs)
181
384
 
182
- ##
183
- # Proceed with resolution! Returns an array of ActivationRequest objects.
385
+ unless @soft_missing
386
+ filtered = filtered.select do |s|
387
+ s.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
388
+ s.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
389
+ rescue StandardError
390
+ true
391
+ end
392
+ end
184
393
 
185
- def resolve
186
- Gem::Molinillo::Resolver.new(self, self).resolve(@needed.map {|d| DependencyRequest.new d, nil }).tsort.filter_map(&:payload)
187
- rescue Gem::Molinillo::VersionConflict => e
188
- conflict = e.conflicts.values.first
189
- raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement)
190
- ensure
191
- @output.close if defined?(@output) && !debug?
394
+ filtered = filter_cooldown_specs(filtered) if @cooldown&.active?
395
+
396
+ filtered
192
397
  end
193
398
 
194
399
  ##
195
- # Extracts the specifications that may be able to fulfill +dependency+ and
196
- # returns those that match the local platform and all those that match.
400
+ # Rejects specs published within the cooldown period. Specs with an
401
+ # unknown publish time (installed gems, lockfiles, sources without
402
+ # timestamps) are kept, so the cooldown fails open.
403
+
404
+ def filter_cooldown_specs(specs)
405
+ remote = specs.select do |s|
406
+ Gem::Resolver::APISpecification === s || Gem::Resolver::IndexSpecification === s
407
+ end
408
+ if remote.any? && remote.none?(&:created_at)
409
+ Gem::Cooldown.warn_missing_created_at remote.first.source
410
+ end
411
+
412
+ specs.reject do |s|
413
+ next false unless @cooldown.skip?(s.created_at)
197
414
 
198
- def find_possible(dependency) # :nodoc:
199
- all = @set.find_all dependency
415
+ (@cooldown_skipped_specs ||= {})[[s.name, s.version]] ||= s
416
+ true
417
+ end
418
+ end
200
419
 
201
- if (skip_dep_gems = skip_gems[dependency.name]) && !skip_dep_gems.empty?
202
- matching = all.select do |api_spec|
203
- skip_dep_gems.any? {|s| api_spec.version == s.version }
420
+ ##
421
+ # Reports, per gem, the newest version that the cooldown kept out of a
422
+ # successful resolution. A skipped version is only worth reporting when
423
+ # it is newer than the resolved version and satisfies every requirement
424
+ # the final resolution places on that gem, so we don't claim a version
425
+ # the resolver could never have picked anyway.
426
+
427
+ def cooldown_skipped_summary(requests)
428
+ skipped_specs = @cooldown_skipped_specs || {}
429
+ return [] if skipped_specs.empty?
430
+
431
+ requirements = Hash.new {|h, name| h[name] = [] }
432
+ @needed.each {|dep| requirements[dep.name] << dep.requirement }
433
+ requests.each do |request|
434
+ request.spec.dependencies.each do |dep|
435
+ next if dep.type == :development && !@development
436
+ requirements[dep.name] << dep.requirement
204
437
  end
438
+ end
205
439
 
206
- all = matching unless matching.empty?
440
+ resolved = {}
441
+ requests.each do |request|
442
+ version = resolved[request.spec.name]
443
+ resolved[request.spec.name] = request.spec.version if version.nil? || request.spec.version > version
207
444
  end
208
445
 
209
- matching_platform = select_local_platforms all
446
+ newest_skipped = {}
447
+ skipped_specs.each do |(name, version), spec|
448
+ resolved_version = resolved[name]
449
+ next unless resolved_version && version > resolved_version
450
+ next unless requirements[name].all? {|req| req.satisfied_by?(version) }
451
+ newest = newest_skipped[name]
452
+ newest_skipped[name] = spec if newest.nil? || version > newest.version
453
+ end
210
454
 
211
- [matching_platform, all]
455
+ newest_skipped.values.sort_by(&:name).map do |spec|
456
+ {
457
+ name: spec.name,
458
+ version: spec.version,
459
+ resolved: resolved[spec.name],
460
+ available_in_days: @cooldown.remaining_days(spec.created_at),
461
+ }
462
+ end
212
463
  end
213
464
 
214
- ##
215
- # Returns the gems in +specs+ that match the local platform.
465
+ def spec_for(name, version)
466
+ @spec_for_cache[name][version]
467
+ end
216
468
 
217
- def select_local_platforms(specs) # :nodoc:
218
- specs.select do |spec|
219
- Gem::Platform.installable? spec
469
+ def build_spec_for_cache(name)
470
+ # Rank sources by the order they were first supplied so that, when multiple
471
+ # sources offer the same version and platform, the earlier source wins.
472
+ source_rank = {}
473
+ @all_specs[name].each do |s|
474
+ source_rank[s.source] ||= source_rank.size
220
475
  end
221
- end
222
476
 
223
- def search_for(dependency)
224
- possibles, all = find_possible(dependency)
225
- if !@soft_missing && possibles.empty?
226
- exc = Gem::UnsatisfiableDependencyError.new dependency, all
227
- exc.errors = @set.errors
228
- raise exc
477
+ @all_specs[name].group_by(&:version).transform_values do |candidates|
478
+ next candidates.first if candidates.length == 1
479
+
480
+ # Prefer already-installed specs to avoid unnecessary downloads
481
+ installed = candidates.select {|s| s.is_a?(Gem::Resolver::InstalledSpecification) }
482
+ next installed.first if installed.length == 1
483
+ candidates = installed if installed.any?
484
+
485
+ # Among remaining candidates, prefer a content-addressed candidate
486
+ # built for the running Ruby, then the most specific platform, then the
487
+ # earlier-supplied source. The Ruby ABI ranks before platform
488
+ # specificity so that gem install and bundle install choose the same
489
+ # artifact: Bundler prefers compatible content-addressed candidates
490
+ # before sorting by platform.
491
+ candidates.min_by do |s|
492
+ [Gem::ContentAddress.ruby_abi_specificity_match(s),
493
+ Gem::Platform.platform_specificity_match(s.platform, Gem::Platform.local),
494
+ source_rank[s.source]]
495
+ end
229
496
  end
497
+ end
498
+
499
+ def compute_dependencies(package, version)
500
+ spec = spec_for(package.to_s, version)
501
+ return {} unless spec
502
+ return {} if @ignore_dependencies
230
503
 
231
- groups = Hash.new {|hash, key| hash[key] = [] }
504
+ spec.fetch_development_dependencies if @development && spec.respond_to?(:fetch_development_dependencies)
232
505
 
233
- # create groups & sources in the same loop
234
- sources = possibles.map do |spec|
235
- source = spec.source
236
- groups[source] << spec
237
- source
238
- end.uniq.reverse
506
+ deps = {}
507
+ root_names = @needed.map(&:name)
508
+
509
+ spec.dependencies.each do |d|
510
+ next if d.name == package.to_s
511
+ next if d.type == :development && !@development
512
+ next if d.type == :development && @development_shallow && !root_names.include?(package.to_s)
239
513
 
240
- activation_requests = []
514
+ dep_package = package_for(d.name)
241
515
 
242
- sources.each do |source|
243
- groups[source].
244
- sort_by {|spec| [spec.version, -Gem::Platform.platform_specificity_match(spec.platform, Gem::Platform.local)] }.
245
- map {|spec| ActivationRequest.new spec, dependency }.
246
- each {|activation_request| activation_requests << activation_request }
516
+ # In force mode, skip deps that can't be satisfied - either no
517
+ # specs at all, or no specs matching the version requirement.
518
+ if @soft_missing
519
+ dep_specs = @all_specs[d.name]
520
+ matching = dep_specs.select {|s| d.requirement.satisfied_by?(s.version) }
521
+ next if matching.empty?
522
+ end
523
+
524
+ deps[d.name] = Gem::PubGrub::RubyGems.requirement_to_constraint(dep_package, d.requirement)
247
525
  end
248
526
 
249
- activation_requests
527
+ deps
250
528
  end
251
529
 
252
- def dependencies_for(specification)
253
- return [] if @ignore_dependencies
254
- spec = specification.spec
255
- requests(spec, specification)
256
- end
530
+ def build_extended_explanation(name, constraint)
531
+ unfiltered = @unfiltered_specs[name]
532
+ return if unfiltered.empty?
257
533
 
258
- def requirement_satisfied_by?(requirement, activated, spec)
259
- matches_spec = requirement.matches_spec? spec
260
- return matches_spec if @soft_missing
534
+ filtered = @all_specs[name]
535
+ pkg = package_for(name)
261
536
 
262
- matches_spec &&
263
- spec.spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
264
- spec.spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
537
+ # A prerelease hint applies when the source would strip prereleases for
538
+ # this constraint (global prerelease flag off and the constraint's range
539
+ # doesn't itself reach into prerelease territory) AND a prerelease of
540
+ # the gem exists somewhere.
541
+ prerelease_gated = !(@set.respond_to?(:prerelease) && @set.prerelease) &&
542
+ !range_admits_prerelease?(constraint.range)
543
+ has_prerelease_candidate = prerelease_gated &&
544
+ @all_versions[pkg].any?(&:prerelease?)
545
+
546
+ return if filtered.length == unfiltered.length && !has_prerelease_candidate
547
+
548
+ hints = []
549
+
550
+ # Check for specs that exist for other platforms
551
+ platform_specs = unfiltered.select do |s|
552
+ !Gem::Platform.installable?(s) && constraint.range.include?(s.version)
553
+ end
554
+ if platform_specs.any?
555
+ label = "#{name} (#{constraint.constraint_string})"
556
+ hints << "The source contains the following gems matching '#{label}':"
557
+ platform_specs.each do |s|
558
+ actual = s.respond_to?(:spec) ? s.spec : s
559
+ hints << " * #{actual.full_name}"
560
+ end
561
+ end
562
+
563
+ # Check for specs filtered by Ruby version
564
+ installable = select_local_platforms(unfiltered)
565
+ ruby_specs = installable.select do |s|
566
+ actual = s.respond_to?(:spec) ? s.spec : s
567
+ constraint.range.include?(s.version) &&
568
+ !actual.required_ruby_version.satisfied_by?(Gem.ruby_version)
569
+ rescue StandardError
570
+ false
571
+ end
572
+ if ruby_specs.any?
573
+ versions = ruby_specs.map(&:version).uniq.sort.reverse.first(3)
574
+ sample = ruby_specs.find {|s| s.version == versions.first }
575
+ actual = sample.respond_to?(:spec) ? sample.spec : sample
576
+ ruby_req = actual.required_ruby_version
577
+ hints << "#{name} #{versions.join(", ")} requires Ruby #{ruby_req} (you have #{Gem.ruby_version})"
578
+ end
579
+
580
+ # Check for specs filtered by the cooldown period
581
+ if @cooldown&.active?
582
+ cooldown_specs = installable.select do |s|
583
+ constraint.range.include?(s.version) && @cooldown.skip?(s.created_at)
584
+ end
585
+ if cooldown_specs.any?
586
+ versions = cooldown_specs.map(&:version).uniq.sort.reverse.first(3)
587
+ hints << "#{name} #{versions.join(", ")} published within the cooldown period (#{@cooldown.days} days). Use --cooldown 0 to bypass it."
588
+ end
589
+ end
590
+
591
+ # Check for specs filtered by prerelease status
592
+ if prerelease_gated
593
+ prerelease_versions = @all_versions[pkg].select(&:prerelease?)
594
+ if prerelease_versions.any?
595
+ versions = prerelease_versions.sort.reverse.first(3) # limit to avoid cluttering error output
596
+ hints << "#{name} #{versions.join(", ")} are pre-release versions. Use --prerelease to allow pre-release gems."
597
+ end
598
+ end
599
+
600
+ hints.empty? ? nil : hints.join("\n")
265
601
  end
266
602
 
267
- def name_for(dependency)
268
- dependency.name
603
+ def extract_extended_explanation(incompatibility)
604
+ while incompatibility.cause.is_a?(Gem::PubGrub::Incompatibility::ConflictCause)
605
+ cause = incompatibility.cause
606
+
607
+ [cause.conflict, cause.other].each do |incompat|
608
+ if incompat.cause.is_a?(Gem::PubGrub::Incompatibility::NoVersions) &&
609
+ incompat.respond_to?(:extended_explanation) &&
610
+ incompat.extended_explanation
611
+ return incompat.extended_explanation
612
+ end
613
+ end
614
+
615
+ incompatibility = cause.conflict
616
+ end
617
+
618
+ nil
269
619
  end
270
620
 
271
- def allow_missing?(dependency)
272
- @soft_missing
621
+ def make_logger
622
+ DEBUG_RESOLVER ? Gem::PubGrub::StderrLogger.new : Gem::PubGrub::NullLogger.new
273
623
  end
274
624
 
275
- def sort_dependencies(dependencies, activated, conflicts)
276
- dependencies.sort_by.with_index do |dependency, i|
277
- name = name_for(dependency)
278
- [
279
- activated.vertex_named(name).payload ? 0 : 1,
280
- amount_constrained(dependency),
281
- conflicts[name] ? 0 : 1,
282
- activated.vertex_named(name).payload ? 0 : search_for(dependency).count,
283
- i, # for stable sort
284
- ]
625
+ # Custom root package so error messages say "your request depends on..."
626
+ # instead of PubGrub's default "root depends on...".
627
+ class RootPackage < Gem::PubGrub::Package
628
+ def initialize
629
+ super(:root)
285
630
  end
286
- end
287
631
 
288
- SINGLE_POSSIBILITY_CONSTRAINT_PENALTY = 1_000_000
289
- private_constant :SINGLE_POSSIBILITY_CONSTRAINT_PENALTY if defined?(private_constant)
632
+ def root?
633
+ true
634
+ end
290
635
 
291
- # returns an integer \in (-\infty, 0]
292
- # a number closer to 0 means the dependency is less constraining
293
- #
294
- # dependencies w/ 0 or 1 possibilities (ignoring version requirements)
295
- # are given very negative values, so they _always_ sort first,
296
- # before dependencies that are unconstrained
297
- def amount_constrained(dependency)
298
- @amount_constrained ||= {}
299
- @amount_constrained[dependency.name] ||= begin
300
- name_dependency = Gem::Dependency.new(dependency.name)
301
- dependency_request_for_name = Gem::Resolver::DependencyRequest.new(name_dependency, dependency.requester)
302
- all = @set.find_all(dependency_request_for_name).size
303
-
304
- if all <= 1
305
- all - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY
306
- else
307
- search = search_for(dependency).size
308
- search - all
309
- end
636
+ def to_s
637
+ "your request"
310
638
  end
311
639
  end
312
- private :amount_constrained
313
640
  end
314
641
 
315
642
  require_relative "resolver/activation_request"
316
- require_relative "resolver/conflict"
317
643
  require_relative "resolver/dependency_request"
644
+ require_relative "resolver/incompatibility"
645
+ require_relative "resolver/strategy"
318
646
  require_relative "resolver/requirement_list"
319
- require_relative "resolver/stats"
320
-
321
647
  require_relative "resolver/set"
322
648
  require_relative "resolver/api_set"
323
649
  require_relative "resolver/composed_set"