rubygems-update 3.3.18 → 3.6.2

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 (832) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2182 -1067
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +184 -290
  5. data/README.md +35 -19
  6. data/bundler/CHANGELOG.md +1003 -3
  7. data/bundler/README.md +3 -7
  8. data/bundler/bundler.gemspec +11 -11
  9. data/bundler/exe/bundle +5 -25
  10. data/bundler/lib/bundler/build_metadata.rb +3 -3
  11. data/bundler/lib/bundler/capistrano.rb +1 -1
  12. data/bundler/lib/bundler/checksum.rb +254 -0
  13. data/bundler/lib/bundler/ci_detector.rb +75 -0
  14. data/bundler/lib/bundler/cli/add.rb +7 -5
  15. data/bundler/lib/bundler/cli/binstubs.rb +10 -6
  16. data/bundler/lib/bundler/cli/cache.rb +1 -1
  17. data/bundler/lib/bundler/cli/check.rb +4 -4
  18. data/bundler/lib/bundler/cli/common.rb +11 -1
  19. data/bundler/lib/bundler/cli/config.rb +8 -7
  20. data/bundler/lib/bundler/cli/console.rb +2 -5
  21. data/bundler/lib/bundler/cli/doctor.rb +10 -12
  22. data/bundler/lib/bundler/cli/exec.rb +2 -1
  23. data/bundler/lib/bundler/cli/fund.rb +1 -1
  24. data/bundler/lib/bundler/cli/gem.rb +77 -53
  25. data/bundler/lib/bundler/cli/info.rb +4 -15
  26. data/bundler/lib/bundler/cli/init.rb +6 -2
  27. data/bundler/lib/bundler/cli/inject.rb +1 -1
  28. data/bundler/lib/bundler/cli/install.rb +27 -15
  29. data/bundler/lib/bundler/cli/issue.rb +1 -1
  30. data/bundler/lib/bundler/cli/lock.rb +54 -28
  31. data/bundler/lib/bundler/cli/open.rb +9 -9
  32. data/bundler/lib/bundler/cli/outdated.rb +34 -29
  33. data/bundler/lib/bundler/cli/platform.rb +7 -5
  34. data/bundler/lib/bundler/cli/plugin.rb +9 -15
  35. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  36. data/bundler/lib/bundler/cli/show.rb +4 -4
  37. data/bundler/lib/bundler/cli/update.rb +6 -5
  38. data/bundler/lib/bundler/cli/viz.rb +1 -1
  39. data/bundler/lib/bundler/cli.rb +258 -307
  40. data/bundler/lib/bundler/compact_index_client/cache.rb +55 -60
  41. data/bundler/lib/bundler/compact_index_client/cache_file.rb +148 -0
  42. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  43. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  44. data/bundler/lib/bundler/compact_index_client/updater.rb +71 -83
  45. data/bundler/lib/bundler/compact_index_client.rb +58 -80
  46. data/bundler/lib/bundler/constants.rb +9 -2
  47. data/bundler/lib/bundler/current_ruby.rb +11 -16
  48. data/bundler/lib/bundler/definition.rb +547 -228
  49. data/bundler/lib/bundler/dependency.rb +30 -87
  50. data/bundler/lib/bundler/digest.rb +3 -3
  51. data/bundler/lib/bundler/dsl.rb +115 -65
  52. data/bundler/lib/bundler/endpoint_specification.rb +27 -14
  53. data/bundler/lib/bundler/env.rb +5 -7
  54. data/bundler/lib/bundler/environment_preserver.rb +8 -25
  55. data/bundler/lib/bundler/errors.rb +85 -11
  56. data/bundler/lib/bundler/feature_flag.rb +1 -2
  57. data/bundler/lib/bundler/fetcher/base.rb +5 -3
  58. data/bundler/lib/bundler/fetcher/compact_index.rb +28 -43
  59. data/bundler/lib/bundler/fetcher/dependency.rb +3 -7
  60. data/bundler/lib/bundler/fetcher/downloader.rb +17 -16
  61. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  62. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  63. data/bundler/lib/bundler/fetcher.rb +91 -74
  64. data/bundler/lib/bundler/force_platform.rb +16 -0
  65. data/bundler/lib/bundler/friendly_errors.rb +6 -9
  66. data/bundler/lib/bundler/gem_helper.rb +5 -6
  67. data/bundler/lib/bundler/gem_helpers.rb +45 -7
  68. data/bundler/lib/bundler/gem_version_promoter.rb +68 -109
  69. data/bundler/lib/bundler/graph.rb +9 -9
  70. data/bundler/lib/bundler/index.rb +69 -73
  71. data/bundler/lib/bundler/injector.rb +12 -13
  72. data/bundler/lib/bundler/inline.rb +40 -17
  73. data/bundler/lib/bundler/installer/gem_installer.rb +13 -12
  74. data/bundler/lib/bundler/installer/parallel_installer.rb +19 -66
  75. data/bundler/lib/bundler/installer/standalone.rb +29 -15
  76. data/bundler/lib/bundler/installer.rb +27 -77
  77. data/bundler/lib/bundler/lazy_specification.rb +134 -71
  78. data/bundler/lib/bundler/lockfile_generator.rb +13 -4
  79. data/bundler/lib/bundler/lockfile_parser.rb +134 -61
  80. data/bundler/lib/bundler/man/bundle-add.1 +46 -48
  81. data/bundler/lib/bundler/man/bundle-add.1.ronn +54 -22
  82. data/bundler/lib/bundler/man/bundle-binstubs.1 +10 -19
  83. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  84. data/bundler/lib/bundler/man/bundle-cache.1 +38 -25
  85. data/bundler/lib/bundler/man/bundle-cache.1.ronn +40 -4
  86. data/bundler/lib/bundler/man/bundle-check.1 +7 -14
  87. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  88. data/bundler/lib/bundler/man/bundle-clean.1 +4 -11
  89. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  90. data/bundler/lib/bundler/man/bundle-config.1 +41 -220
  91. data/bundler/lib/bundler/man/bundle-config.1.ronn +27 -22
  92. data/bundler/lib/bundler/man/bundle-console.1 +33 -0
  93. data/bundler/lib/bundler/man/bundle-console.1.ronn +39 -0
  94. data/bundler/lib/bundler/man/bundle-doctor.1 +5 -19
  95. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  96. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  97. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  98. data/bundler/lib/bundler/man/bundle-exec.1 +20 -78
  99. data/bundler/lib/bundler/man/bundle-exec.1.ronn +12 -10
  100. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  102. data/bundler/lib/bundler/man/bundle-gem.1 +53 -81
  103. data/bundler/lib/bundler/man/bundle-gem.1.ronn +41 -9
  104. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  105. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  106. data/bundler/lib/bundler/man/bundle-info.1 +8 -11
  107. data/bundler/lib/bundler/man/bundle-info.1.ronn +9 -5
  108. data/bundler/lib/bundler/man/bundle-init.1 +7 -12
  109. data/bundler/lib/bundler/man/bundle-init.1.ronn +4 -1
  110. data/bundler/lib/bundler/man/bundle-inject.1 +17 -19
  111. data/bundler/lib/bundler/man/bundle-inject.1.ronn +12 -2
  112. data/bundler/lib/bundler/man/bundle-install.1 +42 -162
  113. data/bundler/lib/bundler/man/bundle-install.1.ronn +31 -49
  114. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  115. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  116. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  117. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  118. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  119. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  120. data/bundler/lib/bundler/man/bundle-lock.1 +25 -34
  121. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  122. data/bundler/lib/bundler/man/bundle-open.1 +18 -18
  123. data/bundler/lib/bundler/man/bundle-open.1.ronn +10 -1
  124. data/bundler/lib/bundler/man/bundle-outdated.1 +22 -67
  125. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +20 -12
  126. data/bundler/lib/bundler/man/bundle-platform.1 +16 -28
  127. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  128. data/bundler/lib/bundler/man/bundle-plugin.1 +58 -0
  129. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  130. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  131. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  132. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  133. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  134. data/bundler/lib/bundler/man/bundle-show.1 +7 -11
  135. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  136. data/bundler/lib/bundler/man/bundle-update.1 +30 -143
  137. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  138. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  139. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  140. data/bundler/lib/bundler/man/bundle-viz.1 +9 -18
  141. data/bundler/lib/bundler/man/bundle-viz.1.ronn +9 -3
  142. data/bundler/lib/bundler/man/bundle.1 +17 -51
  143. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  144. data/bundler/lib/bundler/man/gemfile.5 +77 -341
  145. data/bundler/lib/bundler/man/gemfile.5.ronn +73 -54
  146. data/bundler/lib/bundler/man/index.txt +8 -0
  147. data/bundler/lib/bundler/match_metadata.rb +17 -0
  148. data/bundler/lib/bundler/match_platform.rb +1 -1
  149. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  150. data/bundler/lib/bundler/materialization.rb +59 -0
  151. data/bundler/lib/bundler/mirror.rb +8 -10
  152. data/bundler/lib/bundler/plugin/api/source.rb +7 -5
  153. data/bundler/lib/bundler/plugin/events.rb +24 -0
  154. data/bundler/lib/bundler/plugin/index.rb +13 -5
  155. data/bundler/lib/bundler/plugin/installer/path.rb +18 -0
  156. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  157. data/bundler/lib/bundler/plugin/installer.rb +42 -19
  158. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  159. data/bundler/lib/bundler/plugin.rb +35 -7
  160. data/bundler/lib/bundler/process_lock.rb +10 -14
  161. data/bundler/lib/bundler/remote_specification.rb +17 -13
  162. data/bundler/lib/bundler/resolver/base.rb +117 -0
  163. data/bundler/lib/bundler/resolver/candidate.rb +82 -0
  164. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  165. data/bundler/lib/bundler/resolver/package.rb +90 -0
  166. data/bundler/lib/bundler/resolver/root.rb +25 -0
  167. data/bundler/lib/bundler/resolver/spec_group.rb +54 -67
  168. data/bundler/lib/bundler/resolver.rb +432 -329
  169. data/bundler/lib/bundler/retry.rb +2 -2
  170. data/bundler/lib/bundler/ruby_dsl.rb +42 -7
  171. data/bundler/lib/bundler/ruby_version.rb +23 -10
  172. data/bundler/lib/bundler/rubygems_ext.rb +286 -81
  173. data/bundler/lib/bundler/rubygems_gem_installer.rb +77 -68
  174. data/bundler/lib/bundler/rubygems_integration.rb +57 -155
  175. data/bundler/lib/bundler/runtime.rb +28 -17
  176. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  177. data/bundler/lib/bundler/self_manager.rb +50 -12
  178. data/bundler/lib/bundler/settings.rb +144 -58
  179. data/bundler/lib/bundler/setup.rb +13 -1
  180. data/bundler/lib/bundler/shared_helpers.rb +87 -36
  181. data/bundler/lib/bundler/source/git/git_proxy.rb +278 -80
  182. data/bundler/lib/bundler/source/git.rb +161 -68
  183. data/bundler/lib/bundler/source/metadata.rb +16 -16
  184. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  185. data/bundler/lib/bundler/source/path.rb +16 -26
  186. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  187. data/bundler/lib/bundler/source/rubygems.rb +94 -154
  188. data/bundler/lib/bundler/source.rb +3 -1
  189. data/bundler/lib/bundler/source_list.rb +34 -4
  190. data/bundler/lib/bundler/spec_set.rb +195 -65
  191. data/bundler/lib/bundler/stub_specification.rb +34 -4
  192. data/bundler/lib/bundler/templates/Executable +1 -1
  193. data/bundler/lib/bundler/templates/Executable.bundler +6 -11
  194. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  195. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  196. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  197. data/bundler/lib/bundler/templates/newgem/README.md.tt +11 -5
  198. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +19 -8
  199. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  200. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -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-c.rb.tt +10 -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/newgem.c.tt +1 -1
  205. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  206. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -8
  207. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  208. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  209. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -4
  210. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  211. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  212. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  213. data/bundler/lib/bundler/ui/shell.rb +60 -15
  214. data/bundler/lib/bundler/ui/silent.rb +33 -6
  215. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  216. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  217. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  218. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  219. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  220. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +56 -7
  221. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -418
  222. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  223. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  224. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  225. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  226. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  227. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  228. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  229. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  230. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  231. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  232. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  233. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  234. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  235. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  236. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  237. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  238. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  239. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  240. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  241. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  242. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  243. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  244. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  245. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  246. data/bundler/lib/bundler/vendor/securerandom/.document +1 -0
  247. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  248. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  249. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  250. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  251. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  252. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  253. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -15
  254. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  255. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  256. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  257. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  258. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  259. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  260. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +12 -1
  261. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  262. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  263. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +17 -1
  264. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  265. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +28 -9
  266. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +46 -7
  267. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  268. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  269. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +35 -159
  270. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  271. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  272. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -46
  273. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  274. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  275. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  276. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  277. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  278. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  279. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +166 -8
  280. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  281. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  282. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  283. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +343 -148
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +10 -4
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +3 -2
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +44 -33
  288. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  289. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  290. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  291. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  292. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  293. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +25 -12
  294. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +130 -38
  295. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  296. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  297. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  298. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +12 -11
  299. data/bundler/lib/bundler/vendored_net_http.rb +23 -0
  300. data/bundler/lib/bundler/vendored_persistent.rb +0 -36
  301. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  302. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  303. data/bundler/lib/bundler/vendored_timeout.rb +12 -0
  304. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  305. data/bundler/lib/bundler/version.rb +5 -1
  306. data/bundler/lib/bundler/vlad.rb +1 -1
  307. data/bundler/lib/bundler/worker.rb +5 -7
  308. data/bundler/lib/bundler/yaml_serializer.rb +22 -13
  309. data/bundler/lib/bundler.rb +155 -148
  310. data/{bundler → doc/bundler}/UPGRADING.md +11 -4
  311. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +40 -17
  312. data/doc/rubygems/POLICIES.md +204 -0
  313. data/{test/rubygems/fake_certlib/openssl.rb → exe/gem} +5 -1
  314. data/{bin → exe}/update_rubygems +12 -10
  315. data/lib/rubygems/available_set.rb +8 -7
  316. data/lib/rubygems/basic_specification.rb +90 -52
  317. data/lib/rubygems/bundler_version_finder.rb +6 -6
  318. data/lib/rubygems/ci_detector.rb +75 -0
  319. data/lib/rubygems/command.rb +68 -64
  320. data/lib/rubygems/command_manager.rb +39 -24
  321. data/lib/rubygems/commands/build_command.rb +14 -19
  322. data/lib/rubygems/commands/cert_command.rb +39 -39
  323. data/lib/rubygems/commands/check_command.rb +30 -25
  324. data/lib/rubygems/commands/cleanup_command.rb +32 -43
  325. data/lib/rubygems/commands/contents_command.rb +33 -25
  326. data/lib/rubygems/commands/dependency_command.rb +22 -23
  327. data/lib/rubygems/commands/environment_command.rb +8 -9
  328. data/lib/rubygems/commands/exec_command.rb +247 -0
  329. data/lib/rubygems/commands/fetch_command.rb +25 -10
  330. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  331. data/lib/rubygems/commands/help_command.rb +15 -14
  332. data/lib/rubygems/commands/info_command.rb +5 -5
  333. data/lib/rubygems/commands/install_command.rb +31 -38
  334. data/lib/rubygems/commands/list_command.rb +6 -5
  335. data/lib/rubygems/commands/lock_command.rb +6 -5
  336. data/lib/rubygems/commands/mirror_command.rb +4 -3
  337. data/lib/rubygems/commands/open_command.rb +11 -12
  338. data/lib/rubygems/commands/outdated_command.rb +6 -5
  339. data/lib/rubygems/commands/owner_command.rb +23 -22
  340. data/lib/rubygems/commands/pristine_command.rb +83 -62
  341. data/lib/rubygems/commands/push_command.rb +38 -13
  342. data/lib/rubygems/commands/query_command.rb +11 -11
  343. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  344. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  345. data/lib/rubygems/commands/search_command.rb +6 -5
  346. data/lib/rubygems/commands/server_command.rb +4 -3
  347. data/lib/rubygems/commands/setup_command.rb +137 -154
  348. data/lib/rubygems/commands/signin_command.rb +10 -9
  349. data/lib/rubygems/commands/signout_command.rb +8 -7
  350. data/lib/rubygems/commands/sources_command.rb +34 -33
  351. data/lib/rubygems/commands/specification_command.rb +25 -20
  352. data/lib/rubygems/commands/stale_command.rb +5 -4
  353. data/lib/rubygems/commands/uninstall_command.rb +66 -59
  354. data/lib/rubygems/commands/unpack_command.rb +23 -30
  355. data/lib/rubygems/commands/update_command.rb +62 -94
  356. data/lib/rubygems/commands/which_command.rb +9 -8
  357. data/lib/rubygems/commands/yank_command.rb +14 -13
  358. data/lib/rubygems/compatibility.rb +5 -6
  359. data/lib/rubygems/config_file.rb +160 -50
  360. data/lib/rubygems/core_ext/kernel_gem.rb +3 -10
  361. data/lib/rubygems/core_ext/kernel_require.rb +88 -114
  362. data/lib/rubygems/core_ext/kernel_warn.rb +30 -39
  363. data/lib/rubygems/core_ext/tcpsocket_init.rb +4 -2
  364. data/lib/rubygems/defaults.rb +53 -22
  365. data/lib/rubygems/dependency.rb +34 -36
  366. data/lib/rubygems/dependency_installer.rb +52 -56
  367. data/lib/rubygems/dependency_list.rb +8 -7
  368. data/lib/rubygems/deprecate.rb +80 -75
  369. data/lib/rubygems/doctor.rb +23 -22
  370. data/lib/rubygems/errors.rb +6 -8
  371. data/lib/rubygems/exceptions.rb +20 -18
  372. data/lib/rubygems/ext/build_error.rb +2 -1
  373. data/lib/rubygems/ext/builder.rb +56 -32
  374. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  375. data/lib/rubygems/ext/cargo_builder.rb +158 -131
  376. data/lib/rubygems/ext/cmake_builder.rb +9 -4
  377. data/lib/rubygems/ext/configure_builder.rb +9 -3
  378. data/lib/rubygems/ext/ext_conf_builder.rb +19 -15
  379. data/lib/rubygems/ext/rake_builder.rb +14 -7
  380. data/lib/rubygems/ext.rb +8 -7
  381. data/lib/rubygems/gem_runner.rb +23 -9
  382. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  383. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  384. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +80 -0
  385. data/lib/rubygems/gemcutter_utilities.rb +141 -63
  386. data/lib/rubygems/gemspec_helpers.rb +19 -0
  387. data/lib/rubygems/install_default_message.rb +3 -2
  388. data/lib/rubygems/install_message.rb +3 -2
  389. data/lib/rubygems/install_update_options.rb +72 -67
  390. data/lib/rubygems/installer.rb +148 -130
  391. data/lib/rubygems/installer_uninstaller_utils.rb +2 -4
  392. data/lib/rubygems/local_remote_options.rb +24 -28
  393. data/lib/rubygems/name_tuple.rb +10 -11
  394. data/lib/rubygems/package/digest_io.rb +2 -1
  395. data/lib/rubygems/package/file_source.rb +3 -2
  396. data/lib/rubygems/package/io_source.rb +1 -0
  397. data/lib/rubygems/package/old.rb +11 -10
  398. data/lib/rubygems/package/source.rb +1 -0
  399. data/lib/rubygems/package/tar_header.rb +125 -91
  400. data/lib/rubygems/package/tar_reader/entry.rb +106 -29
  401. data/lib/rubygems/package/tar_reader.rb +16 -39
  402. data/lib/rubygems/package/tar_writer.rb +29 -26
  403. data/lib/rubygems/package.rb +122 -84
  404. data/lib/rubygems/package_task.rb +7 -6
  405. data/lib/rubygems/path_support.rb +11 -11
  406. data/lib/rubygems/platform.rb +119 -70
  407. data/lib/rubygems/psych_tree.rb +6 -1
  408. data/lib/rubygems/query_utils.rb +46 -48
  409. data/lib/rubygems/rdoc.rb +13 -3
  410. data/lib/rubygems/remote_fetcher.rb +47 -39
  411. data/lib/rubygems/request/connection_pools.rb +6 -6
  412. data/lib/rubygems/request/http_pool.rb +2 -1
  413. data/lib/rubygems/request/https_pool.rb +1 -0
  414. data/lib/rubygems/request.rb +48 -44
  415. data/lib/rubygems/request_set/gem_dependency_api.rb +141 -144
  416. data/lib/rubygems/request_set/lockfile/parser.rb +31 -30
  417. data/lib/rubygems/request_set/lockfile/tokenizer.rb +24 -14
  418. data/lib/rubygems/request_set/lockfile.rb +11 -15
  419. data/lib/rubygems/request_set.rb +25 -23
  420. data/lib/rubygems/requirement.rb +30 -27
  421. data/lib/rubygems/resolver/activation_request.rb +7 -10
  422. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  423. data/lib/rubygems/resolver/api_set.rb +20 -13
  424. data/lib/rubygems/resolver/api_specification.rb +8 -7
  425. data/lib/rubygems/resolver/best_set.rb +5 -32
  426. data/lib/rubygems/resolver/composed_set.rb +4 -3
  427. data/lib/rubygems/resolver/conflict.rb +14 -21
  428. data/lib/rubygems/resolver/current_set.rb +1 -0
  429. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  430. data/lib/rubygems/resolver/git_set.rb +2 -2
  431. data/lib/rubygems/resolver/git_specification.rb +7 -6
  432. data/lib/rubygems/resolver/index_set.rb +10 -9
  433. data/lib/rubygems/resolver/index_specification.rb +8 -6
  434. data/lib/rubygems/resolver/installed_specification.rb +6 -5
  435. data/lib/rubygems/resolver/installer_set.rb +19 -22
  436. data/lib/rubygems/resolver/local_specification.rb +4 -3
  437. data/lib/rubygems/resolver/lock_set.rb +6 -5
  438. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  439. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  440. data/lib/rubygems/resolver/set.rb +1 -0
  441. data/lib/rubygems/resolver/source_set.rb +2 -0
  442. data/lib/rubygems/resolver/spec_specification.rb +8 -0
  443. data/lib/rubygems/resolver/specification.rb +2 -1
  444. data/lib/rubygems/resolver/stats.rb +2 -1
  445. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  446. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  447. data/lib/rubygems/resolver.rb +51 -57
  448. data/lib/rubygems/s3_uri_signer.rb +18 -16
  449. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  450. data/lib/rubygems/safe_marshal/reader.rb +325 -0
  451. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  452. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +428 -0
  453. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  454. data/lib/rubygems/safe_marshal.rb +74 -0
  455. data/lib/rubygems/safe_yaml.rb +14 -26
  456. data/lib/rubygems/security/policies.rb +48 -49
  457. data/lib/rubygems/security/policy.rb +25 -28
  458. data/lib/rubygems/security/signer.rb +16 -7
  459. data/lib/rubygems/security/trust_dir.rb +12 -13
  460. data/lib/rubygems/security.rb +40 -66
  461. data/lib/rubygems/security_option.rb +7 -6
  462. data/lib/rubygems/shellwords.rb +3 -0
  463. data/lib/rubygems/source/git.rb +34 -31
  464. data/lib/rubygems/source/installed.rb +4 -3
  465. data/lib/rubygems/source/local.rb +49 -49
  466. data/lib/rubygems/source/lock.rb +2 -3
  467. data/lib/rubygems/source/specific_file.rb +6 -4
  468. data/lib/rubygems/source/vendor.rb +1 -2
  469. data/lib/rubygems/source.rb +37 -31
  470. data/lib/rubygems/source_list.rb +8 -8
  471. data/lib/rubygems/spec_fetcher.rb +95 -66
  472. data/lib/rubygems/specification.rb +342 -404
  473. data/lib/rubygems/specification_policy.rb +147 -75
  474. data/lib/rubygems/specification_record.rb +212 -0
  475. data/lib/rubygems/stub_specification.rb +56 -30
  476. data/lib/rubygems/target_rbconfig.rb +50 -0
  477. data/lib/rubygems/text.rb +3 -4
  478. data/lib/rubygems/uninstaller.rb +67 -48
  479. data/lib/rubygems/update_suggestion.rb +56 -0
  480. data/lib/rubygems/uri.rb +10 -10
  481. data/lib/rubygems/uri_formatter.rb +2 -2
  482. data/lib/rubygems/user_interaction.rb +50 -40
  483. data/lib/rubygems/util/licenses.rb +310 -39
  484. data/lib/rubygems/util/list.rb +4 -1
  485. data/lib/rubygems/util.rb +19 -20
  486. data/lib/rubygems/validator.rb +15 -14
  487. data/lib/rubygems/vendor/molinillo/.document +1 -0
  488. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  489. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  490. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  491. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  492. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  493. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  494. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  495. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  496. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  497. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  498. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  499. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -3
  500. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  501. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  502. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  503. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/ui.rb +1 -1
  504. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  505. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolver.rb +1 -1
  506. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/state.rb +1 -1
  507. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo.rb +2 -2
  508. data/lib/rubygems/vendor/net-http/.document +1 -0
  509. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  510. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +34 -0
  511. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +414 -0
  512. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +981 -0
  513. data/lib/rubygems/vendor/net-http/lib/net/http/proxy_delta.rb +17 -0
  514. data/lib/rubygems/vendor/net-http/lib/net/http/request.rb +88 -0
  515. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +430 -0
  516. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +738 -0
  517. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +1174 -0
  518. data/lib/rubygems/vendor/net-http/lib/net/http/status.rb +84 -0
  519. data/lib/rubygems/vendor/net-http/lib/net/http.rb +2580 -0
  520. data/lib/rubygems/vendor/net-http/lib/net/https.rb +23 -0
  521. data/lib/rubygems/vendor/net-protocol/.document +1 -0
  522. data/lib/rubygems/vendor/net-protocol/lib/net/protocol.rb +544 -0
  523. data/lib/rubygems/vendor/optparse/.document +1 -0
  524. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  525. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  526. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  527. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  528. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  529. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +206 -83
  530. data/lib/rubygems/vendor/resolv/.document +1 -0
  531. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  532. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3455 -0
  533. data/lib/rubygems/vendor/securerandom/.document +1 -0
  534. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  535. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  536. data/lib/rubygems/vendor/timeout/.document +1 -0
  537. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  538. data/lib/rubygems/vendor/timeout/lib/timeout.rb +198 -0
  539. data/lib/rubygems/vendor/tsort/.document +1 -0
  540. data/lib/rubygems/vendor/tsort/lib/tsort.rb +455 -0
  541. data/lib/rubygems/vendor/uri/.document +1 -0
  542. data/lib/rubygems/vendor/uri/COPYING +56 -0
  543. data/lib/rubygems/vendor/uri/lib/uri/common.rb +876 -0
  544. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  545. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  546. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1578 -0
  547. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  548. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  549. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  550. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  551. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  552. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  553. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  554. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  555. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  556. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  557. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  558. data/{bundler/lib/bundler → lib/rubygems}/vendored_molinillo.rb +0 -1
  559. data/lib/rubygems/vendored_net_http.rb +5 -0
  560. data/lib/rubygems/vendored_optparse.rb +3 -0
  561. data/lib/rubygems/vendored_securerandom.rb +3 -0
  562. data/lib/rubygems/vendored_timeout.rb +5 -0
  563. data/lib/rubygems/vendored_tsort.rb +3 -0
  564. data/lib/rubygems/version.rb +57 -45
  565. data/lib/rubygems/version_option.rb +6 -8
  566. data/lib/rubygems/yaml_serializer.rb +98 -0
  567. data/lib/rubygems.rb +191 -133
  568. data/rubygems-update.gemspec +16 -9
  569. data/setup.rb +12 -9
  570. metadata +233 -307
  571. data/POLICIES.md +0 -100
  572. data/bin/gem +0 -13
  573. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  574. data/bundler/lib/bundler/templates/gems.rb +0 -5
  575. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  576. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  577. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  578. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  579. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  580. data/bundler/lib/bundler/version_ranges.rb +0 -122
  581. data/lib/rubygems/indexer.rb +0 -427
  582. data/lib/rubygems/mock_gem_ui.rb +0 -85
  583. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  584. data/lib/rubygems/optparse.rb +0 -3
  585. data/lib/rubygems/resolver/molinillo/LICENSE +0 -9
  586. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  587. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  588. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  589. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  590. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  591. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  592. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  593. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  594. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  595. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  596. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  597. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  598. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +0 -143
  599. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  600. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  601. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +0 -67
  602. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +0 -839
  603. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +0 -46
  604. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +0 -58
  605. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +0 -11
  606. data/lib/rubygems/resolver/molinillo.rb +0 -2
  607. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  608. data/lib/rubygems/tsort/lib/tsort.rb +0 -454
  609. data/lib/rubygems/tsort.rb +0 -3
  610. data/test/rubygems/alternate_cert.pem +0 -19
  611. data/test/rubygems/alternate_cert_32.pem +0 -19
  612. data/test/rubygems/alternate_key.pem +0 -27
  613. data/test/rubygems/bad_rake.rb +0 -2
  614. data/test/rubygems/ca_cert.pem +0 -77
  615. data/test/rubygems/child_cert.pem +0 -20
  616. data/test/rubygems/child_cert_32.pem +0 -20
  617. data/test/rubygems/child_key.pem +0 -27
  618. data/test/rubygems/client.pem +0 -107
  619. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  620. data/test/rubygems/data/gem-private_key.pem +0 -27
  621. data/test/rubygems/data/gem-public_cert.pem +0 -20
  622. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  623. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  624. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  625. data/test/rubygems/encrypted_private_key.pem +0 -30
  626. data/test/rubygems/expired_cert.pem +0 -19
  627. data/test/rubygems/foo/discover.rb +0 -1
  628. data/test/rubygems/future_cert.pem +0 -19
  629. data/test/rubygems/future_cert_32.pem +0 -19
  630. data/test/rubygems/good_rake.rb +0 -2
  631. data/test/rubygems/grandchild_cert.pem +0 -20
  632. data/test/rubygems/grandchild_cert_32.pem +0 -20
  633. data/test/rubygems/grandchild_key.pem +0 -27
  634. data/test/rubygems/helper.rb +0 -1622
  635. data/test/rubygems/installer_test_case.rb +0 -247
  636. data/test/rubygems/invalid_client.pem +0 -49
  637. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  638. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  639. data/test/rubygems/invalid_key.pem +0 -27
  640. data/test/rubygems/invalid_signer_cert.pem +0 -19
  641. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  642. data/test/rubygems/invalidchild_cert.pem +0 -20
  643. data/test/rubygems/invalidchild_cert_32.pem +0 -20
  644. data/test/rubygems/invalidchild_key.pem +0 -27
  645. data/test/rubygems/package/tar_test_case.rb +0 -139
  646. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  647. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  648. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  649. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  650. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  651. data/test/rubygems/private3072_key.pem +0 -40
  652. data/test/rubygems/private_ec_key.pem +0 -9
  653. data/test/rubygems/private_key.pem +0 -27
  654. data/test/rubygems/public3072_cert.pem +0 -25
  655. data/test/rubygems/public_cert.pem +0 -20
  656. data/test/rubygems/public_cert_32.pem +0 -19
  657. data/test/rubygems/public_key.pem +0 -9
  658. data/test/rubygems/rubygems/commands/crash_command.rb +0 -4
  659. data/test/rubygems/rubygems_plugin.rb +0 -23
  660. data/test/rubygems/sff/discover.rb +0 -1
  661. data/test/rubygems/simple_gem.rb +0 -67
  662. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -7
  663. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  664. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -12
  665. data/test/rubygems/ssl_cert.pem +0 -80
  666. data/test/rubygems/ssl_key.pem +0 -27
  667. data/test/rubygems/test_bundled_ca.rb +0 -60
  668. data/test/rubygems/test_config.rb +0 -27
  669. data/test/rubygems/test_deprecate.rb +0 -157
  670. data/test/rubygems/test_exit.rb +0 -11
  671. data/test/rubygems/test_gem.rb +0 -2112
  672. data/test/rubygems/test_gem_available_set.rb +0 -129
  673. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -125
  674. data/test/rubygems/test_gem_command.rb +0 -400
  675. data/test/rubygems/test_gem_command_manager.rb +0 -334
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -727
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -867
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -67
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -291
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -270
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -227
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -167
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -257
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -80
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -93
  686. data/test/rubygems/test_gem_commands_info_command.rb +0 -43
  687. data/test/rubygems/test_gem_commands_install_command.rb +0 -1553
  688. data/test/rubygems/test_gem_commands_list_command.rb +0 -32
  689. data/test/rubygems/test_gem_commands_lock_command.rb +0 -66
  690. data/test/rubygems/test_gem_commands_mirror.rb +0 -19
  691. data/test/rubygems/test_gem_commands_open_command.rb +0 -97
  692. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -49
  693. data/test/rubygems/test_gem_commands_owner_command.rb +0 -326
  694. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -659
  695. data/test/rubygems/test_gem_commands_push_command.rb +0 -477
  696. data/test/rubygems/test_gem_commands_query_command.rb +0 -857
  697. data/test/rubygems/test_gem_commands_search_command.rb +0 -15
  698. data/test/rubygems/test_gem_commands_server_command.rb +0 -19
  699. data/test/rubygems/test_gem_commands_setup_command.rb +0 -447
  700. data/test/rubygems/test_gem_commands_signin_command.rb +0 -219
  701. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  702. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  703. data/test/rubygems/test_gem_commands_specification_command.rb +0 -276
  704. data/test/rubygems/test_gem_commands_stale_command.rb +0 -42
  705. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -504
  706. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -223
  707. data/test/rubygems/test_gem_commands_update_command.rb +0 -835
  708. data/test/rubygems/test_gem_commands_which_command.rb +0 -84
  709. data/test/rubygems/test_gem_commands_yank_command.rb +0 -180
  710. data/test/rubygems/test_gem_config_file.rb +0 -504
  711. data/test/rubygems/test_gem_dependency.rb +0 -395
  712. data/test/rubygems/test_gem_dependency_installer.rb +0 -1155
  713. data/test/rubygems/test_gem_dependency_list.rb +0 -264
  714. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -26
  715. data/test/rubygems/test_gem_doctor.rb +0 -194
  716. data/test/rubygems/test_gem_ext_builder.rb +0 -338
  717. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  718. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +0 -243
  719. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +0 -10
  720. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  721. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  722. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +0 -27
  723. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  724. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -243
  725. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  726. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
  727. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -8
  728. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -39
  729. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -178
  730. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -33
  731. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -75
  732. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -83
  733. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -79
  734. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -230
  735. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -112
  736. data/test/rubygems/test_gem_gem_runner.rb +0 -113
  737. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -272
  738. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -59
  739. data/test/rubygems/test_gem_indexer.rb +0 -361
  740. data/test/rubygems/test_gem_install_update_options.rb +0 -207
  741. data/test/rubygems/test_gem_installer.rb +0 -2394
  742. data/test/rubygems/test_gem_local_remote_options.rb +0 -132
  743. data/test/rubygems/test_gem_name_tuple.rb +0 -42
  744. data/test/rubygems/test_gem_package.rb +0 -1178
  745. data/test/rubygems/test_gem_package_old.rb +0 -90
  746. data/test/rubygems/test_gem_package_tar_header.rb +0 -225
  747. data/test/rubygems/test_gem_package_tar_reader.rb +0 -87
  748. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -152
  749. data/test/rubygems/test_gem_package_tar_writer.rb +0 -330
  750. data/test/rubygems/test_gem_package_task.rb +0 -117
  751. data/test/rubygems/test_gem_path_support.rb +0 -138
  752. data/test/rubygems/test_gem_platform.rb +0 -391
  753. data/test/rubygems/test_gem_rdoc.rb +0 -136
  754. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1226
  755. data/test/rubygems/test_gem_request.rb +0 -541
  756. data/test/rubygems/test_gem_request_connection_pools.rb +0 -150
  757. data/test/rubygems/test_gem_request_set.rb +0 -671
  758. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -847
  759. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -468
  760. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -543
  761. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  762. data/test/rubygems/test_gem_requirement.rb +0 -498
  763. data/test/rubygems/test_gem_resolver.rb +0 -791
  764. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -42
  765. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  766. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -166
  767. data/test/rubygems/test_gem_resolver_best_set.rb +0 -158
  768. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -43
  769. data/test/rubygems/test_gem_resolver_conflict.rb +0 -81
  770. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -82
  771. data/test/rubygems/test_gem_resolver_git_set.rb +0 -187
  772. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -113
  773. data/test/rubygems/test_gem_resolver_index_set.rb +0 -87
  774. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -92
  775. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -46
  776. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -275
  777. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -43
  778. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -61
  779. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -97
  780. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -18
  781. data/test/rubygems/test_gem_resolver_specification.rb +0 -62
  782. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -81
  783. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -81
  784. data/test/rubygems/test_gem_security.rb +0 -340
  785. data/test/rubygems/test_gem_security_policy.rb +0 -535
  786. data/test/rubygems/test_gem_security_signer.rb +0 -217
  787. data/test/rubygems/test_gem_security_trust_dir.rb +0 -98
  788. data/test/rubygems/test_gem_silent_ui.rb +0 -116
  789. data/test/rubygems/test_gem_source.rb +0 -253
  790. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -36
  791. data/test/rubygems/test_gem_source_git.rb +0 -303
  792. data/test/rubygems/test_gem_source_installed.rb +0 -34
  793. data/test/rubygems/test_gem_source_list.rb +0 -118
  794. data/test/rubygems/test_gem_source_local.rb +0 -106
  795. data/test/rubygems/test_gem_source_lock.rb +0 -112
  796. data/test/rubygems/test_gem_source_specific_file.rb +0 -75
  797. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -49
  798. data/test/rubygems/test_gem_source_vendor.rb +0 -29
  799. data/test/rubygems/test_gem_spec_fetcher.rb +0 -337
  800. data/test/rubygems/test_gem_specification.rb +0 -3756
  801. data/test/rubygems/test_gem_stream_ui.rb +0 -224
  802. data/test/rubygems/test_gem_stub_specification.rb +0 -277
  803. data/test/rubygems/test_gem_text.rb +0 -102
  804. data/test/rubygems/test_gem_uninstaller.rb +0 -674
  805. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -30
  806. data/test/rubygems/test_gem_uri.rb +0 -39
  807. data/test/rubygems/test_gem_uri_formatter.rb +0 -26
  808. data/test/rubygems/test_gem_util.rb +0 -90
  809. data/test/rubygems/test_gem_validator.rb +0 -42
  810. data/test/rubygems/test_gem_version.rb +0 -295
  811. data/test/rubygems/test_gem_version_option.rb +0 -164
  812. data/test/rubygems/test_kernel.rb +0 -129
  813. data/test/rubygems/test_project_sanity.rb +0 -20
  814. data/test/rubygems/test_remote_fetch_error.rb +0 -19
  815. data/test/rubygems/test_require.rb +0 -719
  816. data/test/rubygems/test_rubygems.rb +0 -74
  817. data/test/rubygems/utilities.rb +0 -371
  818. data/test/rubygems/wrong_key_cert.pem +0 -19
  819. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  820. data/test/test_changelog_generator.rb +0 -17
  821. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/connection_pool}/.document +0 -0
  822. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/fileutils}/.document +0 -0
  823. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  824. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  825. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  826. /data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/LICENSE +0 -0
  827. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  828. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  829. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  830. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  831. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  832. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -13,13 +13,14 @@ module Bundler
