rubygems-update 4.0.21 → 4.1.0.beta1

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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +590 -53
  3. data/CONTRIBUTING.md +66 -5
  4. data/MIT.txt +4 -3
  5. data/Manifest.txt +332 -375
  6. data/README.md +26 -6
  7. data/bundler.gemspec +63 -0
  8. data/doc/POLICIES.md +147 -0
  9. data/doc/UPGRADING.md +4 -4
  10. data/{bundler/lib → lib}/bundler/build_metadata.rb +2 -2
  11. data/{bundler/lib → lib}/bundler/checksum.rb +40 -25
  12. data/{bundler/lib → lib}/bundler/ci_detector.rb +1 -1
  13. data/{bundler/lib → lib}/bundler/cli/add.rb +3 -4
  14. data/{bundler/lib → lib}/bundler/cli/cache.rb +4 -0
  15. data/{bundler/lib → lib}/bundler/cli/clean.rb +5 -0
  16. data/{bundler/lib → lib}/bundler/cli/common.rb +37 -1
  17. data/{bundler/lib → lib}/bundler/cli/config.rb +4 -2
  18. data/{bundler/lib → lib}/bundler/cli/gem.rb +0 -17
  19. data/{bundler/lib → lib}/bundler/cli/install.rb +4 -5
  20. data/{bundler/lib → lib}/bundler/cli/lock.rb +1 -2
  21. data/{bundler/lib → lib}/bundler/cli/outdated.rb +8 -3
  22. data/{bundler/lib → lib}/bundler/cli/pristine.rb +2 -1
  23. data/{bundler/lib → lib}/bundler/cli/update.rb +21 -12
  24. data/{bundler/lib → lib}/bundler/cli.rb +14 -11
  25. data/{bundler/lib → lib}/bundler/definition.rb +61 -24
  26. data/{bundler/lib → lib}/bundler/dependency.rb +4 -0
  27. data/{bundler/lib → lib}/bundler/dsl.rb +77 -11
  28. data/{bundler/lib → lib}/bundler/endpoint_specification.rb +51 -14
  29. data/{bundler/lib → lib}/bundler/env.rb +7 -24
  30. data/{bundler/lib → lib}/bundler/errors.rb +34 -5
  31. data/{bundler/lib → lib}/bundler/fetcher/compact_index.rb +14 -5
  32. data/lib/bundler/fetcher/connection_pools.rb +150 -0
  33. data/{bundler/lib → lib}/bundler/fetcher/downloader.rb +31 -16
  34. data/{bundler/lib → lib}/bundler/fetcher.rb +8 -47
  35. data/{bundler/lib → lib}/bundler/injector.rb +3 -3
  36. data/{bundler/lib → lib}/bundler/inline.rb +44 -4
  37. data/{bundler/lib → lib}/bundler/installer/parallel_installer.rb +25 -30
  38. data/{bundler/lib → lib}/bundler/installer.rb +20 -6
  39. data/{bundler/lib → lib}/bundler/lazy_specification.rb +44 -17
  40. data/{bundler/lib → lib}/bundler/lockfile_generator.rb +24 -2
  41. data/{bundler/lib → lib}/bundler/lockfile_parser.rb +43 -5
  42. data/{bundler/lib → lib}/bundler/man/bundle-add.1 +7 -4
  43. data/{bundler/lib → lib}/bundler/man/bundle-add.1.ronn +8 -4
  44. data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1 +1 -1
  45. data/{bundler/lib → lib}/bundler/man/bundle-cache.1 +2 -2
  46. data/{bundler/lib → lib}/bundler/man/bundle-cache.1.ronn +2 -2
  47. data/{bundler/lib → lib}/bundler/man/bundle-check.1 +1 -1
  48. data/{bundler/lib → lib}/bundler/man/bundle-clean.1 +1 -1
  49. data/{bundler/lib → lib}/bundler/man/bundle-config.1 +38 -6
  50. data/{bundler/lib → lib}/bundler/man/bundle-config.1.ronn +143 -10
  51. data/{bundler/lib → lib}/bundler/man/bundle-console.1 +1 -1
  52. data/{bundler/lib → lib}/bundler/man/bundle-doctor.1 +1 -1
  53. data/{bundler/lib → lib}/bundler/man/bundle-env.1 +1 -1
  54. data/{bundler/lib → lib}/bundler/man/bundle-exec.1 +1 -1
  55. data/{bundler/lib → lib}/bundler/man/bundle-fund.1 +1 -1
  56. data/{bundler/lib → lib}/bundler/man/bundle-gem.1 +1 -1
  57. data/{bundler/lib → lib}/bundler/man/bundle-help.1 +1 -1
  58. data/{bundler/lib → lib}/bundler/man/bundle-info.1 +1 -1
  59. data/{bundler/lib → lib}/bundler/man/bundle-init.1 +1 -1
  60. data/{bundler/lib → lib}/bundler/man/bundle-install.1 +2 -2
  61. data/{bundler/lib → lib}/bundler/man/bundle-install.1.ronn +4 -4
  62. data/{bundler/lib → lib}/bundler/man/bundle-issue.1 +1 -1
  63. data/{bundler/lib → lib}/bundler/man/bundle-licenses.1 +1 -1
  64. data/{bundler/lib → lib}/bundler/man/bundle-list.1 +1 -1
  65. data/{bundler/lib → lib}/bundler/man/bundle-lock.1 +3 -3
  66. data/{bundler/lib → lib}/bundler/man/bundle-lock.1.ronn +5 -5
  67. data/{bundler/lib → lib}/bundler/man/bundle-open.1 +1 -1
  68. data/{bundler/lib → lib}/bundler/man/bundle-outdated.1 +1 -1
  69. data/{bundler/lib → lib}/bundler/man/bundle-platform.1 +1 -1
  70. data/{bundler/lib → lib}/bundler/man/bundle-plugin.1 +1 -1
  71. data/{bundler/lib → lib}/bundler/man/bundle-pristine.1 +1 -1
  72. data/{bundler/lib → lib}/bundler/man/bundle-remove.1 +1 -1
  73. data/{bundler/lib → lib}/bundler/man/bundle-show.1 +1 -1
  74. data/{bundler/lib → lib}/bundler/man/bundle-update.1 +3 -3
  75. data/{bundler/lib → lib}/bundler/man/bundle-update.1.ronn +3 -5
  76. data/{bundler/lib → lib}/bundler/man/bundle-version.1 +1 -1
  77. data/{bundler/lib → lib}/bundler/man/bundle.1 +1 -1
  78. data/{bundler/lib → lib}/bundler/man/gemfile.5 +45 -1
  79. data/{bundler/lib → lib}/bundler/man/gemfile.5.ronn +53 -0
  80. data/lib/bundler/match_metadata.rb +50 -0
  81. data/{bundler/lib → lib}/bundler/match_platform.rb +25 -2
  82. data/lib/bundler/match_remote_metadata.rb +44 -0
  83. data/{bundler/lib → lib}/bundler/materialization.rb +2 -1
  84. data/lib/bundler/override.rb +69 -0
  85. data/{bundler/lib → lib}/bundler/plugin/dsl.rb +3 -5
  86. data/{bundler/lib → lib}/bundler/plugin/events.rb +55 -13
  87. data/{bundler/lib → lib}/bundler/plugin/index.rb +87 -11
  88. data/{bundler/lib → lib}/bundler/plugin/installer/path.rb +1 -1
  89. data/{bundler/lib → lib}/bundler/plugin/installer.rb +13 -5
  90. data/{bundler/lib → lib}/bundler/plugin.rb +58 -30
  91. data/{bundler/lib → lib}/bundler/remote_specification.rb +6 -3
  92. data/{bundler/lib → lib}/bundler/resolver/base.rb +2 -1
  93. data/{bundler/lib → lib}/bundler/resolver/incompatibility.rb +1 -1
  94. data/{bundler/lib → lib}/bundler/resolver.rb +73 -23
  95. data/{bundler/lib → lib}/bundler/ruby_version.rb +0 -2
  96. data/{bundler/lib → lib}/bundler/rubygems_ext.rb +71 -1
  97. data/{bundler/lib → lib}/bundler/rubygems_gem_installer.rb +41 -2
  98. data/{bundler/lib → lib}/bundler/rubygems_integration.rb +7 -2
  99. data/{bundler/lib → lib}/bundler/runtime.rb +69 -2
  100. data/{bundler/lib → lib}/bundler/self_manager.rb +9 -15
  101. data/{bundler/lib → lib}/bundler/settings.rb +373 -30
  102. data/{bundler/lib → lib}/bundler/shared_helpers.rb +2 -1
  103. data/{bundler/lib → lib}/bundler/source/git/git_proxy.rb +2 -10
  104. data/{bundler/lib → lib}/bundler/source/git.rb +15 -6
  105. data/{bundler/lib → lib}/bundler/source/path/installer.rb +1 -1
  106. data/{bundler/lib → lib}/bundler/source/rubygems/remote.rb +10 -5
  107. data/{bundler/lib → lib}/bundler/source/rubygems.rb +48 -12
  108. data/{bundler/lib → lib}/bundler/spec_set.rb +16 -4
  109. data/{bundler/lib → lib}/bundler/stub_specification.rb +2 -1
  110. data/{bundler/lib → lib}/bundler/templates/newgem/Gemfile.tt +4 -4
  111. data/{bundler/lib → lib}/bundler/templates/newgem/newgem.gemspec.tt +3 -3
  112. data/{bundler/lib → lib}/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
  113. data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
  114. data/{bundler/lib → lib}/bundler/ui/shell.rb +0 -4
  115. data/{bundler/lib → lib}/bundler/ui/silent.rb +0 -4
  116. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +35 -2
  117. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/base.rb +2 -1
  118. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/basic.rb +14 -6
  119. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/color.rb +2 -0
  120. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/version.rb +1 -1
  121. data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor.rb +34 -1
  122. data/lib/bundler/vendored_pub_grub.rb +7 -0
  123. data/lib/bundler/vendored_securerandom.rb +15 -0
  124. data/lib/bundler/vendored_uri.rb +21 -0
  125. data/{bundler/lib → lib}/bundler/version.rb +1 -1
  126. data/{bundler/lib → lib}/bundler/worker.rb +3 -2
  127. data/{bundler/lib → lib}/bundler.rb +1 -1
  128. data/lib/rubygems/basic_specification.rb +15 -14
  129. data/lib/rubygems/bundler_settings.rb +137 -0
  130. data/lib/rubygems/bundler_version_finder.rb +13 -55
  131. data/lib/rubygems/ci_detector.rb +1 -1
  132. data/lib/rubygems/commands/build_command.rb +8 -1
  133. data/lib/rubygems/commands/cert_command.rb +9 -7
  134. data/lib/rubygems/commands/contents_command.rb +1 -1
  135. data/lib/rubygems/commands/dependency_command.rb +15 -3
  136. data/lib/rubygems/commands/environment_command.rb +1 -0
  137. data/lib/rubygems/commands/exec_command.rb +3 -0
  138. data/lib/rubygems/commands/fetch_command.rb +1 -1
  139. data/lib/rubygems/commands/help_command.rb +3 -1
  140. data/lib/rubygems/commands/install_command.rb +13 -3
  141. data/lib/rubygems/commands/lock_command.rb +2 -2
  142. data/lib/rubygems/commands/outdated_command.rb +77 -2
  143. data/lib/rubygems/commands/owner_command.rb +1 -1
  144. data/lib/rubygems/commands/push_command.rb +159 -21
  145. data/lib/rubygems/commands/setup_command.rb +20 -23
  146. data/lib/rubygems/commands/signin_command.rb +3 -1
  147. data/lib/rubygems/commands/signout_command.rb +26 -6
  148. data/lib/rubygems/commands/specification_command.rb +1 -1
  149. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  150. data/lib/rubygems/commands/update_command.rb +84 -2
  151. data/lib/rubygems/commands/yank_command.rb +10 -7
  152. data/lib/rubygems/compact_index_client/cache.rb +122 -0
  153. data/lib/rubygems/compact_index_client/cache_file.rb +147 -0
  154. data/lib/rubygems/compact_index_client/http_fetcher.rb +88 -0
  155. data/lib/rubygems/compact_index_client/parser.rb +90 -0
  156. data/lib/rubygems/compact_index_client/updater.rb +113 -0
  157. data/lib/rubygems/compact_index_client.rb +111 -0
  158. data/lib/rubygems/config_file.rb +304 -22
  159. data/lib/rubygems/content_address.rb +194 -0
  160. data/lib/rubygems/cooldown.rb +173 -0
  161. data/lib/rubygems/cooldown_option.rb +27 -0
  162. data/lib/rubygems/cooldown_settings.rb +57 -0
  163. data/lib/rubygems/credential_store/native/linux.rb +97 -0
  164. data/lib/rubygems/credential_store/native/macos.rb +88 -0
  165. data/lib/rubygems/credential_store/native/windows.rb +130 -0
  166. data/lib/rubygems/credential_store.rb +332 -0
  167. data/lib/rubygems/defaults.rb +9 -0
  168. data/lib/rubygems/dependency_installer.rb +15 -0
  169. data/lib/rubygems/doctor.rb +23 -6
  170. data/lib/rubygems/exceptions.rb +11 -43
  171. data/lib/rubygems/ext/builder.rb +70 -5
  172. data/lib/rubygems/ext/cargo_builder.rb +0 -9
  173. data/lib/rubygems/ext/ext_conf_builder.rb +8 -15
  174. data/lib/rubygems/gemcutter_utilities.rb +44 -2
  175. data/lib/rubygems/install_update_options.rb +16 -0
  176. data/lib/rubygems/installer.rb +90 -11
  177. data/lib/rubygems/installer_uninstaller_utils.rb +24 -3
  178. data/lib/rubygems/name_tuple.rb +55 -18
  179. data/lib/rubygems/package/old.rb +1 -1
  180. data/lib/rubygems/package.rb +200 -47
  181. data/lib/rubygems/package_task.rb +2 -2
  182. data/lib/rubygems/platform.rb +2 -2
  183. data/lib/rubygems/query_utils.rb +84 -24
  184. data/lib/rubygems/remote_fetcher.rb +65 -17
  185. data/lib/rubygems/request/connection_pools.rb +3 -0
  186. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  187. data/lib/rubygems/request_set/lockfile.rb +0 -2
  188. data/lib/rubygems/request_set.rb +105 -17
  189. data/lib/rubygems/resolver/api_set.rb +14 -26
  190. data/lib/rubygems/resolver/api_specification.rb +56 -15
  191. data/lib/rubygems/resolver/incompatibility.rb +10 -0
  192. data/lib/rubygems/resolver/index_specification.rb +6 -4
  193. data/lib/rubygems/resolver/installer_set.rb +2 -2
  194. data/lib/rubygems/resolver/lock_specification.rb +5 -1
  195. data/lib/rubygems/resolver/spec_specification.rb +4 -0
  196. data/lib/rubygems/resolver/specification.rb +16 -1
  197. data/lib/rubygems/resolver/strategy.rb +44 -0
  198. data/lib/rubygems/resolver.rb +471 -145
  199. data/lib/rubygems/safe_marshal.rb +2 -1
  200. data/lib/rubygems/safe_yaml.rb +20 -3
  201. data/lib/rubygems/security/policy.rb +11 -3
  202. data/lib/rubygems/security/signer.rb +15 -7
  203. data/lib/rubygems/security.rb +111 -17
  204. data/lib/rubygems/source/local.rb +7 -2
  205. data/lib/rubygems/source.rb +270 -23
  206. data/lib/rubygems/spec_fetcher.rb +47 -12
  207. data/lib/rubygems/specification.rb +76 -32
  208. data/lib/rubygems/specification_policy.rb +33 -6
  209. data/lib/rubygems/specification_record.rb +41 -2
  210. data/lib/rubygems/stub_specification.rb +39 -16
  211. data/lib/rubygems/uninstaller.rb +2 -0
  212. data/lib/rubygems/util/atomic_file_writer.rb +109 -0
  213. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +2 -1
  214. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +5 -6
  215. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +8 -4
  216. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +15 -1
  217. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +2 -1
  218. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +68 -0
  219. data/lib/rubygems/vendor/net-http/lib/net/http.rb +60 -49
  220. data/lib/rubygems/vendor/optparse/lib/optparse.rb +23 -30
  221. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/assignment.rb +1 -1
  222. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +7 -7
  223. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/failure_writer.rb +1 -1
  224. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/incompatibility.rb +4 -4
  225. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/package.rb +1 -1
  226. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/partial_solution.rb +1 -1
  227. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/rubygems.rb +3 -3
  228. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/solve_failure.rb +1 -1
  229. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/static_package_source.rb +3 -3
  230. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/strategy.rb +2 -2
  231. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/term.rb +1 -1
  232. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version.rb +1 -1
  233. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_constraint.rb +3 -3
  234. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_range.rb +1 -1
  235. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_solver.rb +2 -2
  236. data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_union.rb +1 -1
  237. data/lib/rubygems/vendor/pub_grub/lib/pub_grub.rb +57 -0
  238. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3508 -0
  239. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +4 -0
  240. data/lib/rubygems/vendor/timeout/lib/timeout.rb +190 -77
  241. data/lib/rubygems/vendor/uri/lib/uri.rb +4 -0
  242. data/{bundler/lib/bundler → lib/rubygems}/vendored_pub_grub.rb +0 -1
  243. data/lib/rubygems/version.rb +129 -111
  244. data/lib/rubygems/version_option.rb +14 -0
  245. data/lib/rubygems/yaml_serializer.rb +853 -71
  246. data/lib/rubygems.rb +45 -11
  247. data/rubygems-update.gemspec +3 -4
  248. data/setup.rb +1 -0
  249. metadata +365 -410
  250. data/bundler/CHANGELOG.md +0 -5784
  251. data/bundler/LICENSE.md +0 -22
  252. data/bundler/README.md +0 -58
  253. data/bundler/bundler.gemspec +0 -46
  254. data/bundler/lib/bundler/compact_index_client/cache.rb +0 -107
  255. data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -148
  256. data/bundler/lib/bundler/compact_index_client/parser.rb +0 -87
  257. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -105
  258. data/bundler/lib/bundler/compact_index_client.rb +0 -92
  259. data/bundler/lib/bundler/match_metadata.rb +0 -30
  260. data/bundler/lib/bundler/match_remote_metadata.rb +0 -29
  261. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +0 -20
  262. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +0 -227
  263. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +0 -3
  264. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -56
  265. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +0 -230
  266. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +0 -82
  267. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +0 -41
  268. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +0 -65
  269. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +0 -80
  270. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +0 -1153
  271. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +0 -31
  272. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +0 -102
  273. data/bundler/lib/bundler/vendor/uri/COPYING +0 -56
  274. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +0 -922
  275. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +0 -100
  276. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -267
  277. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +0 -1592
  278. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -137
  279. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -23
  280. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +0 -261
  281. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +0 -22
  282. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -293
  283. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +0 -547
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +0 -206
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +0 -6
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +0 -83
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +0 -23
  288. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -104
  289. data/bundler/lib/bundler/vendored_persistent.rb +0 -11
  290. data/bundler/lib/bundler/vendored_securerandom.rb +0 -12
  291. data/bundler/lib/bundler/vendored_uri.rb +0 -21
  292. data/bundler/lib/bundler/yaml_serializer.rb +0 -98
  293. data/doc/rubygems/CONTRIBUTING.md +0 -231
  294. data/doc/rubygems/POLICIES.md +0 -60
  295. data/lib/rubygems/request_set/lockfile/parser.rb +0 -344
  296. data/lib/rubygems/request_set/lockfile/tokenizer.rb +0 -122
  297. data/lib/rubygems/resolver/conflict.rb +0 -146
  298. data/lib/rubygems/resolver/stats.rb +0 -46
  299. data/lib/rubygems/util/list.rb +0 -40
  300. data/lib/rubygems/vendor/molinillo/LICENSE +0 -9
  301. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  302. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  303. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  304. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  305. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  306. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  307. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  308. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  309. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  310. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  311. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  312. data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  313. data/lib/rubygems/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  314. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  315. data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  316. data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  317. data/lib/rubygems/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  318. data/lib/rubygems/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  319. data/lib/rubygems/vendor/molinillo/lib/molinillo/state.rb +0 -58
  320. data/lib/rubygems/vendor/molinillo/lib/molinillo.rb +0 -11
  321. data/lib/rubygems/vendored_molinillo.rb +0 -3
  322. /data/{bundler/exe → exe}/bundle +0 -0
  323. /data/{bundler/exe → exe}/bundler +0 -0
  324. /data/{bundler/lib → lib}/bundler/.document +0 -0
  325. /data/{bundler/lib → lib}/bundler/capistrano.rb +0 -0
  326. /data/{bundler/lib → lib}/bundler/cli/binstubs.rb +0 -0
  327. /data/{bundler/lib → lib}/bundler/cli/check.rb +0 -0
  328. /data/{bundler/lib → lib}/bundler/cli/console.rb +0 -0
  329. /data/{bundler/lib → lib}/bundler/cli/doctor/diagnose.rb +0 -0
  330. /data/{bundler/lib → lib}/bundler/cli/doctor/ssl.rb +0 -0
  331. /data/{bundler/lib → lib}/bundler/cli/doctor.rb +0 -0
  332. /data/{bundler/lib → lib}/bundler/cli/exec.rb +0 -0
  333. /data/{bundler/lib → lib}/bundler/cli/fund.rb +0 -0
  334. /data/{bundler/lib → lib}/bundler/cli/info.rb +0 -0
  335. /data/{bundler/lib → lib}/bundler/cli/init.rb +0 -0
  336. /data/{bundler/lib → lib}/bundler/cli/issue.rb +0 -0
  337. /data/{bundler/lib → lib}/bundler/cli/list.rb +0 -0
  338. /data/{bundler/lib → lib}/bundler/cli/open.rb +0 -0
  339. /data/{bundler/lib → lib}/bundler/cli/platform.rb +0 -0
  340. /data/{bundler/lib → lib}/bundler/cli/plugin.rb +0 -0
  341. /data/{bundler/lib → lib}/bundler/cli/remove.rb +0 -0
  342. /data/{bundler/lib → lib}/bundler/cli/show.rb +0 -0
  343. /data/{bundler/lib → lib}/bundler/constants.rb +0 -0
  344. /data/{bundler/lib → lib}/bundler/current_ruby.rb +0 -0
  345. /data/{bundler/lib → lib}/bundler/deployment.rb +0 -0
  346. /data/{bundler/lib → lib}/bundler/deprecate.rb +0 -0
  347. /data/{bundler/lib → lib}/bundler/digest.rb +0 -0
  348. /data/{bundler/lib → lib}/bundler/environment_preserver.rb +0 -0
  349. /data/{bundler/lib → lib}/bundler/feature_flag.rb +0 -0
  350. /data/{bundler/lib → lib}/bundler/fetcher/base.rb +0 -0
  351. /data/{bundler/lib → lib}/bundler/fetcher/dependency.rb +0 -0
  352. /data/{bundler/lib → lib}/bundler/fetcher/gem_remote_fetcher.rb +0 -0
  353. /data/{bundler/lib → lib}/bundler/fetcher/index.rb +0 -0
  354. /data/{bundler/lib → lib}/bundler/force_platform.rb +0 -0
  355. /data/{bundler/lib → lib}/bundler/friendly_errors.rb +0 -0
  356. /data/{bundler/lib → lib}/bundler/gem_helper.rb +0 -0
  357. /data/{bundler/lib → lib}/bundler/gem_tasks.rb +0 -0
  358. /data/{bundler/lib → lib}/bundler/gem_version_promoter.rb +0 -0
  359. /data/{bundler/lib → lib}/bundler/index.rb +0 -0
  360. /data/{bundler/lib → lib}/bundler/installer/gem_installer.rb +0 -0
  361. /data/{bundler/lib → lib}/bundler/installer/standalone.rb +0 -0
  362. /data/{bundler/lib → lib}/bundler/man/.document +0 -0
  363. /data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1.ronn +0 -0
  364. /data/{bundler/lib → lib}/bundler/man/bundle-check.1.ronn +0 -0
  365. /data/{bundler/lib → lib}/bundler/man/bundle-clean.1.ronn +0 -0
  366. /data/{bundler/lib → lib}/bundler/man/bundle-console.1.ronn +0 -0
  367. /data/{bundler/lib → lib}/bundler/man/bundle-doctor.1.ronn +0 -0
  368. /data/{bundler/lib → lib}/bundler/man/bundle-env.1.ronn +0 -0
  369. /data/{bundler/lib → lib}/bundler/man/bundle-exec.1.ronn +0 -0
  370. /data/{bundler/lib → lib}/bundler/man/bundle-fund.1.ronn +0 -0
  371. /data/{bundler/lib → lib}/bundler/man/bundle-gem.1.ronn +0 -0
  372. /data/{bundler/lib → lib}/bundler/man/bundle-help.1.ronn +0 -0
  373. /data/{bundler/lib → lib}/bundler/man/bundle-info.1.ronn +0 -0
  374. /data/{bundler/lib → lib}/bundler/man/bundle-init.1.ronn +0 -0
  375. /data/{bundler/lib → lib}/bundler/man/bundle-issue.1.ronn +0 -0
  376. /data/{bundler/lib → lib}/bundler/man/bundle-licenses.1.ronn +0 -0
  377. /data/{bundler/lib → lib}/bundler/man/bundle-list.1.ronn +0 -0
  378. /data/{bundler/lib → lib}/bundler/man/bundle-open.1.ronn +0 -0
  379. /data/{bundler/lib → lib}/bundler/man/bundle-outdated.1.ronn +0 -0
  380. /data/{bundler/lib → lib}/bundler/man/bundle-platform.1.ronn +0 -0
  381. /data/{bundler/lib → lib}/bundler/man/bundle-plugin.1.ronn +0 -0
  382. /data/{bundler/lib → lib}/bundler/man/bundle-pristine.1.ronn +0 -0
  383. /data/{bundler/lib → lib}/bundler/man/bundle-remove.1.ronn +0 -0
  384. /data/{bundler/lib → lib}/bundler/man/bundle-show.1.ronn +0 -0
  385. /data/{bundler/lib → lib}/bundler/man/bundle-version.1.ronn +0 -0
  386. /data/{bundler/lib → lib}/bundler/man/bundle.1.ronn +0 -0
  387. /data/{bundler/lib → lib}/bundler/man/index.txt +0 -0
  388. /data/{bundler/lib → lib}/bundler/mirror.rb +0 -0
  389. /data/{bundler/lib → lib}/bundler/plugin/api/source.rb +0 -0
  390. /data/{bundler/lib → lib}/bundler/plugin/api.rb +0 -0
  391. /data/{bundler/lib → lib}/bundler/plugin/installer/git.rb +0 -0
  392. /data/{bundler/lib → lib}/bundler/plugin/installer/rubygems.rb +0 -0
  393. /data/{bundler/lib → lib}/bundler/plugin/source_list.rb +0 -0
  394. /data/{bundler/lib → lib}/bundler/plugin/unloaded_source.rb +0 -0
  395. /data/{bundler/lib → lib}/bundler/process_lock.rb +0 -0
  396. /data/{bundler/lib → lib}/bundler/resolver/candidate.rb +0 -0
  397. /data/{bundler/lib → lib}/bundler/resolver/package.rb +0 -0
  398. /data/{bundler/lib → lib}/bundler/resolver/root.rb +0 -0
  399. /data/{bundler/lib → lib}/bundler/resolver/spec_group.rb +0 -0
  400. /data/{bundler/lib → lib}/bundler/resolver/strategy.rb +0 -0
  401. /data/{bundler/lib → lib}/bundler/retry.rb +0 -0
  402. /data/{bundler/lib → lib}/bundler/ruby_dsl.rb +0 -0
  403. /data/{bundler/lib → lib}/bundler/safe_marshal.rb +0 -0
  404. /data/{bundler/lib → lib}/bundler/settings/validator.rb +0 -0
  405. /data/{bundler/lib → lib}/bundler/setup.rb +0 -0
  406. /data/{bundler/lib → lib}/bundler/source/gemspec.rb +0 -0
  407. /data/{bundler/lib → lib}/bundler/source/metadata.rb +0 -0
  408. /data/{bundler/lib → lib}/bundler/source/path.rb +0 -0
  409. /data/{bundler/lib → lib}/bundler/source/rubygems_aggregate.rb +0 -0
  410. /data/{bundler/lib → lib}/bundler/source.rb +0 -0
  411. /data/{bundler/lib → lib}/bundler/source_list.rb +0 -0
  412. /data/{bundler/lib → lib}/bundler/source_map.rb +0 -0
  413. /data/{bundler/lib → lib}/bundler/templates/.document +0 -0
  414. /data/{bundler/lib → lib}/bundler/templates/Executable +0 -0
  415. /data/{bundler/lib → lib}/bundler/templates/Executable.standalone +0 -0
  416. /data/{bundler/lib → lib}/bundler/templates/Gemfile +0 -0
  417. /data/{bundler/lib → lib}/bundler/templates/newgem/CHANGELOG.md.tt +0 -0
  418. /data/{bundler/lib → lib}/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +0 -0
  419. /data/{bundler/lib → lib}/bundler/templates/newgem/Cargo.toml.tt +0 -0
  420. /data/{bundler/lib → lib}/bundler/templates/newgem/LICENSE.txt.tt +0 -0
  421. /data/{bundler/lib → lib}/bundler/templates/newgem/README.md.tt +0 -0
  422. /data/{bundler/lib → lib}/bundler/templates/newgem/Rakefile.tt +0 -0
  423. /data/{bundler/lib → lib}/bundler/templates/newgem/bin/console.tt +0 -0
  424. /data/{bundler/lib → lib}/bundler/templates/newgem/bin/setup.tt +0 -0
  425. /data/{bundler/lib → lib}/bundler/templates/newgem/circleci/config.yml.tt +0 -0
  426. /data/{bundler/lib → lib}/bundler/templates/newgem/exe/newgem.tt +0 -0
  427. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +0 -0
  428. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/build.rs.tt +0 -0
  429. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +0 -0
  430. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +0 -0
  431. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +0 -0
  432. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/go.mod.tt +0 -0
  433. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +0 -0
  434. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.c.tt +0 -0
  435. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.go.tt +0 -0
  436. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.h.tt +0 -0
  437. /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +0 -0
  438. /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/build-gems.yml.tt +0 -0
  439. /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/main.yml.tt +0 -0
  440. /data/{bundler/lib → lib}/bundler/templates/newgem/gitignore.tt +0 -0
  441. /data/{bundler/lib → lib}/bundler/templates/newgem/gitlab-ci.yml.tt +0 -0
  442. /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem/version.rb.tt +0 -0
  443. /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem.rb.tt +0 -0
  444. /data/{bundler/lib → lib}/bundler/templates/newgem/rspec.tt +0 -0
  445. /data/{bundler/lib → lib}/bundler/templates/newgem/rubocop.yml.tt +0 -0
  446. /data/{bundler/lib → lib}/bundler/templates/newgem/sig/newgem.rbs.tt +0 -0
  447. /data/{bundler/lib → lib}/bundler/templates/newgem/spec/spec_helper.rb.tt +0 -0
  448. /data/{bundler/lib → lib}/bundler/templates/newgem/standard.yml.tt +0 -0
  449. /data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_helper.rb.tt +0 -0
  450. /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +0 -0
  451. /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +0 -0
  452. /data/{bundler/lib → lib}/bundler/ui/rg_proxy.rb +0 -0
  453. /data/{bundler/lib → lib}/bundler/ui.rb +0 -0
  454. /data/{bundler/lib → lib}/bundler/uri_credentials_filter.rb +0 -0
  455. /data/{bundler/lib → lib}/bundler/uri_normalizer.rb +0 -0
  456. /data/{bundler/lib → lib}/bundler/vendor/.document +0 -0
  457. /data/{bundler/lib → lib}/bundler/vendor/fileutils/COPYING +0 -0
  458. /data/{bundler/lib → lib}/bundler/vendor/fileutils/lib/fileutils.rb +0 -0
  459. /data/{bundler/lib → lib}/bundler/vendor/thor/LICENSE.md +0 -0
  460. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_file.rb +0 -0
  461. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_link.rb +0 -0
  462. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/directory.rb +0 -0
  463. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +0 -0
  464. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +0 -0
  465. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions.rb +0 -0
  466. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/command.rb +0 -0
  467. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -0
  468. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/error.rb +0 -0
  469. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/group.rb +0 -0
  470. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/invocation.rb +0 -0
  471. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/basic.rb +0 -0
  472. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/readline.rb +0 -0
  473. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor.rb +0 -0
  474. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/nested_context.rb +0 -0
  475. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/argument.rb +0 -0
  476. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/arguments.rb +0 -0
  477. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/option.rb +0 -0
  478. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/options.rb +0 -0
  479. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser.rb +0 -0
  480. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/rake_compat.rb +0 -0
  481. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/runner.rb +0 -0
  482. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/column_printer.rb +0 -0
  483. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/html.rb +0 -0
  484. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/table_printer.rb +0 -0
  485. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/terminal.rb +0 -0
  486. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +0 -0
  487. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell.rb +0 -0
  488. /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/util.rb +0 -0
  489. /data/{bundler/lib → lib}/bundler/vendored_fileutils.rb +0 -0
  490. /data/{bundler/lib → lib}/bundler/vendored_net_http.rb +0 -0
  491. /data/{bundler/lib → lib}/bundler/vendored_thor.rb +0 -0
  492. /data/{bundler/lib → lib}/bundler/vendored_timeout.rb +0 -0
  493. /data/{bundler/lib → lib}/bundler/vendored_tsort.rb +0 -0
  494. /data/{bundler/lib → lib}/bundler/vlad.rb +0 -0
  495. /data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/LICENSE.txt +0 -0
  496. /data/{bundler/lib/bundler/vendor/securerandom → lib/rubygems/vendor/resolv}/COPYING +0 -0
