rubygems-update 3.5.3 → 3.7.1

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 (437) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1410 -686
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/CONTRIBUTING.md +4 -226
  5. data/Manifest.txt +107 -83
  6. data/README.md +16 -11
  7. data/SECURITY.md +7 -0
  8. data/bundler/CHANGELOG.md +1525 -931
  9. data/bundler/README.md +9 -9
  10. data/bundler/bundler.gemspec +2 -2
  11. data/bundler/lib/bundler/build_metadata.rb +10 -11
  12. data/bundler/lib/bundler/checksum.rb +22 -12
  13. data/bundler/lib/bundler/cli/add.rb +3 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +1 -1
  15. data/bundler/lib/bundler/cli/check.rb +3 -3
  16. data/bundler/lib/bundler/cli/common.rb +1 -1
  17. data/bundler/lib/bundler/cli/config.rb +2 -2
  18. data/bundler/lib/bundler/cli/console.rb +8 -10
  19. data/bundler/lib/bundler/cli/doctor/diagnose.rb +167 -0
  20. data/bundler/lib/bundler/cli/doctor/ssl.rb +249 -0
  21. data/bundler/lib/bundler/cli/doctor.rb +27 -151
  22. data/bundler/lib/bundler/cli/exec.rb +1 -0
  23. data/bundler/lib/bundler/cli/fund.rb +1 -1
  24. data/bundler/lib/bundler/cli/gem.rb +74 -46
  25. data/bundler/lib/bundler/cli/info.rb +6 -6
  26. data/bundler/lib/bundler/cli/inject.rb +3 -3
  27. data/bundler/lib/bundler/cli/install.rb +19 -10
  28. data/bundler/lib/bundler/cli/issue.rb +3 -3
  29. data/bundler/lib/bundler/cli/lock.rb +32 -11
  30. data/bundler/lib/bundler/cli/outdated.rb +23 -23
  31. data/bundler/lib/bundler/cli/plugin.rb +3 -2
  32. data/bundler/lib/bundler/cli/pristine.rb +1 -1
  33. data/bundler/lib/bundler/cli/show.rb +3 -3
  34. data/bundler/lib/bundler/cli/update.rb +3 -3
  35. data/bundler/lib/bundler/cli.rb +75 -145
  36. data/bundler/lib/bundler/compact_index_client/cache.rb +48 -73
  37. data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -5
  38. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  39. data/bundler/lib/bundler/compact_index_client/updater.rb +6 -16
  40. data/bundler/lib/bundler/compact_index_client.rb +52 -85
  41. data/bundler/lib/bundler/constants.rb +8 -1
  42. data/bundler/lib/bundler/current_ruby.rb +48 -34
  43. data/bundler/lib/bundler/definition.rb +501 -328
  44. data/bundler/lib/bundler/dependency.rb +93 -47
  45. data/bundler/lib/bundler/dsl.rb +147 -103
  46. data/bundler/lib/bundler/endpoint_specification.rb +30 -3
  47. data/bundler/lib/bundler/env.rb +1 -1
  48. data/bundler/lib/bundler/environment_preserver.rb +5 -23
  49. data/bundler/lib/bundler/errors.rb +53 -5
  50. data/bundler/lib/bundler/feature_flag.rb +18 -18
  51. data/bundler/lib/bundler/fetcher/compact_index.rb +16 -25
  52. data/bundler/lib/bundler/fetcher/dependency.rb +2 -1
  53. data/bundler/lib/bundler/fetcher/downloader.rb +34 -8
  54. data/bundler/lib/bundler/fetcher.rb +63 -26
  55. data/bundler/lib/bundler/force_platform.rb +0 -2
  56. data/bundler/lib/bundler/friendly_errors.rb +3 -2
  57. data/bundler/lib/bundler/gem_helper.rb +1 -1
  58. data/bundler/lib/bundler/gem_version_promoter.rb +42 -40
  59. data/bundler/lib/bundler/index.rb +7 -2
  60. data/bundler/lib/bundler/injector.rb +14 -16
  61. data/bundler/lib/bundler/inline.rb +42 -17
  62. data/bundler/lib/bundler/installer/gem_installer.rb +4 -3
  63. data/bundler/lib/bundler/installer/parallel_installer.rb +3 -2
  64. data/bundler/lib/bundler/installer/standalone.rb +2 -5
  65. data/bundler/lib/bundler/installer.rb +22 -45
  66. data/bundler/lib/bundler/lazy_specification.rb +121 -48
  67. data/bundler/lib/bundler/lockfile_generator.rb +1 -1
  68. data/bundler/lib/bundler/lockfile_parser.rb +36 -9
  69. data/bundler/lib/bundler/man/bundle-add.1 +44 -27
  70. data/bundler/lib/bundler/man/bundle-add.1.ronn +52 -23
  71. data/bundler/lib/bundler/man/bundle-binstubs.1 +9 -6
  72. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  73. data/bundler/lib/bundler/man/bundle-cache.1 +32 -4
  74. data/bundler/lib/bundler/man/bundle-cache.1.ronn +31 -2
  75. data/bundler/lib/bundler/man/bundle-check.1 +7 -5
  76. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  77. data/bundler/lib/bundler/man/bundle-clean.1 +3 -3
  78. data/bundler/lib/bundler/man/bundle-config.1 +180 -138
  79. data/bundler/lib/bundler/man/bundle-config.1.ronn +96 -99
  80. data/bundler/lib/bundler/man/bundle-console.1 +4 -6
  81. data/bundler/lib/bundler/man/bundle-console.1.ronn +2 -7
  82. data/bundler/lib/bundler/man/bundle-doctor.1 +46 -7
  83. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +49 -5
  84. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  85. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  86. data/bundler/lib/bundler/man/bundle-exec.1 +9 -6
  87. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -3
  88. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  89. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  90. data/bundler/lib/bundler/man/bundle-gem.1 +69 -28
  91. data/bundler/lib/bundler/man/bundle-gem.1.ronn +42 -6
  92. data/bundler/lib/bundler/man/bundle-help.1 +3 -3
  93. data/bundler/lib/bundler/man/bundle-info.1 +7 -4
  94. data/bundler/lib/bundler/man/bundle-info.1.ronn +6 -2
  95. data/bundler/lib/bundler/man/bundle-init.1 +5 -5
  96. data/bundler/lib/bundler/man/bundle-init.1.ronn +3 -2
  97. data/bundler/lib/bundler/man/bundle-inject.1 +13 -5
  98. data/bundler/lib/bundler/man/bundle-inject.1.ronn +10 -2
  99. data/bundler/lib/bundler/man/bundle-install.1 +20 -17
  100. data/bundler/lib/bundler/man/bundle-install.1.ronn +26 -23
  101. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  102. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  103. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  104. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  105. data/bundler/lib/bundler/man/bundle-list.1 +3 -3
  106. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  107. data/bundler/lib/bundler/man/bundle-lock.1 +23 -8
  108. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  109. data/bundler/lib/bundler/man/bundle-open.1 +4 -4
  110. data/bundler/lib/bundler/man/bundle-open.1.ronn +2 -1
  111. data/bundler/lib/bundler/man/bundle-outdated.1 +10 -7
  112. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +8 -4
  113. data/bundler/lib/bundler/man/bundle-platform.1 +3 -3
  114. data/bundler/lib/bundler/man/bundle-plugin.1 +9 -6
  115. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +7 -3
  116. data/bundler/lib/bundler/man/bundle-pristine.1 +3 -3
  117. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  118. data/bundler/lib/bundler/man/bundle-remove.1 +3 -3
  119. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  120. data/bundler/lib/bundler/man/bundle-show.1 +7 -4
  121. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  122. data/bundler/lib/bundler/man/bundle-update.1 +17 -11
  123. data/bundler/lib/bundler/man/bundle-update.1.ronn +17 -9
  124. data/bundler/lib/bundler/man/bundle-version.1 +3 -3
  125. data/bundler/lib/bundler/man/bundle-viz.1 +6 -6
  126. data/bundler/lib/bundler/man/bundle-viz.1.ronn +7 -3
  127. data/bundler/lib/bundler/man/bundle.1 +3 -3
  128. data/bundler/lib/bundler/man/gemfile.5 +7 -5
  129. data/bundler/lib/bundler/man/gemfile.5.ronn +8 -2
  130. data/bundler/lib/bundler/man/index.txt +4 -0
  131. data/bundler/lib/bundler/match_metadata.rb +13 -0
  132. data/bundler/lib/bundler/match_platform.rb +31 -12
  133. data/bundler/lib/bundler/materialization.rb +59 -0
  134. data/bundler/lib/bundler/mirror.rb +3 -3
  135. data/bundler/lib/bundler/plugin/api/source.rb +5 -4
  136. data/bundler/lib/bundler/plugin/events.rb +24 -0
  137. data/bundler/lib/bundler/plugin/index.rb +5 -1
  138. data/bundler/lib/bundler/plugin/installer/path.rb +26 -0
  139. data/bundler/lib/bundler/plugin/installer.rb +37 -17
  140. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  141. data/bundler/lib/bundler/plugin.rb +21 -2
  142. data/bundler/lib/bundler/process_lock.rb +10 -14
  143. data/bundler/lib/bundler/remote_specification.rb +6 -1
  144. data/bundler/lib/bundler/resolver/base.rb +14 -3
  145. data/bundler/lib/bundler/resolver/candidate.rb +18 -27
  146. data/bundler/lib/bundler/resolver/package.rb +20 -3
  147. data/bundler/lib/bundler/resolver/spec_group.rb +22 -27
  148. data/bundler/lib/bundler/resolver/strategy.rb +40 -0
  149. data/bundler/lib/bundler/resolver.rb +114 -52
  150. data/bundler/lib/bundler/retry.rb +1 -1
  151. data/bundler/lib/bundler/ruby_dsl.rb +12 -3
  152. data/bundler/lib/bundler/ruby_version.rb +7 -1
  153. data/bundler/lib/bundler/rubygems_ext.rb +303 -150
  154. data/bundler/lib/bundler/rubygems_gem_installer.rb +40 -5
  155. data/bundler/lib/bundler/rubygems_integration.rb +40 -73
  156. data/bundler/lib/bundler/runtime.rb +48 -35
  157. data/bundler/lib/bundler/self_manager.rb +36 -26
  158. data/bundler/lib/bundler/settings/validator.rb +0 -23
  159. data/bundler/lib/bundler/settings.rb +36 -27
  160. data/bundler/lib/bundler/setup.rb +6 -0
  161. data/bundler/lib/bundler/shared_helpers.rb +45 -25
  162. data/bundler/lib/bundler/source/gemspec.rb +1 -4
  163. data/bundler/lib/bundler/source/git/git_proxy.rb +26 -9
  164. data/bundler/lib/bundler/source/git.rb +113 -41
  165. data/bundler/lib/bundler/source/metadata.rb +4 -3
  166. data/bundler/lib/bundler/source/path.rb +14 -18
  167. data/bundler/lib/bundler/source/rubygems/remote.rb +12 -4
  168. data/bundler/lib/bundler/source/rubygems.rb +54 -48
  169. data/bundler/lib/bundler/source.rb +2 -0
  170. data/bundler/lib/bundler/source_list.rb +54 -12
  171. data/bundler/lib/bundler/source_map.rb +1 -1
  172. data/bundler/lib/bundler/spec_set.rb +227 -103
  173. data/bundler/lib/bundler/stub_specification.rb +29 -2
  174. data/bundler/lib/bundler/templates/Executable +0 -11
  175. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  176. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -3
  177. data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
  178. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +17 -15
  179. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -12
  180. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  181. data/bundler/lib/bundler/ui/shell.rb +26 -4
  182. data/bundler/lib/bundler/ui/silent.rb +12 -1
  183. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  184. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  185. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  186. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  187. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +15 -13
  188. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  189. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +2 -1
  190. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +134 -57
  191. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  192. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  193. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  194. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  195. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  196. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  197. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  198. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +3 -5
  199. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +11 -0
  200. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +1 -4
  201. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +2 -2
  202. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +2 -1
  203. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +9 -9
  204. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
  205. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +5 -21
  206. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  207. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  208. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +11 -0
  209. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  210. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +43 -16
  211. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +3 -3
  212. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +1 -1
  213. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +28 -37
  214. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +2 -2
  215. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -9
  216. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +26 -3
  217. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  218. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +9 -9
  219. data/bundler/lib/bundler/vendored_net_http.rb +20 -5
  220. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  221. data/bundler/lib/bundler/vendored_timeout.rb +7 -3
  222. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  223. data/bundler/lib/bundler/version.rb +10 -2
  224. data/bundler/lib/bundler/worker.rb +1 -1
  225. data/bundler/lib/bundler/yaml_serializer.rb +12 -7
  226. data/bundler/lib/bundler.rb +101 -61
  227. data/{bundler → doc/bundler}/UPGRADING.md +132 -127
  228. data/doc/rubygems/CONTRIBUTING.md +227 -0
  229. data/{POLICIES.md → doc/rubygems/POLICIES.md} +86 -17
  230. data/exe/update_rubygems +1 -1
  231. data/lib/rubygems/basic_specification.rb +50 -10
  232. data/lib/rubygems/bundler_version_finder.rb +1 -1
  233. data/lib/rubygems/command.rb +1 -4
  234. data/lib/rubygems/command_manager.rb +5 -6
  235. data/lib/rubygems/commands/build_command.rb +2 -11
  236. data/lib/rubygems/commands/cleanup_command.rb +3 -13
  237. data/lib/rubygems/commands/contents_command.rb +17 -10
  238. data/lib/rubygems/commands/environment_command.rb +5 -0
  239. data/lib/rubygems/commands/exec_command.rb +18 -11
  240. data/lib/rubygems/commands/fetch_command.rb +14 -0
  241. data/lib/rubygems/commands/help_command.rb +2 -2
  242. data/lib/rubygems/commands/install_command.rb +0 -4
  243. data/lib/rubygems/commands/pristine_command.rb +29 -19
  244. data/lib/rubygems/commands/push_command.rb +31 -6
  245. data/lib/rubygems/commands/rdoc_command.rb +3 -10
  246. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  247. data/lib/rubygems/commands/setup_command.rb +13 -18
  248. data/lib/rubygems/commands/sources_command.rb +2 -2
  249. data/lib/rubygems/commands/uninstall_command.rb +9 -4
  250. data/lib/rubygems/commands/unpack_command.rb +0 -6
  251. data/lib/rubygems/commands/update_command.rb +13 -22
  252. data/lib/rubygems/config_file.rb +45 -16
  253. data/lib/rubygems/core_ext/kernel_require.rb +15 -3
  254. data/lib/rubygems/core_ext/kernel_warn.rb +2 -6
  255. data/lib/rubygems/defaults.rb +7 -7
  256. data/lib/rubygems/dependency.rb +12 -16
  257. data/lib/rubygems/dependency_list.rb +1 -1
  258. data/lib/rubygems/deprecate.rb +79 -77
  259. data/lib/rubygems/errors.rb +2 -1
  260. data/lib/rubygems/exceptions.rb +2 -9
  261. data/lib/rubygems/ext/builder.rb +21 -8
  262. data/lib/rubygems/ext/cargo_builder.rb +16 -26
  263. data/lib/rubygems/ext/cmake_builder.rb +7 -2
  264. data/lib/rubygems/ext/configure_builder.rb +7 -2
  265. data/lib/rubygems/ext/ext_conf_builder.rb +9 -5
  266. data/lib/rubygems/ext/rake_builder.rb +7 -4
  267. data/lib/rubygems/gem_runner.rb +9 -0
  268. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +11 -4
  269. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -1
  270. data/lib/rubygems/gemcutter_utilities.rb +52 -26
  271. data/lib/rubygems/gemspec_helpers.rb +19 -0
  272. data/lib/rubygems/install_update_options.rb +5 -0
  273. data/lib/rubygems/installer.rb +76 -90
  274. data/lib/rubygems/local_remote_options.rb +8 -8
  275. data/lib/rubygems/package/tar_header.rb +31 -4
  276. data/lib/rubygems/package/tar_reader/entry.rb +1 -5
  277. data/lib/rubygems/package/tar_writer.rb +5 -4
  278. data/lib/rubygems/package.rb +13 -8
  279. data/lib/rubygems/platform.rb +148 -43
  280. data/lib/rubygems/psych_tree.rb +4 -0
  281. data/lib/rubygems/query_utils.rb +2 -2
  282. data/lib/rubygems/rdoc.rb +16 -3
  283. data/lib/rubygems/remote_fetcher.rb +6 -7
  284. data/lib/rubygems/request.rb +5 -5
  285. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  286. data/lib/rubygems/request_set.rb +4 -7
  287. data/lib/rubygems/requirement.rb +16 -12
  288. data/lib/rubygems/resolver/activation_request.rb +1 -1
  289. data/lib/rubygems/resolver/api_set/gem_parser.rb +2 -5
  290. data/lib/rubygems/resolver/api_set.rb +13 -8
  291. data/lib/rubygems/resolver/best_set.rb +1 -29
  292. data/lib/rubygems/resolver/composed_set.rb +3 -3
  293. data/lib/rubygems/resolver/git_set.rb +0 -1
  294. data/lib/rubygems/resolver/index_set.rb +2 -2
  295. data/lib/rubygems/resolver/source_set.rb +1 -1
  296. data/lib/rubygems/resolver/spec_specification.rb +7 -0
  297. data/lib/rubygems/resolver.rb +8 -8
  298. data/lib/rubygems/s3_uri_signer.rb +8 -6
  299. data/lib/rubygems/safe_marshal/reader.rb +31 -14
  300. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +29 -16
  301. data/lib/rubygems/safe_yaml.rb +10 -1
  302. data/lib/rubygems/security.rb +1 -1
  303. data/lib/rubygems/source/git.rb +22 -17
  304. data/lib/rubygems/source/installed.rb +3 -1
  305. data/lib/rubygems/source/local.rb +8 -4
  306. data/lib/rubygems/source/specific_file.rb +5 -3
  307. data/lib/rubygems/source.rb +37 -29
  308. data/lib/rubygems/source_list.rb +1 -1
  309. data/lib/rubygems/spec_fetcher.rb +47 -15
  310. data/lib/rubygems/specification.rb +110 -183
  311. data/lib/rubygems/specification_policy.rb +33 -13
  312. data/lib/rubygems/specification_record.rb +212 -0
  313. data/lib/rubygems/stub_specification.rb +32 -10
  314. data/lib/rubygems/target_rbconfig.rb +50 -0
  315. data/lib/rubygems/uninstaller.rb +42 -22
  316. data/lib/rubygems/uri.rb +6 -6
  317. data/lib/rubygems/uri_formatter.rb +2 -1
  318. data/lib/rubygems/util/licenses.rb +118 -1
  319. data/lib/rubygems/util.rb +1 -1
  320. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  321. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  322. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  323. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  324. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  325. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  326. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  327. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  328. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  329. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  330. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  331. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  332. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
  333. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  334. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  335. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
  336. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
  337. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
  338. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
  339. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
  340. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  341. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
  342. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +3 -3
  343. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
  344. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +35 -30
  345. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
  346. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
  347. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
  348. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +149 -70
  349. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
  350. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  351. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  352. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  353. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  354. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  355. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +158 -62
  356. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  357. data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +165 -69
  358. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  359. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  360. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  361. data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +10 -11
  362. data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
  363. data/lib/rubygems/vendor/uri/COPYING +56 -0
  364. data/lib/rubygems/vendor/uri/lib/uri/common.rb +880 -0
  365. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  366. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  367. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1579 -0
  368. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  369. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  370. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  371. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  372. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  373. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  374. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  375. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  376. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  377. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  378. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  379. data/lib/rubygems/vendored_molinillo.rb +3 -0
  380. data/lib/rubygems/vendored_net_http.rb +5 -0
  381. data/lib/rubygems/vendored_optparse.rb +3 -0
  382. data/lib/rubygems/vendored_securerandom.rb +3 -0
  383. data/lib/rubygems/vendored_timeout.rb +5 -0
  384. data/lib/rubygems/vendored_tsort.rb +3 -0
  385. data/lib/rubygems/version.rb +26 -9
  386. data/lib/rubygems/yaml_serializer.rb +12 -7
  387. data/lib/rubygems.rb +160 -53
  388. data/rubygems-update.gemspec +11 -6
  389. data/setup.rb +1 -1
  390. metadata +124 -96
  391. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +0 -32
  392. data/bundler/lib/bundler/gem_helpers.rb +0 -127
  393. data/bundler/lib/bundler/templates/Executable.bundler +0 -109
  394. data/bundler/lib/bundler/vendor/fileutils/.document +0 -1
  395. data/bundler/lib/bundler/vendor/net-http-persistent/.document +0 -1
  396. data/bundler/lib/bundler/vendor/pub_grub/.document +0 -1
  397. data/bundler/lib/bundler/vendor/thor/.document +0 -1
  398. data/bundler/lib/bundler/vendor/tsort/.document +0 -1
  399. data/bundler/lib/bundler/vendor/uri/.document +0 -1
  400. data/lib/rubygems/net/http.rb +0 -3
  401. data/lib/rubygems/net-http/.document +0 -1
  402. data/lib/rubygems/net-http/LICENSE.txt +0 -22
  403. data/lib/rubygems/net-http/lib/net/http/backward.rb +0 -40
  404. data/lib/rubygems/net-protocol/.document +0 -1
  405. data/lib/rubygems/net-protocol/LICENSE.txt +0 -22
  406. data/lib/rubygems/optparse/.document +0 -1
  407. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  408. data/lib/rubygems/optparse.rb +0 -3
  409. data/lib/rubygems/resolv/.document +0 -1
  410. data/lib/rubygems/resolv/LICENSE.txt +0 -22
  411. data/lib/rubygems/resolver/molinillo/.document +0 -1
  412. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  413. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  414. data/lib/rubygems/resolver/molinillo.rb +0 -3
  415. data/lib/rubygems/shellwords.rb +0 -3
  416. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +0 -21
  417. data/lib/rubygems/timeout/.document +0 -1
  418. data/lib/rubygems/timeout/LICENSE.txt +0 -22
  419. data/lib/rubygems/timeout.rb +0 -3
  420. data/lib/rubygems/tsort/.document +0 -1
  421. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  422. data/lib/rubygems/tsort.rb +0 -3
  423. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  424. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  425. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  426. /data/lib/rubygems/ssl_certs/rubygems.org/{GlobalSignRootCA_R3.pem → GlobalSign.pem} +0 -0
  427. /data/{bundler/lib/bundler/vendor/connection_pool → lib/rubygems/vendor}/.document +0 -0
  428. /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
  429. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
  430. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
  431. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  432. /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
  433. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  434. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  435. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  436. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  437. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -7,7 +7,7 @@ class Gem::SpecificationPolicy
