rubygems-update 3.5.5 → 3.6.9

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 (413) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +606 -1
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +114 -73
  5. data/README.md +16 -11
  6. data/bundler/CHANGELOG.md +506 -6
  7. data/bundler/README.md +2 -2
  8. data/bundler/bundler.gemspec +2 -2
  9. data/bundler/lib/bundler/build_metadata.rb +2 -2
  10. data/bundler/lib/bundler/checksum.rb +22 -12
  11. data/bundler/lib/bundler/cli/add.rb +3 -1
  12. data/bundler/lib/bundler/cli/binstubs.rb +1 -1
  13. data/bundler/lib/bundler/cli/check.rb +3 -3
  14. data/bundler/lib/bundler/cli/console.rb +8 -10
  15. data/bundler/lib/bundler/cli/doctor/diagnose.rb +167 -0
  16. data/bundler/lib/bundler/cli/doctor/ssl.rb +249 -0
  17. data/bundler/lib/bundler/cli/doctor.rb +27 -151
  18. data/bundler/lib/bundler/cli/exec.rb +1 -0
  19. data/bundler/lib/bundler/cli/fund.rb +1 -1
  20. data/bundler/lib/bundler/cli/gem.rb +13 -17
  21. data/bundler/lib/bundler/cli/info.rb +6 -6
  22. data/bundler/lib/bundler/cli/inject.rb +3 -3
  23. data/bundler/lib/bundler/cli/install.rb +14 -5
  24. data/bundler/lib/bundler/cli/issue.rb +3 -3
  25. data/bundler/lib/bundler/cli/lock.rb +32 -11
  26. data/bundler/lib/bundler/cli/outdated.rb +22 -22
  27. data/bundler/lib/bundler/cli/plugin.rb +3 -2
  28. data/bundler/lib/bundler/cli/pristine.rb +1 -1
  29. data/bundler/lib/bundler/cli/show.rb +3 -3
  30. data/bundler/lib/bundler/cli.rb +51 -107
  31. data/bundler/lib/bundler/compact_index_client/cache.rb +48 -73
  32. data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -5
  33. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  34. data/bundler/lib/bundler/compact_index_client/updater.rb +2 -12
  35. data/bundler/lib/bundler/compact_index_client.rb +51 -80
  36. data/bundler/lib/bundler/constants.rb +8 -1
  37. data/bundler/lib/bundler/current_ruby.rb +23 -33
  38. data/bundler/lib/bundler/definition.rb +485 -313
  39. data/bundler/lib/bundler/dependency.rb +92 -46
  40. data/bundler/lib/bundler/dsl.rb +135 -101
  41. data/bundler/lib/bundler/endpoint_specification.rb +30 -3
  42. data/bundler/lib/bundler/env.rb +1 -1
  43. data/bundler/lib/bundler/environment_preserver.rb +5 -23
  44. data/bundler/lib/bundler/errors.rb +53 -5
  45. data/bundler/lib/bundler/feature_flag.rb +3 -6
  46. data/bundler/lib/bundler/fetcher/compact_index.rb +16 -25
  47. data/bundler/lib/bundler/fetcher/downloader.rb +1 -1
  48. data/bundler/lib/bundler/fetcher.rb +14 -7
  49. data/bundler/lib/bundler/force_platform.rb +0 -2
  50. data/bundler/lib/bundler/friendly_errors.rb +1 -1
  51. data/bundler/lib/bundler/gem_helper.rb +1 -1
  52. data/bundler/lib/bundler/gem_helpers.rb +36 -19
  53. data/bundler/lib/bundler/gem_version_promoter.rb +42 -40
  54. data/bundler/lib/bundler/injector.rb +14 -16
  55. data/bundler/lib/bundler/inline.rb +42 -17
  56. data/bundler/lib/bundler/installer/gem_installer.rb +4 -3
  57. data/bundler/lib/bundler/installer/parallel_installer.rb +3 -2
  58. data/bundler/lib/bundler/installer/standalone.rb +2 -5
  59. data/bundler/lib/bundler/installer.rb +17 -41
  60. data/bundler/lib/bundler/lazy_specification.rb +117 -46
  61. data/bundler/lib/bundler/lockfile_generator.rb +1 -1
  62. data/bundler/lib/bundler/lockfile_parser.rb +18 -7
  63. data/bundler/lib/bundler/man/bundle-add.1 +44 -27
  64. data/bundler/lib/bundler/man/bundle-add.1.ronn +52 -23
  65. data/bundler/lib/bundler/man/bundle-binstubs.1 +9 -6
  66. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  67. data/bundler/lib/bundler/man/bundle-cache.1 +32 -4
  68. data/bundler/lib/bundler/man/bundle-cache.1.ronn +31 -2
  69. data/bundler/lib/bundler/man/bundle-check.1 +7 -5
  70. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  71. data/bundler/lib/bundler/man/bundle-clean.1 +3 -3
  72. data/bundler/lib/bundler/man/bundle-config.1 +11 -15
  73. data/bundler/lib/bundler/man/bundle-config.1.ronn +12 -15
  74. data/bundler/lib/bundler/man/bundle-console.1 +4 -6
  75. data/bundler/lib/bundler/man/bundle-console.1.ronn +2 -7
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -4
  77. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  78. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  79. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  80. data/bundler/lib/bundler/man/bundle-exec.1 +9 -6
  81. data/bundler/lib/bundler/man/bundle-exec.1.ronn +6 -3
  82. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  83. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  84. data/bundler/lib/bundler/man/bundle-gem.1 +25 -7
  85. data/bundler/lib/bundler/man/bundle-gem.1.ronn +38 -6
  86. data/bundler/lib/bundler/man/bundle-help.1 +3 -3
  87. data/bundler/lib/bundler/man/bundle-info.1 +7 -4
  88. data/bundler/lib/bundler/man/bundle-info.1.ronn +6 -2
  89. data/bundler/lib/bundler/man/bundle-init.1 +5 -5
  90. data/bundler/lib/bundler/man/bundle-init.1.ronn +3 -2
  91. data/bundler/lib/bundler/man/bundle-inject.1 +12 -4
  92. data/bundler/lib/bundler/man/bundle-inject.1.ronn +9 -1
  93. data/bundler/lib/bundler/man/bundle-install.1 +19 -16
  94. data/bundler/lib/bundler/man/bundle-install.1.ronn +24 -20
  95. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  96. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  97. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  98. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  99. data/bundler/lib/bundler/man/bundle-list.1 +3 -3
  100. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  101. data/bundler/lib/bundler/man/bundle-lock.1 +23 -8
  102. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  103. data/bundler/lib/bundler/man/bundle-open.1 +4 -4
  104. data/bundler/lib/bundler/man/bundle-open.1.ronn +2 -1
  105. data/bundler/lib/bundler/man/bundle-outdated.1 +10 -7
  106. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +8 -4
  107. data/bundler/lib/bundler/man/bundle-platform.1 +3 -3
  108. data/bundler/lib/bundler/man/bundle-plugin.1 +9 -6
  109. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +7 -3
  110. data/bundler/lib/bundler/man/bundle-pristine.1 +3 -3
  111. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  112. data/bundler/lib/bundler/man/bundle-remove.1 +3 -3
  113. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  114. data/bundler/lib/bundler/man/bundle-show.1 +7 -4
  115. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  116. data/bundler/lib/bundler/man/bundle-update.1 +15 -9
  117. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  118. data/bundler/lib/bundler/man/bundle-version.1 +3 -3
  119. data/bundler/lib/bundler/man/bundle-viz.1 +6 -6
  120. data/bundler/lib/bundler/man/bundle-viz.1.ronn +7 -3
  121. data/bundler/lib/bundler/man/bundle.1 +3 -3
  122. data/bundler/lib/bundler/man/gemfile.5 +7 -5
  123. data/bundler/lib/bundler/man/gemfile.5.ronn +8 -2
  124. data/bundler/lib/bundler/man/index.txt +4 -0
  125. data/bundler/lib/bundler/match_metadata.rb +13 -0
  126. data/bundler/lib/bundler/materialization.rb +59 -0
  127. data/bundler/lib/bundler/mirror.rb +3 -3
  128. data/bundler/lib/bundler/plugin/api/source.rb +5 -4
  129. data/bundler/lib/bundler/plugin/events.rb +24 -0
  130. data/bundler/lib/bundler/plugin/index.rb +5 -1
  131. data/bundler/lib/bundler/plugin/installer/path.rb +26 -0
  132. data/bundler/lib/bundler/plugin/installer.rb +37 -17
  133. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  134. data/bundler/lib/bundler/plugin.rb +21 -2
  135. data/bundler/lib/bundler/process_lock.rb +10 -14
  136. data/bundler/lib/bundler/remote_specification.rb +6 -1
  137. data/bundler/lib/bundler/resolver/base.rb +14 -3
  138. data/bundler/lib/bundler/resolver/candidate.rb +18 -27
  139. data/bundler/lib/bundler/resolver/package.rb +20 -3
  140. data/bundler/lib/bundler/resolver/spec_group.rb +22 -27
  141. data/bundler/lib/bundler/resolver/strategy.rb +40 -0
  142. data/bundler/lib/bundler/resolver.rb +114 -50
  143. data/bundler/lib/bundler/retry.rb +1 -1
  144. data/bundler/lib/bundler/ruby_dsl.rb +12 -3
  145. data/bundler/lib/bundler/ruby_version.rb +7 -1
  146. data/bundler/lib/bundler/rubygems_ext.rb +282 -125
  147. data/bundler/lib/bundler/rubygems_gem_installer.rb +40 -5
  148. data/bundler/lib/bundler/rubygems_integration.rb +29 -67
  149. data/bundler/lib/bundler/runtime.rb +48 -35
  150. data/bundler/lib/bundler/self_manager.rb +27 -7
  151. data/bundler/lib/bundler/settings.rb +32 -21
  152. data/bundler/lib/bundler/setup.rb +6 -0
  153. data/bundler/lib/bundler/shared_helpers.rb +39 -21
  154. data/bundler/lib/bundler/source/gemspec.rb +1 -4
  155. data/bundler/lib/bundler/source/git/git_proxy.rb +23 -6
  156. data/bundler/lib/bundler/source/git.rb +113 -41
  157. data/bundler/lib/bundler/source/metadata.rb +4 -3
  158. data/bundler/lib/bundler/source/path.rb +7 -18
  159. data/bundler/lib/bundler/source/rubygems/remote.rb +12 -4
  160. data/bundler/lib/bundler/source/rubygems.rb +54 -48
  161. data/bundler/lib/bundler/source.rb +2 -0
  162. data/bundler/lib/bundler/source_list.rb +53 -7
  163. data/bundler/lib/bundler/spec_set.rb +187 -88
  164. data/bundler/lib/bundler/stub_specification.rb +29 -2
  165. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  166. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -3
  167. data/bundler/lib/bundler/templates/newgem/README.md.tt +7 -3
  168. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +15 -15
  169. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -7
  170. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  171. data/bundler/lib/bundler/ui/shell.rb +24 -2
  172. data/bundler/lib/bundler/ui/silent.rb +12 -1
  173. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  174. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  175. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  176. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  177. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +15 -13
  178. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +68 -30
  179. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  180. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  181. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  182. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  183. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  184. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  185. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  186. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +3 -5
  187. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +11 -0
  188. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +1 -4
  189. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +2 -2
  190. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +2 -1
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +9 -9
  192. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
  193. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +5 -21
  194. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  195. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  196. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +11 -0
  197. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  198. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +43 -16
  199. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +3 -3
  200. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +1 -1
  201. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +28 -37
  202. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +2 -2
  203. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -9
  204. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +26 -3
  205. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  206. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +9 -9
  207. data/bundler/lib/bundler/vendored_net_http.rb +20 -5
  208. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  209. data/bundler/lib/bundler/vendored_timeout.rb +7 -3
  210. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  211. data/bundler/lib/bundler/version.rb +1 -1
  212. data/bundler/lib/bundler/yaml_serializer.rb +12 -7
  213. data/bundler/lib/bundler.rb +89 -51
  214. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +10 -14
  215. data/{POLICIES.md → doc/rubygems/POLICIES.md} +81 -12
  216. data/exe/update_rubygems +1 -1
  217. data/lib/rubygems/basic_specification.rb +43 -10
  218. data/lib/rubygems/bundler_version_finder.rb +1 -1
  219. data/lib/rubygems/command.rb +1 -4
  220. data/lib/rubygems/command_manager.rb +5 -6
  221. data/lib/rubygems/commands/build_command.rb +2 -11
  222. data/lib/rubygems/commands/cleanup_command.rb +3 -13
  223. data/lib/rubygems/commands/contents_command.rb +17 -10
  224. data/lib/rubygems/commands/environment_command.rb +5 -0
  225. data/lib/rubygems/commands/exec_command.rb +18 -11
  226. data/lib/rubygems/commands/fetch_command.rb +14 -0
  227. data/lib/rubygems/commands/help_command.rb +2 -2
  228. data/lib/rubygems/commands/install_command.rb +0 -4
  229. data/lib/rubygems/commands/pristine_command.rb +30 -17
  230. data/lib/rubygems/commands/push_command.rb +31 -6
  231. data/lib/rubygems/commands/rdoc_command.rb +3 -10
  232. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  233. data/lib/rubygems/commands/setup_command.rb +11 -16
  234. data/lib/rubygems/commands/sources_command.rb +2 -2
  235. data/lib/rubygems/commands/uninstall_command.rb +9 -4
  236. data/lib/rubygems/commands/unpack_command.rb +0 -6
  237. data/lib/rubygems/commands/update_command.rb +10 -17
  238. data/lib/rubygems/config_file.rb +45 -16
  239. data/lib/rubygems/core_ext/kernel_warn.rb +2 -6
  240. data/lib/rubygems/defaults.rb +6 -6
  241. data/lib/rubygems/dependency.rb +12 -16
  242. data/lib/rubygems/dependency_list.rb +1 -1
  243. data/lib/rubygems/deprecate.rb +79 -77
  244. data/lib/rubygems/errors.rb +2 -1
  245. data/lib/rubygems/exceptions.rb +2 -9
  246. data/lib/rubygems/ext/builder.rb +21 -8
  247. data/lib/rubygems/ext/cargo_builder.rb +12 -26
  248. data/lib/rubygems/ext/cmake_builder.rb +7 -2
  249. data/lib/rubygems/ext/configure_builder.rb +7 -2
  250. data/lib/rubygems/ext/ext_conf_builder.rb +9 -5
  251. data/lib/rubygems/ext/rake_builder.rb +7 -4
  252. data/lib/rubygems/gem_runner.rb +9 -0
  253. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +1 -1
  254. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -1
  255. data/lib/rubygems/gemcutter_utilities.rb +52 -26
  256. data/lib/rubygems/gemspec_helpers.rb +19 -0
  257. data/lib/rubygems/install_update_options.rb +5 -0
  258. data/lib/rubygems/installer.rb +31 -40
  259. data/lib/rubygems/local_remote_options.rb +8 -8
  260. data/lib/rubygems/package/tar_header.rb +31 -4
  261. data/lib/rubygems/package/tar_reader/entry.rb +1 -5
  262. data/lib/rubygems/package/tar_writer.rb +5 -4
  263. data/lib/rubygems/package.rb +13 -8
  264. data/lib/rubygems/platform.rb +7 -5
  265. data/lib/rubygems/psych_tree.rb +4 -0
  266. data/lib/rubygems/query_utils.rb +2 -2
  267. data/lib/rubygems/rdoc.rb +16 -3
  268. data/lib/rubygems/remote_fetcher.rb +3 -4
  269. data/lib/rubygems/request.rb +5 -5
  270. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  271. data/lib/rubygems/request_set.rb +1 -1
  272. data/lib/rubygems/requirement.rb +16 -12
  273. data/lib/rubygems/resolver/activation_request.rb +1 -1
  274. data/lib/rubygems/resolver/api_set/gem_parser.rb +2 -5
  275. data/lib/rubygems/resolver/api_set.rb +13 -8
  276. data/lib/rubygems/resolver/best_set.rb +0 -28
  277. data/lib/rubygems/resolver/composed_set.rb +3 -3
  278. data/lib/rubygems/resolver/git_set.rb +0 -1
  279. data/lib/rubygems/resolver/index_set.rb +2 -2
  280. data/lib/rubygems/resolver/spec_specification.rb +7 -0
  281. data/lib/rubygems/resolver.rb +7 -7
  282. data/lib/rubygems/s3_uri_signer.rb +3 -3
  283. data/lib/rubygems/safe_marshal/reader.rb +31 -14
  284. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +29 -16
  285. data/lib/rubygems/safe_yaml.rb +10 -1
  286. data/lib/rubygems/security.rb +1 -1
  287. data/lib/rubygems/source/git.rb +22 -17
  288. data/lib/rubygems/source/installed.rb +3 -1
  289. data/lib/rubygems/source/local.rb +8 -4
  290. data/lib/rubygems/source/specific_file.rb +5 -3
  291. data/lib/rubygems/source.rb +10 -8
  292. data/lib/rubygems/source_list.rb +1 -1
  293. data/lib/rubygems/spec_fetcher.rb +47 -15
  294. data/lib/rubygems/specification.rb +107 -180
  295. data/lib/rubygems/specification_policy.rb +33 -13
  296. data/lib/rubygems/specification_record.rb +212 -0
  297. data/lib/rubygems/stub_specification.rb +32 -10
  298. data/lib/rubygems/target_rbconfig.rb +50 -0
  299. data/lib/rubygems/uninstaller.rb +42 -22
  300. data/lib/rubygems/uri.rb +6 -6
  301. data/lib/rubygems/util/licenses.rb +97 -1
  302. data/lib/rubygems/util.rb +1 -1
  303. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  304. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  305. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  306. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  307. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  308. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  309. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  310. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  311. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  312. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  313. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  314. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  315. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
  316. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  317. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  318. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
  319. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +4 -4
  320. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
  321. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
  322. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
  323. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  324. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
  325. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +3 -3
  326. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
  327. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +35 -30
  328. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
  329. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
  330. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
  331. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +135 -51
  332. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
  333. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  334. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  335. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  336. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  337. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  338. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +158 -62
  339. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  340. data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +117 -49
  341. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  342. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  343. data/lib/rubygems/vendor/timeout/.document +1 -0
  344. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  345. data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +10 -11
  346. data/lib/rubygems/vendor/tsort/.document +1 -0
  347. data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
  348. data/lib/rubygems/vendor/uri/.document +1 -0
  349. data/lib/rubygems/vendor/uri/COPYING +56 -0
  350. data/lib/rubygems/vendor/uri/lib/uri/common.rb +880 -0
  351. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  352. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  353. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1579 -0
  354. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  355. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  356. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  357. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  358. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  359. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  360. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  361. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  362. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  363. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  364. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  365. data/lib/rubygems/vendored_molinillo.rb +3 -0
  366. data/lib/rubygems/vendored_net_http.rb +5 -0
  367. data/lib/rubygems/vendored_optparse.rb +3 -0
  368. data/lib/rubygems/vendored_securerandom.rb +3 -0
  369. data/lib/rubygems/vendored_timeout.rb +5 -0
  370. data/lib/rubygems/vendored_tsort.rb +3 -0
  371. data/lib/rubygems/version.rb +26 -9
  372. data/lib/rubygems/yaml_serializer.rb +12 -7
  373. data/lib/rubygems.rb +82 -47
  374. data/rubygems-update.gemspec +11 -6
  375. data/setup.rb +1 -1
  376. metadata +131 -86
  377. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +0 -32
  378. data/lib/rubygems/net/http.rb +0 -3
  379. data/lib/rubygems/net-http/LICENSE.txt +0 -22
  380. data/lib/rubygems/net-http/lib/net/http/backward.rb +0 -40
  381. data/lib/rubygems/net-protocol/LICENSE.txt +0 -22
  382. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  383. data/lib/rubygems/optparse.rb +0 -3
  384. data/lib/rubygems/resolv/LICENSE.txt +0 -22
  385. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  386. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  387. data/lib/rubygems/resolver/molinillo.rb +0 -3
  388. data/lib/rubygems/shellwords.rb +0 -3
  389. data/lib/rubygems/timeout/LICENSE.txt +0 -22
  390. data/lib/rubygems/timeout.rb +0 -3
  391. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  392. data/lib/rubygems/tsort.rb +0 -3
  393. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  394. /data/{lib/rubygems/net-http → bundler/lib/bundler/vendor/securerandom}/.document +0 -0
  395. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  396. /data/{bundler → doc/bundler}/UPGRADING.md +0 -0
  397. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  398. /data/lib/rubygems/{net-protocol → vendor/molinillo}/.document +0 -0
  399. /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
  400. /data/lib/rubygems/{optparse → vendor/net-http}/.document +0 -0
  401. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
  402. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
  403. /data/lib/rubygems/{resolv → vendor/net-protocol}/.document +0 -0
  404. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  405. /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
  406. /data/lib/rubygems/{resolver/molinillo → vendor/optparse}/.document +0 -0
  407. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  408. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  409. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  410. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  411. /data/lib/rubygems/{timeout → vendor/resolv}/.document +0 -0
  412. /data/lib/rubygems/{tsort → vendor/securerandom}/.document +0 -0
  413. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../shellwords"
