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
@@ -129,13 +129,45 @@ class Gem::Package
129
129
  # Permission for other files
130
130
  attr_accessor :data_mode
131
131
 
132
- def self.build(spec, skip_validation = false, strict_validation = false, file_name = nil)
133
- gem_file = file_name || spec.file_name
132
+ ##
133
+ # The minimum RubyGems version that can install content-addressable gems.
134
+ # Built into +required_rubygems_version+ so older clients reject skinny
135
+ # gems through both the local and remote install paths.
136
+
137
+ MINIMUM_RUBYGEMS_VERSION = ">= 4.1.0.a"
138
+
139
+ ##
140
+ # Builds the gem described by +spec+ and returns the built file name;
141
+ # passing +ruby_abi+ ("X.Y") builds a content-addressable gem named by the
142
+ # SHA-256 of its contents, updates +spec.required_ruby_version+ to
143
+ # "~> X.Y.0", and constrains +spec.required_rubygems_version+ to at least
144
+ # MINIMUM_RUBYGEMS_VERSION (incompatible with
145
+ # +file_name+).
146
+
147
+ def self.build(spec, skip_validation = false, strict_validation = false, file_name = nil, ruby_abi = nil)
148
+ if ruby_abi && file_name
149
+ raise ArgumentError, "Cannot specify both a Ruby ABI and an output file name because content addressable gems must use the generated file name."
150
+ end
151
+ if ruby_abi
152
+ require "digest"
153
+ require "stringio"
154
+
155
+ io = StringIO.new
156
+ io.set_encoding(Encoding::BINARY)
134
157
 
135
- package = new gem_file
136
- package.spec = spec
137
- package.build skip_validation, strict_validation
158
+ package = new io
159
+ package.spec = spec.dup
160
+ gem_file = package.build_content_addressable_file ruby_abi, skip_validation, strict_validation
138
161
 
162
+ spec.required_ruby_version = package.spec.required_ruby_version
163
+ spec.required_rubygems_version = package.spec.required_rubygems_version
164
+ else
165
+ gem_file = file_name || spec.file_name
166
+
167
+ package = new gem_file
168
+ package.spec = spec
169
+ package.build skip_validation, strict_validation
170
+ end
139
171
  gem_file
140
172
  end
141
173
 
@@ -216,6 +248,21 @@ class Gem::Package
216
248
  FileUtils.cp @gem.path, path unless File.exist? path
217
249
  end
218
250
 
251
+ ##
252
+ # Derives the content address from the gem's file name and verifies it
253
+ # against the SHA256 digest of the file contents.
254
+
255
+ def content_address
256
+ path = @gem&.path
257
+ return unless path
258
+
259
+ address = Gem::ContentAddress.verified_file_name_claim(path, spec)
260
+ return nil unless address
261
+ return nil unless Gem::ContentAddress.eligible?(spec)
262
+
263
+ address
264
+ end
265
+
219
266
  ##
220
267
  # Adds a checksum for each entry in the gem to checksums.yaml.gz.
221
268
 
@@ -232,7 +279,11 @@ class Gem::Package
232
279
 
233
280
  tar.add_file_signed "checksums.yaml.gz", 0o444, @signer do |io|
234
281
  gzip_to io do |gz_io|
235
- Psych.dump checksums_by_algorithm, gz_io
282
+ if Gem.use_psych?
283
+ Psych.dump checksums_by_algorithm, gz_io
284
+ else
285
+ gz_io.write Gem::YAMLSerializer.dump(checksums_by_algorithm)
286
+ end
236
287
  end
237
288
  end
238
289
  end
@@ -311,16 +362,47 @@ class Gem::Package
311
362
  end
312
363
  end
313
364
 
314
- say <<-EOM
365
+ message = <<-EOM
315
366
  Successfully built RubyGem
316
367
  Name: #{@spec.name}
317
368
  Version: #{@spec.version}
318
- File: #{File.basename @gem.path}
319
369
  EOM
370
+
371
+ message += " File: #{File.basename(@gem.path)}\n" if @gem.path
372
+ say message
320
373
  ensure