@@ -2,11 +2,13 @@
2
2
 
3
3
  require_relative "../command"
4
4
  require_relative "../local_remote_options"
5
+ require_relative "../version_option"
5
6
  require_relative "../gemcutter_utilities"
6
7
  require_relative "../package"
7
8
 
8
9
  class Gem::Commands::PushCommand < Gem::Command
9
10
  include Gem::LocalRemoteOptions
11
+ include Gem::VersionOption
10
12
  include Gem::GemcutterUtilities
11
13
 
12
14
  def description # :nodoc:
@@ -17,7 +19,9 @@ https://rubygems.org) and adds it to the index.
17
19
  The gem can be removed from the index and deleted from the server using the yank
18
20
  command. For further discussion see the help for the yank command.
19
21
 
20
- The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate.
22
+ The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate. If the :credential_store: gemrc option (or RUBYGEMS_CREDENTIAL_STORE environment variable) is set, the API key is stored in and read from the credential store it selects instead of ~/.gem/credentials.
23
+
24
+ The API key to send is resolved in this order: the GEM_HOST_API_KEY environment variable, the --key option, the host's own key in the credential store (when :credential_store: is set), the host's own key in ~/.gem/credentials, then the default RubyGems.org key from either place. The first one found is used.
21
25
  EOF