4
-
5
3
  # This class is used by rubygems to build Rust extensions. It is a thin-wrapper
6
4
  # over the `cargo rustc` command which takes care of building Rust code in a way
7
5
  # that Ruby can use.
@@ -16,10 +14,15 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
16
14
  @profile = :release
17
15
  end
18
16
 
19
- def build(extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd)
17
+ def build(extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd,
18
+ target_rbconfig=Gem.target_rbconfig)
20
19
  require "tempfile"
21
20
  require "fileutils"
22
21
 
22
+ if target_rbconfig.path
23
+ warn "--target-rbconfig is not yet supported for Rust extensions. Ignoring"
24
+ end
25
+
23
26
  # Where's the Cargo.toml of the crate we're building
24
27
  cargo_toml = File.join(cargo_dir, "Cargo.toml")
25
28
  # What's the crate's name
@@ -47,7 +50,6 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
47
50
 
48
51
  nesting = extension_nesting(extension)
49
52
 
50
- # TODO: remove in RubyGems 4
51
53
  if Gem.install_extension_in_lib && lib_dir
52
54
  nested_lib_dir = File.join(lib_dir, nesting)
53
55
  FileUtils.mkdir_p nested_lib_dir
@@ -155,7 +157,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
155
157
  # We want to use the same linker that Ruby uses, so that the linker flags from
