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
@@ -20,10 +20,6 @@ module Bundler
20
20
  state == :installed
21
21
  end
22
22
 
23
- def enqueued?
24
- state == :enqueued
25
- end
26
-
27
23
  def enqueue_with_priority?
28
24
  state == :installable && spec.extensions.any?
29
25
  end
@@ -100,7 +96,8 @@ module Bundler
100
96
  handle_error if failed_specs.any?
101
97
  @specs
102
98
  ensure
103
- worker_pool&.stop
99
+ @worker_pool&.stop
100
+ @download_worker_pool&.stop
104
101
  end
105
102
 
106
103
  private
@@ -170,17 +167,18 @@ module Bundler
170
167
  end
171
168
  end
172
169
 
170
+ def download_worker_pool
171
+ @download_worker_pool ||= Bundler::Worker.new(@size, "Gem Downloader",
172
+ ->(spec_install, worker_num) { do_download(spec_install, worker_num) }, response_queue: response_queue)
173
+ end
174
+
173
175
  def worker_pool
174
- @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda {|spec_install, worker_num|
175
- case spec_install.state
176
- when :enqueued
177
- do_download(spec_install, worker_num)
178
- when :installable
179
- do_install(spec_install, worker_num)
180
- else
181
- spec_install
182
- end
183
- }
176
+ @worker_pool ||= Bundler::Worker.new(@size, "Parallel Installer",
177
+ ->(spec_install, worker_num) { do_install(spec_install, worker_num) }, response_queue: response_queue)
178
+ end
179
+
180
+ def response_queue
181
+ @response_queue ||= Thread::Queue.new
184
182
  end
185
183
 
186
184
  def do_download(spec_install, worker_num)
@@ -218,24 +216,24 @@ module Bundler
218
216
  spec_install
219
217
  end
220
218
 
221
- # Dequeue a spec and save its post-install message and then enqueue the
222
- # remaining specs.
223
- # Some specs might've had to wait til this spec was installed to be
224
- # processed so the call to `enqueue_specs` is important after every
225
- # dequeue.
219
+ # Process one completed download or installation. Downloads can finish
220
+ # before their dependencies are installed, so check all downloaded specs
221
+ # after each completion and enqueue any that are now installable.
226
222
  def process_specs(installed_specs)
227
223
  spec = worker_pool.deq
228
224
 
229
225
  if spec.installed?
230
226
  installed_specs[spec.name] = true
231
- return
232
227
  elsif spec.failed?
233
228
  return
234
- elsif spec.ready_to_install?(installed_specs)
235
- spec.state = :installable
236
229
  end
237
230
 
238
- worker_pool.enq(spec, priority: spec.enqueue_with_priority?)
231
+ @specs.each do |candidate|
232
+ next unless candidate.ready_to_install?(installed_specs)
233
+
234
+ candidate.state = :installable
235
+ worker_pool.enq(candidate, priority: candidate.enqueue_with_priority?)
236
+ end
239
237
  end
240
238
 
241
239
  def finished_installing?
@@ -274,11 +272,8 @@ module Bundler
274
272
  t
275
273
  end
276
274
 
277
- # Keys in the remains hash represent uninstalled gems specs.
278
- # We enqueue all gem specs that do not have any dependencies.
279
- # Later we call this lambda again to install specs that depended on
280
- # previously installed specifications. We continue until all specs
281
- # are installed.
275
+ # Queue every missing spec for download. `process_specs` schedules each
276
+ # downloaded spec for installation once its dependencies are installed.
282
277
  def enqueue_specs(installed_specs)
283
278
  @specs.each do |spec|
284
279
  if spec.installed?
@@ -287,7 +282,7 @@ module Bundler
287
282
  end
288
283
 
289
284
  spec.state = :enqueued
290
- worker_pool.enq spec
285
+ download_worker_pool.enq spec
291
286
  end
292
287
  end
293
288
  end
@@ -228,18 +228,32 @@ module Bundler
228
228
  end
229
229
 
230
230
  def ensure_specs_are_compatible!
231
+ overrides = @definition.overrides
231
232
  @definition.specs.each do |spec|
232
- unless spec.matches_current_ruby?
233
- raise InstallError, "#{spec.full_name} requires ruby version #{spec.required_ruby_version}, " \
234
- "which is incompatible with the current version, #{Gem.ruby_version}"
233
+ unless spec.matches_current_ruby_with_overrides?(overrides)
234
+ raise InstallError, incompatibility_message(spec, "requires ruby version #{spec.required_ruby_version}, " \
235
+ "which is incompatible with the current version, #{Gem.ruby_version}")
235
236
  end