13
13
 
14
14
  attr_reader(
15
15
  :dependencies,
16
+ :locked_checksums,
16
17
  :locked_deps,
17
18
  :locked_gems,
18
19
  :platforms,
19
- :requires,
20
20
  :ruby_version,
21
21
  :lockfile,
22
- :gemfiles
22
+ :gemfiles,
23
+ :sources
23
24
  )
24
25
 
25
26
  # Given a gemfile and lockfile creates a Bundler definition
@@ -69,28 +70,35 @@ module Bundler
69
70
  @sources = sources
70
71
  @unlock = unlock
71
72
  @optional_groups = optional_groups
72
- @remote = false
73
+ @prefer_local = false
73
74
  @specs = nil
74
75
  @ruby_version = ruby_version
75
76
  @gemfiles = gemfiles
76
77
 
77
78
  @lockfile = lockfile
78
79
  @lockfile_contents = String.new
80
+
79
81
  @locked_bundler_version = nil
80
- @locked_ruby_version = nil
81
- @new_platform = nil
82
+ @resolved_bundler_version = nil
83
+
84
+ @locked_ruby_version = nil
85
+ @new_platforms = []
86
+ @removed_platform = nil
82
87
 
83
- if lockfile && File.exist?(lockfile)
88
+ if lockfile_exists?
84
89
  @lockfile_contents = Bundler.read_file(lockfile)