156
158
  # mkmf work properly.
157
159
  def linker_args
158
- cc_flag = Shellwords.split(makefile_config("CC"))
160
+ cc_flag = self.class.shellsplit(makefile_config("CC"))
159
161
  linker = cc_flag.shift
160
162
  link_args = cc_flag.flat_map {|a| ["-C", "link-arg=#{a}"] }
161
163
 
@@ -174,7 +176,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
174
176
 
175
177
  def libruby_args(dest_dir)
176
178
  libs = makefile_config(ruby_static? ? "LIBRUBYARG_STATIC" : "LIBRUBYARG_SHARED")
177
- raw_libs = Shellwords.split(libs)
179
+ raw_libs = self.class.shellsplit(libs)
178
180
  raw_libs.flat_map {|l| ldflag_to_link_modifier(l) }
179
181
  end
180
182
 
@@ -185,6 +187,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder
185
187
  end
186
188
 
187
189
  def cargo_dylib_path(dest_path, crate_name)
190
+ so_ext = RbConfig::CONFIG["SOEXT"]
188
191
  prefix = so_ext == "dll" ? "" : "lib"
189
192
  path_parts = [dest_path]
190
193
  path_parts << ENV["CARGO_BUILD_TARGET"] if ENV["CARGO_BUILD_TARGET"]