7
7
 
8
8
  VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
9
9
 
10
- SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/ # :nodoc:
10
+ SPECIAL_CHARACTERS = /\A[#{Regexp.escape(".-_")}]+/ # :nodoc:
11
11
 
12
12
  VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc:
13
13
 
@@ -45,6 +45,7 @@ class Gem::SpecificationPolicy
45
45
 
46
46
  def validate(strict = false)
47
47
  validate_required!
48
+ validate_required_metadata!
48
49
 
49
50
  validate_optional(strict) if packaging || strict
50
51
 
@@ -85,15 +86,17 @@ class Gem::SpecificationPolicy
85
86
 
86
87
  validate_authors_field
87
88
 
88
- validate_metadata
89
-
90
89
  validate_licenses_length
91
90
 
92
- validate_lazy_metadata
93
-
94
91
  validate_duplicate_dependencies
95
92
  end
96
93
 
94
+ def validate_required_metadata!
95
+ validate_metadata
96
+
97
+ validate_lazy_metadata
98
+ end
99
+
97
100
  def validate_optional(strict)
98
101
  validate_licenses
99
102
 
@@ -103,6 +106,8 @@ class Gem::SpecificationPolicy
103
106
 
104
107
  validate_dependencies
105
108
 
109
+ validate_required_ruby_version
110
+
106
111
  validate_extensions
107
112
 
108
113
  validate_removed_attributes
@@ -118,6 +123,13 @@ class Gem::SpecificationPolicy
118
123
  end
119
124
  end
120
125
 
126
+ ##
127
+ # Implementation for Specification#validate_for_resolution
128
+
129
+ def validate_for_resolution
130
+ validate_required!
131
+ end
132
+
121
133
  ##
122
134
  # Implementation for Specification#validate_metadata
123
135
 
@@ -227,6 +239,12 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
227
239
  end
228
240
  end
229
241
 
242
+ def validate_required_ruby_version
243
+ if @specification.required_ruby_version.requirements == [Gem::Requirement::DefaultRequirement]
244
+ warning "make sure you specify the oldest ruby version constraint (like \">= 3.0\") that you want your gem to support by setting the `required_ruby_version` gemspec attribute"
245
+ end
246
+ end
247
+
230
248
  ##
231
249
  # Issues a warning for each file to be packaged which is world-readable.
232
250
  #
@@ -266,7 +284,9 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
266
284
 
267
285
  return if rubygems_version == Gem::VERSION
268
286
 
269
- error "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
287
+ warning "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
288
+
289
+ @specification.rubygems_version = Gem::VERSION
270
290
  end
271
291
 
272
292
  def validate_required_attributes
@@ -287,7 +307,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
287
307
  elsif !VALID_NAME_PATTERN.match?(name)
288
308
  error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
289
309
  elsif SPECIAL_CHARACTERS.match?(name)
290
- error "invalid value for attribute name: #{name.dump} can not begin with a period, dash, or underscore"
310
+ error "invalid value for attribute name: #{name.dump} cannot begin with a period, dash, or underscore"
291
311
  end
292
312
  end
293
313
 
@@ -427,13 +447,13 @@ or set it to nil if you don't want to specify a license.
427
447
 
428
448
  # Make sure a homepage is valid HTTP/HTTPS URI
429
449
  if homepage && !homepage.empty?
430
- require "uri"
450
+ require_relative "vendor/uri/lib/uri"
431
451
  begin
432
- homepage_uri = URI.parse(homepage)
433
- unless [URI::HTTP, URI::HTTPS].member? homepage_uri.class
452
+ homepage_uri = Gem::URI.parse(homepage)
453
+ unless [Gem::URI::HTTP, Gem::URI::HTTPS].member? homepage_uri.class
434
454
  error "\"#{homepage}\" is not a valid HTTP URI"
435
455
  end
436
- rescue URI::InvalidURIError
456
+ rescue Gem::URI::InvalidURIError
437
457
  error "\"#{homepage}\" is not a valid HTTP URI"
438
458
  end
439
459
  end
@@ -497,10 +517,10 @@ You have specified rust based extension, but Cargo.lock is not part of the gem f
497
517
 
498
518
  def validate_rake_extensions(builder) # :nodoc:
499
519
  rake_extension = @specification.extensions.any? {|s| builder.builder_for(s) == Gem::Ext::RakeBuilder }
500
- rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" }
520
+ rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" && d.type == :runtime }
501
521
 
502
522
  warning <<-WARNING if rake_extension && !rake_dependency
503
- You have specified rake based extension, but rake is not added as dependency. It is recommended to add rake as a dependency in gemspec since there's no guarantee rake will be already installed.
523
+ You have specified rake based extension, but rake is not added as runtime dependency. It is recommended to add rake as a runtime dependency in gemspec since there's no guarantee rake will be already installed.
504
524
  WARNING
505
525
  end
506
526
 
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gem
4
+ class SpecificationRecord
5
+ def self.dirs_from(paths)
6
+ paths.map do |path|
7
+ File.join(path, "specifications")
8
+ end
9
+ end
10
+
11
+ def self.from_path(path)
12
+ new(dirs_from([path]))
13
+ end
14
+
15
+ def initialize(dirs)
16
+ @all = nil
17
+ @stubs = nil
18
+ @stubs_by_name = {}
19
+ @spec_with_requirable_file = {}
20
+ @active_stub_with_requirable_file = {}
21
+
22
+ @dirs = dirs
23
+ end
24
+
25
+ # Sentinel object to represent "not found" stubs
26
+ NOT_FOUND = Struct.new(:to_spec, :this).new
27
+ private_constant :NOT_FOUND
28
+
29
+ ##
30
+ # Returns the list of all specifications in the record
31
+
32
+ def all
33
+ @all ||= stubs.map(&:to_spec)
34
+ end
35
+
36
+ ##
37
+ # Returns a Gem::StubSpecification for every specification in the record
38
+
39
+ def stubs
40
+ @stubs ||= begin
41
+ pattern = "*.gemspec"
42
+ stubs = stubs_for_pattern(pattern, false)
43
+
44
+ @stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
45
+ stubs
46
+ end
47
+ end
48
+
49
+ ##
50
+ # Returns a Gem::StubSpecification for every specification in the record
51
+ # named +name+ only returns stubs that match Gem.platforms
52
+
53
+ def stubs_for(name)
54
+ if @stubs
55
+ @stubs_by_name[name] || []
56
+ else
57
+ @stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
58
+ s.name == name
59
+ end
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Finds stub specifications matching a pattern in the record, optionally
65
+ # filtering out specs not matching the current platform
66
+
67
+ def stubs_for_pattern(pattern, match_platform = true)
68
+ installed_stubs = installed_stubs(pattern)
69
+ installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
70
+ stubs = installed_stubs + Gem::Specification.default_stubs(pattern)
71
+ Gem::Specification._resort!(stubs)
72
+ stubs
73
+ end
74
+
75
+ ##
76
+ # Adds +spec+ to the the record, keeping the collection properly sorted.
77
+
78
+ def add_spec(spec)
79
+ return if all.include? spec
80
+
81
+ all << spec
82
+ stubs << spec
83
+ (@stubs_by_name[spec.name] ||= []) << spec
84
+
85
+ Gem::Specification._resort!(@stubs_by_name[spec.name])
86
+ Gem::Specification._resort!(stubs)
87
+ end
88
+
89
+ ##
90
+ # Removes +spec+ from the record.
91
+
92
+ def remove_spec(spec)
93
+ all.delete spec.to_spec
94
+ stubs.delete spec
95
+ (@stubs_by_name[spec.name] || []).delete spec
96
+ end
97
+
98
+ ##
99
+ # Sets the specs known by the record to +specs+.
100
+
101
+ def all=(specs)
102
+ @stubs_by_name = specs.group_by(&:name)
103
+ @all = @stubs = specs
104
+ end
105
+
106
+ ##
107
+ # Return full names of all specs in the record in sorted order.
108
+
109
+ def all_names
110
+ all.map(&:full_name)
111
+ end
112
+
113
+ include Enumerable
114
+
115
+ ##
116
+ # Enumerate every known spec.
117
+
118
+ def each
119
+ return enum_for(:each) unless block_given?
120
+
121
+ all.each do |x|
122
+ yield x
123
+ end
124
+ end
125
+
126
+ ##
127
+ # Returns every spec in the record that matches +name+ and optional +requirements+.
128
+
129
+ def find_all_by_name(name, *requirements)
130
+ req = Gem::Requirement.create(*requirements)
131
+ env_req = Gem.env_requirement(name)
132
+
133
+ matches = stubs_for(name).find_all do |spec|
134
+ req.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version)
135
+ end.map(&:to_spec)
136
+
137
+ if name == "bundler" && !req.specific?
138
+ require_relative "bundler_version_finder"
139
+ Gem::BundlerVersionFinder.prioritize!(matches)
140
+ end
141
+
142
+ matches
143
+ end
144
+
145
+ ##
146
+ # Return the best specification in the record that contains the file matching +path+.
147
+
148
+ def find_by_path(path)
149
+ path = path.dup.freeze
150
+ spec = @spec_with_requirable_file[path] ||= stubs.find do |s|
151
+ s.contains_requirable_file? path
152
+ end || NOT_FOUND
153
+
154
+ spec.to_spec
155
+ end
156
+
157
+ ##
158
+ # Return the best specification in the record that contains the file
159
+ # matching +path+ amongst the specs that are not activated.
160
+
161
+ def find_inactive_by_path(path)
162
+ stub = stubs.find do |s|
163
+ next if s.activated?
164
+ s.contains_requirable_file? path
165
+ end
166
+ stub&.to_spec
167
+ end
168
+
169
+ ##
170
+ # Return the best specification in the record that contains the file
171
+ # matching +path+, among those already activated.
172
+
173
+ def find_active_stub_by_path(path)
174
+ stub = @active_stub_with_requirable_file[path] ||= stubs.find do |s|
175
+ s.activated? && s.contains_requirable_file?(path)
176
+ end || NOT_FOUND
177
+
178
+ stub.this
179
+ end
180
+
181
+ ##
182
+ # Return the latest specs in the record, optionally including prerelease
183
+ # specs if +prerelease+ is true.
184
+
185
+ def latest_specs(prerelease)
186
+ Gem::Specification._latest_specs stubs, prerelease
187
+ end
188
+
189
+ ##
190
+ # Return the latest installed spec in the record for gem +name+.
191
+
192
+ def latest_spec_for(name)
193
+ latest_specs(true).find {|installed_spec| installed_spec.name == name }
194
+ end
195
+
196
+ private
197
+
198
+ def installed_stubs(pattern)
199
+ map_stubs(pattern) do |path, base_dir, gems_dir|
200
+ Gem::StubSpecification.gemspec_stub(path, base_dir, gems_dir)
201
+ end
202
+ end
203
+
204
+ def map_stubs(pattern)
205
+ @dirs.flat_map do |dir|
206
+ base_dir = File.dirname dir
207
+ gems_dir = File.join base_dir, "gems"
208
+ Gem::Specification.gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
209
+ end
210
+ end
211
+ end
212
+ end
@@ -83,11 +83,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
83
83
  # True when this gem has been activated