85
90
  @locked_gems = LockfileParser.new(@lockfile_contents)
86
91
  @locked_platforms = @locked_gems.platforms
92
+ @most_specific_locked_platform = @locked_gems.most_specific_locked_platform
87
93
  @platforms = @locked_platforms.dup
88
94
  @locked_bundler_version = @locked_gems.bundler_version
89
95
  @locked_ruby_version = @locked_gems.ruby_version
96
+ @originally_locked_deps = @locked_gems.dependencies
90
97
  @originally_locked_specs = SpecSet.new(@locked_gems.specs)
98
+ @locked_checksums = @locked_gems.checksums
91
99
 
92
100
  if unlock != true
93
- @locked_deps = @locked_gems.dependencies
101
+ @locked_deps = @originally_locked_deps
94
102
  @locked_specs = @originally_locked_specs
95
103
  @locked_sources = @locked_gems.sources
96
104
  else
@@ -101,12 +109,16 @@ module Bundler
101
109
  end
102
110
  else
103
111
  @unlock = {}
104
- @platforms = []
105
112
  @locked_gems = nil
113
+ @locked_platforms = []
114
+ @most_specific_locked_platform = nil
115
+ @platforms = []
106
116
  @locked_deps = {}
107
117
  @locked_specs = SpecSet.new([])