321
374
  @signer = nil
322
375
  end
323
376
 
377
+ ##
378
+ # Builds this package scoped to +ruby_abi+ ("X.Y"), then writes it to a
379
+ # content-addressable file name derived from the SHA-256 digest of the gem
380
+ # contents, e.g. "example-1.0-01234567.gem". Returns the file name of the
381
+ # written gem.
382
+ #
383
+ # The spec is validated for an ABI-scoped build and its
384
+ # +required_ruby_version+ and +required_rubygems_version+ are constrained
385
+ # before building, so every gem this method produces is eligible for
386
+ # content addressing.
387
+
388
+ def build_content_addressable_file(ruby_abi, skip_validation = false, strict_validation = false)
389
+ validate_ruby_abi ruby_abi
390
+ @spec.required_rubygems_version = normalized_required_rubygems_version(ruby_abi)
391
+ @spec.required_ruby_version = Gem::ContentAddress.ruby_abi_requirement(ruby_abi)
392
+
393
+ build skip_validation, strict_validation
394
+
395
+ bytes = @gem.with_read_io(&:read)
396
+ gem_file = "#{@spec.name}-#{@spec.version}-#{Gem::ContentAddress.address_for(bytes)}.gem"
397
+ File.binwrite(gem_file, bytes)
398
+
399
+ say " File: #{gem_file}"
400
+ say " Platform: #{@spec.platform}"
401
+ say " Ruby ABI: #{ruby_abi}"
402
+
403
+ gem_file
404
+ end
405
+
324
406
  ##
325
407
  # A list of file names contained in this gem
326
408
 
@@ -474,7 +556,7 @@ EOM
474
556
  end
475
557
  end
476
558
 
477
- if dir_mode
559
+ if dir_mode && !directories.empty?
478
560
  File.chmod(dir_mode, *directories)
479
561
  end
480
562
  end
@@ -503,24 +585,6 @@ EOM
503
585
  gz_io.close
504
586
  end
505
587
 
506
- ##
507
- # Returns the full path for installing +filename+.
508
- #
509
- # If +filename+ is not inside +destination_dir+ an exception is raised.
510
-
511
- def install_location(filename, destination_dir) # :nodoc:
512
- raise Gem::Package::PathError.new(filename, destination_dir) if
513
- filename.start_with? "/"
514
-
515
- destination_dir = File.realpath(destination_dir)
516
- destination = File.expand_path(filename, destination_dir)
517
-
518
- raise Gem::Package::PathError.new(destination, destination_dir) unless
519
- normalize_path(destination).start_with? normalize_path(destination_dir + "/")
520
-
521
- destination
522
- end
523
-
524
588
  if Gem.win_platform?
525
589
  def normalize_path(pathname) # :nodoc:
526
590
  pathname.downcase
@@ -534,7 +598,7 @@ EOM
534
598
  ##
535
599
  # Loads a Gem::Specification from the TarEntry +entry+
536
600
 
537
- def load_spec(entry) # :nodoc:
601
+ def load_spec_from_metadata(entry) # :nodoc:
538
602
  limit = 10 * 1024 * 1024
539
603
  case entry.full_name
540
604
  when "metadata" then
@@ -655,6 +719,110 @@ EOM
655
719
 
656
720
  private
657
721
 