22
26
  end
23
27
 
@@ -45,8 +49,17 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
45
49
  @user_defined_host = true
46
50
  end
47
51
 
52
+ add_option("--platform PLATFORM",
53
+ "Push a gem for a specific platform",
54
+ " (e.g. x86_64-darwin-20)") do |value, options|
55
+ options[:platform] = value
56
+ end
57
+
58
+ add_ruby_abi_option("push", " (e.g. 3.4)")
59
+
48
60
  add_option("--attestation FILE",
49
- "Push with sigstore attestations") do |value, options|
61
+ "Push with sigstore attestations",
62
+ " (FILE must be a JSON sigstore bundle)") do |value, options|
50
63
  options[:attestations] << value
51
64
  end
52
65
 
@@ -54,7 +67,12 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
54
67
  end
55
68
 
56
69
  def execute
57
- gem_name = get_one_gem_name
70
+ gem_name = if options[:platform] || options[:ruby_abi]
71
+ resolve_gem_name(get_all_gem_names)
72
+ else
73
+ get_one_gem_name
74
+ end
75
+
58
76
  default_gem_server, push_host = get_hosts_for(gem_name)
59
77
 
60
78
  @host = if @user_defined_host
@@ -91,24 +109,150 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
91
109
 
92
110
  private
93
111
 