118
+ @originally_locked_deps = {}
119
+ @originally_locked_specs = @locked_specs
108
120
  @locked_sources = []
109
- @locked_platforms = []
121
+ @locked_checksums = Bundler.feature_flag.lockfile_checksums?
110
122
  end
111
123
 
112
124
  locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
@@ -122,65 +134,94 @@ module Bundler
122
134
  @sources.merged_gem_lockfile_sections!(locked_gem_sources.first)
123
135
  end
124
136
 
125
- @unlock[:sources] ||= []
137
+ @sources_to_unlock = @unlock.delete(:sources) || []
126
138
  @unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object
127
139
  @ruby_version.diff(locked_ruby_version_object)
128
140
  end
129
141
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
130
142
 
131
- add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
143
+ @current_platform_missing = add_current_platform unless Bundler.frozen_bundle?
132
144
 
133
145
  converge_path_sources_to_gemspec_sources
134
146
  @path_changes = converge_paths
135
147
  @source_changes = converge_sources
136
148
 
149
+ @explicit_unlocks = @unlock.delete(:gems) || []
150
+
137
151
  if @unlock[:conservative]
138
- @unlock[:gems] ||= @dependencies.map(&:name)
152
+ @gems_to_unlock = @explicit_unlocks.any? ? @explicit_unlocks : @dependencies.map(&:name)
139
153
  else