722
+ ##
723
+ # The +required_rubygems_version+ for a content-addressable build: the
724
+ # spec's requirement raised to at least MINIMUM_RUBYGEMS_VERSION, warning
725
+ # if it had to be changed. Raises if the requirement excludes every version
726
+ # satisfying that floor, since no RubyGems could install the built gem.
727
+
728
+ def normalized_required_rubygems_version(ruby_abi)
729
+ minimum = Gem::Requirement.new(MINIMUM_RUBYGEMS_VERSION)
730
+ existing = @spec.required_rubygems_version
731
+
732
+ return minimum if existing.nil? || existing == Gem::Requirement.default
733
+
734
+ floor = minimum.requirements.first.last
735
+
736
+ if excludes_rubygems_floor?(existing, floor)
737
+ raise ArgumentError,
738
+ "Cannot build gem for Ruby ABI #{ruby_abi} because required_rubygems_version is set to #{existing}, " \
739
+ "which excludes RubyGems #{MINIMUM_RUBYGEMS_VERSION} required to install content addressable gems. " \
740
+ "Please remove or loosen the conflicting constraint."
741
+ end
742
+
743
+ return existing if satisfies_rubygems_floor?(existing, floor)
744
+
745
+ preserved = existing.requirements.filter_map do |op, version|
746
+ "#{op} #{version}" if ["~>", "<", "<=", "!="].include?(op)
747
+ end
748
+
749
+ normalized = Gem::Requirement.new([MINIMUM_RUBYGEMS_VERSION, *preserved])
750
+
751
+ alert_warning \
752
+ "required_rubygems_version was changed from \"#{existing}\" to \"#{normalized}\" for this build " \
753
+ "because content addressable gems can only be installed by RubyGems #{MINIMUM_RUBYGEMS_VERSION}."
754
+
755
+ normalized
756
+ end
757
+
758
+ ##
759
+ # Whether +requirement+ excludes every RubyGems version satisfying the
760
+ # +floor+, so that no RubyGems could install the built gem.
761
+
762
+ def excludes_rubygems_floor?(requirement, floor)
763
+ capped_below_floor = requirement.requirements.any? do |op, version|
764
+ case op
765
+ when "<" then version <= floor
766
+ when "<=", "=" then version < floor
767
+ when "~>" then version.bump <= floor.release
768
+ else false
769
+ end
770
+ end
771
+
772
+ return true if capped_below_floor
773
+
774
+ !requirement.satisfied_by?(floor) && requirement.requirements.any? do |op, version|
775
+ ["<=", "="].include?(op) && version == floor
776
+ end
777
+ end
778
+
779
+ ##
780
+ # Whether one of the lower bounds of +requirement+ already guarantees the
781
+ # +floor+.
782
+
783
+ def satisfies_rubygems_floor?(requirement, floor)
784
+ requirement.requirements.any? do |op, version|
785
+ case op
786
+ when ">=", "~>", "=", ">" then version >= floor
787
+ else false
788
+ end
789
+ end
790
+ end
791
+
792
+ ##
793
+ # Validates that the spec can be built as a content-addressable gem scoped
794
+ # to +ruby_abi+ ("X.Y"): the ABI must be well-formed, the spec must declare
795
+ # a non-Ruby platform, and any existing +required_ruby_version+ must match
796
+ # the ABI.
797
+
798
+ def validate_ruby_abi(ruby_abi)
799
+ if !Gem::ContentAddress.valid_ruby_abi?(ruby_abi)
800
+ raise ArgumentError, "Ruby ABI must be in X.Y format"
801
+ elsif !Gem::ContentAddress.platform_eligible?(@spec.platform)
802
+ raise ArgumentError, "Cannot build a gem scoped to a single Ruby ABI as no platform or a Ruby platform has been set"
803
+ elsif !Gem::ContentAddress.ruby_abi_compatible?(@spec, ruby_abi)
804
+ raise ArgumentError, "Cannot build gem for Ruby ABI #{ruby_abi} because required_ruby_version is set to #{@spec.required_ruby_version}. Please set required_ruby_version to \"~> #{ruby_abi}.0\"."
805
+ end
806
+ end
807
+
808
+ ##
809
+ # Returns the full path for installing +filename+ into +destination_dir+,
810
+ # which must already be resolved with File.realpath by the caller.
811
+ #
812
+ # If +filename+ is not inside +destination_dir+ an exception is raised.
813
+
814
+ def install_location(filename, destination_dir) # :nodoc:
815
+ raise Gem::Package::PathError.new(filename, destination_dir) if
816
+ filename.start_with? "/"
817
+
818
+ destination = File.expand_path(filename, destination_dir)
819
+
820
+ raise Gem::Package::PathError.new(destination, destination_dir) unless
821
+ normalize_path(destination).start_with? normalize_path(destination_dir + "/")
822
+
823
+ destination
824
+ end
825
+
658
826
  ##
