rubygems-update 3.4.10 → 3.5.22

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