236
- unless spec.matches_current_rubygems?
237
- raise InstallError, "#{spec.full_name} requires rubygems version #{spec.required_rubygems_version}, " \
238
- "which is incompatible with the current version, #{Gem.rubygems_version}"
237
+ unless spec.matches_current_rubygems_with_overrides?(overrides)
238
+ raise InstallError, incompatibility_message(spec, "requires rubygems version #{spec.required_rubygems_version}, " \
239
+ "which is incompatible with the current version, #{Gem.rubygems_version}")
239
240
  end
240
241
  end
241
242
  end
242
243
 
244
+ # Build the error raised when a locked spec can't run on the current Ruby or
245
+ # RubyGems. When the offending spec is a platform-specific variant locked in
246
+ # frozen mode, point users at the fix: re-resolving outside frozen mode adds
247
+ # the Ruby (non platform-specific) fallback variant to the lockfile.
248
+ def incompatibility_message(spec, reason)
249
+ message = "#{spec.full_name} #{reason}"
250
+ return message unless Bundler.frozen_bundle? && spec.platform != Gem::Platform::RUBY
251
+
252
+ message + "\n\nThe lockfile only includes the #{spec.platform} variant of #{spec.name}. " \
253
+ "If a compatible Ruby variant is available, run `bundle install` outside of frozen/deployment mode " \
254
+ "to add it to the lockfile as a fallback, then commit the updated #{SharedHelpers.relative_lockfile_path}."
255
+ end
256
+
243
257
  def lock
244
258
  @definition.lock
245
259
  end
@@ -8,8 +8,9 @@ module Bundler
8
8
  include MatchPlatform
9
9
  include ForcePlatform
10
10
 
11
- attr_reader :name, :version, :platform, :materialization
11
+ attr_reader :name, :version, :platform, :materialization, :content_address
12
12
  attr_accessor :source, :remote, :force_ruby_platform, :dependencies, :required_ruby_version, :required_rubygems_version
13
+ attr_accessor :overrides
13
14
 
14
15
  #
15
16
  # For backwards compatibility with existing lockfiles, if the most specific
@@ -26,20 +27,22 @@ module Bundler
26
27
  alias_method :runtime_dependencies, :dependencies
27
28
 
28
29
  def self.from_spec(s)
29
- lazy_spec = new(s.name, s.version, s.platform, s.source)
30
+ lazy_spec = new(s.name, s.version, s.platform, s.source, content_address: s.content_address)
30
31
  lazy_spec.dependencies = s.runtime_dependencies
31
32
  lazy_spec.required_ruby_version = s.required_ruby_version
32
33
  lazy_spec.required_rubygems_version = s.required_rubygems_version
34
+ lazy_spec.overrides = s.overrides if s.is_a?(LazySpecification)
33
35
  lazy_spec
34
36
  end
35
37
 
36
- def initialize(name, version, platform, source = nil, **materialization_options)
38
+ def initialize(name, version, platform, source = nil, content_address: nil, **materialization_options)
37
39
  @name = name
38
40
  @version = version
39
41
  @dependencies = []
40
42
  @required_ruby_version = Gem::Requirement.default
41
43
  @required_rubygems_version = Gem::Requirement.default
42
44
  @platform = platform || Gem::Platform::RUBY
45
+ @content_address = content_address
43
46
 
44
47
  @original_source = source
45
48
  @source = source
@@ -63,19 +66,25 @@ module Bundler
63
66
  end
64
67
 
65
68
  def full_name
66
- @full_name ||= if platform == Gem::Platform::RUBY
69
+ @full_name ||= if Gem::ContentAddress.content_addressed?(self, validate_ruby_abi: false)
70
+ "#{@name}-#{@version}-#{@content_address}"
71
+ elsif platform == Gem::Platform::RUBY
67
72
  "#{@name}-#{@version}"
68
73
  else
69
74
  "#{@name}-#{@version}-#{platform}"
70
75
  end
71
76
  end
72
77
 
78
+ def file_name
79
+ "#{full_name}.gem"
80
+ end
81
+
73
82
  def lock_name
74
83
  @lock_name ||= name_tuple.lock_name