112
+ def resolve_gem_name(names)
113
+ platform = options[:platform] && Gem::Platform.new(options[:platform])
114
+ ruby_abi = options[:ruby_abi]
115
+
116
+ candidates = names.filter_map do |name|
117
+ [name, Gem::Package.new(name).spec]
118
+ rescue Gem::Package::FormatError => e
119
+ alert_warning "Skipping #{name}: #{e.message}"
120
+ nil
121
+ end
122
+
123
+ matches = candidates.select do |_, spec|
124
+ (!platform || spec.platform == platform) &&
125
+ (!ruby_abi || (Gem::ContentAddress.eligible?(spec) && spec.ruby_abi == ruby_abi))
126
+ end
127
+
128
+ raise Gem::CommandLineError, "No gem matched #{gem_name_selector_description}" if matches.empty?
129
+ raise Gem::CommandLineError, multiple_matches_message(matches) if matches.length > 1
130
+
131
+ matches.first.first
132
+ end
133
+
134
+ def gem_name_selector_description
135
+ selectors = []
136
+ selectors << "platform #{options[:platform]}" if options[:platform]
137
+ selectors << "Ruby ABI #{options[:ruby_abi]}" if options[:ruby_abi]
138
+ selectors.join(" and ")
139
+ end
140
+
141
+ def multiple_matches_message(matches)
142
+ message = "Multiple gems matched #{gem_name_selector_description}: #{matches.map(&:first).join(", ")}"
143
+
144
+ if options[:platform] && !options[:ruby_abi]
145
+ ruby_abis = matches.filter_map {|_, spec| spec.ruby_abi }.uniq.sort
146
+ message += "\nSpecify --ruby-abi with one of: #{ruby_abis.join(", ")}" unless ruby_abis.empty?
147
+ message += "\nTo push a gem without a Ruby ABI, pass the exact filename." if matches.any? {|_, spec| spec.ruby_abi.nil? }
148
+ elsif options[:ruby_abi] && !options[:platform]
149
+ platforms = matches.map {|_, spec| spec.platform.to_s }.uniq.sort
150
+ message += "\nSpecify --platform with one of: #{platforms.join(", ")}" unless platforms.empty?
151
+ end
152
+
153
+ message
154
+ end
155
+
94
156
  def send_push_request(name, args)
