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
@@ -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, push_rubygem: 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
  ##
@@ -244,8 +228,7 @@ class Gem::Installer
244
228
  ruby_executable = true
245
229
  existing = io.read.slice(/
246
230
  ^\s*(
247
- gem \s |
248
- load \s Gem\.bin_path\( |
231
+ Gem\.activate_and_load_bin_path\( |
249
232
  load \s Gem\.activate_bin_path\(
250
233
  )
251
234
  (['"])(.*?)(\2),
@@ -344,7 +327,7 @@ class Gem::Installer
344
327
 
345
328
  say spec.post_install_message if options[:post_install_message] && !spec.post_install_message.nil?
346
329
 
347
- Gem::Specification.add_spec(spec)
330
+ Gem::Specification.add_spec(spec) unless @install_dir
348
331
 
349
332
  load_plugin
350
333
 
@@ -488,11 +471,21 @@ class Gem::Installer
488
471
  end
489
472
 
490
473
  def generate_bin # :nodoc:
491
- return if spec.executables.nil? || spec.executables.empty?
474
+ executables = spec.executables
475
+ return if executables.nil? || executables.empty?
476
+
477
+ if @gem_home == Gem.user_dir
478
+ # If we get here, then one of the following likely happened:
479
+ # - `--user-install` was specified
480
+ # - `Gem::PathSupport#home` fell back to `Gem.user_dir`
481
+ # - GEM_HOME was manually set to `Gem.user_dir`
482
+
483
+ check_that_user_bin_dir_is_in_path(executables)
484
+ end
492
485
 
493
486
  ensure_writable_dir @bin_dir
494
487
 
495
- spec.executables.each do |filename|
488
+ executables.each do |filename|
496
489
  bin_path = File.join gem_dir, spec.bindir, filename
497
490
  next unless File.exist? bin_path
498
491
 
@@ -500,8 +493,7 @@ class Gem::Installer
500
493
  dir_mode = options[:prog_mode] || (mode | 0o111)
501
494
 
502
495
  unless dir_mode == mode
503
- require "fileutils"
504
- FileUtils.chmod dir_mode, bin_path
496
+ File.chmod dir_mode, bin_path
505
497
  end
506
498
 
507
499
  check_executable_overwrite filename
@@ -539,12 +531,14 @@ class Gem::Installer
539
531
  def generate_bin_script(filename, bindir)
540
532
  bin_script_path = File.join bindir, formatted_program_filename(filename)
541
533
 
542
- require "fileutils"
543
- FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
534
+ Gem.open_file_with_lock(bin_script_path) do
535
+ require "fileutils"
536
+ FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
544
537
 
545
- File.open bin_script_path, "wb", 0o755 do |file|
546
- file.print app_script_text(filename)
547
- file.chmod(options[:prog_mode] || 0o755)
538
+ File.open(bin_script_path, "wb", 0o755) do |file|
539
+ file.write app_script_text(filename)
540
+ file.chmod(options[:prog_mode] || 0o755)
541
+ end
548
542
  end
549
543
 
550
544
  verbose bin_script_path
@@ -693,9 +687,7 @@ class Gem::Installer
693
687
  end
694
688
  end
695
689
 
696
- def check_that_user_bin_dir_is_in_path # :nodoc:
697
- return if self.class.path_warning
698
-
690
+ def check_that_user_bin_dir_is_in_path(executables) # :nodoc:
699
691
  user_bin_dir = @bin_dir || Gem.bindir(gem_home)
700
692
  user_bin_dir = user_bin_dir.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
701
693
 
@@ -711,8 +703,7 @@ class Gem::Installer
711
703
 
712
704
  unless path.include? user_bin_dir
713
705
  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
706
+ alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables (#{executables.join(", ")}) will not run."
716
707
  end
717
708
  end
718
709
  end
@@ -757,54 +748,53 @@ class Gem::Installer
757
748
  def app_script_text(bin_file_name)
758
749
  # NOTE: that the `load` lines cannot be indented, as old RG versions match
759
750
  # against the beginning of the line
760
- <<-TEXT
761
- #{shebang bin_file_name}
762
- #
763
- # This file was generated by RubyGems.
764
- #
765
- # The application '#{spec.name}' is installed as part of a gem, and
766
- # this file is here to facilitate running it.
767
- #
768
-
769
- require 'rubygems'
770
- #{gemdeps_load(spec.name)}
771
- version = "#{Gem::Requirement.default_prerelease}"
772
-
773
- str = ARGV.first
774
- if str
775
- str = str.b[/\\A_(.*)_\\z/, 1]
776
- if str and Gem::Version.correct?(str)
777
- #{explicit_version_requirement(spec.name)}
778
- ARGV.shift
779
- end
780
- end
751
+ <<~TEXT
752
+ #{shebang bin_file_name}
753
+ #
754
+ # This file was generated by RubyGems.
755
+ #
756
+ # The application '#{spec.name}' is installed as part of a gem, and
757
+ # this file is here to facilitate running it.
758
+ #
759
+
760
+ require 'rubygems'
761
+ #{gemdeps_load(spec.name)}
762
+ version = "#{Gem::Requirement.default_prerelease}"
763
+
764
+ str = ARGV.first
765
+ if str
766
+ str = str.b[/\\A_(.*)_\\z/, 1]
767
+ if str and Gem::Version.correct?(str)
768
+ #{explicit_version_requirement(spec.name)}
769
+ ARGV.shift
770
+ end
771
+ end
781
772
 
782
- if Gem.respond_to?(:activate_bin_path)
783
- load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
784
- else
785
- gem #{spec.name.dump}, version
786
- load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version)
787
- end
788
- TEXT
773
+ if Gem.respond_to?(:activate_and_load_bin_path)
774
+ Gem.activate_and_load_bin_path('#{spec.name}', '#{bin_file_name}', version)
775
+ else
776
+ load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
777
+ end
778
+ TEXT
789
779
  end
790
780
 
791
781
  def gemdeps_load(name)
792
782
  return "" if name == "bundler"
793
783
 
794
- <<-TEXT
784
+ <<~TEXT
795
785
 
796
- Gem.use_gemdeps
797
- TEXT
786
+ Gem.use_gemdeps
787
+ TEXT
798
788
  end
799
789
 
800
790
  def explicit_version_requirement(name)
801
791
  code = "version = str"
802
792
  return code unless name == "bundler"
803
793
 
804
- code += <<-TEXT
794
+ code += <<~TEXT
805
795
 
806
- ENV['BUNDLER_VERSION'] = str
807
- TEXT
796
+ ENV['BUNDLER_VERSION'] = str
797
+ TEXT
808
798
  end
809
799
 
810
800
  ##
@@ -819,9 +809,9 @@ TEXT
819
809
 
820
810
  if File.exist?(File.join(bindir, ruby_exe))
821
811
  # stub & ruby.exe within same folder. Portable
822
- <<-TEXT
823
- @ECHO OFF
824
- @"%~dp0#{ruby_exe}" "%~dpn0" %*
812
+ <<~TEXT
813
+ @ECHO OFF
814
+ @"%~dp0#{ruby_exe}" "%~dpn0" %*
825
815
  TEXT
826
816
  elsif bindir.downcase.start_with? rb_topdir.downcase
827
817
  # stub within ruby folder, but not standard bin. Portable
@@ -829,16 +819,16 @@ TEXT
829
819
  from = Pathname.new bindir
830
820
  to = Pathname.new "#{rb_topdir}/bin"
831
821
  rel = to.relative_path_from from
832
- <<-TEXT
833
- @ECHO OFF
834
- @"%~dp0#{rel}/#{ruby_exe}" "%~dpn0" %*
822
+ <<~TEXT
823
+ @ECHO OFF
824
+ @"%~dp0#{rel}/#{ruby_exe}" "%~dpn0" %*
835
825
  TEXT
836
826
  else
837
827
  # outside ruby folder, maybe -user-install or bundler. Portable, but ruby
838
828
  # is dependent on PATH
839
- <<-TEXT
840
- @ECHO OFF
841
- @#{ruby_exe} "%~dpn0" %*
829
+ <<~TEXT
830
+ @ECHO OFF
831
+ @#{ruby_exe} "%~dpn0" %*
842
832
  TEXT
843
833
  end
844
834
  end
@@ -847,7 +837,7 @@ TEXT
847
837
  # configure scripts and rakefiles or mkrf_conf files.
848
838
 
849
839
  def build_extensions
850
- builder = Gem::Ext::Builder.new spec, build_args
840
+ builder = Gem::Ext::Builder.new spec, build_args, Gem.target_rbconfig
851
841
 
852
842
  builder.build_extensions
853
843
  end
@@ -961,11 +951,8 @@ TEXT
961
951
  end
962
952
 
963
953
  def ensure_writable_dir(dir) # :nodoc:
964
- begin
965
- Dir.mkdir dir, *[options[:dir_mode] && 0o755].compact
966
- rescue SystemCallError
967
- raise unless File.directory? dir
968
- end
954
+ require "fileutils"
955
+ FileUtils.mkdir_p dir, mode: options[:dir_mode] && 0o755
969
956
 
970
957
  raise Gem::FilePermissionError.new(dir) unless File.writable? dir
971
958
  end
@@ -993,7 +980,7 @@ TEXT
993
980
  end
994
981
 
995
982
  def rb_config
996
- RbConfig::CONFIG
983
+ Gem.target_rbconfig
997
984
  end
998
985
 
999
986
  def ruby_install_name
@@ -1006,18 +993,17 @@ TEXT
1006
993
 
1007
994
  def bash_prolog_script
1008
995
  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
996
  <<~EOS
1016
997
  #!/bin/sh
1017
998
  # -*- ruby -*-
1018
999
  _=_\\
1019
1000
  =begin
1020
- #{script.chomp}
1001
+ bindir="${0%/*}"
1002
+ ruby="$bindir/#{ruby_install_name}"
1003
+ if [ ! -f "$ruby" ]; then
1004
+ ruby="#{ruby_install_name}"
1005
+ fi
1006
+ exec "$ruby" "-x" "$0" "$@"
1021
1007
  =end
1022
1008
  EOS
1023
1009
  else
@@ -6,7 +6,7 @@
6
6
  # See LICENSE.txt for permissions.
7
7
  #++
8
8
 
9
- require "uri"
9
+ require_relative "vendor/uri/lib/uri"
10
10
  require_relative "../rubygems"
11
11
 
12
12
  ##
@@ -17,10 +17,10 @@ module Gem::LocalRemoteOptions
17
17
  # Allows Gem::OptionParser to handle HTTP URIs.
18
18
 
19
19
  def accept_uri_http
20
- Gem::OptionParser.accept URI::HTTP do |value|
20
+ Gem::OptionParser.accept Gem::URI::HTTP do |value|
21
21
  begin
22
- uri = URI.parse value
23
- rescue URI::InvalidURIError
22
+ uri = Gem::URI.parse value
23
+ rescue Gem::URI::InvalidURIError
24
24
  raise Gem::OptionParser::InvalidArgument, value
25
25
  end
26
26
 
@@ -88,7 +88,7 @@ module Gem::LocalRemoteOptions
88
88
  def add_proxy_option
89
89
  accept_uri_http
90
90
 
91
- add_option(:"Local/Remote", "-p", "--[no-]http-proxy [URL]", URI::HTTP,
91
+ add_option(:"Local/Remote", "-p", "--[no-]http-proxy [URL]", Gem::URI::HTTP,
92
92
  "Use HTTP proxy for remote operations") do |value, options|
93
93
  options[:http_proxy] = value == false ? :no_proxy : value
94
94
  Gem.configuration[:http_proxy] = options[:http_proxy]
@@ -101,7 +101,7 @@ module Gem::LocalRemoteOptions
101
101
  def add_source_option
102
102
  accept_uri_http
103
103
 
104
- add_option(:"Local/Remote", "-s", "--source URL", URI::HTTP,
104
+ add_option(:"Local/Remote", "-s", "--source URL", Gem::URI::HTTP,
105
105
  "Append URL to list of remote gem sources") do |source, options|
106
106
  source << "/" unless source.end_with?("/")
107
107
 
@@ -134,13 +134,13 @@ module Gem::LocalRemoteOptions
134
134
  # Is local fetching enabled?
135
135
 
136
136
  def local?
137
- options[:domain] == :local || options[:domain] == :both
137
+ [:local, :both].include?(options[:domain])
138
138
  end
139
139
 
140
140
  ##
141
141
  # Is remote fetching enabled?
142
142
 
143
143
  def remote?
144
- options[:domain] == :remote || options[:domain] == :both
144
+ [:remote, :both].include?(options[:domain])
145
145
  end
146
146
  end
@@ -95,14 +95,14 @@ class Gem::Package::TarHeader
95
95
 
96
96
  attr_reader(*FIELDS)
97
97
 
98
- EMPTY_HEADER = ("\0" * 512).freeze # :nodoc:
98
+ EMPTY_HEADER = ("\0" * 512).b.freeze # :nodoc:
99
99
 
100
100
  ##
101
101
  # Creates a tar header from IO +stream+
102
102
 
103
103
  def self.from(stream)
104
104
  header = stream.read 512
105
- empty = (header == EMPTY_HEADER)
105
+ return EMPTY if header == EMPTY_HEADER
106
106
 
107
107
  fields = header.unpack UNPACK_FORMAT
108
108
 
@@ -123,7 +123,7 @@ class Gem::Package::TarHeader
123
123
  devminor: strict_oct(fields.shift),
124
124
  prefix: fields.shift,
125
125
 
126
- empty: empty
126
+ empty: false
127
127
  end
128
128
 
129
129
  def self.strict_oct(str)
@@ -172,6 +172,22 @@ class Gem::Package::TarHeader
172
172
  @empty = vals[:empty]
173
173
  end
174
174
 
175
+ EMPTY = new({ # :nodoc:
176
+ checksum: 0,
177
+ gname: "",
178
+ linkname: "",
179
+ magic: "",
180
+ mode: 0,
181
+ name: "",
182
+ prefix: "",
183
+ size: 0,
184
+ uname: "",
185
+ version: 0,
186
+
187
+ empty: true,
188
+ }).freeze
189
+ private_constant :EMPTY
190
+
175
191
  ##
176
192
  # Is the tar entry empty?
177
193
 
@@ -212,6 +228,17 @@ class Gem::Package::TarHeader
212
228
  @checksum = oct calculate_checksum(header), 6
213
229
  end
214
230
 
231
+ ##
232
+ # Header's full name, including prefix
233
+
234
+ def full_name
235
+ if prefix != ""
236
+ File.join prefix, name
237
+ else
238
+ name
239
+ end
240
+ end
241
+
215
242
  private
216
243
 
217
244
  def calculate_checksum(header)
@@ -241,7 +268,7 @@ class Gem::Package::TarHeader
241
268
 
242
269
  header = header.pack PACK_FORMAT
243
270
 
244
- header << ("\0" * ((512 - header.size) % 512))
271
+ header.ljust 512, "\0"
245
272
  end
246
273
 
247
274
  def oct(num, len)
@@ -87,11 +87,7 @@ class Gem::Package::TarReader::Entry
87
87
  # Full name of the tar entry
88
88
 
89
89
  def full_name
90
- if @header.prefix != ""
91
- File.join @header.prefix, @header.name
92
- else
93
- @header.name
94
- end
90
+ @header.full_name.force_encoding(Encoding::UTF_8)
95
91
  rescue ArgumentError => e
96
92
  raise unless e.message == "string contains null byte"
97
93
  raise Gem::Package::TarInvalidError,