84
84
 
85
85
  def activated?
86
- @activated ||=
87
- begin
88
- loaded = Gem.loaded_specs[name]
89
- loaded && loaded.version == version
90
- end
86
+ @activated ||= !loaded_spec.nil?
91
87
  end
92
88
 
93
89
  def default_gem?
@@ -187,11 +183,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
187
183
  # The full Gem::Specification for this gem, loaded from evalling its gemspec
188
184
 
189
185
  def spec
190
- @spec ||= if @data
191
- loaded = Gem.loaded_specs[name]
192
- loaded if loaded && loaded.version == version
193
- end
194
-
186
+ @spec ||= loaded_spec if @data
195
187
  @spec ||= Gem::Specification.load(loaded_from)
196
188
  end
197
189
  alias_method :to_spec, :spec
@@ -210,4 +202,34 @@ class Gem::StubSpecification < Gem::BasicSpecification
210
202
  def stubbed?
211
203
  data.is_a? StubLine
212
204
  end
205
+
206
+ def ==(other) # :nodoc:
207
+ self.class === other &&
208
+ name == other.name &&
209
+ version == other.version &&
210
+ platform == other.platform
211
+ end
212
+
213
+ alias_method :eql?, :== # :nodoc:
214
+
215
+ def hash # :nodoc:
216
+ name.hash ^ version.hash ^ platform.hash
217
+ end
218
+
219
+ def <=>(other) # :nodoc:
220
+ sort_obj <=> other.sort_obj
221
+ end
222
+
223
+ def sort_obj # :nodoc:
224
+ [name, version, Gem::Platform.sort_priority(platform)]
225
+ end
226
+
227
+ private
228
+
229
+ def loaded_spec
230
+ spec = Gem.loaded_specs[name]
231
+ return unless spec && spec.version == version && spec.default_gem? == default_gem?
232
+
233
+ spec
234
+ end
213
235
  end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbconfig"
