rubygems-update 3.1.6 → 3.3.22

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 (703) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +1452 -514
  3. data/CODE_OF_CONDUCT.md +55 -19
  4. data/CONTRIBUTING.md +74 -27
  5. data/Manifest.txt +154 -117
  6. data/POLICIES.md +27 -19
  7. data/README.md +10 -8
  8. data/UPGRADING.md +5 -81
  9. data/bin/gem +3 -8
  10. data/bin/update_rubygems +5 -5
  11. data/bundler/CHANGELOG.md +2358 -1430
  12. data/bundler/README.md +7 -9
  13. data/bundler/UPGRADING.md +27 -34
  14. data/bundler/bundler.gemspec +8 -11
  15. data/bundler/exe/bundle +10 -8
  16. data/bundler/exe/bundler +1 -1
  17. data/bundler/lib/bundler/.document +1 -0
  18. data/bundler/lib/bundler/build_metadata.rb +4 -12
  19. data/bundler/lib/bundler/cli/add.rb +1 -1
  20. data/bundler/lib/bundler/cli/binstubs.rb +6 -2
  21. data/bundler/lib/bundler/cli/cache.rb +3 -8
  22. data/bundler/lib/bundler/cli/check.rb +4 -2
  23. data/bundler/lib/bundler/cli/clean.rb +1 -1
  24. data/bundler/lib/bundler/cli/common.rb +31 -3
  25. data/bundler/lib/bundler/cli/config.rb +10 -1
  26. data/bundler/lib/bundler/cli/console.rb +1 -1
  27. data/bundler/lib/bundler/cli/doctor.rb +25 -6
  28. data/bundler/lib/bundler/cli/exec.rb +5 -10
  29. data/bundler/lib/bundler/cli/fund.rb +36 -0
  30. data/bundler/lib/bundler/cli/gem.rb +219 -28
  31. data/bundler/lib/bundler/cli/info.rb +38 -6
  32. data/bundler/lib/bundler/cli/init.rb +3 -3
  33. data/bundler/lib/bundler/cli/inject.rb +1 -1
  34. data/bundler/lib/bundler/cli/install.rb +25 -54
  35. data/bundler/lib/bundler/cli/issue.rb +5 -4
  36. data/bundler/lib/bundler/cli/list.rb +19 -11
  37. data/bundler/lib/bundler/cli/lock.rb +5 -1
  38. data/bundler/lib/bundler/cli/open.rb +1 -2
  39. data/bundler/lib/bundler/cli/outdated.rb +105 -76
  40. data/bundler/lib/bundler/cli/platform.rb +2 -2
  41. data/bundler/lib/bundler/cli/plugin.rb +10 -0
  42. data/bundler/lib/bundler/cli/pristine.rb +5 -0
  43. data/bundler/lib/bundler/cli/remove.rb +1 -2
  44. data/bundler/lib/bundler/cli/show.rb +2 -2
  45. data/bundler/lib/bundler/cli/update.rb +20 -9
  46. data/bundler/lib/bundler/cli.rb +106 -83
  47. data/bundler/lib/bundler/compact_index_client/cache.rb +6 -23
  48. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  49. data/bundler/lib/bundler/compact_index_client/updater.rb +29 -25
  50. data/bundler/lib/bundler/compact_index_client.rb +3 -9
  51. data/bundler/lib/bundler/current_ruby.rb +17 -6
  52. data/bundler/lib/bundler/definition.rb +297 -396
  53. data/bundler/lib/bundler/dep_proxy.rb +16 -9
  54. data/bundler/lib/bundler/dependency.rb +22 -77
  55. data/bundler/lib/bundler/digest.rb +71 -0
  56. data/bundler/lib/bundler/dsl.rb +76 -83
  57. data/bundler/lib/bundler/endpoint_specification.rb +16 -14
  58. data/bundler/lib/bundler/env.rb +2 -2
  59. data/bundler/lib/bundler/environment_preserver.rb +29 -2
  60. data/bundler/lib/bundler/errors.rb +30 -3
  61. data/bundler/lib/bundler/feature_flag.rb +0 -9
  62. data/bundler/lib/bundler/fetcher/base.rb +7 -9
  63. data/bundler/lib/bundler/fetcher/compact_index.rb +11 -16
  64. data/bundler/lib/bundler/fetcher/downloader.rb +10 -7
  65. data/bundler/lib/bundler/fetcher/index.rb +2 -30
  66. data/bundler/lib/bundler/fetcher.rb +24 -25
  67. data/bundler/lib/bundler/friendly_errors.rb +46 -47
  68. data/bundler/lib/bundler/gem_helper.rb +53 -31
  69. data/bundler/lib/bundler/gem_helpers.rb +43 -24
  70. data/bundler/lib/bundler/gem_version_promoter.rb +10 -20
  71. data/bundler/lib/bundler/graph.rb +1 -1
  72. data/bundler/lib/bundler/index.rb +19 -25
  73. data/bundler/lib/bundler/injector.rb +38 -6
  74. data/bundler/lib/bundler/inline.rb +4 -13
  75. data/bundler/lib/bundler/installer/gem_installer.rb +19 -24
  76. data/bundler/lib/bundler/installer/parallel_installer.rb +46 -25
  77. data/bundler/lib/bundler/installer/standalone.rb +58 -11
  78. data/bundler/lib/bundler/installer.rb +51 -81
  79. data/bundler/lib/bundler/lazy_specification.rb +79 -36
  80. data/bundler/lib/bundler/lockfile_generator.rb +3 -3
  81. data/bundler/lib/bundler/lockfile_parser.rb +19 -44
  82. data/bundler/lib/bundler/man/.document +1 -0
  83. data/bundler/{man → lib/bundler/man}/bundle-add.1 +21 -5
  84. data/bundler/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +16 -4
  85. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  86. data/bundler/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  87. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +7 -1
  88. data/bundler/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +7 -0
  89. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  90. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  91. data/bundler/{man → lib/bundler/man}/bundle-config.1 +65 -47
  92. data/bundler/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +74 -65
  93. data/bundler/lib/bundler/man/bundle-console.1 +53 -0
  94. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  95. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  96. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +2 -2
  97. data/bundler/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +1 -1
  98. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +38 -3
  99. data/bundler/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +46 -7
  100. data/bundler/lib/bundler/man/bundle-help.1 +13 -0
  101. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  102. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  103. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  104. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +5 -2
  105. data/bundler/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +3 -1
  106. data/bundler/{man → lib/bundler/man}/bundle-install.1 +35 -4
  107. data/bundler/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +33 -5
  108. data/bundler/{man → lib/bundler/man}/bundle-list.1 +7 -7
  109. data/bundler/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  110. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  111. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  112. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +3 -10
  113. data/bundler/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +1 -10
  114. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +16 -6
  115. data/bundler/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +14 -7
  116. data/bundler/lib/bundler/man/bundle-plugin.1 +81 -0
  117. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  118. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  119. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  120. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  121. data/bundler/{man → lib/bundler/man}/bundle-update.1 +5 -5
  122. data/bundler/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +5 -4
  123. data/bundler/lib/bundler/man/bundle-version.1 +35 -0
  124. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  125. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +4 -1
  126. data/bundler/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +2 -0
  127. data/bundler/{man → lib/bundler/man}/bundle.1 +15 -10
  128. data/bundler/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +12 -7
  129. data/bundler/{man → lib/bundler/man}/gemfile.5 +106 -80
  130. data/bundler/{man → lib/bundler/man}/gemfile.5.ronn +94 -83
  131. data/bundler/{man → lib/bundler/man}/index.txt +4 -0
  132. data/bundler/lib/bundler/match_metadata.rb +13 -0
  133. data/bundler/lib/bundler/match_platform.rb +0 -1
  134. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  135. data/bundler/lib/bundler/mirror.rb +2 -2
  136. data/bundler/lib/bundler/plugin/api/source.rb +25 -9
  137. data/bundler/lib/bundler/plugin/dsl.rb +1 -1
  138. data/bundler/lib/bundler/plugin/index.rb +13 -1
  139. data/bundler/lib/bundler/plugin/installer/git.rb +0 -4
  140. data/bundler/lib/bundler/plugin/installer/rubygems.rb +1 -5
  141. data/bundler/lib/bundler/plugin/installer.rb +11 -11
  142. data/bundler/lib/bundler/plugin/source_list.rb +5 -1
  143. data/bundler/lib/bundler/plugin.rb +58 -11
  144. data/bundler/lib/bundler/process_lock.rb +1 -1
  145. data/bundler/lib/bundler/remote_specification.rb +11 -6
  146. data/bundler/lib/bundler/resolver/base.rb +50 -0
  147. data/bundler/lib/bundler/resolver/spec_group.rb +64 -57
  148. data/bundler/lib/bundler/resolver.rb +234 -230
  149. data/bundler/lib/bundler/retry.rb +2 -2
  150. data/bundler/lib/bundler/ruby_dsl.rb +1 -1
  151. data/bundler/lib/bundler/ruby_version.rb +6 -19
  152. data/bundler/lib/bundler/rubygems_ext.rb +194 -33
  153. data/bundler/lib/bundler/rubygems_gem_installer.rb +87 -16
  154. data/bundler/lib/bundler/rubygems_integration.rb +71 -153
  155. data/bundler/lib/bundler/runtime.rb +22 -26
  156. data/bundler/lib/bundler/self_manager.rb +168 -0
  157. data/bundler/lib/bundler/settings.rb +145 -66
  158. data/bundler/lib/bundler/setup.rb +2 -2
  159. data/bundler/lib/bundler/shared_helpers.rb +17 -32
  160. data/bundler/lib/bundler/similarity_detector.rb +1 -1
  161. data/bundler/lib/bundler/source/git/git_proxy.rb +88 -84
  162. data/bundler/lib/bundler/source/git.rb +50 -32
  163. data/bundler/lib/bundler/source/metadata.rb +3 -7
  164. data/bundler/lib/bundler/source/path/installer.rb +10 -10
  165. data/bundler/lib/bundler/source/path.rb +10 -4
  166. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  167. data/bundler/lib/bundler/source/rubygems.rb +201 -179
  168. data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
  169. data/bundler/lib/bundler/source.rb +25 -5
  170. data/bundler/lib/bundler/source_list.rb +105 -63
  171. data/bundler/lib/bundler/source_map.rb +71 -0
  172. data/bundler/lib/bundler/spec_set.rb +62 -57
  173. data/bundler/lib/bundler/stub_specification.rb +30 -10
  174. data/bundler/lib/bundler/templates/Executable +2 -4
  175. data/bundler/lib/bundler/templates/Executable.bundler +8 -8
  176. data/bundler/lib/bundler/templates/Executable.standalone +2 -4
  177. data/bundler/lib/bundler/templates/Gemfile +0 -2
  178. data/bundler/lib/bundler/templates/gems.rb +0 -3
  179. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  180. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  181. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +12 -1
  182. data/bundler/lib/bundler/templates/newgem/README.md.tt +9 -14
  183. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +32 -5
  184. data/bundler/lib/bundler/templates/newgem/bin/console.tt +1 -0
  185. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  186. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  187. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +27 -0
  188. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  189. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  190. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  191. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +27 -17
  192. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  193. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  194. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  195. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  196. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  197. data/bundler/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  198. data/bundler/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/test_newgem.rb.tt} +3 -1
  199. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  200. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  201. data/bundler/lib/bundler/ui/shell.rb +6 -6
  202. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -1
  203. data/bundler/lib/bundler/vendor/.document +1 -0
  204. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  205. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  206. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  207. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
  208. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
  209. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  210. data/bundler/lib/bundler/vendor/molinillo/LICENSE +9 -0
  211. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  212. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  213. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  214. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +37 -5
  215. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +34 -28
  216. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  217. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
  218. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
  219. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  220. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  221. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  222. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  223. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  224. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +9 -7
  225. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -2
  226. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +7 -3
  227. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  228. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  229. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +10 -5
  230. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
  231. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +28 -9
  232. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +27 -6
  233. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
  234. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  235. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  236. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  237. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +5 -13
  238. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  239. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  240. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +452 -0
  241. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  242. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  243. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  244. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  245. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  246. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  247. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  248. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  249. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  250. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  251. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  252. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  253. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  254. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  255. data/bundler/lib/bundler/vendored_persistent.rb +0 -7
  256. data/bundler/lib/bundler/vendored_tmpdir.rb +4 -0
  257. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  258. data/bundler/lib/bundler/version.rb +1 -1
  259. data/bundler/lib/bundler/worker.rb +20 -5
  260. data/bundler/lib/bundler/yaml_serializer.rb +1 -1
  261. data/bundler/lib/bundler.rb +79 -47
  262. data/hide_lib_for_update/note.txt +0 -4
  263. data/lib/rubygems/available_set.rb +7 -9
  264. data/lib/rubygems/basic_specification.rb +23 -21
  265. data/lib/rubygems/bundler_version_finder.rb +26 -53
  266. data/lib/rubygems/command.rb +48 -45
  267. data/lib/rubygems/command_manager.rb +20 -14
  268. data/lib/rubygems/commands/build_command.rb +47 -27
  269. data/lib/rubygems/commands/cert_command.rb +78 -75
  270. data/lib/rubygems/commands/check_command.rb +20 -22
  271. data/lib/rubygems/commands/cleanup_command.rb +30 -26
  272. data/lib/rubygems/commands/contents_command.rb +16 -18
  273. data/lib/rubygems/commands/dependency_command.rb +39 -51
  274. data/lib/rubygems/commands/environment_command.rb +11 -10
  275. data/lib/rubygems/commands/fetch_command.rb +33 -16
  276. data/lib/rubygems/commands/generate_index_command.rb +17 -19
  277. data/lib/rubygems/commands/help_command.rb +6 -6
  278. data/lib/rubygems/commands/info_command.rb +10 -7
  279. data/lib/rubygems/commands/install_command.rb +29 -27
  280. data/lib/rubygems/commands/list_command.rb +9 -8
  281. data/lib/rubygems/commands/lock_command.rb +5 -7
  282. data/lib/rubygems/commands/mirror_command.rb +3 -5
  283. data/lib/rubygems/commands/open_command.rb +10 -14
  284. data/lib/rubygems/commands/outdated_command.rb +5 -7
  285. data/lib/rubygems/commands/owner_command.rb +26 -16
  286. data/lib/rubygems/commands/pristine_command.rb +61 -49
  287. data/lib/rubygems/commands/push_command.rb +22 -59
  288. data/lib/rubygems/commands/query_command.rb +21 -351
  289. data/lib/rubygems/commands/rdoc_command.rb +23 -25
  290. data/lib/rubygems/commands/search_command.rb +8 -8
  291. data/lib/rubygems/commands/server_command.rb +16 -77
  292. data/lib/rubygems/commands/setup_command.rb +255 -229
  293. data/lib/rubygems/commands/signin_command.rb +9 -11
  294. data/lib/rubygems/commands/signout_command.rb +7 -9
  295. data/lib/rubygems/commands/sources_command.rb +27 -25
  296. data/lib/rubygems/commands/specification_command.rb +25 -21
  297. data/lib/rubygems/commands/stale_command.rb +3 -5
  298. data/lib/rubygems/commands/uninstall_command.rb +41 -43
  299. data/lib/rubygems/commands/unpack_command.rb +13 -15
  300. data/lib/rubygems/commands/update_command.rb +132 -74
  301. data/lib/rubygems/commands/which_command.rb +7 -9
  302. data/lib/rubygems/commands/yank_command.rb +16 -19
  303. data/lib/rubygems/compatibility.rb +4 -2
  304. data/lib/rubygems/config_file.rb +42 -26
  305. data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
  306. data/lib/rubygems/core_ext/kernel_require.rb +6 -3
  307. data/lib/rubygems/core_ext/kernel_warn.rb +12 -13
  308. data/lib/rubygems/core_ext/tcpsocket_init.rb +52 -0
  309. data/lib/rubygems/defaults.rb +108 -32
  310. data/lib/rubygems/dependency.rb +21 -22
  311. data/lib/rubygems/dependency_installer.rb +19 -91
  312. data/lib/rubygems/dependency_list.rb +13 -15
  313. data/lib/rubygems/deprecate.rb +102 -8
  314. data/lib/rubygems/doctor.rb +22 -22
  315. data/lib/rubygems/errors.rb +6 -21
  316. data/lib/rubygems/exceptions.rb +33 -34
  317. data/lib/rubygems/ext/build_error.rb +2 -0
  318. data/lib/rubygems/ext/builder.rb +48 -54
  319. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +23 -0
  320. data/lib/rubygems/ext/cargo_builder.rb +321 -0
  321. data/lib/rubygems/ext/cmake_builder.rb +6 -9
  322. data/lib/rubygems/ext/configure_builder.rb +5 -8
  323. data/lib/rubygems/ext/ext_conf_builder.rb +42 -66
  324. data/lib/rubygems/ext/rake_builder.rb +7 -10
  325. data/lib/rubygems/ext.rb +7 -6
  326. data/lib/rubygems/gem_runner.rb +15 -26
  327. data/lib/rubygems/gemcutter_utilities.rb +153 -32
  328. data/lib/rubygems/indexer.rb +30 -49
  329. data/lib/rubygems/install_default_message.rb +2 -2
  330. data/lib/rubygems/install_message.rb +2 -2
  331. data/lib/rubygems/install_update_options.rb +73 -64
  332. data/lib/rubygems/installer.rb +194 -151
  333. data/lib/rubygems/installer_uninstaller_utils.rb +29 -0
  334. data/lib/rubygems/local_remote_options.rb +22 -24
  335. data/lib/rubygems/mock_gem_ui.rb +2 -8
  336. data/lib/rubygems/name_tuple.rb +9 -14
  337. data/lib/rubygems/openssl.rb +7 -0
  338. data/lib/rubygems/optparse/.document +1 -0
  339. data/lib/rubygems/optparse/COPYING +56 -0
  340. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  341. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  342. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  343. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  344. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  345. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  346. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  347. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  348. data/lib/rubygems/optparse/lib/optparse.rb +2303 -0
  349. data/lib/rubygems/optparse.rb +3 -0
  350. data/lib/rubygems/package/digest_io.rb +0 -2
  351. data/lib/rubygems/package/file_source.rb +2 -4
  352. data/lib/rubygems/package/io_source.rb +4 -2
  353. data/lib/rubygems/package/old.rb +9 -11
  354. data/lib/rubygems/package/tar_header.rb +54 -56
  355. data/lib/rubygems/package/tar_reader/entry.rb +2 -5
  356. data/lib/rubygems/package/tar_reader.rb +1 -4
  357. data/lib/rubygems/package/tar_writer.rb +8 -18
  358. data/lib/rubygems/package.rb +101 -117
  359. data/lib/rubygems/package_task.rb +5 -11
  360. data/lib/rubygems/path_support.rb +2 -9
  361. data/lib/rubygems/platform.rb +101 -76
  362. data/lib/rubygems/psych_tree.rb +1 -3
  363. data/lib/rubygems/query_utils.rb +351 -0
  364. data/lib/rubygems/rdoc.rb +2 -14
  365. data/lib/rubygems/remote_fetcher.rb +48 -74
  366. data/lib/rubygems/request/connection_pools.rb +6 -10
  367. data/lib/rubygems/request/http_pool.rb +2 -4
  368. data/lib/rubygems/request/https_pool.rb +0 -2
  369. data/lib/rubygems/request.rb +26 -31
  370. data/lib/rubygems/request_set/gem_dependency_api.rb +23 -25
  371. data/lib/rubygems/request_set/lockfile/parser.rb +26 -28
  372. data/lib/rubygems/request_set/lockfile/tokenizer.rb +5 -7
  373. data/lib/rubygems/request_set/lockfile.rb +17 -21
  374. data/lib/rubygems/request_set.rb +27 -40
  375. data/lib/rubygems/requirement.rb +28 -48
  376. data/lib/rubygems/resolver/activation_request.rb +12 -6
  377. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  378. data/lib/rubygems/resolver/api_set.rb +32 -25
  379. data/lib/rubygems/resolver/api_specification.rb +29 -15
  380. data/lib/rubygems/resolver/best_set.rb +7 -9
  381. data/lib/rubygems/resolver/composed_set.rb +3 -5
  382. data/lib/rubygems/resolver/conflict.rb +12 -14
  383. data/lib/rubygems/resolver/current_set.rb +0 -2
  384. data/lib/rubygems/resolver/dependency_request.rb +3 -5
  385. data/lib/rubygems/resolver/git_set.rb +2 -4
  386. data/lib/rubygems/resolver/git_specification.rb +6 -8
  387. data/lib/rubygems/resolver/index_set.rb +4 -6
  388. data/lib/rubygems/resolver/index_specification.rb +38 -7
  389. data/lib/rubygems/resolver/installed_specification.rb +4 -6
  390. data/lib/rubygems/resolver/installer_set.rb +66 -24
  391. data/lib/rubygems/resolver/local_specification.rb +2 -4
  392. data/lib/rubygems/resolver/lock_set.rb +6 -8
  393. data/lib/rubygems/resolver/lock_specification.rb +4 -6
  394. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  395. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  396. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +8 -0
  397. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  398. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -1
  399. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -1
  400. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +2 -1
  401. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +2 -1
  402. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +7 -6
  403. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -1
  404. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +4 -3
  405. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +51 -12
  406. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +41 -8
  407. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +76 -8
  408. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  409. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
  410. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  411. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +510 -165
  412. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  413. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +8 -4
  414. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  415. data/lib/rubygems/resolver/molinillo.rb +1 -1
  416. data/lib/rubygems/resolver/requirement_list.rb +0 -2
  417. data/lib/rubygems/resolver/set.rb +0 -3
  418. data/lib/rubygems/resolver/source_set.rb +0 -2
  419. data/lib/rubygems/resolver/spec_specification.rb +14 -2
  420. data/lib/rubygems/resolver/specification.rb +14 -4
  421. data/lib/rubygems/resolver/stats.rb +0 -2
  422. data/lib/rubygems/resolver/vendor_set.rb +1 -3
  423. data/lib/rubygems/resolver/vendor_specification.rb +3 -5
  424. data/lib/rubygems/resolver.rb +53 -51
  425. data/lib/rubygems/s3_uri_signer.rb +7 -15
  426. data/lib/rubygems/safe_yaml.rb +14 -16
  427. data/lib/rubygems/security/policies.rb +11 -11
  428. data/lib/rubygems/security/policy.rb +25 -29
  429. data/lib/rubygems/security/signer.rb +13 -16
  430. data/lib/rubygems/security/trust_dir.rb +4 -5
  431. data/lib/rubygems/security.rb +103 -69
  432. data/lib/rubygems/security_option.rb +7 -7
  433. data/lib/rubygems/source/git.rb +30 -30
  434. data/lib/rubygems/source/installed.rb +1 -3
  435. data/lib/rubygems/source/local.rb +4 -6
  436. data/lib/rubygems/source/lock.rb +0 -2
  437. data/lib/rubygems/source/specific_file.rb +1 -3
  438. data/lib/rubygems/source/vendor.rb +0 -2
  439. data/lib/rubygems/source.rb +44 -38
  440. data/lib/rubygems/source_list.rb +9 -16
  441. data/lib/rubygems/spec_fetcher.rb +49 -48
  442. data/lib/rubygems/specification.rb +338 -295
  443. data/lib/rubygems/specification_policy.rb +112 -61
  444. data/lib/rubygems/stub_specification.rb +21 -28
  445. data/lib/rubygems/text.rb +21 -20
  446. data/lib/rubygems/tsort/.document +1 -0
  447. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  448. data/lib/rubygems/tsort/lib/tsort.rb +454 -0
  449. data/lib/rubygems/tsort.rb +3 -0
  450. data/lib/rubygems/uninstaller.rb +98 -45
  451. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  452. data/lib/rubygems/uri.rb +126 -0
  453. data/lib/rubygems/uri_formatter.rb +2 -3
  454. data/lib/rubygems/user_interaction.rb +43 -54
  455. data/lib/rubygems/util/licenses.rb +115 -10
  456. data/lib/rubygems/util/list.rb +0 -2
  457. data/lib/rubygems/util.rb +18 -12
  458. data/lib/rubygems/validator.rb +6 -8
  459. data/lib/rubygems/version.rb +29 -20
  460. data/lib/rubygems/version_option.rb +11 -5
  461. data/lib/rubygems.rb +192 -289
  462. data/rubygems-update.gemspec +4 -4
  463. data/setup.rb +11 -22
  464. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  465. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  466. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  467. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  468. data/test/rubygems/encrypted_private_key.pem +26 -26
  469. data/{lib/rubygems/test_case.rb → test/rubygems/helper.rb} +380 -314
  470. data/{lib → test}/rubygems/installer_test_case.rb +38 -24
  471. data/{lib → test}/rubygems/package/tar_test_case.rb +4 -6
  472. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  473. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  474. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
  475. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -2
  476. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
  477. data/test/rubygems/private_ec_key.pem +9 -0
  478. data/test/rubygems/rubygems/commands/crash_command.rb +0 -2
  479. data/test/rubygems/rubygems_plugin.rb +2 -4
  480. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -2
  481. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +4 -6
  482. data/test/rubygems/test_bundled_ca.rb +43 -50
  483. data/test/rubygems/test_config.rb +5 -7
  484. data/test/rubygems/test_deprecate.rb +87 -10
  485. data/test/rubygems/test_exit.rb +11 -0
  486. data/test/rubygems/test_gem.rb +719 -639
  487. data/test/rubygems/test_gem_available_set.rb +24 -26
  488. data/test/rubygems/test_gem_bundler_version_finder.rb +37 -44
  489. data/test/rubygems/test_gem_command.rb +78 -49
  490. data/test/rubygems/test_gem_command_manager.rb +98 -35
  491. data/test/rubygems/test_gem_commands_build_command.rb +275 -57
  492. data/test/rubygems/test_gem_commands_cert_command.rb +180 -125
  493. data/test/rubygems/test_gem_commands_check_command.rb +9 -11
  494. data/test/rubygems/test_gem_commands_cleanup_command.rb +78 -69
  495. data/test/rubygems/test_gem_commands_contents_command.rb +73 -42
  496. data/test/rubygems/test_gem_commands_dependency_command.rb +38 -40
  497. data/test/rubygems/test_gem_commands_environment_command.rb +60 -38
  498. data/test/rubygems/test_gem_commands_fetch_command.rb +163 -32
  499. data/test/rubygems/test_gem_commands_generate_index_command.rb +8 -14
  500. data/test/rubygems/test_gem_commands_help_command.rb +34 -16
  501. data/test/rubygems/test_gem_commands_info_command.rb +33 -9
  502. data/test/rubygems/test_gem_commands_install_command.rb +401 -198
  503. data/test/rubygems/test_gem_commands_list_command.rb +5 -7
  504. data/test/rubygems/test_gem_commands_lock_command.rb +11 -13
  505. data/test/rubygems/test_gem_commands_mirror.rb +3 -5
  506. data/test/rubygems/test_gem_commands_open_command.rb +16 -19
  507. data/test/rubygems/test_gem_commands_outdated_command.rb +23 -7
  508. data/test/rubygems/test_gem_commands_owner_command.rb +100 -46
  509. data/test/rubygems/test_gem_commands_pristine_command.rb +131 -99
  510. data/test/rubygems/test_gem_commands_push_command.rb +134 -66
  511. data/test/rubygems/test_gem_commands_query_command.rb +91 -91
  512. data/test/rubygems/test_gem_commands_search_command.rb +2 -4
  513. data/test/rubygems/test_gem_commands_server_command.rb +6 -50
  514. data/test/rubygems/test_gem_commands_setup_command.rb +288 -179
  515. data/test/rubygems/test_gem_commands_signin_command.rb +162 -28
  516. data/test/rubygems/test_gem_commands_signout_command.rb +3 -10
  517. data/test/rubygems/test_gem_commands_sources_command.rb +139 -32
  518. data/test/rubygems/test_gem_commands_specification_command.rb +81 -55
  519. data/test/rubygems/test_gem_commands_stale_command.rb +4 -6
  520. data/test/rubygems/test_gem_commands_uninstall_command.rb +80 -82
  521. data/test/rubygems/test_gem_commands_unpack_command.rb +32 -34
  522. data/test/rubygems/test_gem_commands_update_command.rb +335 -88
  523. data/test/rubygems/test_gem_commands_which_command.rb +12 -14
  524. data/test/rubygems/test_gem_commands_yank_command.rb +80 -44
  525. data/test/rubygems/test_gem_config_file.rb +114 -97
  526. data/test/rubygems/test_gem_dependency.rb +87 -87
  527. data/test/rubygems/test_gem_dependency_installer.rb +277 -391
  528. data/test/rubygems/test_gem_dependency_list.rb +57 -59
  529. data/test/rubygems/test_gem_dependency_resolution_error.rb +5 -7
  530. data/test/rubygems/test_gem_doctor.rb +73 -47
  531. data/test/rubygems/test_gem_ext_builder.rb +115 -109
  532. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +1 -0
  533. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +243 -0
  534. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +10 -0
  535. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +21 -0
  536. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +10 -0
  537. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +27 -0
  538. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +1 -0
  539. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +243 -0
  540. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +10 -0
  541. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +21 -0
  542. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +8 -0
  543. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +39 -0
  544. data/test/rubygems/test_gem_ext_cargo_builder.rb +178 -0
  545. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +33 -0
  546. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +75 -0
  547. data/test/rubygems/test_gem_ext_cmake_builder.rb +31 -38
  548. data/test/rubygems/test_gem_ext_configure_builder.rb +23 -39
  549. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +66 -82
  550. data/test/rubygems/test_gem_ext_rake_builder.rb +49 -32
  551. data/test/rubygems/test_gem_gem_runner.rb +51 -8
  552. data/test/rubygems/test_gem_gemcutter_utilities.rb +87 -76
  553. data/test/rubygems/test_gem_impossible_dependencies_error.rb +4 -6
  554. data/test/rubygems/test_gem_indexer.rb +62 -64
  555. data/test/rubygems/test_gem_install_update_options.rb +31 -21
  556. data/test/rubygems/test_gem_installer.rb +798 -491
  557. data/test/rubygems/test_gem_local_remote_options.rb +11 -13
  558. data/test/rubygems/test_gem_name_tuple.rb +4 -6
  559. data/test/rubygems/test_gem_package.rb +318 -283
  560. data/test/rubygems/test_gem_package_old.rb +18 -20
  561. data/test/rubygems/test_gem_package_tar_header.rb +64 -47
  562. data/test/rubygems/test_gem_package_tar_reader.rb +8 -10
  563. data/test/rubygems/test_gem_package_tar_reader_entry.rb +18 -20
  564. data/test/rubygems/test_gem_package_tar_writer.rb +96 -100
  565. data/test/rubygems/test_gem_package_task.rb +58 -25
  566. data/test/rubygems/test_gem_path_support.rb +15 -21
  567. data/test/rubygems/test_gem_platform.rb +354 -201
  568. data/test/rubygems/test_gem_rdoc.rb +19 -21
  569. data/test/rubygems/test_gem_remote_fetcher.rb +376 -337
  570. data/test/rubygems/test_gem_request.rb +114 -86
  571. data/test/rubygems/test_gem_request_connection_pools.rb +30 -34
  572. data/test/rubygems/test_gem_request_set.rb +123 -124
  573. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +222 -226
  574. data/test/rubygems/test_gem_request_set_lockfile.rb +93 -95
  575. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +68 -70
  576. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +136 -138
  577. data/test/rubygems/test_gem_requirement.rb +133 -54
  578. data/test/rubygems/test_gem_resolver.rb +149 -117
  579. data/test/rubygems/test_gem_resolver_activation_request.rb +6 -8
  580. data/test/rubygems/test_gem_resolver_api_set.rb +79 -78
  581. data/test/rubygems/test_gem_resolver_api_specification.rb +47 -49
  582. data/test/rubygems/test_gem_resolver_best_set.rb +43 -22
  583. data/test/rubygems/test_gem_resolver_composed_set.rb +1 -3
  584. data/test/rubygems/test_gem_resolver_conflict.rb +12 -14
  585. data/test/rubygems/test_gem_resolver_dependency_request.rb +15 -17
  586. data/test/rubygems/test_gem_resolver_git_set.rb +22 -24
  587. data/test/rubygems/test_gem_resolver_git_specification.rb +22 -23
  588. data/test/rubygems/test_gem_resolver_index_set.rb +14 -16
  589. data/test/rubygems/test_gem_resolver_index_specification.rb +16 -18
  590. data/test/rubygems/test_gem_resolver_installed_specification.rb +5 -7
  591. data/test/rubygems/test_gem_resolver_installer_set.rb +104 -44
  592. data/test/rubygems/test_gem_resolver_local_specification.rb +7 -9
  593. data/test/rubygems/test_gem_resolver_lock_set.rb +15 -17
  594. data/test/rubygems/test_gem_resolver_lock_specification.rb +17 -19
  595. data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -3
  596. data/test/rubygems/test_gem_resolver_specification.rb +8 -12
  597. data/test/rubygems/test_gem_resolver_vendor_set.rb +9 -11
  598. data/test/rubygems/test_gem_resolver_vendor_specification.rb +10 -12
  599. data/test/rubygems/test_gem_security.rb +104 -78
  600. data/test/rubygems/test_gem_security_policy.rb +92 -97
  601. data/test/rubygems/test_gem_security_signer.rb +45 -47
  602. data/test/rubygems/test_gem_security_trust_dir.rb +12 -14
  603. data/test/rubygems/test_gem_silent_ui.rb +46 -42
  604. data/test/rubygems/test_gem_source.rb +53 -52
  605. data/test/rubygems/test_gem_source_fetch_problem.rb +16 -8
  606. data/test/rubygems/test_gem_source_git.rb +69 -69
  607. data/test/rubygems/test_gem_source_installed.rb +16 -18
  608. data/test/rubygems/test_gem_source_list.rb +5 -6
  609. data/test/rubygems/test_gem_source_local.rb +15 -17
  610. data/test/rubygems/test_gem_source_lock.rb +31 -33
  611. data/test/rubygems/test_gem_source_specific_file.rb +18 -20
  612. data/test/rubygems/test_gem_source_subpath_problem.rb +49 -0
  613. data/test/rubygems/test_gem_source_vendor.rb +13 -15
  614. data/test/rubygems/test_gem_spec_fetcher.rb +74 -67
  615. data/test/rubygems/test_gem_specification.rb +888 -1024
  616. data/test/rubygems/test_gem_stream_ui.rb +23 -23
  617. data/test/rubygems/test_gem_stub_specification.rb +39 -57
  618. data/test/rubygems/test_gem_text.rb +8 -4
  619. data/test/rubygems/test_gem_uninstaller.rb +233 -104
  620. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +3 -5
  621. data/test/rubygems/test_gem_uri.rb +39 -0
  622. data/test/rubygems/test_gem_uri_formatter.rb +14 -16
  623. data/test/rubygems/test_gem_util.rb +37 -35
  624. data/test/rubygems/test_gem_validator.rb +10 -12
  625. data/test/rubygems/test_gem_version.rb +31 -31
  626. data/test/rubygems/test_gem_version_option.rb +16 -18
  627. data/test/rubygems/test_kernel.rb +46 -60
  628. data/test/rubygems/test_project_sanity.rb +8 -3
  629. data/test/rubygems/test_remote_fetch_error.rb +7 -9
  630. data/test/rubygems/test_require.rb +240 -167
  631. data/test/rubygems/test_rubygems.rb +74 -0
  632. data/{lib/rubygems/test_utilities.rb → test/rubygems/utilities.rb} +30 -39
  633. data/test/test_changelog_generator.rb +17 -0
  634. metadata +158 -146
  635. data/.bundle/config +0 -2
  636. data/.rubocop.yml +0 -91
  637. data/Gemfile +0 -8
  638. data/Gemfile.lock +0 -43
  639. data/Rakefile +0 -428
  640. data/bundler/CODE_OF_CONDUCT.md +0 -136
  641. data/bundler/lib/bundler/gemdeps.rb +0 -29
  642. data/bundler/lib/bundler/psyched_yaml.rb +0 -37
  643. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
  644. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  645. data/bundler/man/bundle-add.1.txt +0 -58
  646. data/bundler/man/bundle-binstubs.1.txt +0 -48
  647. data/bundler/man/bundle-cache.1.txt +0 -78
  648. data/bundler/man/bundle-check.1.txt +0 -33
  649. data/bundler/man/bundle-clean.1.txt +0 -26
  650. data/bundler/man/bundle-config.1.txt +0 -528
  651. data/bundler/man/bundle-doctor.1.txt +0 -44
  652. data/bundler/man/bundle-exec.1.txt +0 -178
  653. data/bundler/man/bundle-gem.1.txt +0 -91
  654. data/bundler/man/bundle-info.1.txt +0 -21
  655. data/bundler/man/bundle-init.1.txt +0 -34
  656. data/bundler/man/bundle-inject.1.txt +0 -32
  657. data/bundler/man/bundle-install.1.txt +0 -401
  658. data/bundler/man/bundle-list.1.txt +0 -43
  659. data/bundler/man/bundle-lock.1.txt +0 -93
  660. data/bundler/man/bundle-open.1.txt +0 -29
  661. data/bundler/man/bundle-outdated.1.txt +0 -131
  662. data/bundler/man/bundle-platform.1.txt +0 -57
  663. data/bundler/man/bundle-pristine.1.txt +0 -44
  664. data/bundler/man/bundle-remove.1.txt +0 -34
  665. data/bundler/man/bundle-show.1.txt +0 -27
  666. data/bundler/man/bundle-update.1.txt +0 -390
  667. data/bundler/man/bundle-viz.1.txt +0 -39
  668. data/bundler/man/bundle.1.txt +0 -116
  669. data/bundler/man/gemfile.5.txt +0 -649
  670. data/lib/rubygems/psych_additions.rb +0 -10
  671. data/lib/rubygems/server.rb +0 -879
  672. data/lib/rubygems/source_local.rb +0 -7
  673. data/lib/rubygems/source_specific_file.rb +0 -6
  674. data/lib/rubygems/syck_hack.rb +0 -79
  675. data/lib/rubygems/uri_parser.rb +0 -36
  676. data/lib/rubygems/uri_parsing.rb +0 -23
  677. data/lib/ubygems.rb +0 -14
  678. data/test/rubygems/bogussources.rb +0 -9
  679. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  680. data/test/rubygems/test_gem_server.rb +0 -612
  681. data/tmp/.keep +0 -0
  682. data/util/CL2notes +0 -55
  683. data/util/bisect +0 -10
  684. data/util/ci.sh +0 -62
  685. data/util/cops/deprecations.rb +0 -52
  686. data/util/create_certs.rb +0 -171
  687. data/util/create_certs.sh +0 -27
  688. data/util/create_encrypted_key.rb +0 -16
  689. data/util/generate_spdx_license_list.rb +0 -63
  690. data/util/patch_with_prs.rb +0 -77
  691. data/util/rubocop +0 -8
  692. data/util/update_bundled_ca_certificates.rb +0 -137
  693. data/util/update_changelog.rb +0 -64
  694. /data/bundler/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  695. /data/bundler/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  696. /data/bundler/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  697. /data/bundler/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  698. /data/bundler/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  699. /data/bundler/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  700. /data/bundler/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  701. /data/bundler/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  702. /data/bundler/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  703. /data/bundler/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "lockfile_parser"