75
84
  end
76
85
 
77
86
  def name_tuple
78
- Gem::NameTuple.new(@name, @version, @platform)
87
+ Gem::NameTuple.new(@name, @version, @platform, content_address: @content_address)
79
88
  end
80
89
 
81
90
  def ==(other)
@@ -110,6 +119,16 @@ module Bundler
110
119
  @name == dependency.name && effective_requirement.satisfied_by?(Gem::Version.new(@version))
111
120
  end
112
121
 
122
+ ##
123
+ # Assigns the content address parsed from the lockfile's CONTENT
124
+ # ADDRESSES section. The full name embeds the content address, so its
125
+ # memoization must be invalidated.
126
+
127
+ def content_address=(value)
128
+ @content_address = value
129
+ @full_name = nil
130
+ end
131
+
113
132
  def to_lock
114
133
  out = String.new
115
134
  out << " #{lock_name}\n"
@@ -128,13 +147,13 @@ module Bundler
128
147
  materialize(self, &:first)
129
148
  end
130
149
 
131
- def materialized_for_installation
132
- @materialization = materialize_for_installation
150
+ def materialized_for_installation(locked_platforms = nil)
151
+ @materialization = materialize_for_installation(locked_platforms)
133
152
 
134
153
  self unless incomplete?
135
154
  end
136
155
 
137
- def materialize_for_installation
156
+ def materialize_for_installation(locked_platforms)
138
157
  source.local!
139
158
 
140
159
  if use_exact_resolved_specifications?
@@ -144,7 +163,7 @@ module Bundler
144
163
  # Exact spec is incompatible; in frozen mode, try to find a compatible platform variant
145
164
  # In non-frozen mode, return nil to trigger re-resolution and lockfile update
146
165
  if Bundler.frozen_bundle?
147
- materialize([name, version]) {|specs| resolve_best_platform(specs) }
166
+ materialize([name, version]) {|specs| resolve_best_platform(specs, locked_platforms: locked_platforms) }
148
167
  end
149
168
  else
150
169
  materialize([name, version]) {|specs| resolve_best_platform(specs) }
@@ -185,12 +204,14 @@ module Bundler
185
204
  # Try platforms in order of preference until finding a compatible spec.
186
205
  # Used for legacy lockfiles and as a fallback when the exact locked spec
187
206
  # is incompatible. Falls back to frozen bundle behavior if none match.
188
- def resolve_best_platform(specs)
189
- find_compatible_platform_spec(specs) || frozen_bundle_fallback(specs)
207
+ def resolve_best_platform(specs, locked_platforms: nil)
208
+ specs = MatchPlatform.select_all_content_address_match(specs, content_address)
209
+
210
+ find_compatible_platform_spec(specs, locked_platforms: locked_platforms) || frozen_bundle_fallback(specs)
190
211
  end
191
212
 
192
- def find_compatible_platform_spec(specs)
193
- candidate_platforms.each do |plat|
213
+ def find_compatible_platform_spec(specs, locked_platforms: nil)
214
+ candidate_platforms(locked_platforms: locked_platforms).each do |plat|
194
215
  candidates = MatchPlatform.select_best_platform_match(specs, plat)
195
216
  spec = choose_compatible(candidates, fallback_to_non_installable: false)
196
217
  return spec if spec
@@ -200,9 +221,14 @@ module Bundler
200
221
 
201
222
  # Platforms to try in order of preference. Ruby platform is last since it
202
223
  # requires compilation, but works when precompiled gems are incompatible.
203
- def candidate_platforms
224
+ # When a set of locked platforms is given (frozen mode), restrict the
225
+ # candidates to those, so we never materialize a platform that wasn't locked.
226
+ def candidate_platforms(locked_platforms: nil)
204
227
  target = source.is_a?(Source::Path) ? platform : Bundler.local_platform
205
- [target, platform, Gem::Platform::RUBY].uniq
228
+ platforms = [target, platform, Gem::Platform::RUBY].uniq
229
+ return platforms unless locked_platforms
230
+
231
+ platforms & locked_platforms
206
232
  end
207
233
 
208
234
  # In frozen mode, accept any candidate. Will error at install time.
@@ -234,8 +260,9 @@ module Bundler
234
260
  # about the mismatch higher up the stack, right before trying to install the
235
261
  # bad gem.
236
262
  def choose_compatible(candidates, fallback_to_non_installable: Bundler.frozen_bundle?)