4
+
5
+ ##
6
+ # A TargetConfig is a wrapper around an RbConfig object that provides a
7
+ # consistent interface for querying configuration for *deployment target
8
+ # platform*, where the gem being installed is intended to run on.
9
+ #
10
+ # The TargetConfig is typically created from the RbConfig of the running Ruby
11
+ # process, but can also be created from an RbConfig file on disk for cross-
12
+ # compiling gems.
13
+
14
+ class Gem::TargetRbConfig
15
+ attr_reader :path
16
+
17
+ def initialize(rbconfig, path)
18
+ @rbconfig = rbconfig
19
+ @path = path
20
+ end
21
+
22
+ ##
23
+ # Creates a TargetRbConfig for the platform that RubyGems is running on.
24
+
25
+ def self.for_running_ruby
26
+ new(::RbConfig, nil)
27
+ end
28
+
29
+ ##
30
+ # Creates a TargetRbConfig from the RbConfig file at the given path.
31
+ # Typically used for cross-compiling gems.
32
+
33
+ def self.from_path(rbconfig_path)
34
+ namespace = Module.new do |m|
35
+ # Load the rbconfig.rb file within a new anonymous module to avoid
36
+ # conflicts with the rbconfig for the running platform.
37
+ Kernel.load rbconfig_path, m
38
+ end
39
+ rbconfig = namespace.const_get(:RbConfig)
40
+
41
+ new(rbconfig, rbconfig_path)
42
+ end
43
+
44
+ ##
45
+ # Queries the configuration for the given key.
46
+
47
+ def [](key)
48
+ @rbconfig::CONFIG[key]
49
+ end
50
+ end
@@ -10,7 +10,6 @@ require "fileutils"
10
10
  require_relative "../rubygems"