4
- require "set"
5
4
 
6
5
  module Bundler
7
6
  class Definition
8
7
  include GemHelpers
9
8
 
9
+ class << self
10
+ # Do not create or modify a lockfile (Makes #lock a noop)
11
+ attr_accessor :no_lock
12
+ end
13
+
10
14
  attr_reader(
11
15
  :dependencies,
12
16
  :locked_deps,
@@ -57,10 +61,8 @@ module Bundler
57
61
  @unlocking_bundler = false
58
62
  @unlocking = unlock
59
63
  else
60
- unlock = unlock.dup
61
64
  @unlocking_bundler = unlock.delete(:bundler)
62
- unlock.delete_if {|_k, v| Array(v).empty? }
63
- @unlocking = !unlock.empty?
65
+ @unlocking = unlock.any? {|_k, v| !Array(v).empty? }
64
66
  end
65
67
 
66
68
  @dependencies = dependencies
@@ -68,6 +70,7 @@ module Bundler
68
70
  @unlock = unlock
69
71
  @optional_groups = optional_groups
70
72
  @remote = false
73
+ @prefer_local = false
71
74
  @specs = nil
72
75
  @ruby_version = ruby_version
73
76
  @gemfiles = gemfiles
@@ -76,7 +79,7 @@ module Bundler
76
79
  @lockfile_contents = String.new
77
80
  @locked_bundler_version = nil
78
81
  @locked_ruby_version = nil
79
- @locked_specs_incomplete_for_platform = false
82
+ @new_platform = nil
80
83
 
81
84
  if lockfile && File.exist?(lockfile)
82
85
  @lockfile_contents = Bundler.read_file(lockfile)
@@ -85,10 +88,11 @@ module Bundler
85
88
  @platforms = @locked_platforms.dup
86
89
  @locked_bundler_version = @locked_gems.bundler_version
87
90
  @locked_ruby_version = @locked_gems.ruby_version
91
+ @originally_locked_specs = SpecSet.new(@locked_gems.specs)
88
92
 
89
93
  if unlock != true
90
94
  @locked_deps = @locked_gems.dependencies
91
- @locked_specs = SpecSet.new(@locked_gems.specs)
95
+ @locked_specs = @originally_locked_specs
92
96
  @locked_sources = @locked_gems.sources
93
97
  else
94
98
  @unlock = {}
@@ -106,22 +110,36 @@ module Bundler
106
110
  @locked_platforms = []
107
111
  end
108
112
 
109
- @unlock[:gems] ||= []
113
+ locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
114
+ @multisource_allowed = locked_gem_sources.size == 1 && locked_gem_sources.first.multiple_remotes? && Bundler.frozen_bundle?
115
+
116
+ if @multisource_allowed
117
+ unless sources.aggregate_global_source?
118
+ msg = "Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."
119
+
120
+ Bundler::SharedHelpers.major_deprecation 2, msg
121
+ end
122
+
123
+ @sources.merged_gem_lockfile_sections!(locked_gem_sources.first)
124
+ end
125
+
110
126
  @unlock[:sources] ||= []
111
127
  @unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object
112
128
  @ruby_version.diff(locked_ruby_version_object)
113
129
  end
114
130
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
115
131
 
116
- add_current_platform unless Bundler.frozen_bundle?
132
+ add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
117
133
 
118
134
  converge_path_sources_to_gemspec_sources
119
135
  @path_changes = converge_paths
120
136
  @source_changes = converge_sources
121
137
 
122
- unless @unlock[:lock_shared_dependencies]
123
- eager_unlock = expand_dependencies(@unlock[:gems], true)
124
- @unlock[:gems] = @locked_specs.for(eager_unlock, [], false, false, false).map(&:name)
138
+ if @unlock[:conservative]
139
+ @unlock[:gems] ||= @dependencies.map(&:name)
140
+ else
141
+ eager_unlock = expand_dependencies(@unlock[:gems] || [], true)
142
+ @unlock[:gems] = @locked_specs.for(eager_unlock, false, platforms).map(&:name)
125
143
  end
126
144
 
127
145
  @dependency_changes = converge_dependencies
@@ -145,17 +163,28 @@ module Bundler
145
163
  end
146
164
  end
147
165
 
166
+ def resolve_only_locally!
167
+ @remote = false
168
+ sources.local_only!
169
+ resolve
170
+ end
171
+
172
+ def resolve_prefering_local!
173
+ @prefer_local = true
174
+ @remote = true
175
+ sources.remote!
176
+ resolve
177
+ end
178
+
148
179
  def resolve_with_cache!
149
- raise "Specs already loaded" if @specs
150
180
  sources.cached!
151
- specs
181
+ resolve
152
182
  end
153
183
 
154
184
  def resolve_remotely!
155
- raise "Specs already loaded" if @specs
156
185
  @remote = true
157
186
  sources.remote!
158
- specs
187
+ resolve
159
188
  end
160
189
 
161
190
  # For given dependency list returns a SpecSet with Gemspec of all the required
@@ -165,25 +194,7 @@ module Bundler
165
194
  #
166
195
  # @return [Bundler::SpecSet]
167
196
  def specs
168
- @specs ||= begin
169
- begin
170
- specs = resolve.materialize(requested_dependencies)
171
- rescue GemNotFound => e # Handle yanked gem
172
- gem_name, gem_version = extract_gem_info(e)
173
- locked_gem = @locked_specs[gem_name].last
174
- raise if locked_gem.nil? || locked_gem.version.to_s != gem_version || !@remote
175
- raise GemNotFound, "Your bundle is locked to #{locked_gem}, but that version could not " \
176
- "be found in any of the sources listed in your Gemfile. If you haven't changed sources, " \
177
- "that means the author of #{locked_gem} has removed it. You'll need to update your bundle " \
178
- "to a version other than #{locked_gem} that hasn't been removed in order to install."
179
- end
180
- unless specs["bundler"].any?
181
- bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
182
- specs["bundler"] = bundler
183
- end
184
-
185
- specs
186
- end
197
+ @specs ||= materialize(requested_dependencies)
187
198
  end
188
199
 
189
200
  def new_specs
@@ -194,14 +205,8 @@ module Bundler
194
205
  @locked_specs - specs
195
206
  end
196
207
 
197
- def new_platform?
198
- @new_platform
199
- end
200
-
201
208
  def missing_specs
202
- missing = []
203
- resolve.materialize(requested_dependencies, missing)
204
- missing
209
+ resolve.materialize(requested_dependencies).missing_specs
205
210
  end
206
211
 
207
212
  def missing_specs?
@@ -210,8 +215,8 @@ module Bundler
210
215
  Bundler.ui.debug "The definition is missing #{missing.map(&:full_name)}"
211
216
  true
212
217
  rescue BundlerError => e
213
- @index = nil
214
218
  @resolve = nil
219
+ @resolver = nil
215
220
  @specs = nil
216
221
  @gem_version_promoter = nil
217
222
 
@@ -220,21 +225,43 @@ module Bundler
220
225
  end
221
226
 
222
227
  def requested_specs
223
- @requested_specs ||= begin
224
- groups = requested_groups
225
- groups.map!(&:to_sym)
226
- specs_for(groups)
227
- end
228
+ specs_for(requested_groups)
229
+ end
230
+
231
+ def requested_dependencies
232
+ dependencies_for(requested_groups)
228
233
  end
229
234
 
230
235
  def current_dependencies
231
- dependencies.select(&:should_include?)
236
+ dependencies.select do |d|
237
+ d.should_include? && !d.gem_platforms(@platforms).empty?
238
+ end
239
+ end
240
+
241
+ def locked_dependencies
242
+ @locked_deps.values
243
+ end
244
+
245
+ def new_deps
246
+ @new_deps ||= @dependencies - locked_dependencies
247
+ end
248
+
249
+ def deleted_deps
250
+ @deleted_deps ||= locked_dependencies - @dependencies
232
251
  end
233
252
 
234
253
  def specs_for(groups)
235
- deps = dependencies.select {|d| (d.groups & groups).any? }
236
- deps.delete_if {|d| !d.should_include? }
237
- specs.for(expand_dependencies(deps))
254
+ return specs if groups.empty?
255
+ deps = dependencies_for(groups)
256
+ materialize(deps)
257
+ end
258
+
259
+ def dependencies_for(groups)
260
+ groups.map!(&:to_sym)
261
+ deps = current_dependencies.reject do |d|
262
+ (d.groups & groups).empty?
263
+ end
264
+ expand_dependencies(deps)
238
265
  end
239
266
 
240
267
  # Resolve all the dependencies specified in Gemfile. It ensures that
@@ -243,78 +270,26 @@ module Bundler
243
270
  #
244
271
  # @return [SpecSet] resolved dependencies
245
272
  def resolve
246
- @resolve ||= begin
247
- last_resolve = converge_locked_specs
248
- resolve =
249
- if Bundler.frozen_bundle?
250
- Bundler.ui.debug "Frozen, using resolution from the lockfile"
251
- last_resolve
252
- elsif !unlocking? && nothing_changed?
253
- Bundler.ui.debug("Found no changes, using resolution from the lockfile")
254
- last_resolve
273
+ @resolve ||= if Bundler.frozen_bundle?
274
+ Bundler.ui.debug "Frozen, using resolution from the lockfile"
275
+ @locked_specs
276
+ elsif !unlocking? && nothing_changed?
277
+ if deleted_deps.any?
278
+ Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile")
279
+ SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
280
+ else
281
+ Bundler.ui.debug("Found no changes, using resolution from the lockfile")
282
+ if @locked_gems.may_include_redundant_platform_specific_gems?
283
+ SpecSet.new(filter_specs(@locked_specs, @dependencies))
255
284
  else
256
- # Run a resolve against the locally available gems
257
- Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
258
- last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
285
+ @locked_specs
259
286
  end
260
-
261
- # filter out gems that _can_ be installed on multiple platforms, but don't need
262
- # to be
263
- resolve.for(expand_dependencies(dependencies, true), [], false, false, false)
264
- end
265
- end
266
-
267
- def index
268
- @index ||= Index.build do |idx|
269
- dependency_names = @dependencies.map(&:name)
270
-
271
- sources.all_sources.each do |source|
272
- source.dependency_names = dependency_names - pinned_spec_names(source)
273
- idx.add_source source.specs
274
- dependency_names.concat(source.unmet_deps).uniq!
275
287
  end
276
-
277
- double_check_for_index(idx, dependency_names)
278
- end
279
- end
280
-
281
- # Suppose the gem Foo depends on the gem Bar. Foo exists in Source A. Bar has some versions that exist in both
282
- # sources A and B. At this point, the API request will have found all the versions of Bar in source A,
283
- # but will not have found any versions of Bar from source B, which is a problem if the requested version
284
- # of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for
285
- # each spec we found, we add all possible versions from all sources to the index.
286
- def double_check_for_index(idx, dependency_names)
287
- pinned_names = pinned_spec_names
288
- loop do
289
- idxcount = idx.size
290
-
291
- names = :names # do this so we only have to traverse to get dependency_names from the index once
292
- unmet_dependency_names = lambda do
293
- return names unless names == :names
294
- new_names = sources.all_sources.map(&:dependency_names_to_double_check)
295
- return names = nil if new_names.compact!
296
- names = new_names.flatten(1).concat(dependency_names)
297
- names.uniq!
298
- names -= pinned_names
299
- names
300
- end
301
-
302
- sources.all_sources.each do |source|
303
- source.double_check_for(unmet_dependency_names)
304
- end
305
-
306
- break if idxcount == idx.size
288
+ else
289
+ Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
290
+ resolver.start(expanded_dependencies)
307
291
  end
308
292
  end
309
- private :double_check_for_index
310
-
311
- def has_rubygems_remotes?
312
- sources.rubygems_sources.any? {|s| s.remotes.any? }
313
- end
314
-
315
- def has_local_dependencies?
316
- !sources.path_sources.empty? || !sources.git_sources.empty?
317
- end
318
293
 
319
294
  def spec_git_paths
320
295
  sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact
@@ -325,6 +300,8 @@ module Bundler
325
300
  end
326
301
 
327
302
  def lock(file, preserve_unknown_sections = false)
303
+ return if Definition.no_lock
304
+
328
305
  contents = to_lock
329
306
 
330
307
  # Convert to \r\n if the existing lock has them
@@ -335,10 +312,7 @@ module Bundler
335
312
  locked_major = @locked_bundler_version.segments.first
336
313
  current_major = Gem::Version.create(Bundler::VERSION).segments.first
337
314
 
338
- if updating_major = locked_major < current_major
339
- Bundler.ui.warn "Warning: the lockfile is being updated to Bundler #{current_major}, " \
340
- "after which you will be unable to return to Bundler #{@locked_bundler_version.segments.first}."
341
- end
315
+ updating_major = locked_major < current_major
342
316
  end
343
317
 
344
318
  preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))