263
+ override_list = overrides || []
237
264
  search = candidates.reverse.find do |spec|
238
- spec.is_a?(StubSpecification) || spec.matches_current_metadata?
265
+ spec.is_a?(StubSpecification) || spec.matches_current_metadata_with_overrides?(override_list)
239
266
  end
240
267
  if search.nil? && fallback_to_non_installable
241
268
  search = candidates.last
@@ -262,7 +289,7 @@ module Bundler
262
289
  spec.dependencies = dependencies
263
290
  else
264
291
  if !source.is_a?(Source::Path) && spec.runtime_dependencies.sort != dependencies.sort
265
- raise IncorrectLockfileDependencies.new(self)
292
+ raise IncorrectLockfileDependencies.new(self, spec.runtime_dependencies, dependencies)
266
293
  end
267
294
  end
268
295
  end
@@ -19,6 +19,7 @@ module Bundler
19
19
  add_sources
20
20
  add_platforms
21
21
  add_dependencies
22
+ add_content_addresses
22
23
  add_checksums
23
24
  add_locked_ruby_version
24
25
  add_bundled_with
@@ -66,10 +67,31 @@ module Bundler
66
67
  end
67
68
  end
68
69
 
70
+ def add_content_addresses
71
+ content_addresses = definition.resolve.filter_map do |spec|
72
+ next unless Gem::ContentAddress.content_addressed?(spec, validate_ruby_abi: false)
73
+
74
+ line = "#{spec.lock_name} #{spec.content_address}"
75
+
76
+ if definition.locked_checksums
77
+ checksums = spec.source.checksum_store.checksums_to_lock(spec.full_name)
78
+ line += " #{checksums}" if checksums
79
+ end
80
+
81
+ line
82
+ end
83
+
84
+ add_section("CONTENT ADDRESSES", content_addresses) unless content_addresses.empty?
85
+ end
86
+
69
87
  def add_checksums
70
88
  return unless definition.locked_checksums
71
- checksums = definition.resolve.map do |spec|
72
- spec.source.checksum_store.to_lock(spec)
89
+ checksums = definition.resolve.filter_map do |spec|
90
+ line = spec.source.checksum_store.to_lock(spec)
91
+
92
+ next if line == spec.lock_name && Gem::ContentAddress.content_addressed?(spec, validate_ruby_abi: false)
93
+
94
+ line
73
95
  end
74
96
 
75
97
  add_section("CHECKSUMS", checksums + bundler_checksum)
@@ -41,6 +41,7 @@ module Bundler
41
41
  BUNDLED = "BUNDLED WITH"
42
42
  DEPENDENCIES = "DEPENDENCIES"
43
43
  CHECKSUMS = "CHECKSUMS"
44
+ CONTENT_ADDRESSES = "CONTENT ADDRESSES"
44
45
  PLATFORMS = "PLATFORMS"
45
46
  RUBY = "RUBY VERSION"
46
47
  GIT = "GIT"
@@ -57,6 +58,7 @@ module Bundler
57
58
  Gem::Version.create("1.12") => [RUBY].freeze,
58
59
  Gem::Version.create("1.13") => [PLUGIN].freeze,
59
60
  Gem::Version.create("2.5.0") => [CHECKSUMS].freeze,
61
+ Gem::Version.create("4.1.0") => [CONTENT_ADDRESSES].freeze,
60
62
  }.freeze
61
63
 
62
64
  KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten!.freeze
@@ -95,14 +97,14 @@ module Bundler
95
97
  lockfile_contents.split(BUNDLED).last.strip
96
98
  end
97
99
 
98
- def initialize(lockfile, strict: false)
100
+ def initialize(lockfile, strict: false, lockfile_path: nil)
99
101
  @platforms = []
100
102
  @sources = []
101
103
  @metadata_source = Source::Metadata.new
102
104
  @dependencies = {}
103
105
  @parse_method = nil
104
106
  @specs = {}
105
- @lockfile_path = begin
107
+ @lockfile_path = lockfile_path || begin
106
108
  SharedHelpers.relative_lockfile_path
107
109
  rescue GemfileNotFound
108
110
  "Gemfile.lock"
@@ -140,6 +142,8 @@ module Bundler
140
142
  # for all gemfiles that don't already explicitly include the feature.
141
143
  @checksums = true
142
144
  @parse_method = :parse_checksum