@@ -247,8 +250,7 @@ EOF
247
250
 
248
251
  def rustc_dynamic_linker_flags(dest_dir, crate_name)
249
252
  split_flags("DLDFLAGS").
250
- map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir, crate_name) }.
251
- compact.
253
+ filter_map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir, crate_name) }.
252
254
  flat_map {|arg| ldflag_to_link_modifier(arg) }
253
255
  end
254
256
 
@@ -257,7 +259,7 @@ EOF
257
259
  end
258
260
 
259
261
  def split_flags(var)
260
- Shellwords.split(RbConfig::CONFIG.fetch(var, ""))
262
+ self.class.shellsplit(RbConfig::CONFIG.fetch(var, ""))
261
263
  end
262
264
 
263
265
  def ldflag_to_link_modifier(arg)
@@ -293,7 +295,7 @@ EOF
293
295
 
294
296
  case var_name
295
297
  # On windows, it is assumed that mkmf has setup an exports file for the
296
- # extension, so we have to to create one ourselves.
298
+ # extension, so we have to create one ourselves.
297
299
  when "DEFFILE"
298
300
  write_deffile(dest_dir, crate_name)
299
301
  else
@@ -313,22 +315,6 @@ EOF
313
315
  deffile_path
314
316
  end
315
317
 