@@ -355,14 +329,6 @@ module Bundler
355
329
  end
356
330
  end
357
331
 
358
- def locked_bundler_version
359
- if @locked_bundler_version && @locked_bundler_version < Gem::Version.new(Bundler::VERSION)
360
- new_version = Bundler::VERSION
361
- end
362
-
363
- new_version || @locked_bundler_version || Bundler::VERSION
364
- end
365
-
366
332
  def locked_ruby_version
367
333
  return unless ruby_version
368
334
  if @unlock[:ruby] || !@locked_ruby_version
@@ -396,12 +362,10 @@ module Bundler
396
362
  "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control."
397
363
 
398
364
  unless explicit_flag
399
- suggested_command = if Bundler.settings.locations("frozen")[:global]
365
+ suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
400
366
  "bundle config unset frozen"
401
367
  elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
402
368
  "bundle config unset deployment"
403
- else
404
- "bundle install --no-deployment"
405
369
  end
406
370
  msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \
407
371
  "freeze \nby running `#{suggested_command}`."
@@ -416,44 +380,28 @@ module Bundler
416
380
  added.concat new_platforms.map {|p| "* platform: #{p}" }
417
381
  deleted.concat deleted_platforms.map {|p| "* platform: #{p}" }
418
382
 
419
- gemfile_sources = sources.lock_sources
383
+ added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
384
+ deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?
420
385
 