11
11
  require_relative "installer_uninstaller_utils"
12
12
  require_relative "dependency_list"
13
- require_relative "rdoc"
14
13
  require_relative "user_interaction"
15
14
 
16
15
  ##
@@ -32,7 +31,7 @@ class Gem::Uninstaller
32
31
  attr_reader :bin_dir
33
32
 
34
33
  ##
35
- # The gem repository the gem will be installed into
34
+ # The gem repository the gem will be uninstalled from
36
35
 
37
36
  attr_reader :gem_home
38
37
 
@@ -49,8 +48,9 @@ class Gem::Uninstaller
49
48
  # TODO: document the valid options
50
49
  @gem = gem
51
50
  @version = options[:version] || Gem::Requirement.default
52
- @gem_home = File.realpath(options[:install_dir] || Gem.dir)
53
- @plugins_dir = Gem.plugindir(@gem_home)
51
+ @install_dir = options[:install_dir]
52
+ @gem_home = File.realpath(@install_dir || Gem.dir)
53
+ @user_dir = File.exist?(Gem.user_dir) ? File.realpath(Gem.user_dir) : Gem.user_dir
54
54
  @force_executables = options[:executables]
55
55
  @force_all = options[:all]
56
56
  @force_ignore = options[:ignore]
@@ -70,7 +70,7 @@ class Gem::Uninstaller
70
70
 