316
- # We have to basically reimplement <code>RbConfig::CONFIG['SOEXT']</code> here to support
317
- # Ruby < 2.5
318
- #
319
- # @see https://github.com/ruby/ruby/blob/c87c027f18c005460746a74c07cd80ee355b16e4/configure.ac#L3185
320
- def so_ext
321
- return RbConfig::CONFIG["SOEXT"] if RbConfig::CONFIG.key?("SOEXT")
322
-
323
- if win_target?
324
- "dll"
325
- elsif darwin_target?
326
- "dylib"
327
- else
328
- "so"
329
- end
330
- end
331
-
332
318
  # Corresponds to $(LIBPATH) in mkmf
333
319
  def mkmf_libpath
334
320
  ["-L", "native=#{makefile_config("libdir")}"]
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
4
- def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
4
+ def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd,
5
+ target_rbconfig=Gem.target_rbconfig)
6
+ if target_rbconfig.path
7
+ warn "--target-rbconfig is not yet supported for CMake extensions. Ignoring"
8
+ end
9
+
5
10
  unless File.exist?(File.join(cmake_dir, "Makefile"))
6
11
  require_relative "../command"
7
12
  cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]
@@ -9,7 +14,7 @@ class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
9
14
  run cmd, results, class_name, cmake_dir
10
15
  end
11
16
 
12
- make dest_path, results, cmake_dir
17
+ make dest_path, results, cmake_dir, target_rbconfig: target_rbconfig
13
18
 
14
19
  results
15
20
  end
@@ -7,14 +7,19 @@
7
7
  #++
8
8
 
9
9
  class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
10
- def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
10
+ def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd,
11
+ target_rbconfig=Gem.target_rbconfig)
12
+ if target_rbconfig.path
13
+ warn "--target-rbconfig is not yet supported for configure-based extensions. Ignoring"
14
+ end
15
+
11
16
  unless File.exist?(File.join(configure_dir, "Makefile"))
12
17
  cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]
13
18
 
14
19
  run cmd, results, class_name, configure_dir
15
20
  end
16
21
 
17
- make dest_path, results, configure_dir
22
+ make dest_path, results, configure_dir, target_rbconfig: target_rbconfig
18
23
 
19
24
  results
20
25
  end
@@ -7,7 +7,8 @@
7
7
  #++
8
8
 
9
9
  class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
10
- def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd)
10
+ def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd,
11
+ target_rbconfig=Gem.target_rbconfig)
11
12
  require "fileutils"
12
13
  require "tempfile"
13
14
 
@@ -23,6 +24,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
23
24
 
24
25
  begin
25
26
  cmd = ruby << File.basename(extension)
27
+ cmd << "--target-rbconfig=#{target_rbconfig.path}" if target_rbconfig.path
26
28
  cmd.push(*args)
27
29
 
28
30
  run(cmd, results, class_name, extension_dir) do |s, r|
@@ -39,12 +41,14 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
39
41
 
40
42
  ENV["DESTDIR"] = nil
41
43
 
42
- make dest_path, results, extension_dir, tmp_dest_relative
44
+ make dest_path, results, extension_dir, tmp_dest_relative, target_rbconfig: target_rbconfig
43
45
 
44
46
  full_tmp_dest = File.join(extension_dir, tmp_dest_relative)
45
47
 
46
- # TODO: remove in RubyGems 4
47
- if Gem.install_extension_in_lib && lib_dir
48
+ is_cross_compiling = target_rbconfig["platform"] != RbConfig::CONFIG["platform"]
49
+ # Do not copy extension libraries by default when cross-compiling
50
+ # not to conflict with the one already built for the host platform.
51
+ if Gem.install_extension_in_lib && lib_dir && !is_cross_compiling
48
52
  FileUtils.mkdir_p lib_dir
49
53
  entries = Dir.entries(full_tmp_dest) - %w[. ..]
50
54
  entries = entries.map {|entry| File.join full_tmp_dest, entry }
@@ -56,7 +60,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
56
60
  destent.exist? || FileUtils.mv(ent.path, destent.path)
57
61
  end
58
62
 
59
- make dest_path, results, extension_dir, tmp_dest_relative, ["clean"]
63
+ make dest_path, results, extension_dir, tmp_dest_relative, ["clean"], target_rbconfig: target_rbconfig
60
64
  ensure
61
65
  ENV["DESTDIR"] = destdir
62
66
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../shellwords"
4
-
5
3
  #--
6
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
7
5
  # All rights reserved.
@@ -9,7 +7,12 @@ require_relative "../shellwords"
9
7
  #++
10
8
 
11
9
  class Gem::Ext::RakeBuilder < Gem::Ext::Builder
12
- def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd)
10
+ def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd,
11
+ target_rbconfig=Gem.target_rbconfig)
12
+ if target_rbconfig.path
13
+ warn "--target-rbconfig is not yet supported for Rake extensions. Ignoring"
14
+ end
15
+
13
16
  if /mkrf_conf/i.match?(File.basename(extension))
14
17
  run([Gem.ruby, File.basename(extension), *args], results, class_name, extension_dir)