421
- new_sources = gemfile_sources - @locked_sources
422
- deleted_sources = @locked_sources - gemfile_sources
386
+ both_sources = Hash.new {|h, k| h[k] = [] }
387
+ @dependencies.each {|d| both_sources[d.name][0] = d }
423
388
 
424
- new_deps = @dependencies - @locked_deps.values
425
- deleted_deps = @locked_deps.values - @dependencies
389
+ locked_dependencies.each do |d|
390
+ next if !Bundler.feature_flag.bundler_3_mode? && @locked_specs[d.name].empty?
426
391
 
427
- # Check if it is possible that the source is only changed thing
428
- if (new_deps.empty? && deleted_deps.empty?) && (!new_sources.empty? && !deleted_sources.empty?)
429
- new_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) }
430
- deleted_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) }
392
+ both_sources[d.name][1] = d
431
393
  end
432
394
 
433
- if @locked_sources != gemfile_sources
434
- if new_sources.any?
435
- added.concat new_sources.map {|source| "* source: #{source}" }
436
- end
395
+ both_sources.each do |name, (dep, lock_dep)|
396
+ next if dep.nil? || lock_dep.nil?
437
397
 
438
- if deleted_sources.any?
439
- deleted.concat deleted_sources.map {|source| "* source: #{source}" }
440
- end
441
- end
398
+ gemfile_source = dep.source || sources.default_source
399
+ lock_source = lock_dep.source || sources.default_source
400
+ next if lock_source.include?(gemfile_source)
442
401
 