659
827
  # Raises an exception unless +dir+, with symlinks resolved, is
660
828
  # +destination_dir+ or a directory inside it. +destination_dir+ must
@@ -703,12 +871,7 @@ EOM
703
871
  digest entry
704
872
  end
705
873
 
706
- case file_name
707
- when "metadata", "metadata.gz" then
708
- load_spec entry
709
- when "data.tar.gz" then
710
- verify_gz entry
711
- end
874
+ load_spec_from_metadata entry
712
875
  rescue StandardError
713
876
  warn "Exception while verifying #{@gem.path}"
714
877
  raise
@@ -736,18 +899,6 @@ EOM
736
899
  end
737
900
  end
738
901
 
739
- ##
740
- # Verifies that +entry+ is a valid gzipped file.
741
-
742
- def verify_gz(entry) # :nodoc:
743
- Zlib::GzipReader.wrap entry do |gzio|
744
- # TODO: read into a buffer once zlib supports it
745
- gzio.read 16_384 until gzio.eof? # gzip checksum verification
746
- end
747
- rescue Zlib::GzipFile::Error => e
748
- raise Gem::Package::FormatError.new(e.message, entry.full_name)
749
- end
750
-
751
902
  if RUBY_ENGINE == "truffleruby"
752
903
  def copy_stream(src, dst, size) # :nodoc:
753
904
  dst.write src.read(size)
@@ -767,9 +918,11 @@ EOM
767
918
  if Gem.win_platform?
768
919
  # Create a symlink and fallback to copy the file or directory on Windows,
769
920
  # where symlink creation needs special privileges in form of the Developer Mode.
921
+ # JRuby on Windows raises TypeError from the wincode path-conversion helper
922
+ # when it cannot create the symlink, so fall back to copy in that case too.
770
923
  def create_symlink(old_name, new_name)
771
924
  File.symlink(old_name, new_name)
772
- rescue Errno::EACCES
925
+ rescue Errno::EACCES, TypeError
773
926
  from = File.expand_path(old_name, File.dirname(new_name))
774
927
  FileUtils.cp_r(from, new_name)
775
928
  end
@@ -111,10 +111,10 @@ class Gem::PackageTask < Rake::PackageTask
111
111
  file gem_path => [package_dir, gem_dir] + @gem_spec.files do
112
112
  chdir(gem_dir) do
113
113
  when_writing "Creating #{gem_spec.file_name}" do
114
- Gem::Package.build gem_spec
114
+ built_gem_file = Gem::Package.build gem_spec
115
115
 
116
116
  verbose trace do
117
- mv gem_file, ".."
117
+ mv built_gem_file, ".."
118
118
  end
119
119
  end
120
120
  end
@@ -196,7 +196,7 @@ class Gem::Platform
196
196
  # the runtime platform.
197
197
  #
198
198
  #--
199
- # NOTE: Until it can be removed, changes to this method must also be reflected in `bundler/lib/bundler/rubygems_ext.rb`
199
+ # NOTE: Until it can be removed, changes to this method must also be reflected in `lib/bundler/rubygems_ext.rb`
200
200
 
201
201
  def ===(other)
202
202
  return nil unless Gem::Platform === other
@@ -221,7 +221,7 @@ class Gem::Platform
221
221
  end
222
222
 
223
223
  #--
224
- # NOTE: Until it can be removed, changes to this method must also be reflected in `bundler/lib/bundler/rubygems_ext.rb`
224
+ # NOTE: Until it can be removed, changes to this method must also be reflected in `lib/bundler/rubygems_ext.rb`
225
225
 
226
226
  def normalized_linux_version
227
227
  return nil unless @version
@@ -149,9 +149,15 @@ module Gem::QueryUtils
149
149
  spec_tuples = if name.nil?
150
150
  fetcher.detect(specs_type) { true }
151
151
  else
152
- fetcher.detect(specs_type) do |name_tuple|
152
+ matching_tuples = fetcher.detect(specs_type) do |name_tuple|
153
153
  name === name_tuple.name && options[:version].satisfied_by?(name_tuple.version)