157
+ # Always honor explicit --attestation option
158
+ # Auto-attestation is only supported on rubygems.org with GitHub Actions (not JRuby)
159
+ if options[:attestations].any? || (RUBY_ENGINE != "jruby" && attestation_supported_host? && ENV["GITHUB_ACTIONS"] == "true")
160
+ send_push_request_with_attestation(name, args)
161
+ else
162
+ send_push_request_without_attestation(name, args)
163
+ end
164
+ end
165
+
166
+ def send_push_request_without_attestation(name, args)
95
167
  scope = get_push_scope
96
168
  rubygems_api_request(*args, scope: scope) do |request|
97
169
  body = Gem.read_binary name
98
- if options[:attestations].any?
99
- request.set_form([
100
- ["gem", body, { filename: name, content_type: "application/octet-stream" }],
101
- get_attestations_part,
102
- ], "multipart/form-data")
103
- else
104
- request.body = body
105
- request.add_field "Content-Type", "application/octet-stream"
106
- request.add_field "Content-Length", request.body.size
170
+ request.body = body
171
+ request.add_field "Content-Type", "application/octet-stream"
172
+ request.add_field "Content-Length", request.body.size
173
+ request.add_field "Authorization", api_key
174
+ end
175
+ end
176
+
177
+ def send_push_request_with_attestation(name, args)
178
+ attestations = if options[:attestations].any?
179
+ options[:attestations].map do |attestation|
180
+ load_attestation(attestation)
181
+ end
182
+ else
183
+ # Only the opportunistic signing step falls back. The request below stays
184
+ # outside this rescue because once the server may have seen the attested
185
+ # push, a network error must not trigger an unattested retry.
186
+ begin
187
+ [attest!(name)]
188
+ rescue StandardError => e
189
+ message = "Failed to create an attestation, pushing without one.\n"
190
+ message += if Gem.configuration.really_verbose
191
+ e.full_message
192
+ else
193
+ e.message
194
+ end
195
+ alert_warning message
196
+ return send_push_request_without_attestation(name, args)
107
197
  end