443
- added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
444
- if deleted_deps.any?
445
- deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" }
446
- end
447
-
448
- both_sources = Hash.new {|h, k| h[k] = [] }
449
- @dependencies.each {|d| both_sources[d.name][0] = d }
450
- @locked_deps.each {|name, d| both_sources[name][1] = d.source }
451
-
452
- both_sources.each do |name, (dep, lock_source)|
453
- next unless (dep.nil? && !lock_source.nil?) || (!dep.nil? && !lock_source.nil? && !lock_source.can_lock?(dep))
454
- gemfile_source_name = (dep && dep.source) || "no specified source"
455
- lockfile_source_name = lock_source || "no specified source"
456
- changed << "* #{name} from `#{gemfile_source_name}` to `#{lockfile_source_name}`"
402
+ gemfile_source_name = dep.source ? gemfile_source.identifier : "no specified source"
403
+ lockfile_source_name = lock_dep.source ? lock_source.identifier : "no specified source"
404
+ changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
457
405
  end
458
406
 
459
407
  reason = change_reason
@@ -497,15 +445,11 @@ module Bundler
497
445
  end
498
446
 
499
447
  def validate_platforms!
500
- return if @platforms.any? do |bundle_platform|
501
- Bundler.rubygems.platforms.any? do |local_platform|
502
- MatchPlatform.platforms_match?(bundle_platform, local_platform)
503
- end
504
- end
448
+ return if current_platform_locked?
505
449
 