145
+ elsif line == CONTENT_ADDRESSES
146
+ @parse_method = :parse_content_address
143
147
  elsif line == PLATFORMS
144
148
  @parse_method = :parse_platform
145
149
  elsif line == RUBY
@@ -227,6 +231,16 @@ module Bundler
227
231
  $ # Line end
228
232
  /xo
229
233
 
234
+ NAME_VERSION_CONTENT_ADDRESS = /
235
+ ^#{space}{2}(?!#{space}) # Exactly 2 spaces at the start of the line
236
+ (.*?) # Name
237
+ #{space}\(([^-]*) # Space, followed by version
238
+ -(.*)\) # Platform, always present for content-addressable gems
239
+ #{space}([0-9a-f]{8,64}) # Content address
240
+ (?:#{space}([^ ]+))? # Optional checksums
241
+ $ # Line end
242
+ /xo
243
+
230
244
  def parse_dependency(line)
231
245
  return unless line =~ NAME_VERSION
232
246
  spaces = $1
@@ -268,7 +282,8 @@ module Bundler
268
282
 
269
283
  version = Gem::Version.new(version)
270
284
  platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
271
- full_name = Gem::NameTuple.new(name, version, platform).full_name
285
+ name_tuple = Gem::NameTuple.new(name, version, platform)
286
+ full_name = name_tuple.full_name
272
287
  spec = @specs[full_name]
273
288
 
274
289
  if name == "bundler"
@@ -280,10 +295,33 @@ module Bundler
280
295
  checksums.split(",") do |lock_checksum|
281
296
  column = line.index(lock_checksum) + 1
282
297
  checksum = Checksum.from_lock(lock_checksum, "#{@lockfile_path}:#{@pos.line}:#{column}")
283
- spec.source.checksum_store.register(spec, checksum)
298
+ spec.source.checksum_store.register(name_tuple, checksum)
284
299
  end
285
300
  else
286
- spec.source.checksum_store.register(spec, nil)
301
+ spec.source.checksum_store.register(name_tuple, nil)
302
+ end
303
+ end
304
+
305
+ def parse_content_address(line)
306
+ return unless line =~ NAME_VERSION_CONTENT_ADDRESS
307
+
308
+ name = -$1
309
+ version = Gem::Version.new($2)
310
+ platform = Gem::Platform.new($3)
311
+ content_address = $4
312
+ checksums = $5
313
+
314
+ spec = @specs[Gem::NameTuple.new(name, version, platform).full_name]
315
+ return unless spec
316
+
317
+ spec.content_address = content_address
318
+
319
+ return unless checksums
320
+
321
+ checksums.split(",") do |lock_checksum|
322
+ column = line.index(lock_checksum) + 1
323
+ checksum = Checksum.from_lock(lock_checksum, "#{@lockfile_path}:#{@pos.line}:#{column}")
324
+ spec.source.checksum_store.register(spec, checksum)
287
325
  end
288
326
  end
289
327
 
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-ADD" "1" "April 2026" ""
3
+ .TH "BUNDLE\-ADD" "1" "May 2026" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
6
6
  .SH "SYNOPSIS"
@@ -46,13 +46,16 @@ Do not print progress information to the standard output\.
46
46
  Adds the gem to the Gemfile but does not install it\.
47
47
  .TP
48
48
  \fB\-\-optimistic\fR
49
- Adds optimistic declaration of version\.
49
+ Ignored (now default behavior)
50
+ .TP
51
+ \fB\-\-pessimistic\fR
52
+ Adds pessimistic declaration of version\.
50
53
  .TP
51
54
  \fB\-\-strict\fR
52
55
  Adds strict declaration of version\.
53
56
  .TP
54
57
  \fB\-\-cooldown=<number>\fR
55
- Only consider gem versions published at least \fInumber\fR days ago when resolving\. Pass \fB0\fR to disable cooldown for this run\. See \fBcooldown\fR in bundle\-config(1) for precedence rules\.
58
+ Only consider gem versions published at least \fInumber\fR days ago when resolving\. Pass \fB0\fR to disable cooldown for this run, overriding every other cooldown setting, RubyGems' own included\. See \fBcooldown\fR in bundle\-config(1) for precedence rules\.
56
59
  .SH "EXAMPLES"
57
60
  .IP "1." 4
58
61
  You can add the \fBrails\fR gem to the Gemfile without any version restriction\. The source of the gem will be the global source\.
@@ -65,7 +68,7 @@ You can add the \fBrails\fR gem with version greater than 1\.1 (not including 1\
65
68
  .IP "3." 4
66
69
  You can use the \fBhttps://gems\.example\.com\fR custom source and assign the gem to a group\.
67
70
  .IP
68
- \fBbundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"\fR
71
+ \fBbundle add rails \-\-version ">= 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"\fR
69
72
  .IP "4." 4
70
73
  The following adds the \fBgem\fR entry to the Gemfile without installing the gem\. You can install gems later via \fBbundle install\fR\.
71
74
  .IP
@@ -51,15 +51,19 @@ Adds the named gem to the [`Gemfile(5)`][Gemfile(5)] and run `bundle install`.
51
51
  Adds the gem to the Gemfile but does not install it.
52
52
 
53
53
  * `--optimistic`:
54
- Adds optimistic declaration of version.
54
+ Ignored (now default behavior)
55
+
56
+ * `--pessimistic`:
57
+ Adds pessimistic declaration of version.
55
58
 
56
59
  * `--strict`:
57
60
  Adds strict declaration of version.
58
61
 
59
62
  * `--cooldown=<number>`:
60
63
  Only consider gem versions published at least <number> days ago when
61
- resolving. Pass `0` to disable cooldown for this run. See `cooldown`
62
- in bundle-config(1) for precedence rules.
64
+ resolving. Pass `0` to disable cooldown for this run, overriding every
65
+ other cooldown setting, RubyGems' own included. See `cooldown` in
66
+ bundle-config(1) for precedence rules.
63
67
 
64
68
  ## EXAMPLES
65
69
 
@@ -75,7 +79,7 @@ Adds the named gem to the [`Gemfile(5)`][Gemfile(5)] and run `bundle install`.
75
79
  3. You can use the `https://gems.example.com` custom source and assign the gem
76
80
  to a group.
77
81
 
78
- `bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development"`
82
+ `bundle add rails --version ">= 5.0.0" --source "https://gems.example.com" --group "development"`
79
83
 
80
84
  4. The following adds the `gem` entry to the Gemfile without installing the
81
85
  gem. You can install gems later via `bundle install`.
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-BINSTUBS" "1" "April 2026" ""
3
+ .TH "BUNDLE\-BINSTUBS" "1" "May 2026" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CACHE" "1" "April 2026" ""
3
+ .TH "BUNDLE\-CACHE" "1" "May 2026" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
6
6
  .SH "SYNOPSIS"
@@ -18,7 +18,7 @@ Include gems for all platforms present in the lockfile, not only the current one
18
18
  Specify a different cache path than the default (vendor/cache)\.
19
19
  .TP
20
20
  \fB\-\-cooldown=<number>\fR
21
- Only consider gem versions published at least \fInumber\fR days ago when resolving before caching\. Pass \fB0\fR to disable cooldown for this run, overriding any per\-source or global configuration\. See \fBcooldown\fR in bundle\-config(1)\.
21
+ Only consider gem versions published at least \fInumber\fR days ago when resolving before caching\. Pass \fB0\fR to disable cooldown for this run, overriding every other cooldown setting, RubyGems' own included\. See \fBcooldown\fR in bundle\-config(1)\.
22
22
  .TP
23
23
  \fB\-\-gemfile=GEMFILE\fR
24
24
  Use the specified gemfile instead of Gemfile\.
@@ -24,8 +24,8 @@ use the gems in the cache in preference to the ones on `rubygems.org`.
24
24
  * `--cooldown=<number>`:
25
25
  Only consider gem versions published at least <number> days ago when
26
26
  resolving before caching. Pass `0` to disable cooldown for this run,
27
- overriding any per-source or global configuration. See `cooldown` in
28
- bundle-config(1).
27
+ overriding every other cooldown setting, RubyGems' own included. See
28
+ `cooldown` in bundle-config(1).
29
29
 
30
30
  * `--gemfile=GEMFILE`:
31
31
  Use the specified gemfile instead of Gemfile.
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CHECK" "1" "April 2026" ""
3
+ .TH "BUNDLE\-CHECK" "1" "May 2026" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CLEAN" "1" "April 2026" ""
3
+ .TH "BUNDLE\-CLEAN" "1" "May 2026" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
6
6
  .SH "SYNOPSIS"