rubygems-update 3.0.3 → 3.4.7

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