71
71
  # only add user directory if install_dir is not set
72
72
  @user_install = false
73
- @user_install = options[:user_install] unless options[:install_dir]
73
+ @user_install = options[:user_install] unless @install_dir
74
74
 
75
75
  # Optimization: populated during #uninstall
76
76
  @default_specs_matching_uninstall_params = []
@@ -85,11 +85,7 @@ class Gem::Uninstaller
85
85
 
86
86
  list = []
87
87
 
88
- dirs =
89
- Gem::Specification.dirs +
90
- [Gem.default_specifications_dir]
91
-
92
- Gem::Specification.each_spec dirs do |spec|
88
+ specification_record.stubs.each do |spec|
93
89
  next unless dependency.matches_spec? spec
94
90
 
95
91
  list << spec
@@ -101,11 +97,11 @@ class Gem::Uninstaller
101
97
 
102
98
  default_specs, list = list.partition(&:default_gem?)
103
99
  warn_cannot_uninstall_default_gems(default_specs - list)
104
- @default_specs_matching_uninstall_params = default_specs
100
+ @default_specs_matching_uninstall_params = default_specs.map(&:to_spec)
105
101
 
106
102
  list, other_repo_specs = list.partition do |spec|
107
103
  @gem_home == spec.base_dir ||
108
- (@user_install && spec.base_dir == Gem.user_dir)
104
+ (@user_install && spec.base_dir == @user_dir)
109
105
  end