154
154
  end
155
+
156
+ if args.empty?
157
+ matching_tuples
158
+ else
159
+ fetcher.decode_content_addressable_tuples(matching_tuples, latest: specs_type == :latest)
160
+ end
155
161
  end
156
162
 
157
163
  output_query_results(spec_tuples)
@@ -200,9 +206,11 @@ module Gem::QueryUtils
200
206
  matching_tuples = matching_tuples.sort_by {|n,_| n.version }.reverse
201
207
 
202
208
  platforms = Hash.new {|h,version| h[version] = [] }
209
+ platform_ruby_abis = Hash.new {|h,version| h[version] = Hash.new {|hh,platform| hh[platform] = [] } }
203
210
 
204
211
  matching_tuples.each do |n, _|
205
212
  platforms[n.version] << n.platform if n.platform
213
+ platform_ruby_abis[n.version][n.platform] << n.ruby_abi if n.ruby_abi
206
214
  end
207
215
 
208
216
  seen = {}
@@ -216,11 +224,11 @@ module Gem::QueryUtils
216
224
  end
217
225
  end
218
226
 
219
- output << clean_text(make_entry(matching_tuples, platforms))
227
+ output << clean_text(make_entry(matching_tuples, platforms, platform_ruby_abis))
220
228
  end
221
229
  end
222
230
 
223
- def entry_details(entry, detail_tuple, specs, platforms)
231
+ def entry_details(entry, detail_tuple, specs, platforms, platform_ruby_abis)
224
232
  return unless options[:details]
225
233
 
226
234
  name_tuple, spec = detail_tuple
@@ -229,7 +237,11 @@ module Gem::QueryUtils
229
237
 
230
238
  entry << "\n"
231
239
 
232
- spec_platforms entry, platforms
240
+ if ruby_abi_metadata?(platform_ruby_abis)
241
+ spec_platform_ruby_abis entry, platforms, platform_ruby_abis
242
+ else
243
+ spec_platforms entry, platforms
244
+ end
233
245
  spec_authors entry, spec
234
246
  spec_homepage entry, spec
235
247
  spec_license entry, spec
@@ -237,36 +249,63 @@ module Gem::QueryUtils
237
249
  spec_summary entry, spec
238
250
  end
239
251
 
240
- def entry_versions(entry, name_tuples, platforms, specs)
252
+ def entry_versions(entry, name_tuples, platforms, platform_ruby_abis, specs)
241
253
  return unless options[:versions]
242
254
 
243
255
  list =
244
256
  if platforms.empty? || options[:details]
245
257
  name_tuples.map(&:version).uniq
258
+ elsif ruby_abi_metadata?(platform_ruby_abis)
259
+ platforms.sort.reverse.flat_map do |version, pls|
260
+ out = version_label(version, specs)
261
+ labels = version_platform_labels(version, pls, platform_ruby_abis, label_platform: true)
262
+ labels.empty? ? [out] : labels.map {|label| "#{out} #{label}" }
263
+ end
246
264
  else
247
265
  platforms.sort.reverse.map do |version, pls|
248
- out = version.to_s
266
+ out = version_label(version, specs)
267
+ labels = version_platform_labels(version, pls, platform_ruby_abis)
268
+ labels.empty? ? out : "#{out} #{labels.join(" ")}"
269
+ end
270
+ end
249
271
 
250
- if options[:domain] == :local
251
- default = specs.any? do |s|
252
- !s.is_a?(Gem::Source) && s.version == version && s.default_gem?
253
- end
254
- out = "default: #{out}" if default
255
- end
272
+ use_multiline_separator = !options[:details] && ruby_abi_metadata?(platform_ruby_abis) && list.length > 1
273
+ separator = use_multiline_separator ? "\n#{" " * (entry.first.length + 2)}" : ", "
274
+ entry << " (#{list.join separator})"
275
+ end
256
276
 
257
- if pls != [Gem::Platform::RUBY]
258
- platform_list = [pls.delete(Gem::Platform::RUBY), *pls.sort].compact
259
- out = platform_list.unshift(out).join(" ")
260
- end
277
+ def version_label(version, specs)
278
+ out = version.to_s
279
+ return out unless options[:domain] == :local
261
280
 