198
+ end
199
+ bundles = "[" + attestations.join(",") + "]"
200
+
201
+ rubygems_api_request(*args, scope: get_push_scope) do |request|
202
+ request.set_form([
203
+ ["gem", Gem.read_binary(name), { filename: name, content_type: "application/octet-stream" }],
204
+ ["attestations", bundles, { content_type: "application/json" }],
205
+ ], "multipart/form-data")
108
206
  request.add_field "Authorization", api_key
109
207
  end
110
208
  end
111
209
 
210
+ def load_attestation(file)
211
+ data = begin
212
+ Gem.read_binary(file)
213
+ rescue SystemCallError, IOError, ArgumentError => e
214
+ raise Gem::Exception, "Failed to read attestation #{file}: #{e.message}"
215
+ end
216
+ validate_attestation_json(data, file)
217
+ end
218
+
219
+ def validate_attestation_json(data, source)
220
+ require "json"
221
+
222
+ parsed = begin
223
+ JSON.parse(data)
224
+ rescue JSON::ParserError => e
225
+ raise Gem::Exception, "Attestation #{source} is not valid JSON: #{e.message}"
226
+ end
227
+ raise Gem::Exception, "Attestation #{source} is not a JSON object" unless parsed.is_a?(Hash)
228
+ data
229
+ end
230
+
231
+ def attest!(name)
232
+ require "open3"
233
+ require "shellwords"
234
+ require "tempfile"
235
+
236
+ env = defined?(Bundler.unbundled_env) ? Bundler.unbundled_env : ENV.to_h
237
+
238
+ Tempfile.create([File.basename(name, ".*"), ".sigstore.json"]) do |tempfile|
239
+ tempfile.close
240
+ bundle = tempfile.path
241
+
242
+ # Gem.ruby is quoted if it contains whitespace, so split it into argv
243
+ # elements to keep the quotes out of the spawned command.
244
+ out, st = Open3.capture2e(
245
+ env,
246
+ *Shellwords.split(Gem.ruby), "-S", "gem", "exec", "--conservative",
247
+ "sigstore-cli", "sign", name, "--bundle", bundle,
248
+ unsetenv_others: true
249
+ )
250
+ raise Gem::Exception, "Failed to sign gem:\n\n#{out}" unless st.success?
251
+
252
+ validate_attestation_json(Gem.read_binary(bundle), "generated by sigstore-cli")
253
+ end
254
+ end
255
+
112
256
  def get_hosts_for(name)
113
257
  gem_metadata = Gem::Package.new(name).spec.metadata
114
258
 
@@ -122,14 +266,8 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
122
266
  :push_rubygem
123
267
  end
124
268
 
125
- def get_attestations_part
126
- bundles = "[" + options[:attestations].map do |attestation|
127
- Gem.read_binary(attestation)
128
- end.join(",") + "]"
129
- [
130
- "attestations",
131
- bundles,
132
- { content_type: "application/json" },
133
- ]
269
+ def attestation_supported_host?
270
+ host = (@host || Gem.host).to_s.chomp("/")
271
+ host == Gem::DEFAULT_HOST
134
272
  end