110
106
 
111
107
  list.sort!
@@ -125,7 +121,7 @@ class Gem::Uninstaller
125
121
  remove_all list
126
122
 
127
123
  elsif list.size > 1
128
- gem_names = list.map(&:full_name)
124
+ gem_names = list.map(&:full_name_with_location)
129
125
  gem_names << "All versions"
130
126
 
131
127
  say
@@ -146,7 +142,9 @@ class Gem::Uninstaller
146
142
  ##
147
143
  # Uninstalls gem +spec+
148
144
 
149
- def uninstall_gem(spec)
145
+ def uninstall_gem(stub)
146
+ spec = stub.to_spec
147
+
150
148
  @spec = spec
151
149
 
152
150
  unless dependencies_ok? spec
@@ -164,6 +162,8 @@ class Gem::Uninstaller
164
162
  remove_plugins @spec
165
163
  remove @spec
166
164
 
165
+ specification_record.remove_spec(stub)
166
+
167
167
  regenerate_plugins
168
168
 
169
169
  Gem.post_uninstall_hooks.each do |hook|
@@ -177,7 +177,7 @@ class Gem::Uninstaller
177
177
  # Removes installed executables and batch files (windows only) for +spec+.
178
178
 
179
179
  def remove_executables(spec)
180
- return if spec.executables.empty?
180
+ return if spec.executables.empty? || default_spec_matches?(spec)
181
181
 