262
- out
263
- end
264
- end
281
+ default = specs.any? do |s|
282
+ !s.is_a?(Gem::Source) && s.version == version && s.default_gem?
283
+ end
284
+ default ? "default: #{out}" : out
285
+ end
286
+
287
+ def ruby_abi_metadata?(platform_ruby_abis)
288
+ platform_ruby_abis.values.any? do |ruby_abis_by_platform|
289
+ ruby_abis_by_platform.values.any?(&:any?)
290
+ end
291
+ end
292
+
293
+ def version_platform_labels(version, platforms, platform_ruby_abis, label_platform: false)
294
+ platforms = platforms.uniq
295
+ return [] if platforms == [Gem::Platform::RUBY]
265
296
 
266
- entry << " (#{list.join ", "})"
297
+ platforms = [platforms.delete(Gem::Platform::RUBY), *platforms.sort].compact
298
+ platforms.map do |platform|
299
+ ruby_abis = platform_ruby_abis[version][platform].uniq.sort
300
+ platform_label = label_platform ? "Platform: #{platform}" : platform
301
+ next platform_label if ruby_abis.empty?
302
+
303
+ separator = label_platform ? ", " : " "
304
+ "#{platform_label}#{separator}Ruby ABI: #{ruby_abis.join(", ")}"
305
+ end
267
306
  end
268
307
 
269
- def make_entry(entry_tuples, platforms)
308
+ def make_entry(entry_tuples, platforms, platform_ruby_abis)
270
309
  detail_tuple = entry_tuples.first
271
310
 
272
311
  name_tuples, specs = entry_tuples.flatten.partition do |item|
@@ -275,8 +314,8 @@ module Gem::QueryUtils
275
314
 
276
315
  entry = [name_tuples.first.name]
277
316
 
278
- entry_versions(entry, name_tuples, platforms, specs)
279
- entry_details(entry, detail_tuple, specs, platforms)
317
+ entry_versions(entry, name_tuples, platforms, platform_ruby_abis, specs)
318
+ entry_details(entry, detail_tuple, specs, platforms, platform_ruby_abis)
280
319
 
281
320
  entry.join
282
321
  end
@@ -319,6 +358,7 @@ module Gem::QueryUtils
319
358
  end
320
359
 
321
360
  def spec_platforms(entry, platforms)
361
+ platforms = platforms.transform_values(&:uniq)
322
362
  non_ruby = platforms.any? do |_, pls|
323
363
  pls.any? {|pl| pl != Gem::Platform::RUBY }
324
364
  end
@@ -326,7 +366,7 @@ module Gem::QueryUtils
326
366
  return unless non_ruby
327
367
 
328
368
  if platforms.length == 1
329
- title = platforms.values.length == 1 ? "Platform" : "Platforms"
369
+ title = platforms.values.first.length == 1 ? "Platform" : "Platforms"
330
370
  entry << " #{title}: #{platforms.values.sort.join(", ")}\n"
331
371
  else
332
372
  entry << " Platforms:\n"
@@ -342,6 +382,26 @@ module Gem::QueryUtils
342
382
  end
343
383
  end
344
384
 
385
+ def spec_platform_ruby_abis(entry, platforms, platform_ruby_abis)
386
+ entry << " Platforms:\n"
387
+
388
+ platforms.sort.each do |version, pls|
389
+ labels = version_platform_labels(version, pls, platform_ruby_abis)
390
+ next if labels.empty?
391
+
392
+ if platforms.length == 1
393
+ labels.each do |label|
394
+ entry << " #{label}\n"
395
+ end
396
+ else
397
+ label = " #{version}: "
398
+ data = format_text labels.join(", "), 68, label.length
399
+ data[0, label.length] = label
400
+ entry << data << "\n"
401
+ end
402
+ end
403
+ end
404
+
345
405
  def spec_summary(entry, spec)
346
406
  summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
347
407
  entry << "\n\n" << format_text(summary, 68, 4)