15
18
  end
@@ -17,7 +20,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
17
20
  rake = ENV["rake"]
18
21
 
19
22
  if rake
20
- rake = Shellwords.split(rake)
23
+ rake = shellsplit(rake)
21
24
  else
22
25
  begin
23
26
  rake = ruby << "-rrubygems" << Gem.bin_path("rake", "rake")
@@ -29,6 +29,7 @@ class Gem::GemRunner
29
29
  # Run the gem command with the following arguments.
30
30
 
31
31
  def run(args)
32
+ validate_encoding args
32
33
  build_args = extract_build_args args
33
34
 
34
35
  do_configuration args
@@ -72,6 +73,14 @@ class Gem::GemRunner
72
73
 
73
74
  private
74
75
 
76
+ def validate_encoding(args)
77
+ invalid_arg = args.find {|arg| !arg.valid_encoding? }
78
+
79
+ if invalid_arg
80
+ raise Gem::OptionParser::InvalidArgument.new("'#{invalid_arg.scrub}' has invalid encoding")
81
+ end
82
+ end
83
+
75
84
  def do_configuration(args)
76
85
  Gem.configuration = @config_file_class.new(args)
77
86
  Gem.use_paths Gem.configuration[:gemhome], Gem.configuration[:gempath]
@@ -51,7 +51,7 @@ module Gem::GemcutterUtilities
51
51
  request_line = socket.gets
52
52
 
53
53
  method, req_uri, _protocol = request_line.split(" ")
54
- req_uri = URI.parse(req_uri)
54
+ req_uri = Gem::URI.parse(req_uri)
55
55
 
56
56
  responder = SocketResponder.new(socket)
57
57
 
@@ -69,8 +69,10 @@ module Gem::GemcutterUtilities
69
69
  rubygems_api_request(:get, "api/v1/webauthn_verification/#{webauthn_token}/status.json") do |request|
70
70
  if credentials.empty?
71
71
  request.add_field "Authorization", api_key
72
+ elsif credentials[:identifier] && credentials[:password]
73
+ request.basic_auth credentials[:identifier], credentials[:password]
72
74
  else
73
- request.basic_auth credentials[:email], credentials[:password]
75
+ raise Gem::WebauthnVerificationError, "Provided missing credentials"
74
76
  end
75
77
  end
76
78
  end
@@ -10,7 +10,8 @@ require_relative "gemcutter_utilities/webauthn_poller"
10
10
 
11
11
  module Gem::GemcutterUtilities
12
12
  ERROR_CODE = 1
13
- API_SCOPES = [:index_rubygems, :push_rubygem, :yank_rubygem, :add_owner, :remove_owner, :access_webhooks, :show_dashboard].freeze
13
+ API_SCOPES = [:index_rubygems, :push_rubygem, :yank_rubygem, :add_owner, :remove_owner, :access_webhooks].freeze
14
+ EXCLUSIVELY_API_SCOPES = [:show_dashboard].freeze
14
15
 
15
16
  include Gem::Text
16
17
 
@@ -61,6 +62,10 @@ module Gem::GemcutterUtilities
61
62
  options[:otp] || ENV["GEM_HOST_OTP_CODE"]
62
63
  end
63
64
 
65
+ def webauthn_enabled?
66
+ options[:webauthn]
67
+ end
68
+
64
69
  ##
65
70
  # The host to connect to either from the RUBYGEMS_HOST environment variable
66
71
  # or from the user's configuration
@@ -84,7 +89,7 @@ module Gem::GemcutterUtilities
84
89
  # If +allowed_push_host+ metadata is present, then it will only allow that host.
85
90
 
86
91
  def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, scope: nil, credentials: {}, &block)
87
- require_relative "net/http"
92
+ require_relative "vendored_net_http"
88
93
 
89
94
  self.host = host if host
90
95
  unless self.host
@@ -93,8 +98,8 @@ module Gem::GemcutterUtilities
93
98
  end
94
99
 
95
100
  if allowed_push_host
96
- allowed_host_uri = URI.parse(allowed_push_host)
97
- host_uri = URI.parse(self.host)
101
+ allowed_host_uri = Gem::URI.parse(allowed_push_host)
102
+ host_uri = Gem::URI.parse(self.host)
98
103
 
99
104
  unless (host_uri.scheme == allowed_host_uri.scheme) && (host_uri.host == allowed_host_uri.host)
100
105
  alert_error "#{self.host.inspect} is not allowed by the gemspec, which only allows #{allowed_push_host.inspect}"
@@ -102,7 +107,7 @@ module Gem::GemcutterUtilities
102
107
  end
103
108
  end
104
109
 
105
- uri = URI.parse "#{self.host}/#{path}"
110
+ uri = Gem::URI.parse "#{self.host}/#{path}"
106
111
  response = request_with_otp(method, uri, &block)
107
112
 
108
113
  if mfa_unauthorized?(response)
@@ -129,14 +134,13 @@ module Gem::GemcutterUtilities
129
134
 
130
135
  say "The existing key doesn't have access of #{scope} on #{pretty_host}. Please sign in to update access."
131
136
 
132
- email = ask " Email: "
133
- password = ask_for_password "Password: "
137
+ identifier = ask "Username/email: "
138
+ password = ask_for_password " Password: "
134
139
 
135
140
  response = rubygems_api_request(:put, "api/v1/api_key",
136
141
  sign_in_host, scope: scope) do |request|
137
- request.basic_auth email, password
138
- request["OTP"] = otp if otp
139
- request.body = URI.encode_www_form({ api_key: api_key }.merge(update_scope_params))
142
+ request.basic_auth identifier, password
143
+ request.body = Gem::URI.encode_www_form({ api_key: api_key }.merge(update_scope_params))
140
144
  end
141
145
 
142
146
  with_response response do |_resp|
@@ -158,25 +162,24 @@ module Gem::GemcutterUtilities
158
162
  say "Don't have an account yet? " \
159
163
  "Create one at #{sign_in_host}/sign_up"
160
164
 
161
- email = ask " Email: "
162
- password = ask_for_password "Password: "
165
+ identifier = ask "Username/email: "
166
+ password = ask_for_password " Password: "
163
167
  say "\n"