182
182
  executables = spec.executables.clone
183
183
 
@@ -239,7 +239,7 @@ class Gem::Uninstaller
239
239
 
240
240
  def remove(spec)
241
241
  unless path_ok?(@gem_home, spec) ||
242
- (@user_install && path_ok?(Gem.user_dir, spec))
242
+ (@user_install && path_ok?(@user_dir, spec))
243
243
  e = Gem::GemNotInHomeException.new \
244
244
  "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
245
245
  e.spec = spec
@@ -250,7 +250,15 @@ class Gem::Uninstaller
250
250
  raise Gem::FilePermissionError, spec.base_dir unless
251
251
  File.writable?(spec.base_dir)
252
252
 
253
- safe_delete { FileUtils.rm_r spec.full_gem_path }
253
+ full_gem_path = spec.full_gem_path
254
+ exclusions = []
255
+
256
+ if default_spec_matches?(spec) && spec.executables.any?
257
+ exclusions = spec.executables.map {|exe| File.join(spec.bin_dir, exe) }
258
+ exclusions << File.dirname(exclusions.last) until exclusions.last == full_gem_path
259
+ end
260
+
261
+ safe_delete { rm_r full_gem_path, exclusions: exclusions }
254
262
  safe_delete { FileUtils.rm_r spec.extension_dir }
255
263
 
256
264
  old_platform_name = spec.original_name
@@ -274,8 +282,6 @@ class Gem::Uninstaller
274
282
 
275
283
  safe_delete { FileUtils.rm_r gemspec }
276
284
  announce_deletion_of(spec)
277
-
278
- Gem::Specification.reset
279
285
  end
280
286
 
281
287
  ##
@@ -284,17 +290,17 @@ class Gem::Uninstaller
284
290
  def remove_plugins(spec) # :nodoc:
285
291
  return if spec.plugins.empty?
286
292
 
287
- remove_plugins_for(spec, @plugins_dir)
293
+ remove_plugins_for(spec, plugin_dir_for(spec))
288
294
  end
289
295
 
290
296
  ##
291
297
  # Regenerates plugin wrappers after removal.
292
298
 
293
299
  def regenerate_plugins
294
- latest = Gem::Specification.latest_spec_for(@spec.name)
300
+ latest = specification_record.latest_spec_for(@spec.name)
295
301
  return if latest.nil?
296
302
 
297
- regenerate_plugins_for(latest, @plugins_dir)
303
+ regenerate_plugins_for(latest, plugin_dir_for(@spec))
298
304
  end
299
305
 
300
306
  ##
@@ -379,6 +385,16 @@ class Gem::Uninstaller
379
385
 
380
386
  private
381
387
 
388
+ def rm_r(path, exclusions:)
389
+ FileUtils::Entry_.new(path).postorder_traverse do |ent|
390
+ ent.remove unless exclusions.include?(ent.path)
391
+ end
392
+ end
393
+
394
+ def specification_record
395
+ @specification_record ||= @install_dir ? Gem::SpecificationRecord.from_path(@install_dir) : Gem::Specification.specification_record
396
+ end
397
+
382
398
  def announce_deletion_of(spec)
383
399
  name = spec.full_name
384
400
  say "Successfully uninstalled #{name}"
@@ -406,4 +422,8 @@ class Gem::Uninstaller
406
422
  say "Gem #{spec.full_name} cannot be uninstalled because it is a default gem"
407
423
  end
408
424
  end
425
+
426
+ def plugin_dir_for(spec)
427
+ Gem.plugindir(spec.base_dir)
428
+ end
409
429
  end
data/lib/rubygems/uri.rb CHANGED
@@ -16,9 +16,9 @@ class Gem::Uri
16
16
  # Parses uri, raising if it's invalid
17
17
 
18
18
  def self.parse!(uri)
19
- require "uri"
19
+ require_relative "vendor/uri/lib/uri"
20
20
 
21
- raise URI::InvalidURIError unless uri
21
+ raise Gem::URI::InvalidURIError unless uri
22
22
 
23
23
  return uri unless uri.is_a?(String)
24
24
 
@@ -28,9 +28,9 @@ class Gem::Uri
28
28
  # as "%7BDESede%7D". If this is escaped again the percentage
29
29
  # symbols will be escaped.
30
30
  begin
31
- URI.parse(uri)
32
- rescue URI::InvalidURIError
33
- URI.parse(URI::DEFAULT_PARSER.escape(uri))
31
+ Gem::URI.parse(uri)
32
+ rescue Gem::URI::InvalidURIError
33
+ Gem::URI.parse(Gem::URI::RFC2396_PARSER.escape(uri))
34
34
  end
35
35
  end
36
36
 
@@ -39,7 +39,7 @@ class Gem::Uri
39
39
 
40
40
  def self.parse(uri)
41
41
  parse!(uri)
42
- rescue URI::InvalidURIError
42
+ rescue Gem::URI::InvalidURIError
43
43
  uri
44
44
  end
45
45
 
@@ -17,7 +17,8 @@ class Gem::UriFormatter
17
17
  # Creates a new URI formatter for +uri+.
18
18
 
19
19
  def initialize(uri)
20
- require "cgi"
20
+ require "cgi/escape"
21
+ require "cgi/util" unless defined?(CGI::EscapeExt)
21
22
 
22
23
  @uri = uri
23
24
  end