140
- eager_unlock = expand_dependencies(@unlock[:gems] || [], true)
141
- @unlock[:gems] = @locked_specs.for(eager_unlock, false, false).map(&:name)
154
+ eager_unlock = @explicit_unlocks.map {|name| Dependency.new(name, ">= 0") }
155
+ @gems_to_unlock = @locked_specs.for(eager_unlock, platforms).map(&:name).uniq
142
156
  end
143
157
 
144
158
  @dependency_changes = converge_dependencies
145
159
  @local_changes = converge_locals
146
160
 
147
- @locked_specs_incomplete_for_platform = !@locked_specs.for(requested_dependencies & expand_dependencies(locked_dependencies), true, true)
148
-
149
- @requires = compute_requires
161
+ check_lockfile
150
162
  end
151
163
 
152
164
  def gem_version_promoter
153
- @gem_version_promoter ||= begin
154
- locked_specs =
155
- if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
156
- # Definition uses an empty set of locked_specs to indicate all gems
157
- # are unlocked, but GemVersionPromoter needs the locked_specs
158
- # for conservative comparison.
159
- Bundler::SpecSet.new(@locked_gems.specs)
160
- else
161
- @locked_specs
162
- end
163
- GemVersionPromoter.new(locked_specs, @unlock[:gems])
164
- end
165
+ @gem_version_promoter ||= GemVersionPromoter.new
165
166
  end
166
167
 
167
- def resolve_only_locally!
168
- @remote = false
168
+ def check!
169
+ # If dependencies have changed, we need to resolve remotely. Otherwise,
170
+ # since we'll be resolving with a single local source, we may end up
171
+ # locking gems under the wrong source in the lockfile, and missing lockfile
172
+ # checksums
173
+ resolve_remotely! if @dependency_changes
174
+
175
+ # Now do a local only resolve, to verify if any gems are missing locally
169
176
  sources.local_only!
170
177
  resolve
171
178
  end
172
179
 
180
+ #
181
+ # Setup sources according to the given options and the state of the
182
+ # definition.
183
+ #
184
+ # @return [Boolean] Whether fetching remote information will be necessary or not
185
+ #
186
+ def setup_domain!(options = {})
187
+ prefer_local! if options[:"prefer-local"]
188
+
189
+ if options[:add_checksums] || (!options[:local] && install_needed?)
190
+ remotely!
191
+ true
192
+ else
193
+ Bundler.settings.set_command_option(:jobs, 1) unless install_needed? # to avoid the overhead of Bundler::Worker
194
+ with_cache!
195
+ false
196
+ end
197
+ end
198
+
173
199
  def resolve_with_cache!
174
- sources.cached!
200
+ with_cache!
201
+
175
202
  resolve
176
203
  end
177
204
 
205
+ def with_cache!
206
+ sources.local!
207
+ sources.cached!
208
+ end
209
+
178
210
  def resolve_remotely!
179
- @remote = true
180
- sources.remote!
211
+ remotely!
212
+
181
213
  resolve
182
214
  end
183
215
 
216
+ def remotely!
217
+ sources.cached!
218
+ sources.remote!
219
+ end
220
+
221
+ def prefer_local!
222
+ @prefer_local = true
223
+ end
224
+
184
225
  # For given dependency list returns a SpecSet with Gemspec of all the required
185
226
  # dependencies.
186
227
  # 1. The method first resolves the dependencies specified in Gemfile
@@ -200,7 +241,7 @@ module Bundler
200
241
  end
201
242
 
202
243
  def missing_specs
203
- resolve.materialize(requested_dependencies).missing_specs
244
+ resolve.missing_specs_for(requested_dependencies)
204
245
  end
205
246
 
206
247
  def missing_specs?
@@ -210,8 +251,10 @@ module Bundler
210
251
  true
211
252
  rescue BundlerError => e
212
253
  @resolve = nil
254
+ @resolver = nil
255
+ @resolution_packages = nil
256
+ @source_requirements = nil
213
257
  @specs = nil
214
- @gem_version_promoter = nil
215
258
 
216
259
  Bundler.ui.debug "The definition is missing dependencies, failed to resolve & materialize locally (#{e})"
217
260
  true
@@ -226,8 +269,17 @@ module Bundler
226
269
  end
227
270
 
228
271
  def current_dependencies
272
+ filter_relevant(dependencies)
273
+ end
274
+
275
+ def current_locked_dependencies
276
+ filter_relevant(locked_dependencies)
277
+ end
278
+
279
+ def filter_relevant(dependencies)
280
+ platforms_array = [generic_local_platform].freeze
229
281
  dependencies.select do |d|
230
- d.should_include? && !d.gem_platforms(@platforms).empty?
282
+ d.should_include? && !d.gem_platforms(platforms_array).empty?
231
283
  end
232
284
  end
233
285
 
@@ -251,10 +303,11 @@ module Bundler
251
303
 
252
304
  def dependencies_for(groups)
253
305
  groups.map!(&:to_sym)
254
- deps = current_dependencies.reject do |d|
255
- (d.groups & groups).empty?
306
+ deps = current_dependencies # always returns a new array
307
+ deps.select! do |d|
308
+ d.groups.intersect?(groups)
256
309
  end
257
- expand_dependencies(deps)
310
+ deps
258
311
  end
259
312
 
260
313
  # Resolve all the dependencies specified in Gemfile. It ensures that
@@ -266,63 +319,57 @@ module Bundler
266
319
  @resolve ||= if Bundler.frozen_bundle?
267
320
  Bundler.ui.debug "Frozen, using resolution from the lockfile"
268
321
  @locked_specs
269
- elsif !unlocking? && nothing_changed?
322
+ elsif no_resolve_needed?
270
323
  if deleted_deps.any?
271
- Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile")
324
+ Bundler.ui.debug "Some dependencies were deleted, using a subset of the resolution from the lockfile"
272
325
  SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
273
326
  else
274
- Bundler.ui.debug("Found no changes, using resolution from the lockfile")
275
- if @locked_gems.may_include_redundant_platform_specific_gems?
327
+ Bundler.ui.debug "Found no changes, using resolution from the lockfile"
328
+ if @removed_platform || @locked_gems.may_include_redundant_platform_specific_gems?
276
329
  SpecSet.new(filter_specs(@locked_specs, @dependencies))
277
330
  else
278
331
  @locked_specs
279
332
  end
280
333
  end
281
334
  else
282
- last_resolve = converge_locked_specs
283
- # Run a resolve against the locally available gems
284
- Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
285
- expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true)
286
- Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
335
+ if lockfile_exists?
336
+ Bundler.ui.debug "Found changes from the lockfile, re-resolving dependencies because #{change_reason}"
337
+ else
338
+ Bundler.ui.debug "Resolving dependencies because there's no lockfile"
339
+ end
340
+
341
+ start_resolution
287
342
  end
288
343
  end
289
344
 
290
345
  def spec_git_paths
291
- sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact
346
+ sources.git_sources.filter_map {|s| File.realpath(s.path) if File.exist?(s.path) }
292
347
  end
293
348
 
294
349
  def groups
295
- dependencies.map(&:groups).flatten.uniq
350
+ dependencies.flat_map(&:groups).uniq
296
351
  end
297
352
 
298
- def lock(file, preserve_unknown_sections = false)
299
- return if Definition.no_lock
300
-
301
- contents = to_lock
353
+ def lock(file_or_preserve_unknown_sections = false, preserve_unknown_sections_or_unused = false)
354
+ if [true, false, nil].include?(file_or_preserve_unknown_sections)
355
+ target_lockfile = lockfile
356
+ preserve_unknown_sections = file_or_preserve_unknown_sections
357
+ else
358
+ target_lockfile = file_or_preserve_unknown_sections
359
+ preserve_unknown_sections = preserve_unknown_sections_or_unused
302
360
 
303
- # Convert to \r\n if the existing lock has them
304
- # i.e., Windows with `git config core.autocrlf=true`
305
- contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")
361
+ suggestion = if target_lockfile == lockfile
362
+ "To fix this warning, remove it from the `Definition#lock` call."
363
+ else
364
+ "Instead, instantiate a new definition passing `#{target_lockfile}`, and call `lock` without a file argument on that definition"
365
+ end
306
366
 
307
- if @locked_bundler_version
308
- locked_major = @locked_bundler_version.segments.first
309
- current_major = Gem::Version.create(Bundler::VERSION).segments.first
367
+ msg = "`Definition#lock` was passed a target file argument. #{suggestion}"
310
368
 
311
- updating_major = locked_major < current_major
369
+ Bundler::SharedHelpers.major_deprecation 2, msg
312
370
  end
313
371
 
314
- preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))
315
-
316
- return if file && File.exist?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections)
317
-
318
- if Bundler.frozen_bundle?
319
- Bundler.ui.error "Cannot write a changed lockfile while frozen."
320
- return
321
- end
322
-
323
- SharedHelpers.filesystem_access(file) do |p|
324
- File.open(p, "wb") {|f| f.puts(contents) }
325
- end
372
+ write_lock(target_lockfile, preserve_unknown_sections)
326
373
  end
327
374
 
328
375
  def locked_ruby_version
@@ -346,26 +393,19 @@ module Bundler
346
393
  end
347
394
  end
348
395
 
396
+ def bundler_version_to_lock
397
+ @resolved_bundler_version || Bundler.gem_version
398
+ end
399
+
349
400
  def to_lock
350
401
  require_relative "lockfile_generator"
351
402
  LockfileGenerator.generate(self)
352
403
  end
353
404
 
354
405
  def ensure_equivalent_gemfile_and_lockfile(explicit_flag = false)
355
- msg = String.new
356
- msg << "You are trying to install in deployment mode after changing\n" \
357
- "your Gemfile. Run `bundle install` elsewhere and add the\n" \
358
- "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control."
406
+ return unless Bundler.frozen_bundle?
359
407
 