506
450
  raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
507
- "but your local platforms are #{Bundler.rubygems.platforms.map(&:to_s)}, and " \
508
- "there's no compatible match between those two lists."
451
+ "but your local platform is #{Bundler.local_platform}. " \
452
+ "Add the current platform to the lockfile with\n`bundle lock --add-platform #{Bundler.local_platform}` and try again."
509
453
  end
510
454
 
511
455
  def add_platform(platform)
@@ -518,39 +462,111 @@ module Bundler
518
462
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
519
463
  end
520
464
 
521
- def add_current_platform
522
- current_platforms.each {|platform| add_platform(platform) }
523
- end
524
-
525
- def find_resolved_spec(current_spec)
526
- specs.find_by_name_and_platform(current_spec.name, current_spec.platform)
527
- end
528
-
529
- def find_indexed_specs(current_spec)
530
- index[current_spec.name].select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
465
+ def most_specific_locked_platform
466
+ @platforms.min_by do |bundle_platform|
467
+ platform_specificity_match(bundle_platform, local_platform)
468
+ end
531
469
  end
532
470
 
533
471
  attr_reader :sources
534
472
  private :sources
535
473
 
536
474
  def nothing_changed?
537
- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@locked_specs_incomplete_for_platform
475
+ !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
538
476
  end
539
477
 
540
478
  def unlocking?
541
479
  @unlocking
542
480
  end
543
481
 
544
- private
482
+ private
483
+
484
+ def resolver
485
+ @resolver ||= begin
486
+ last_resolve = converge_locked_specs
487
+ remove_ruby_from_platforms_if_necessary!(dependencies)
488
+ Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve), platforms)
489
+ end
490
+ end
491
+
492
+ def expanded_dependencies
493
+ @expanded_dependencies ||= expand_dependencies(dependencies + metadata_dependencies, true)
494
+ end
495
+
496
+ def filter_specs(specs, deps)
497
+ SpecSet.new(specs).for(expand_dependencies(deps, true), false, platforms)
498
+ end
499
+
500
+ def materialize(dependencies)
501
+ specs = resolve.materialize(dependencies)
502
+ missing_specs = specs.missing_specs
503
+
504
+ if missing_specs.any?
505
+ missing_specs.each do |s|
506
+ locked_gem = @locked_specs[s.name].last
507
+ next if locked_gem.nil? || locked_gem.version != s.version || !@remote
508
+ raise GemNotFound, "Your bundle is locked to #{locked_gem} from #{locked_gem.source}, but that version can " \
509
+ "no longer be found in that source. That means the author of #{locked_gem} has removed it. " \
510
+ "You'll need to update your bundle to a version other than #{locked_gem} that hasn't been " \
511
+ "removed in order to install."
512
+ end
513
+
514
+ missing_specs_list = missing_specs.group_by(&:source).map do |source, missing_specs_for_source|
515
+ "#{missing_specs_for_source.map(&:full_name).join(", ")} in #{source}"
516
+ end
517
+
518
+ raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
519
+ end
520
+
521
+ loop do
522
+ incomplete_specs = specs.incomplete_specs
523
+ break if incomplete_specs.empty?
524
+
525
+ Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
526
+ @resolve = resolver.start(expanded_dependencies, :exclude_specs => incomplete_specs)
527
+ specs = resolve.materialize(dependencies)
528
+ end
529
+
530
+ bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
531
+ specs["bundler"] = bundler
532
+
533
+ specs
534
+ end
535
+
536
+ def precompute_source_requirements_for_indirect_dependencies?
537
+ @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
538
+ end
545
539
 