164
168
 
165
169
  key_name = get_key_name(scope)
166
170
  scope_params = get_scope_params(scope)
167
- profile = get_user_profile(email, password)
171
+ profile = get_user_profile(identifier, password)
168
172
  mfa_params = get_mfa_params(profile)
169
173
  all_params = scope_params.merge(mfa_params)
170
174
  warning = profile["warning"]
171
- credentials = { email: email, password: password }
175
+ credentials = { identifier: identifier, password: password }
172
176
 
173
177
  say "#{warning}\n" if warning
174
178
 
175
179
  response = rubygems_api_request(:post, "api/v1/api_key",
176
180
  sign_in_host, credentials: credentials, scope: scope) do |request|
177
- request.basic_auth email, password
178
- request["OTP"] = otp if otp
179
- request.body = URI.encode_www_form({ name: key_name }.merge(all_params))
181
+ request.basic_auth identifier, password
182
+ request.body = Gem::URI.encode_www_form({ name: key_name }.merge(all_params))
180
183
  end
181
184
 
182
185
  with_response response do |resp|
@@ -250,6 +253,8 @@ module Gem::GemcutterUtilities
250
253
  req["OTP"] = otp if otp
251
254
  block.call(req)
252
255
  end
256
+ ensure
257
+ options[:otp] = nil if webauthn_enabled?
253
258
  end
254
259
 
255
260
  def fetch_otp(credentials)
@@ -258,7 +263,10 @@ module Gem::GemcutterUtilities
258
263
  port = server.addr[1].to_s
259
264
 
260
265
  url_with_port = "#{webauthn_url}?port=#{port}"
261
- say "You have enabled multi-factor authentication. Please visit #{url_with_port} to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, you can re-run the gem signin command with the `--otp [your_code]` option."
266
+ say "You have enabled multi-factor authentication. Please visit the following URL to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, you can re-run the gem signin command with the `--otp [your_code]` option."
267
+ say ""
268
+ say url_with_port
269
+ say ""
262
270
 
263
271
  threads = [WebauthnListener.listener_thread(host, server), WebauthnPoller.poll_thread(options, host, webauthn_url, credentials)]
264
272
  otp_thread = wait_for_otp_thread(*threads)
@@ -270,6 +278,8 @@ module Gem::GemcutterUtilities
270
278
  terminate_interaction(1)
271
279
  end
272
280
 
281
+ options[:webauthn] = true
282
+
273
283
  say "You are verified with a security device. You may close the browser window."
274
284
  otp_thread[:otp]
275
285
  else
@@ -294,7 +304,7 @@ module Gem::GemcutterUtilities
294
304
  if credentials.empty?
295
305
  request.add_field "Authorization", api_key
296
306
  else
297
- request.basic_auth credentials[:email], credentials[:password]
307
+ request.basic_auth credentials[:identifier], credentials[:password]
298
308
  end
299
309
  end
300
310
  response.is_a?(Gem::Net::HTTPSuccess) ? response.body : nil
@@ -309,15 +319,31 @@ module Gem::GemcutterUtilities
309
319
  end
310
320
 
311
321
  def get_scope_params(scope)
312
- scope_params = {}
322
+ scope_params = { index_rubygems: true }
313
323
 
314
324
  if scope
315
325
  scope_params = { scope => true }
316
326
  else
317
- say "Please select scopes you want to enable for the API key (y/n)"
318
- API_SCOPES.each do |s|
319
- selected = ask_yes_no(s.to_s, false)
320
- scope_params[s] = true if selected
327
+ say "The default access scope is:"
328
+ scope_params.each do |k, _v|
329
+ say " #{k}: y"
330
+ end
331
+ say "\n"
332
+ customise = ask_yes_no("Do you want to customise scopes?", false)
333
+ if customise
334
+ EXCLUSIVELY_API_SCOPES.each do |excl_scope|
335
+ selected = ask_yes_no("#{excl_scope} (exclusive scope, answering yes will not prompt for other scopes)", false)
336
+ next unless selected
337
+
338
+ return { excl_scope => true }
339
+ end
340
+
341
+ scope_params = {}
342
+
343
+ API_SCOPES.each do |s|
344
+ selected = ask_yes_no(s.to_s, false)
345
+ scope_params[s] = true if selected
346
+ end
321
347
  end
322
348
  say "\n"
323
349
  end
@@ -329,11 +355,11 @@ module Gem::GemcutterUtilities
329
355
  host == Gem::DEFAULT_HOST
330
356
  end
331
357
 
332
- def get_user_profile(email, password)
358
+ def get_user_profile(identifier, password)
333
359
  return {} unless default_host?
334
360
 
335
361
  response = rubygems_api_request(:get, "api/v1/profile/me.yaml") do |request|
336
- request.basic_auth email, password
362
+ request.basic_auth identifier, password
337
363
  end
338
364
 
339
365
  with_response response do |resp|
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../rubygems"
4
+
5
+ ##
6
+ # Mixin methods for commands that work with gemspecs.
7
+
8
+ module Gem::GemspecHelpers
9
+ def find_gemspec(glob = "*.gemspec")
10
+ gemspecs = Dir.glob(glob).sort
11
+
12
+ if gemspecs.size > 1
13
+ alert_error "Multiple gemspecs found: #{gemspecs}, please specify one"
14
+ terminate_interaction(1)
15
+ end
16
+
17
+ gemspecs.first
18
+ end
19
+ end
@@ -179,6 +179,11 @@ module Gem::InstallUpdateOptions
179
179
  "Suggest alternates when gems are not found") do |v,_o|
180
180
  options[:suggest_alternate] = v
181
181
  end
182
+
183
+ add_option(:"Install/Update", "--target-rbconfig [FILE]",
184
+ "rbconfig.rb for the deployment target platform") do |v, _o|
185
+ Gem.set_target_rbconfig(v)
186
+ end
182
187
  end
183
188
 
184
189
  ##
@@ -66,8 +66,6 @@ class Gem::Installer
66
66
 
67
67
  attr_reader :package
68
68
 