360
- unless explicit_flag
361
- suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
362
- "bundle config unset frozen"
363
- elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
364
- "bundle config unset deployment"
365
- end
366
- msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \
367
- "freeze \nby running `#{suggested_command}`."
368
- end
408
+ raise ProductionError, "Frozen mode is set, but there's no lockfile" unless lockfile_exists?
369
409
 
370
410
  added = []
371
411
  deleted = []
@@ -380,32 +420,36 @@ module Bundler
380
420
  deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?
381
421
 
382
422
  both_sources = Hash.new {|h, k| h[k] = [] }
383
- @dependencies.each {|d| both_sources[d.name][0] = d }
384
-
385
- locked_dependencies.each do |d|
386
- next if !Bundler.feature_flag.bundler_3_mode? && @locked_specs[d.name].empty?
387
-
388
- both_sources[d.name][1] = d
389
- end
423
+ current_dependencies.each {|d| both_sources[d.name][0] = d }
424
+ current_locked_dependencies.each {|d| both_sources[d.name][1] = d }
390
425
 
391
426
  both_sources.each do |name, (dep, lock_dep)|
392
427
  next if dep.nil? || lock_dep.nil?
393
428
 
394
- gemfile_source = dep.source || sources.default_source
395
- lock_source = lock_dep.source || sources.default_source
429
+ gemfile_source = dep.source || default_source
430
+ lock_source = lock_dep.source || default_source
396
431
  next if lock_source.include?(gemfile_source)
397
432
 
398
- gemfile_source_name = dep.source ? gemfile_source.identifier : "no specified source"
399
- lockfile_source_name = lock_dep.source ? lock_source.identifier : "no specified source"
433
+ gemfile_source_name = dep.source ? gemfile_source.to_gemfile : "no specified source"
434
+ lockfile_source_name = lock_dep.source ? lock_source.to_gemfile : "no specified source"
400
435
  changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
401
436
  end
402
437
 
403
- reason = change_reason
404
- msg << "\n\n#{reason.split(", ").map(&:capitalize).join("\n")}" unless reason.strip.empty?
438
+ reason = nothing_changed? ? "some dependencies were deleted from your gemfile" : change_reason
439
+ msg = String.new
440
+ msg << "#{reason.capitalize.strip}, but the lockfile can't be updated because frozen mode is set"
405
441
  msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any?
406
442
  msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
407
443
  msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any?
408
- msg << "\n"
444
+ msg << "\n\nRun `bundle install` elsewhere and add the updated #{SharedHelpers.relative_gemfile_path} to version control.\n"
445
+
446
+ unless explicit_flag
447
+ suggested_command = unless Bundler.settings.locations("frozen").keys.include?(:env)
448
+ "bundle config set frozen false"
449
+ end
450
+ msg << "If this is a development machine, remove the #{SharedHelpers.relative_lockfile_path} " \
451
+ "freeze by running `#{suggested_command}`." if suggested_command
452
+ end
409
453
 
410
454
  raise ProductionError, msg if added.any? || deleted.any? || changed.any? || !nothing_changed?
411
455
  end
@@ -444,113 +488,321 @@ module Bundler
444
488
  return if current_platform_locked?
445
489
 
446
490
  raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
447
- "but your local platform is #{Bundler.local_platform}. " \
448
- "Add the current platform to the lockfile with\n`bundle lock --add-platform #{Bundler.local_platform}` and try again."
491
+ "but your local platform is #{local_platform}. " \
492
+ "Add the current platform to the lockfile with\n`bundle lock --add-platform #{local_platform}` and try again."
493
+ end
494
+
495
+ def normalize_platforms
496
+ @platforms = resolve.normalize_platforms!(current_dependencies, platforms)
497
+
498
+ @resolve = SpecSet.new(resolve.for(current_dependencies, @platforms))
449
499
  end
450
500
 
451
501
  def add_platform(platform)
452
- @new_platform ||= !@platforms.include?(platform)
453
- @platforms |= [platform]
502
+ return if @platforms.include?(platform)
503
+
504
+ @new_platforms << platform
505
+ @platforms << platform
454
506
  end
455
507
 
456
508
  def remove_platform(platform)
457
- return if @platforms.delete(Gem::Platform.new(platform))
509
+ removed_platform = @platforms.delete(Gem::Platform.new(platform))
510
+ @removed_platform ||= removed_platform
511
+ return if removed_platform
458
512
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
459
513
  end
460
514
 
461
- def most_specific_locked_platform
462
- @platforms.min_by do |bundle_platform|
463
- platform_specificity_match(bundle_platform, local_platform)
464
- end
515
+ def nothing_changed?
516
+ !something_changed?
465
517
  end
466
518
 
467
- attr_reader :sources
468
- private :sources
469
-
470
- def nothing_changed?
471
- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@locked_specs_incomplete_for_platform
519
+ def no_resolve_needed?
520
+ !resolve_needed?
472
521
  end
473
522
 
474
523
  def unlocking?
475
524
  @unlocking
476
525
  end
477
526
 
527
+ attr_writer :source_requirements
528
+
529
+ def add_checksums
530
+ @locked_checksums = true
531
+
532
+ setup_domain!(add_checksums: true)
533
+
534
+ specs # force materialization to real specifications, so that checksums are fetched
535
+ end
536
+
478
537
  private
479
538
 
480
- def filter_specs(specs, deps)
481
- SpecSet.new(specs).for(expand_dependencies(deps, true), false, false)
539
+ def install_needed?
540
+ resolve_needed? || missing_specs?
541
+ end
542
+
543
+ def something_changed?
544
+ return true unless lockfile_exists?
545
+
546
+ @source_changes ||
547
+ @dependency_changes ||
548
+ @current_platform_missing ||
549
+ @new_platforms.any? ||
550
+ @path_changes ||
551
+ @local_changes ||
552
+ @missing_lockfile_dep ||
553
+ @unlocking_bundler ||
554
+ @locked_spec_with_missing_deps ||
555
+ @locked_spec_with_invalid_deps
556
+ end
557
+
558
+ def resolve_needed?
559
+ unlocking? || something_changed?
560
+ end
561
+
562
+ def should_add_extra_platforms?
563
+ !lockfile_exists? && generic_local_platform_is_ruby? && !Bundler.settings[:force_ruby_platform]
564
+ end
565
+
566
+ def lockfile_exists?
567
+ lockfile && File.exist?(lockfile)
568
+ end
569
+
570
+ def write_lock(file, preserve_unknown_sections)
571
+ return if Definition.no_lock || file.nil?
572
+
573
+ contents = to_lock
574
+
575
+ # Convert to \r\n if the existing lock has them
576
+ # i.e., Windows with `git config core.autocrlf=true`
577
+ contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match?("\r\n")
578
+
579
+ if @locked_bundler_version
580
+ locked_major = @locked_bundler_version.segments.first
581
+ current_major = bundler_version_to_lock.segments.first
582
+
583
+ updating_major = locked_major < current_major
584
+ end
585
+
586
+ preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))
587
+
588
+ if File.exist?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections)
589
+ return if Bundler.frozen_bundle?
590
+ SharedHelpers.filesystem_access(file) { FileUtils.touch(file) }
591
+ return
592
+ end
593
+
594
+ if Bundler.frozen_bundle?
595
+ Bundler.ui.error "Cannot write a changed lockfile while frozen."
596
+ return
597
+ end
598
+
599
+ SharedHelpers.filesystem_access(file) do |p|
600
+ File.open(p, "wb") {|f| f.puts(contents) }
601
+ end
602
+ end
603
+
604
+ def resolver
605
+ @resolver ||= Resolver.new(resolution_packages, gem_version_promoter, @most_specific_locked_platform)
606
+ end
607
+
608
+ def expanded_dependencies
609
+ dependencies_with_bundler + metadata_dependencies
610
+ end
611
+
612
+ def dependencies_with_bundler
613
+ return dependencies unless @unlocking_bundler
614
+ return dependencies if dependencies.any? {|d| d.name == "bundler" }
615
+
616
+ [Dependency.new("bundler", @unlocking_bundler)] + dependencies
617
+ end
618
+
619
+ def resolution_packages
620
+ @resolution_packages ||= begin
621
+ last_resolve = converge_locked_specs
622
+ remove_invalid_platforms!
623
+ packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, locked_specs: @originally_locked_specs, unlock: @gems_to_unlock, prerelease: gem_version_promoter.pre?, prefer_local: @prefer_local)
624
+ packages = additional_base_requirements_to_prevent_downgrades(packages, last_resolve)
625
+ packages = additional_base_requirements_to_force_updates(packages)
626
+ packages
627
+ end
628
+ end
629
+
630
+ def filter_specs(specs, deps, skips: [])
631
+ SpecSet.new(specs).for(deps, platforms, skips: skips)
482
632
  end
483
633
 
484
634
  def materialize(dependencies)
485
- specs = resolve.materialize(dependencies)
486
- missing_specs = specs.missing_specs
635
+ # Tracks potential endless loops trying to re-resolve.
636
+ # TODO: Remove as dead code if not reports are received in a while
637
+ incorrect_spec = nil
638
+
639
+ specs = begin
640
+ resolve.materialize(dependencies)
641
+ rescue IncorrectLockfileDependencies => e
642
+ spec = e.spec
643
+ raise "Infinite loop while fixing lockfile dependencies" if incorrect_spec == spec
644
+
645
+ incorrect_spec = spec
646
+ reresolve_without([spec])
647
+ retry
648
+ end
649
+
650
+ missing_specs = resolve.missing_specs
487
651
 
488
652
  if missing_specs.any?
489
653
  missing_specs.each do |s|
490
654
  locked_gem = @locked_specs[s.name].last
491
- next if locked_gem.nil? || locked_gem.version != s.version || !@remote
492
- raise GemNotFound, "Your bundle is locked to #{locked_gem} from #{locked_gem.source}, but that version can " \
493
- "no longer be found in that source. That means the author of #{locked_gem} has removed it. " \
494
- "You'll need to update your bundle to a version other than #{locked_gem} that hasn't been " \
495
- "removed in order to install."
655
+ next if locked_gem.nil? || locked_gem.version != s.version || sources.local_mode?
656
+
657
+ message = if sources.implicit_global_source?
658
+ "Because your Gemfile specifies no global remote source, your bundle is locked to " \
659
+ "#{locked_gem} from #{locked_gem.source}. However, #{locked_gem} is not installed. You'll " \
660
+ "need to either add a global remote source to your Gemfile or make sure #{locked_gem} is " \
661
+ "available locally before rerunning Bundler."
662
+ else
663
+ "Your bundle is locked to #{locked_gem} from #{locked_gem.source}, but that version can " \
664
+ "no longer be found in that source. That means the author of #{locked_gem} has removed it. " \
665
+ "You'll need to update your bundle to a version other than #{locked_gem} that hasn't been " \
666
+ "removed in order to install."
667
+ end
668
+
669
+ raise GemNotFound, message
496
670
  end