135
273
  end
@@ -283,7 +283,6 @@ By default, this RubyGems will install gem as:
283
283
 
284
284
  def install_lib(lib_dir)
285
285
  libs = { "RubyGems" => "lib" }
286
- libs["Bundler"] = "bundler/lib"
287
286
  libs.each do |tool, path|
288
287
  say "Installing #{tool}" if @verbose
289
288
 
@@ -371,7 +370,7 @@ By default, this RubyGems will install gem as:
371
370
  # the default gem will look for them.
372
371
  bundler_install_dir = File.dirname(File.dirname(specs_dir))
373
372
 
374
- new_bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
373
+ new_bundler_spec = Gem::Specification.load("bundler.gemspec")
375
374
  full_name = new_bundler_spec.full_name
376
375
  gemspec_path = "#{full_name}.gemspec"
377
376
 
@@ -396,26 +395,24 @@ By default, this RubyGems will install gem as:
396
395
 
397
396
  require_relative "../installer"
398
397
 
399
- Dir.chdir("bundler") do
400
- built_gem = Gem::Package.build(new_bundler_spec)
401
- begin
402
- installer = Gem::Installer.at(
403
- built_gem,
404
- env_shebang: options[:env_shebang],
405
- format_executable: options[:format_executable],
406
- force: options[:force],
407
- bin_dir: bin_dir,
408
- install_dir: bundler_install_dir,
409
- wrappers: true
410
- )
411
- # We only need to install the executables here. The default spec was
412
- # already written above, and lib/bundler.rb and lib/bundler/* are
413
- # available under the site_ruby directory.
414
- installer.extract_bin
415
- installer.generate_bin
416
- ensure
417
- FileUtils.rm_f built_gem
418
- end
398
+ built_gem = Gem::Package.build(new_bundler_spec)
399
+ begin
400
+ installer = Gem::Installer.at(
401
+ built_gem,
402
+ env_shebang: options[:env_shebang],
403
+ format_executable: options[:format_executable],
404
+ force: options[:force],
405
+ bin_dir: bin_dir,
406
+ install_dir: bundler_install_dir,
407
+ wrappers: true
408
+ )
409
+ # We only need to install the executables here. The default spec was
410
+ # already written above, and lib/bundler.rb and lib/bundler/* are
411
+ # available under the site_ruby directory.
412
+ installer.extract_bin
413
+ installer.generate_bin
414
+ ensure
415
+ FileUtils.rm_f built_gem
419
416
  end
420
417
 
421
418
  new_bundler_spec.executables.each {|executable| bin_file_names << target_bin_path(bin_dir, executable) }
@@ -505,7 +502,7 @@ abort "#{deprecation_message}"
505
502
 
506
503
  def remove_old_lib_files(lib_dir)
507
504
  lib_dirs = { File.join(lib_dir, "rubygems") => "lib/rubygems" }
508
- lib_dirs[File.join(lib_dir, "bundler")] = "bundler/lib/bundler"
505
+ lib_dirs[File.join(lib_dir, "bundler")] = "lib/bundler"
509
506
  lib_dirs.each do |old_lib_dir, new_lib_dir|
510
507
  lib_files = files_in(new_lib_dir)
511
508
 
@@ -21,7 +21,9 @@ class Gem::Commands::SigninCommand < Gem::Command
21
21
  "The signin command executes host sign in for a push server (the default is"\
22
22
  " https://rubygems.org). The host can be provided with the host flag or can"\
23
23
  " be inferred from the provided gem. Host resolution matches the resolution"\
24
- " strategy for the push command."
24
+ " strategy for the push command. If the :credential_store: gemrc option (or"\
25
+ " RUBYGEMS_CREDENTIAL_STORE environment variable) is set, the resulting API key is"\
26
+ " stored in the credential store it selects instead of ~/.gem/credentials."
25
27
  end
26
28
 
27
29
  def usage # :nodoc:
@@ -9,7 +9,10 @@ class Gem::Commands::SignoutCommand < Gem::Command
9
9
 
10
10
  def description # :nodoc:
11
11
  "The `signout` command is used to sign out from all current sessions,"\
12
- " allowing you to sign in using a different set of credentials."
12
+ " allowing you to sign in using a different set of credentials. It removes"\
13
+ " the ~/.gem/credentials file. If the :credential_store: gemrc option is"\
14
+ " set, it also removes every RubyGems key from the credential store,"\
15
+ " including keys saved for other hosts with `gem signin --host`."
13
16
  end
14
17
 
15
18
  def usage # :nodoc:
@@ -18,14 +21,31 @@ class Gem::Commands::SignoutCommand < Gem::Command
18
21
 
19
22
  def execute
20
23
  credentials_path = Gem.configuration.credentials_path
24
+ credentials_file_exists = File.exist?(credentials_path)
21
25
 
22
- if !File.exist?(credentials_path)
26
+ if !credentials_file_exists && !Gem.configuration.credential_store
23
27
  alert_error "You are not currently signed in."
24
- elsif !File.writable?(credentials_path)
25
- alert_error "File '#{Gem.configuration.credentials_path}' is read-only."\
26
- " Please make sure it is writable."
28
+ return
29
+ end
30
+
31
+ # An unwritable file must not leave the stored keys behind, so each half
32
+ # reports its own outcome.
33
+ store_cleared, file_removed = Gem.configuration.unset_api_key!
34
+
35
+ unremoved = []
36
+ unremoved << "the credential store" unless store_cleared
37
+ unremoved << "'#{credentials_path}'" if credentials_file_exists && !file_removed
38
+
39
+ unless unremoved.empty?
40
+ alert_error "Could not remove the credentials from #{unremoved.join(" and ")}." \
41
+ " They are still there. Check that the file and its directory are writable," \
42
+ " or remove them yourself to finish signing out."
43
+ terminate_interaction 1
44
+ end
45
+
46
+ if Gem.configuration.credential_store
47
+ say "You have successfully signed out of every registry, including RubyGems.org."
27
48
  else
28
- Gem.configuration.unset_api_key!
29
49
  say "You have successfully signed out from all sessions."
30
50
  end
31
51
  end
@@ -147,7 +147,7 @@ Specific fields in the specification can be extracted in YAML format:
147
147
  say case options[:format]
148
148
  when :ruby then s.to_ruby
149
149
  when :marshal then Marshal.dump s
150
- else s.to_yaml
150
+ else Gem.use_psych? ? s.to_yaml : Gem::YAMLSerializer.dump(s)
151
151
  end
152
152
 
153
153
  say "\n"
@@ -117,7 +117,7 @@ that is a dependency of an existing gem. You can use the
117
117
  if options[:version] != Gem::Requirement.default &&
118
118
  get_all_gem_names.size > 1
119
119
  alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
120
- " version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
120
+ " version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:>=2'`"
121
121
  terminate_interaction 1
122
122
  end
123
123
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative "../command"
4
4
  require_relative "../command_manager"
5
+ require_relative "../cooldown"
5
6
  require_relative "../dependency_installer"
6
7
  require_relative "../install_update_options"
7
8
  require_relative "../local_remote_options"
@@ -95,8 +96,12 @@ command to remove old versions.
95
96
  end
96
97
 
97
98
  def execute
99
+ @cooldown = Gem::Cooldown.from_options options
100
+ @cooldown_skipped = []
101
+
98
102
  if options[:system]
99
103
  update_rubygems
104
+ output_cooldown_skipped_summary
100
105
  return