546
- def current_platforms
547
- current_platform = Bundler.local_platform
548
- [].tap do |platforms|
549
- platforms << current_platform if Bundler.feature_flag.specific_platform?
550
- platforms << generic(current_platform)
540
+ def pin_locally_available_names(source_requirements)
541
+ source_requirements.each_with_object({}) do |(name, original_source), new_source_requirements|
542
+ local_source = original_source.dup
543
+ local_source.local_only!
544
+
545
+ new_source_requirements[name] = if local_source.specs.search(name).any?
546
+ local_source
547
+ else
548
+ original_source
549
+ end
551
550
  end
552
551
  end
553
552
 
553
+ def current_ruby_platform_locked?
554
+ return false unless generic_local_platform == Gem::Platform::RUBY
555
+ return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)
556
+
557
+ current_platform_locked?
558
+ end
559
+
560
+ def current_platform_locked?
561
+ @platforms.any? do |bundle_platform|
562
+ MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
563
+ end
564
+ end
565
+
566
+ def add_current_platform
567
+ add_platform(local_platform)
568
+ end
569
+
554
570
  def change_reason
555
571
  if unlocking?
556
572
  unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v|
@@ -569,7 +585,6 @@ module Bundler
569
585
  [@new_platform, "you added a new platform to your gemfile"],
570
586
  [@path_changes, "the gemspecs for path gems changed"],
571
587
  [@local_changes, "the gemspecs for git local gems changed"],
572
- [@locked_specs_incomplete_for_platform, "the lockfile does not have all gems needed for the current platform"],
573
588
  ].select(&:first).map(&:last).join(", ")
574
589
  end
575
590
 
@@ -587,9 +602,9 @@ module Bundler
587
602
 
588
603
  def dependencies_for_source_changed?(source, locked_source = source)
589
604
  deps_for_source = @dependencies.select {|s| s.source == source }
590
- locked_deps_for_source = @locked_deps.values.select {|dep| dep.source == locked_source }
605
+ locked_deps_for_source = locked_dependencies.select {|dep| dep.source == locked_source }
591
606
 
592
- Set.new(deps_for_source) != Set.new(locked_deps_for_source)
607
+ deps_for_source.uniq.sort != locked_deps_for_source.sort
593
608
  end
594
609
 
595
610
  def specs_for_source_changed?(source)
@@ -648,36 +663,11 @@ module Bundler
648
663
  end
649
664
  end
650
665
 
651
- def converge_rubygems_sources
652
- return false if Bundler.feature_flag.disable_multisource?
653
-
654
- changes = false
655
-
656
- # Get the RubyGems sources from the Gemfile.lock
657
- locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
658
- # Get the RubyGems remotes from the Gemfile
659
- actual_remotes = sources.rubygems_remotes
660
-
661
- # If there is a RubyGems source in both
662
- if !locked_gem_sources.empty? && !actual_remotes.empty?
663
- locked_gem_sources.each do |locked_gem|
664
- # Merge the remotes from the Gemfile into the Gemfile.lock
665
- changes |= locked_gem.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes])
666
- end
667
- end
668
-
669
- changes
670
- end
671
-
672
666
  def converge_sources
673
- changes = false
674
-
675
- changes |= converge_rubygems_sources
676
-
677
667
  # Replace the sources from the Gemfile with the sources from the Gemfile.lock,
678
668
  # if they exist in the Gemfile.lock and are `==`. If you can't find an equivalent
679
669
  # source in the Gemfile.lock, use the one from the Gemfile.
680
- changes |= sources.replace_sources!(@locked_sources)
670
+ changes = sources.replace_sources!(@locked_sources)
681
671
 
682
672
  sources.all_sources.each do |source|
683
673
  # If the source is unlockable and the current command allows an unlock of
@@ -695,28 +685,14 @@ module Bundler
695
685
  end
696
686
 
697
687
  def converge_dependencies
698
- frozen = Bundler.frozen_bundle?
699
- (@dependencies + @locked_deps.values).each do |dep|
700
- locked_source = @locked_deps[dep.name]
701
- # This is to make sure that if bundler is installing in deployment mode and
702
- # after locked_source and sources don't match, we still use locked_source.
703
- if frozen && !locked_source.nil? &&
704
- locked_source.respond_to?(:source) && locked_source.source.instance_of?(Source::Path) && locked_source.source.path.exist?
705
- dep.source = locked_source.source
706
- elsif dep.source
688
+ changes = false
689
+
690
+ @dependencies.each do |dep|
691
+ if dep.source
707
692
  dep.source = sources.get(dep.source)
708
693
  end
709
- if dep.source.is_a?(Source::Gemspec)
710
- dep.platforms.concat(@platforms.map {|p| Dependency::REVERSE_PLATFORM_MAP[p] }.flatten(1)).uniq!
711
- end
712
- end
713
694
 
714
- changes = false
715
- # We want to know if all match, but don't want to check all entries
716
- # This means we need to return false if any dependency doesn't match
717
- # the lock or doesn't exist in the lock.
718
- @dependencies.each do |dependency|
719
- unless locked_dep = @locked_deps[dependency.name]
695
+ unless locked_dep = @locked_deps[dep.name]
720
696
  changes = true
721
697
  next
722
698
  end
@@ -727,11 +703,11 @@ module Bundler
727
703
  # directive, the lockfile dependencies and resolved dependencies end up
728
704
  # with a mismatch on #type. Work around that by setting the type on the
729
705
  # dep from the lockfile.
730
- locked_dep.instance_variable_set(:@type, dependency.type)
706
+ locked_dep.instance_variable_set(:@type, dep.type)
731
707
 
732
708
  # We already know the name matches from the hash lookup
733
709
  # so we only need to check the requirement now
734
- changes ||= dependency.requirement != locked_dep.requirement
710
+ changes ||= dep.requirement != locked_dep.requirement
735
711
  end
736
712
 
737
713
  changes
@@ -741,50 +717,50 @@ module Bundler
741
717
  # commonly happen if the Gemfile has changed since the lockfile was last
742
718
  # generated
743
719
  def converge_locked_specs
744
- deps = []
720
+ converged = converge_specs(@locked_specs)
745
721
 
746
- # Build a list of dependencies that are the same in the Gemfile
747
- # and Gemfile.lock. If the Gemfile modified a dependency, but
748
- # the gem in the Gemfile.lock still satisfies it, this is fine
749
- # too.
750
- @dependencies.each do |dep|
751
- locked_dep = @locked_deps[dep.name]
722
+ resolve = SpecSet.new(converged.reject {|s| @unlock[:gems].include?(s.name) })
752
723
 
753
- # If the locked_dep doesn't match the dependency we're looking for then we ignore the locked_dep
754
- locked_dep = nil unless locked_dep == dep
724
+ diff = nil
755
725
 
756
- if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep)
757
- deps << dep
758
- elsif dep.source.is_a?(Source::Path) && dep.current_platform? && (!locked_dep || dep.source != locked_dep.source)
759
- @locked_specs.each do |s|
760
- @unlock[:gems] << s.name if s.source == dep.source
761
- end
726
+ # Now, we unlock any sources that do not have anymore gems pinned to it
727
+ sources.all_sources.each do |source|
728
+ next unless source.respond_to?(:unlock!)
762
729
 
763
- dep.source.unlock! if dep.source.respond_to?(:unlock!)
764
- dep.source.specs.each {|s| @unlock[:gems] << s.name }
730
+ unless resolve.any? {|s| s.source == source }
731
+ diff ||= @locked_specs.to_a - resolve.to_a
732
+ source.unlock! if diff.any? {|s| s.source == source }
765
733
  end
766
734
  end
767
735
 
768
- unlock_source_unlocks_spec = Bundler.feature_flag.unlock_source_unlocks_spec?
736
+ resolve
737
+ end
769
738
 
739
+ def converge_specs(specs)
770
740
  converged = []
771
- @locked_specs.each do |s|
772
- # Replace the locked dependency's source with the equivalent source from the Gemfile
741
+
742
+ deps = @dependencies.select do |dep|
743
+ specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
744
+ end
745
+
746
+ @specs_that_changed_sources = []
747
+
748
+ specs.each do |s|
773
749
  dep = @dependencies.find {|d| s.satisfies?(d) }
774
- s.source = (dep && dep.source) || sources.get(s.source)
775
750
 
776
- # Don't add a spec to the list if its source is expired. For example,
777
- # if you change a Git gem to RubyGems.
778
- next if s.source.nil?
779
- next if @unlock[:sources].include?(s.source.name)
751
+ # Replace the locked dependency's source with the equivalent source from the Gemfile
752
+ s.source = if dep && dep.source
753
+ gemfile_source = dep.source
754
+ lockfile_source = s.source
755
+
756
+ @specs_that_changed_sources << s if gemfile_source != lockfile_source
780
757
 
781
- # XXX This is a backwards-compatibility fix to preserve the ability to
782
- # unlock a single gem by passing its name via `--source`. See issue #3759
783
- # TODO: delete in Bundler 2
784
- next if unlock_source_unlocks_spec && @unlock[:sources].include?(s.name)
758
+ gemfile_source
759
+ else
760
+ sources.get_with_fallback(s.source)
761
+ end
785
762
 
786
- # If the spec is from a path source and it doesn't exist anymore
787
- # then we unlock it.
763
+ next if @unlock[:sources].include?(s.source.name)
788
764
 
789
765
  # Path sources have special logic
790
766
  if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec)
@@ -793,8 +769,8 @@ module Bundler
793
769
  rescue PathError, GitError
794
770
  # if we won't need the source (according to the lockfile),
795
771
  # don't error if the path/git source isn't available