497
671
 
498
- raise GemNotFound, "Could not find #{missing_specs.map(&:full_name).join(", ")} in any of the sources"
672
+ missing_specs_list = missing_specs.group_by(&:source).map do |source, missing_specs_for_source|
673
+ "#{missing_specs_for_source.map(&:full_name).join(", ")} in #{source}"
674
+ end
675
+
676
+ raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
499
677
  end
500
678
 
501
- unless specs["bundler"].any?
502
- bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
503
- specs["bundler"] = bundler
679
+ partially_missing_specs = resolve.partially_missing_specs
680
+
681
+ if partially_missing_specs.any? && !sources.local_mode?
682
+ Bundler.ui.warn "Some locked specs have possibly been yanked (#{partially_missing_specs.map(&:full_name).join(", ")}). Ignoring them..."
683
+
684
+ resolve.delete(partially_missing_specs)
685
+ end
686
+
687
+ incomplete_specs = resolve.incomplete_specs
688
+ loop do
689
+ break if incomplete_specs.empty?
690
+
691
+ Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
692
+ sources.remote!
693
+ reresolve_without(incomplete_specs)
694
+ specs = resolve.materialize(dependencies)
695
+
696
+ still_incomplete_specs = resolve.incomplete_specs
697
+
698
+ if still_incomplete_specs == incomplete_specs
699
+ package = resolution_packages.get_package(incomplete_specs.first.name)
700
+ resolver.raise_not_found! package
701
+ end
702
+
703
+ incomplete_specs = still_incomplete_specs
504
704
  end
505
705
 
706
+ insecurely_materialized_specs = resolve.insecurely_materialized_specs
707
+
708
+ if insecurely_materialized_specs.any?
709
+ Bundler.ui.warn "The following platform specific gems are getting installed, yet the lockfile includes only their generic ruby version:\n" \
710
+ " * #{insecurely_materialized_specs.map(&:full_name).join("\n * ")}\n" \
711
+ "Please run `bundle lock --normalize-platforms` and commit the resulting lockfile.\n" \
712
+ "Alternatively, you may run `bundle lock --add-platform <list-of-platforms-that-you-want-to-support>`"
713
+ end
714
+
715
+ bundler = sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last
716
+ specs["bundler"] = bundler
717
+
506
718
  specs
507
719
  end
508
720
 
509
- def precompute_source_requirements_for_indirect_dependencies?
510
- @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
721
+ def reresolve_without(incomplete_specs)
722
+ resolution_packages.delete(incomplete_specs)
723
+ @resolve = start_resolution
511
724
  end
512
725
 
513
- def current_ruby_platform_locked?
514
- return false unless generic_local_platform == Gem::Platform::RUBY
515
- return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)
726
+ def start_resolution
727
+ local_platform_needed_for_resolvability = @most_specific_non_local_locked_ruby_platform && !@platforms.include?(local_platform)
728
+ @platforms << local_platform if local_platform_needed_for_resolvability
729
+ add_platform(Gem::Platform::RUBY) if RUBY_ENGINE == "truffleruby"
730
+
731
+ result = SpecSet.new(resolver.start)
732
+
733
+ @resolved_bundler_version = result.find {|spec| spec.name == "bundler" }&.version
516
734
 
517
- current_platform_locked?
735
+ if @most_specific_non_local_locked_ruby_platform
736
+ if spec_set_incomplete_for_platform?(result, @most_specific_non_local_locked_ruby_platform)
737
+ @platforms.delete(@most_specific_non_local_locked_ruby_platform)
738
+ elsif local_platform_needed_for_resolvability
739
+ @platforms.delete(local_platform)
740
+ end
741
+ end
742
+
743
+ @platforms = result.add_extra_platforms!(platforms) if should_add_extra_platforms?
744
+
745
+ SpecSet.new(result.for(dependencies, @platforms))
746
+ end
747
+
748
+ def precompute_source_requirements_for_indirect_dependencies?
749
+ sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
518
750
  end
519
751
 
520
752
  def current_platform_locked?
521
753
  @platforms.any? do |bundle_platform|
522
- MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
754
+ MatchPlatform.platforms_match?(bundle_platform, local_platform)
523
755
  end
524
756
  end
525
757
 
526
758
  def add_current_platform
527
- add_platform(local_platform)
759
+ return if @platforms.include?(local_platform)
760
+
761
+ @most_specific_non_local_locked_ruby_platform = find_most_specific_locked_ruby_platform
762
+ return if @most_specific_non_local_locked_ruby_platform
763
+
764
+ @platforms << local_platform
765
+ true
766
+ end
767
+
768
+ def find_most_specific_locked_ruby_platform
769
+ return unless generic_local_platform_is_ruby? && current_platform_locked?
770
+
771
+ @most_specific_locked_platform
528
772
  end
529
773
 
530
774
  def change_reason
531
775
  if unlocking?
532
- unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v|
533
- if v == true
534
- k.to_s
535
- else
536
- v = Array(v)
537
- "#{k}: (#{v.join(", ")})"
538
- end
539
- end.join(", ")
776
+ unlock_targets = if @gems_to_unlock.any?
777
+ ["gems", @gems_to_unlock]
778
+ elsif @sources_to_unlock.any?
779
+ ["sources", @sources_to_unlock]
780
+ end
781
+
782
+ unlock_reason = if unlock_targets
783
+ "#{unlock_targets.first}: (#{unlock_targets.last.join(", ")})"
784
+ else
785
+ @unlock[:ruby] ? "ruby" : ""
786
+ end
787
+
540
788
  return "bundler is unlocking #{unlock_reason}"
541
789
  end
542
790
  [
543
791
  [@source_changes, "the list of sources changed"],
544
792
  [@dependency_changes, "the dependencies in your gemfile changed"],
545
- [@new_platform, "you added a new platform to your gemfile"],
793
+ [@current_platform_missing, "your lockfile does not include the current platform"],
794
+ [@new_platforms.any?, "you added a new platform to your gemfile"],
546
795
  [@path_changes, "the gemspecs for path gems changed"],
547
796
  [@local_changes, "the gemspecs for git local gems changed"],
548
- [@locked_specs_incomplete_for_platform, "the lockfile does not have all gems needed for the current platform"],
797
+ [@missing_lockfile_dep, "your lock file is missing \"#{@missing_lockfile_dep}\""],
798
+ [@unlocking_bundler, "an update to the version of Bundler itself was requested"],
799
+ [@locked_spec_with_missing_deps, "your lock file includes \"#{@locked_spec_with_missing_deps}\" but not some of its dependencies"],
800
+ [@locked_spec_with_invalid_deps, "your lockfile does not satisfy dependencies of \"#{@locked_spec_with_invalid_deps}\""],
549
801
  ].select(&:first).map(&:last).join(", ")
550
802
  end
551
803
 
552
- def pretty_dep(dep, source = false)
553
- SharedHelpers.pretty_dependency(dep, source)
804
+ def pretty_dep(dep)
805
+ SharedHelpers.pretty_dependency(dep)
554
806
  end
555
807
 
556
808
  # Check if the specs of the given source changed
@@ -572,8 +824,7 @@ module Bundler
572
824
  locked_index = Index.new
573
825
  locked_index.use(@locked_specs.select {|s| source.can_lock?(s) })
574
826
 
575
- # order here matters, since Index#== is checking source.specs.include?(locked_index)
576
- locked_index != source.specs
827
+ !locked_index.subset?(source.specs)
577
828
  rescue PathError, GitError => e
578
829
  Bundler.ui.debug "Assuming that #{source} has not changed since fetching its specs errored (#{e})"
579
830
  false
@@ -587,9 +838,9 @@ module Bundler
587
838
 
588
839
  Bundler.settings.local_overrides.map do |k, v|
589
840
  spec = @dependencies.find {|s| s.name == k }
590
- source = spec && spec.source
591
- if source && source.respond_to?(:local_override!)
592
- source.unlock! if @unlock[:gems].include?(spec.name)
841
+ source = spec&.source
842
+ if source&.respond_to?(:local_override!)
843
+ source.unlock! if @gems_to_unlock.include?(spec.name)
593
844
  locals << [source, source.local_override!(v)]
594
845
  end
595
846
  end
@@ -597,7 +848,40 @@ module Bundler
597
848
  sources_with_changes = locals.select do |source, changed|
598
849
  changed || specs_changed?(source)
599
850
  end.map(&:first)
600
- !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
851
+ !sources_with_changes.each {|source| @sources_to_unlock << source.name }.empty?
852
+ end
853
+
854
+ def check_lockfile
855
+ @missing_lockfile_dep = nil
856
+
857
+ @locked_spec_with_invalid_deps = nil
858
+ @locked_spec_with_missing_deps = nil
859
+
860
+ missing = []
861
+ invalid = []
862
+
863
+ @locked_specs.each do |s|
864
+ validation = @locked_specs.validate_deps(s)
865
+
866
+ missing << s if validation == :missing
867
+ invalid << s if validation == :invalid
868
+ end
869
+
870
+ if missing.any?
871
+ @locked_specs.delete(missing)
872
+
873
+ @locked_spec_with_missing_deps = missing.first.name
874
+ elsif !@dependency_changes
875
+ @missing_lockfile_dep = current_dependencies.find do |d|
876
+ @locked_specs[d.name].empty? && d.name != "bundler"
877
+ end&.name
878
+ end
879
+
880
+ if invalid.any?
881
+ @locked_specs.delete(invalid)
882
+
883
+ @locked_spec_with_invalid_deps = invalid.first.name
884
+ end
601
885
  end
602
886
 
603
887
  def converge_paths
@@ -631,12 +915,17 @@ module Bundler
631
915
  changes = sources.replace_sources!(@locked_sources)
632
916
 
633
917
  sources.all_sources.each do |source|
918
+ # has to be done separately, because we want to keep the locked checksum
919
+ # store for a source, even when doing a full update
920
+ if @locked_checksums && @locked_gems && locked_source = @locked_gems.sources.find {|s| s == source && !s.equal?(source) }
921
+ source.checksum_store.merge!(locked_source.checksum_store)
922
+ end
634
923
  # If the source is unlockable and the current command allows an unlock of
635
924
  # the source (for example, you are doing a `bundle update <foo>` of a git-pinned
636
925
  # gem), unlock it. For git sources, this means to unlock the revision, which
637
926
  # will cause the `ref` used to be the most recent for the branch (or master) if
638
927
  # an explicit `ref` is not used.
639
- if source.respond_to?(:unlock!) && @unlock[:sources].include?(source.name)
928
+ if source.respond_to?(:unlock!) && @sources_to_unlock.include?(source.name)
640
929
  source.unlock!
641
930
  changes = true
642
931
  end