101
106
  end
102
107
 
@@ -132,6 +137,8 @@ command to remove old versions.
132
137
  end
133
138
  say "Gems already up-to-date: #{up_to_date_names.join(" ")}" unless up_to_date_names.empty?
134
139
  say "Gems not currently installed: #{not_installed_names.join(" ")}" unless not_installed_names.empty?
140
+
141
+ output_cooldown_skipped_summary
135
142
  end
136
143
 
137
144
  def fetch_remote_gems(spec) # :nodoc:
@@ -140,7 +147,12 @@ command to remove old versions.
140
147
 
141
148
  fetcher = Gem::SpecFetcher.fetcher
142
149
 
143
- spec_tuples, errors = fetcher.search_for_dependency dependency
150
+ # The default indexes carry only the newest version of each gem, which
151
+ # leaves nothing to fall back to when the cooldown excludes it, so
152
+ # search the full index instead.
153
+ type = dependency.prerelease? ? :complete : :released if @cooldown&.active?
154
+
155
+ spec_tuples, errors = fetcher.search_for_dependency dependency, type: type
144
156
 
145
157
  error = errors.find {|e| e.respond_to? :exception }
146
158
 
@@ -167,12 +179,78 @@ command to remove old versions.
167
179
  def highest_remote_name_tuple(spec) # :nodoc:
168
180
  spec_tuples = fetch_remote_gems spec
169
181
 
170
- highest_remote_gem = spec_tuples.max
182
+ highest_remote_gem = filter_cooldown_tuples(spec_tuples).max
171
183
  return unless highest_remote_gem
172
184
 
173
185
  highest_remote_gem.first
174
186
  end
175
187
 
188
+ ##
189
+ # Rejects [NameTuple, Gem::Source] pairs published within the cooldown
190
+ # period. Tuples with an unknown publish time are kept, so the cooldown
191
+ # fails open.
192
+
193
+ def filter_cooldown_tuples(spec_tuples) # :nodoc:
194
+ return spec_tuples unless @cooldown&.active?
195
+
196
+ with_times = spec_tuples.map do |tup, source|
197
+ [tup, source, source.created_at_for_tuple(tup)]
198
+ end
199
+
200
+ if !with_times.empty? && with_times.none? {|_, _, created_at| created_at }
201
+ Gem::Cooldown.warn_missing_created_at with_times.first[1]
202
+ end
203
+
204
+ with_times.reject do |tup, _, created_at|
205
+ next false unless @cooldown.skip?(created_at)
206
+
207
+ (@cooldown_skipped_tuples ||= {})[[tup.name, tup.version]] ||= created_at
208
+ true
209
+ end.map {|tup, source, _| [tup, source] }
210
+ end
211
+
212
+ ##
213
+ # Summary entries for tuples the cooldown kept out of the update, kept
214
+ # only when newer than the version the update actually settled on (the
215
+ # updated version, or the one already installed when nothing moved).
216
+
217
+ def cooldown_skipped_tuple_entries # :nodoc:
218
+ skipped = @cooldown_skipped_tuples
219
+ return [] unless skipped
220
+
221
+ resolved = {}
222
+ @updated.each do |spec|
223
+ version = resolved[spec.name]
224
+ resolved[spec.name] = spec.version if version.nil? || spec.version > version
225
+ end
226
+
227
+ skipped.filter_map do |(name, version), created_at|
228
+ resolved_version = resolved[name] || resolved_fallback_version(name)
229
+ next unless resolved_version && version > resolved_version
230
+
231
+ {
232
+ name: name,
233
+ version: version,
234
+ resolved: resolved_version,
235
+ available_in_days: @cooldown.remaining_days(created_at),
236
+ }
237
+ end
238
+ end
239
+
240
+ def resolved_fallback_version(name) # :nodoc:
241
+ if name == "rubygems-update"
242
+ Gem::Version.new Gem::VERSION
243
+ else
244
+ Gem::Specification.find_all_by_name(name).map(&:version).max
245
+ end
246
+ end
247
+
248
+ def output_cooldown_skipped_summary # :nodoc:
249
+ entries = (@cooldown_skipped || []) + cooldown_skipped_tuple_entries
250
+
251
+ Gem::Cooldown.output_skipped_summary entries
252
+ end
253
+
176
254
  def install_rubygems(spec) # :nodoc:
177
255
  args = update_rubygems_arguments
178
256
  version = spec.version
@@ -256,6 +334,10 @@ command to remove old versions.
256
334
  @installer.installed_gems.each do |spec|
257
335
  @updated << spec
258
336
  end
337
+
338
+ (@cooldown_skipped ||= []).concat @installer.cooldown_skipped
339
+
340
+ @installer.installed_gems
259
341
  end
260
342
 
261
343
  def update_gems(gems_to_update)
@@ -25,7 +25,7 @@ data you will need to change them immediately and yank your gem.
25
25
  end
26
26
 
27
27
  def usage # :nodoc:
28
- "#{program_name} -v VERSION [-p PLATFORM] [--key KEY_NAME] [--host HOST] GEM"
28
+ "#{program_name} -v VERSION [-p PLATFORM] [--ruby-abi RUBY_ABI] [--key KEY_NAME] [--host HOST] GEM"
29
29
  end
30
30
 
31
31
  def initialize
@@ -33,6 +33,7 @@ data you will need to change them immediately and yank your gem.
33
33
 
34
34
  add_version_option("remove")
35
35
  add_platform_option("remove")
36
+ add_ruby_abi_option("remove")
36
37
  add_otp_option
37
38
 
38
39
  add_option("--host HOST",
@@ -50,20 +51,21 @@ data you will need to change them immediately and yank your gem.
50
51
 
51
52
  sign_in @host, scope: get_yank_scope
52
53
 
53
- version = get_version_from_requirements(options[:version])
54
- platform = get_platform_from_requirements(options)
54
+ version = get_version_from_requirements(options[:version])
55
+ platform = get_platform_from_requirements(options)
56
+ ruby_abi = options[:ruby_abi]
55
57
 
56
58
  if version
57
- yank_gem(version, platform)
59
+ yank_gem(version, platform, ruby_abi)
58
60
  else
59
61
  say "A version argument is required: #{usage}"
60
62
  terminate_interaction
61
63
  end
62
64
  end
63
65
 
64
- def yank_gem(version, platform)
66
+ def yank_gem(version, platform, ruby_abi)
65
67
  say "Yanking gem from #{host}..."
66
- args = [:delete, version, platform, "api/v1/gems/yank"]
68
+ args = [:delete, version, platform, ruby_abi, "api/v1/gems/yank"]
67
69
  response = yank_api_request(*args)
68
70
 
69
71
  say response.body
@@ -71,7 +73,7 @@ data you will need to change them immediately and yank your gem.
71
73
 
72
74
  private
73
75
 
74
- def yank_api_request(method, version, platform, api)
76
+ def yank_api_request(method, version, platform, ruby_abi, api)
75
77
  name = get_one_gem_name
76
78
  response = rubygems_api_request(method, api, host, scope: get_yank_scope) do |request|
77
79
  request.add_field("Authorization", api_key)
@@ -81,6 +83,7 @@ data you will need to change them immediately and yank your gem.
81
83
  "version" => version,
82
84
  }
83
85
  data["platform"] = platform if platform
86
+ data["ruby_abi"] = ruby_abi if ruby_abi
84
87
 
85
88
  request.set_form_data data
86
89
  end