796
- next if @locked_specs.
797
- for(requested_dependencies, [], false, true, false).
772
+ next if specs.
773
+ for(requested_dependencies, false).
798
774
  none? {|locked_spec| locked_spec.source == s.source }
799
775
 
800
776
  raise
@@ -806,147 +782,76 @@ module Bundler
806
782
  # commonly happens if the version changed in the gemspec
807
783
  next unless new_spec
808
784
 
809
- new_runtime_deps = new_spec.dependencies.select {|d| d.type != :development }
810
- old_runtime_deps = s.dependencies.select {|d| d.type != :development }
811
- # If the dependencies of the path source have changed and locked spec can't satisfy new dependencies, unlock it
812
- next unless new_runtime_deps.sort == old_runtime_deps.sort || new_runtime_deps.all? {|d| satisfies_locked_spec?(d) }
813
-
814
785
  s.dependencies.replace(new_spec.dependencies)
815
786
  end
816
787
 
817
- converged << s
818
- end
819
-
820
- resolve = SpecSet.new(converged)
821
- @locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(deps), @unlock[:gems], true, true)
822
- resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems], false, false, false)
823
- diff = nil
824
-
825
- # Now, we unlock any sources that do not have anymore gems pinned to it
826
- sources.all_sources.each do |source|
827
- next unless source.respond_to?(:unlock!)
828
-
829
- unless resolve.any? {|s| s.source == source }
830
- diff ||= @locked_specs.to_a - resolve.to_a
831
- source.unlock! if diff.any? {|s| s.source == source }
788
+ if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
789
+ @unlock[:gems] << s.name
790
+ else
791
+ converged << s
832
792
  end
833
793
  end
834
794
 
835
- resolve
836
- end
837
-
838
- def in_locked_deps?(dep, locked_dep)
839
- # Because the lockfile can't link a dep to a specific remote, we need to
840
- # treat sources as equivalent anytime the locked dep has all the remotes
841
- # that the Gemfile dep does.
842
- locked_dep && locked_dep.source && dep.source && locked_dep.source.include?(dep.source)
843
- end
844
-
845
- def satisfies_locked_spec?(dep)
846
- @locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
847
- end
848
-
849
- # This list of dependencies is only used in #resolve, so it's OK to add
850
- # the metadata dependencies here
851
- def expanded_dependencies
852
- @expanded_dependencies ||= begin
853
- expand_dependencies(dependencies + metadata_dependencies, @remote)
854
- end
795
+ filter_specs(converged, deps)
855
796
  end
856
797
 
857
798
  def metadata_dependencies
858
- @metadata_dependencies ||= begin
859
- ruby_versions = concat_ruby_version_requirements(@ruby_version)
860
- if ruby_versions.empty? || !@ruby_version.exact?
861
- concat_ruby_version_requirements(RubyVersion.system)
862
- concat_ruby_version_requirements(locked_ruby_version_object) unless @unlock[:ruby]
863
- end
864
- [
865
- Dependency.new("Ruby\0", ruby_versions),
866
- Dependency.new("RubyGems\0", Gem::VERSION),
867
- ]
868
- end
869
- end
870
-
871
- def concat_ruby_version_requirements(ruby_version, ruby_versions = [])
872
- return ruby_versions unless ruby_version
873
- if ruby_version.patchlevel
874
- ruby_versions << ruby_version.to_gem_version_with_patchlevel
875
- else
876
- ruby_versions.concat(ruby_version.versions.map do |version|
877
- requirement = Gem::Requirement.new(version)
878
- if requirement.exact?
879
- "~> #{version}.0"
880
- else
881
- requirement
882
- end
883
- end)
884
- end
799
+ @metadata_dependencies ||= [
800
+ Dependency.new("Ruby\0", Gem.ruby_version),
801
+ Dependency.new("RubyGems\0", Gem::VERSION),
802
+ ]
885
803
  end
886
804
 
887
805
  def expand_dependencies(dependencies, remote = false)
888
- sorted_platforms = Resolver.sort_platforms(@platforms)
889
806
  deps = []
890
807
  dependencies.each do |dep|
891
808
  dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
892
- next if !remote && !dep.current_platform?
893
- platforms = dep.gem_platforms(sorted_platforms)
894
- if platforms.empty? && !Bundler.settings[:disable_platform_warnings]
895
- mapped_platforms = dep.expanded_platforms
896
- Bundler.ui.warn \
897
- "The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \
898
- "Bundler is installing for #{@platforms.join ", "} but the dependency " \
899
- "is only for #{mapped_platforms.join ", "}. " \
900
- "To add those platforms to the bundle, " \
901
- "run `bundle lock --add-platform #{mapped_platforms.join " "}`."
902
- end
903
- platforms.each do |p|
904
- deps << DepProxy.new(dep, p) if remote || p == generic_local_platform
905
- end
809
+ next unless remote || dep.current_platform?
810
+ target_platforms = dep.gem_platforms(remote ? @platforms : [generic_local_platform])
811
+ deps += expand_dependency_with_platforms(dep, target_platforms)
906
812
  end
907
813
  deps
908
814
  end
909
815
 
910
- def requested_dependencies
911
- groups = requested_groups
912
- groups.map!(&:to_sym)
913
- dependencies.reject {|d| !d.should_include? || (d.groups & groups).empty? }
816
+ def expand_dependency_with_platforms(dep, platforms)
817
+ platforms.map do |p|
818
+ DepProxy.get_proxy(dep, p)
819
+ end
914
820
  end
915
821
 
916
822
  def source_requirements
917
- # Load all specs from remote sources
918
- index
919
-
920
823
  # Record the specs available in each gem's source, so that those
921
824
  # specs will be available later when the resolver knows where to
922
825
  # look for that gemspec (or its dependencies)
923
- default = sources.default_source
924
- source_requirements = { :default => default }
925
- default = nil unless Bundler.feature_flag.disable_multisource?
926
- dependencies.each do |dep|
927
- next unless source = dep.source || default
928
- source_requirements[dep.name] = source
826
+ source_requirements = if precompute_source_requirements_for_indirect_dependencies?
827
+ all_requirements = source_map.all_requirements
828
+ all_requirements = pin_locally_available_names(all_requirements) if @prefer_local
829
+ { :default => sources.default_source }.merge(all_requirements)
830
+ else
831
+ { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
929
832
  end
833
+ source_requirements.merge!(source_map.locked_requirements) unless @remote
930
834
  metadata_dependencies.each do |dep|
931
835
  source_requirements[dep.name] = sources.metadata_source
932
836
  end
837
+ source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
933
838
  source_requirements["bundler"] = sources.metadata_source # needs to come last to override
839
+ verify_changed_sources!
934
840
  source_requirements
935
841
  end
936
842
 
937
- def pinned_spec_names(skip = nil)
938
- pinned_names = []
939
- default = Bundler.feature_flag.disable_multisource? && sources.default_source
940
- @dependencies.each do |dep|
941
- next unless dep_source = dep.source || default
942
- next if dep_source == skip
943
- pinned_names << dep.name
843
+ def verify_changed_sources!
844
+ @specs_that_changed_sources.each do |s|
845
+ if s.source.specs.search(s.name).empty?
846
+ raise GemNotFound, "Could not find gem '#{s.name}' in #{s.source}"
847
+ end
944
848
  end
945
- pinned_names
946
849
  end
947
850
 
948
851
  def requested_groups
949
- groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
852
+ values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
853
+ values &= Bundler.settings[:only] unless Bundler.settings[:only].empty?
854
+ values
950
855
  end
951
856
 
952
857
  def lockfiles_equal?(current, proposed, preserve_unknown_sections)
@@ -962,12 +867,6 @@ module Bundler
962
867
  current == proposed
963
868
  end
964
869
 
965
- def extract_gem_info(error)
966
- # This method will extract the error message like "Could not find foo-1.2.3 in any of the sources"
967
- # to an array. The first element will be the gem name (e.g. foo), the second will be the version number.
968
- error.message.scan(/Could not find (\w+)-(\d+(?:\.\d+)+)/).flatten
969
- end
970
-
971
870
  def compute_requires
972
871
  dependencies.reduce({}) do |requires, dep|
973
872
  next requires unless dep.should_include?
@@ -979,24 +878,26 @@ module Bundler
979
878
  end
980
879
  end
981
880
 
982
- def additional_base_requirements_for_resolve
983
- return [] unless @locked_gems && Bundler.feature_flag.only_update_to_newer_versions?
984
- dependencies_by_name = dependencies.inject({}) {|memo, dep| memo.update(dep.name => dep) }
985
- @locked_gems.specs.reduce({}) do |requirements, locked_spec|
986
- name = locked_spec.name
987
- dependency = dependencies_by_name[name]
988
- next requirements if @locked_gems.dependencies[name] != dependency
989
- next requirements if dependency && dependency.source.is_a?(Source::Path)
990
- dep = Gem::Dependency.new(name, ">= #{locked_spec.version}")
991
- requirements[name] = DepProxy.new(dep, locked_spec.platform)
992
- requirements
993
- end.values
881
+ def additional_base_requirements_for_resolve(last_resolve)
882
+ return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
883
+ converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
884
+ Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
885
+ end.uniq
994
886
  end
995
887
 
996
- def equivalent_rubygems_remotes?(source)
997
- return false unless source.is_a?(Source::Rubygems)
888
+ def remove_ruby_from_platforms_if_necessary!(dependencies)
889
+ return if Bundler.frozen_bundle? ||
890
+ Bundler.local_platform == Gem::Platform::RUBY ||
891
+ !platforms.include?(Gem::Platform::RUBY) ||
892
+ (@new_platform && platforms.last == Gem::Platform::RUBY) ||
893
+ !@originally_locked_specs.incomplete_ruby_specs?(expand_dependencies(dependencies))
894
+
895
+ remove_platform(Gem::Platform::RUBY)
896
+ add_current_platform
897
+ end
998
898
 
999
- Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
899
+ def source_map
900
+ @source_map ||= SourceMap.new(sources, dependencies, @locked_specs)
1000
901
  end
1001
902
  end
1002
903
  end