@@ -653,7 +942,7 @@ module Bundler
653
942
  dep.source = sources.get(dep.source)
654
943
  end
655
944
 
656
- unless locked_dep = @locked_deps[dep.name]
945
+ unless locked_dep = @originally_locked_deps[dep.name]
657
946
  changes = true
658
947
  next
659
948
  end
@@ -678,7 +967,9 @@ module Bundler
678
967
  # commonly happen if the Gemfile has changed since the lockfile was last
679
968
  # generated
680
969
  def converge_locked_specs
681
- resolve = converge_specs(@locked_specs)
970
+ converged = converge_specs(@locked_specs)
971
+
972
+ resolve = SpecSet.new(converged)
682
973
 
683
974
  diff = nil
684
975
 
@@ -697,106 +988,105 @@ module Bundler
697
988
 
698
989
  def converge_specs(specs)
699
990
  converged = []
700
-
701
- deps = @dependencies.select do |dep|
702
- specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
703
- end
991
+ deps = []
704
992
 
705
993
  specs.each do |s|
706
- # Replace the locked dependency's source with the equivalent source from the Gemfile
994
+ name = s.name
707
995
  dep = @dependencies.find {|d| s.satisfies?(d) }
996
+ lockfile_source = s.source
997
+
998
+ if dep
999
+ gemfile_source = dep.source || default_source
708
1000
 
709
- s.source = (dep && dep.source) || sources.get(s.source) || sources.default_source
1001
+ deps << dep if !dep.source || lockfile_source.include?(dep.source) || new_deps.include?(dep)
710
1002
 
711
- next if @unlock[:sources].include?(s.source.name)
1003
+ # Replace the locked dependency's source with the equivalent source from the Gemfile
1004
+ s.source = gemfile_source
1005
+ else
1006
+ # Replace the locked dependency's source with the default source, if the locked source is no longer in the Gemfile
1007
+ s.source = default_source unless sources.get(lockfile_source)
1008
+ end
712
1009
 
713
- # If the spec is from a path source and it doesn't exist anymore
714
- # then we unlock it.
1010
+ source = s.source
1011
+ next if @sources_to_unlock.include?(source.name)
715
1012
 
716
1013
  # Path sources have special logic
717
- if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec)
718
- new_specs = begin
719
- s.source.specs
720
- rescue PathError, GitError
721
- # if we won't need the source (according to the lockfile),
722
- # don't error if the path/git source isn't available
723
- next if specs.
724
- for(requested_dependencies, false, true).
725
- none? {|locked_spec| locked_spec.source == s.source }
726
-
727
- raise
1014
+ if source.instance_of?(Source::Path) || source.instance_of?(Source::Gemspec) || (source.instance_of?(Source::Git) && !@gems_to_unlock.include?(name) && deps.include?(dep))
1015
+ new_spec = source.specs[s].first
1016
+ if new_spec
1017
+ s.runtime_dependencies.replace(new_spec.runtime_dependencies)
1018
+ else
1019
+ # If the spec is no longer in the path source, unlock it. This
1020
+ # commonly happens if the version changed in the gemspec
1021
+ @gems_to_unlock << name
728
1022
  end
729
-
730
- new_spec = new_specs[s].first
731
-
732
- # If the spec is no longer in the path source, unlock it. This
733
- # commonly happens if the version changed in the gemspec
734
- next unless new_spec
735
-
736
- s.dependencies.replace(new_spec.dependencies)
737
1023
  end
738
1024
 
739
- if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
740
- @unlock[:gems] << s.name
741
- else
742
- converged << s
1025
+ if dep.nil? && requested_dep = requested_dependencies.find {|d| name == d.name }
1026
+ @gems_to_unlock << name
1027
+ deps << requested_dep
743
1028
  end
1029
+
1030
+ converged << s
744
1031
  end
745
1032
 
746
- SpecSet.new(filter_specs(converged, deps).reject {|s| @unlock[:gems].include?(s.name) })
1033
+ filter_specs(converged, deps, skips: @gems_to_unlock)
747
1034
  end
748
1035
 
749
1036
  def metadata_dependencies
750
1037
  @metadata_dependencies ||= [
751
- Dependency.new("Ruby\0", RubyVersion.system.gem_version),
1038
+ Dependency.new("Ruby\0", Bundler::RubyVersion.system.gem_version),
752
1039
  Dependency.new("RubyGems\0", Gem::VERSION),
753
1040
  ]
754
1041
  end
755
1042
 
756
- def expand_dependencies(dependencies, remote = false)
757
- deps = []
758
- dependencies.each do |dep|
759
- dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
760
- next unless remote || dep.current_platform?
761
- target_platforms = dep.gem_platforms(remote ? @platforms : [generic_local_platform])
762
- deps += expand_dependency_with_platforms(dep, target_platforms)
763
- end
764
- deps
765
- end
766
-
767
- def expand_dependency_with_platforms(dep, platforms)
768
- platforms.map do |p|
769
- DepProxy.get_proxy(dep, p)
770
- end
1043
+ def source_requirements
1044
+ @source_requirements ||= find_source_requirements
771
1045
  end
772
1046
 
773
- def source_requirements
1047
+ def find_source_requirements
774
1048
  # Record the specs available in each gem's source, so that those
775
1049
  # specs will be available later when the resolver knows where to
776
1050
  # look for that gemspec (or its dependencies)
777
1051
  source_requirements = if precompute_source_requirements_for_indirect_dependencies?
778
- { :default => sources.default_source }.merge(source_map.all_requirements)
1052
+ all_requirements = source_map.all_requirements
1053
+ { default: default_source }.merge(all_requirements)
779
1054
  else
780
- { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
1055
+ { default: Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
781
1056
  end
782
- source_requirements.merge!(source_map.locked_requirements) unless @remote
1057
+ source_requirements.merge!(source_map.locked_requirements) if nothing_changed?
783
1058
  metadata_dependencies.each do |dep|
784
1059
  source_requirements[dep.name] = sources.metadata_source
785
1060
  end
786
- source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
787
- source_requirements["bundler"] = sources.metadata_source # needs to come last to override
1061
+
1062
+ default_bundler_source = source_requirements["bundler"] || default_source
1063
+
1064
+ if @unlocking_bundler
1065
+ default_bundler_source.add_dependency_names("bundler")
1066
+ else
1067
+ source_requirements[:default_bundler] = default_bundler_source
1068
+ source_requirements["bundler"] = sources.metadata_source # needs to come last to override
1069
+ end
1070
+
788
1071
  source_requirements
789
1072
  end
790
1073
 
1074
+ def default_source
1075
+ sources.default_source
1076
+ end
1077
+
791
1078
  def requested_groups
792
- groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
1079
+ values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
1080
+ values &= Bundler.settings[:only] unless Bundler.settings[:only].empty?
1081
+ values
793
1082
  end
794
1083
 
795
1084
  def lockfiles_equal?(current, proposed, preserve_unknown_sections)
796
1085
  if preserve_unknown_sections
797
1086
  sections_to_ignore = LockfileParser.sections_to_ignore(@locked_bundler_version)
798
1087
  sections_to_ignore += LockfileParser.unknown_sections_in_lockfile(current)
799
- sections_to_ignore += LockfileParser::ENVIRONMENT_VERSION_SECTIONS
1088
+ sections_to_ignore << LockfileParser::RUBY
1089
+ sections_to_ignore << LockfileParser::BUNDLED unless @unlocking_bundler
800
1090
  pattern = /#{Regexp.union(sections_to_ignore)}\n(\s{2,}.*\n)+/
801
1091
  whitespace_cleanup = /\n{2,}/
802
1092
  current = current.gsub(pattern, "\n").gsub(whitespace_cleanup, "\n\n").strip
@@ -805,24 +1095,53 @@ module Bundler
805
1095
  current == proposed
806
1096
  end
807
1097
 
808
- def compute_requires
809
- dependencies.reduce({}) do |requires, dep|
810
- next requires unless dep.should_include?
811
- requires[dep.name] = Array(dep.autorequire || dep.name).map do |file|
812
- # Allow `require: true` as an alias for `require: <name>`
813
- file == true ? dep.name : file
814
- end
815
- requires
1098
+ def additional_base_requirements_to_prevent_downgrades(resolution_packages, last_resolve)
1099
+ return resolution_packages unless @locked_gems && !sources.expired_sources?(@locked_gems.sources)
1100
+ converge_specs(@originally_locked_specs - last_resolve).each do |locked_spec|
1101
+ next if locked_spec.source.is_a?(Source::Path)
1102
+ resolution_packages.base_requirements[locked_spec.name] = Gem::Requirement.new(">= #{locked_spec.version}")
1103
+ end
1104
+ resolution_packages
1105
+ end
1106
+
1107
+ def additional_base_requirements_to_force_updates(resolution_packages)
1108
+ return resolution_packages if @explicit_unlocks.empty?
1109
+ full_update = dup_for_full_unlock.resolve
1110
+ @explicit_unlocks.each do |name|
1111
+ version = full_update[name].first&.version
1112
+ resolution_packages.base_requirements[name] = Gem::Requirement.new("= #{version}") if version
816
1113
  end
1114
+ resolution_packages
817
1115
  end
818
1116
 
819
- def additional_base_requirements_for_resolve
820
- return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
821
- converge_specs(@originally_locked_specs).map do |locked_spec|
822
- name = locked_spec.name
823
- dep = Dependency.new(name, ">= #{locked_spec.version}")
824
- DepProxy.get_proxy(dep, locked_spec.platform)
1117
+ def dup_for_full_unlock
1118
+ unlocked_definition = self.class.new(@lockfile, @dependencies, @sources, true, @ruby_version, @optional_groups, @gemfiles)
1119
+ unlocked_definition.source_requirements = source_requirements
1120
+ unlocked_definition.gem_version_promoter.tap do |gvp|
1121
+ gvp.level = gem_version_promoter.level
1122
+ gvp.strict = gem_version_promoter.strict
1123
+ gvp.pre = gem_version_promoter.pre
825
1124
  end
1125
+ unlocked_definition
1126
+ end
1127
+
1128
+ def remove_invalid_platforms!
1129
+ return if Bundler.frozen_bundle?
1130
+
1131
+ platforms.reverse_each do |platform|
1132
+ next if local_platform == platform ||
1133
+ @new_platforms.include?(platform) ||
1134
+ @path_changes ||
1135
+ @dependency_changes ||
1136
+ @locked_spec_with_invalid_deps ||
1137
+ !spec_set_incomplete_for_platform?(@originally_locked_specs, platform)
1138
+
1139
+ remove_platform(platform)
1140
+ end
1141
+ end
1142
+
1143
+ def spec_set_incomplete_for_platform?(spec_set, platform)
1144
+ spec_set.incomplete_for_platform?(current_dependencies, platform)
826
1145
  end
827
1146
 
828
1147
  def source_map