69
- @path_warning = false
70
-
71
69
  class << self
72
70
  #
73
71
  # Changes in rubygems to lazily loading `rubygems/command` (in order to
@@ -86,11 +84,6 @@ class Gem::Installer
86
84
  super(klass)
87
85
  end
88
86
 
89
- ##
90
- # True if we've warned about PATH not including Gem.bindir
91
-
92
- attr_accessor :path_warning
93
-
94
87
  ##
95
88
  # Overrides the executable format.
96
89
  #
@@ -188,15 +181,6 @@ class Gem::Installer
188
181
  @package.dir_mode = options[:dir_mode]
189
182
  @package.prog_mode = options[:prog_mode]
190
183
  @package.data_mode = options[:data_mode]
191
-
192
- if @gem_home == Gem.user_dir
193
- # If we get here, then one of the following likely happened:
194
- # - `--user-install` was specified
195
- # - `Gem::PathSupport#home` fell back to `Gem.user_dir`
196
- # - GEM_HOME was manually set to `Gem.user_dir`
197
-
198
- check_that_user_bin_dir_is_in_path
199
- end
200
184
  end
201
185
 
202
186
  ##
@@ -344,7 +328,7 @@ class Gem::Installer
344
328
 
345
329
  say spec.post_install_message if options[:post_install_message] && !spec.post_install_message.nil?
346
330
 
347
- Gem::Specification.add_spec(spec)
331
+ Gem::Specification.add_spec(spec) unless @install_dir
348
332
 
349
333
  load_plugin
350
334
 
@@ -488,11 +472,21 @@ class Gem::Installer
488
472
  end
489
473
 
490
474
  def generate_bin # :nodoc:
491
- return if spec.executables.nil? || spec.executables.empty?
475
+ executables = spec.executables
476
+ return if executables.nil? || executables.empty?
477
+
478
+ if @gem_home == Gem.user_dir
479
+ # If we get here, then one of the following likely happened:
480
+ # - `--user-install` was specified
481
+ # - `Gem::PathSupport#home` fell back to `Gem.user_dir`
482
+ # - GEM_HOME was manually set to `Gem.user_dir`
483
+
484
+ check_that_user_bin_dir_is_in_path(executables)
485
+ end
492
486
 
493
487
  ensure_writable_dir @bin_dir
494
488
 
495
- spec.executables.each do |filename|
489
+ executables.each do |filename|
496
490
  bin_path = File.join gem_dir, spec.bindir, filename
497
491
  next unless File.exist? bin_path
498
492
 
@@ -500,8 +494,7 @@ class Gem::Installer
500
494
  dir_mode = options[:prog_mode] || (mode | 0o111)
501
495
 
502
496
  unless dir_mode == mode
503
- require "fileutils"
504
- FileUtils.chmod dir_mode, bin_path
497
+ File.chmod dir_mode, bin_path
505
498
  end
506
499
 
507
500
  check_executable_overwrite filename
@@ -539,12 +532,14 @@ class Gem::Installer
539
532
  def generate_bin_script(filename, bindir)
540
533
  bin_script_path = File.join bindir, formatted_program_filename(filename)
541
534
 
542
- require "fileutils"
543
- FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
535
+ Gem.open_file_with_lock(bin_script_path) do
536
+ require "fileutils"
537
+ FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
544
538
 
545
- File.open bin_script_path, "wb", 0o755 do |file|
546
- file.print app_script_text(filename)
547
- file.chmod(options[:prog_mode] || 0o755)
539
+ File.open(bin_script_path, "wb", 0o755) do |file|
540
+ file.write app_script_text(filename)
541
+ file.chmod(options[:prog_mode] || 0o755)
542
+ end
548
543
  end
549
544
 
550
545
  verbose bin_script_path
@@ -693,9 +688,7 @@ class Gem::Installer
693
688
  end
694
689
  end
695
690
 
696
- def check_that_user_bin_dir_is_in_path # :nodoc:
697
- return if self.class.path_warning
698
-
691
+ def check_that_user_bin_dir_is_in_path(executables) # :nodoc:
699
692
  user_bin_dir = @bin_dir || Gem.bindir(gem_home)
700
693
  user_bin_dir = user_bin_dir.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
701
694
 
@@ -711,8 +704,7 @@ class Gem::Installer
711
704
 
712
705
  unless path.include? user_bin_dir
713
706
  unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV["HOME"], "~"))
714
- alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run."
715
- self.class.path_warning = true
707
+ alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables (#{executables.join(", ")}) will not run."
716
708
  end
717
709
  end
718
710
  end
@@ -847,7 +839,7 @@ TEXT
847
839
  # configure scripts and rakefiles or mkrf_conf files.
848
840
 
849
841
  def build_extensions
850
- builder = Gem::Ext::Builder.new spec, build_args
842
+ builder = Gem::Ext::Builder.new spec, build_args, Gem.target_rbconfig
851
843
 
852
844
  builder.build_extensions
853
845
  end
@@ -993,7 +985,7 @@ TEXT
993
985
  end
994
986
 
995
987
  def rb_config
996
- RbConfig::CONFIG
988
+ Gem.target_rbconfig
997
989
  end
998
990
 
999
991
  def ruby_install_name
@@ -1006,18 +998,17 @@ TEXT
1006
998
 
1007
999
  def bash_prolog_script
1008
1000
  if load_relative_enabled?
1009
- script = +<<~EOS
1010
- bindir="${0%/*}"
1011
- EOS
1012
-
1013
- script << %(exec "$bindir/#{ruby_install_name}" "-x" "$0" "$@"\n)
1014
-
1015
1001
  <<~EOS
1016
1002
  #!/bin/sh
1017
1003
  # -*- ruby -*-
1018
1004
  _=_\\
1019
1005
  =begin
1020
- #{script.chomp}
1006
+ bindir="${0%/*}"
1007
+ ruby="$bindir/#{ruby_install_name}"
1008
+ if [ ! -f "$ruby" ]; then
1009
+ ruby="#{ruby_install_name}"
1010
+ fi
1011
+ exec "$ruby" "-x" "$0" "$@"
1021
1012
  =end
1022
1013
  EOS
1023
1014
  else