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
@@ -192,15 +192,14 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
192
192
  # Checks that the gem does not depend on itself.
193
193
 
194
194
  def validate_dependencies # :nodoc:
195
- warning_messages = []
195
+ error_messages = []
196
196
  @specification.dependencies.each do |dep|
197
- if dep.name == @specification.name # warn on self reference
198
- warning_messages << "Self referencing dependency is unnecessary and strongly discouraged."
197
+ if dep.name == @specification.name # error on self reference
198
+ error_messages << "Dependencies of this gem include a self-reference."
199
199
  end
200
200
  end
201
- if warning_messages.any?
202
- warning_messages.each {|warning_message| warning warning_message }
203
- end
201
+
202
+ error error_messages.join if error_messages.any?
204
203
  end
205
204
 
206
205
  def validate_required_ruby_version
@@ -476,6 +475,7 @@ or set it to nil if you don't want to specify a license.
476
475
 
477
476
  validate_rake_extensions(builder)
478
477
  validate_rust_extensions(builder)
478
+ validate_extension_require_relative
479
479
  end
480
480
 
481
481
  def validate_rust_extensions(builder) # :nodoc:
@@ -496,6 +496,33 @@ You have specified rake based extension, but rake is not added as runtime depend
496
496
  WARNING
497
497
  end
498
498
 
499
+ def validate_extension_require_relative # :nodoc:
500
+ return unless @specification.extensions.any?
501
+
502
+ require_paths = @specification.require_paths
503
+
504
+ @specification.files.each do |rb_file|
505
+ next unless rb_file.end_with?(".rb")
506
+ next unless require_paths.any? {|rp| rb_file.start_with?("#{rp}/") }
507
+ next unless File.file?(rb_file)
508
+
509
+ File.foreach(rb_file).with_index(1) do |line, lineno|
510
+ next unless line =~ /^\s*require_relative\s+["']([^"']+)["']/
511
+
512
+ required_path = Regexp.last_match(1)
513
+ resolved = File.join(File.dirname(rb_file), required_path)
514
+
515
+ next if @specification.files.any? {|f| f == "#{resolved}.rb" || f == resolved }
516
+
517
+ warning <<~WARNING
518
+ #{rb_file}:#{lineno} uses `require_relative "#{required_path}"` to load a compiled extension.
519
+ This will break in RubyGems 4.2, which will stop copying compiled extensions into the gem's lib directory.
520
+ Use `require` instead of `require_relative` to load compiled extensions.
521
+ WARNING
522
+ end
523
+ end
524
+ end
525
+
499
526
  def validate_unique_links
500
527
  links = @specification.metadata.slice(*METADATA_LINK_KEYS)
501
528
  grouped = links.group_by {|_key, uri| uri }
@@ -2,12 +2,50 @@
2
2
 
3
3
  module Gem
4
4
  class SpecificationRecord
5
+ ##
6
+ # Specification directories for each path: the flat +specifications+
7
+ # dir and the ABI-scoped +specifications/<ruby_abi>+ subdir.
8
+
5
9
  def self.dirs_from(paths)
6
- paths.map do |path|
7
- File.join(path, "specifications")
10
+ paths.flat_map do |path|
11
+ specifications = File.join(path, "specifications")
12
+
13
+ [specifications, File.join(specifications, Gem.ruby_abi)]
8
14
  end
9
15
  end
10
16
 
17
+ ##
18
+ # Whether +dir+ is an ABI-scoped spec dir
19
+ # (<tt>.../specifications/<ruby_abi></tt>). Requires the parent to be
20
+ # named +specifications+ to avoid false positives.
21
+ def self.abi_scoped_spec_dir?(dir)
22
+ Gem::ContentAddress.valid_ruby_abi?(File.basename(dir)) &&
23
+ File.basename(File.dirname(dir)) == "specifications"
24
+ end
25
+
26
+ ##
27
+ # The spec dir for +spec+ under +base_dir+: the ABI-scoped subdir for
28
+ # content-addressed specs, the flat +specifications+ dir otherwise.
29
+ def self.specification_dir_for(spec, base_dir)
30
+ dir = File.join(base_dir, "specifications")
31
+ dir = File.join(dir, spec.ruby_abi) if Gem::ContentAddress.content_addressed?(spec)
32
+ dir
33
+ end
34
+
35
+ ##
36
+ # Ensure ABI-scoped subdirectories are present in +dirs+. No-op when
37
+ # +dirs+ already includes them (e.g. MRI); expands flat-only +dirs+
38
+
39
+ def self.dirs_with_abi(dirs)
40
+ dirs.flat_map do |dir|
41
+ if File.basename(dir) == "specifications"
42
+ [dir, File.join(dir, Gem.ruby_abi)]
43
+ else
44
+ dir
45
+ end
46
+ end.uniq
47
+ end
48
+
11
49
  def self.from_path(path)
12
50
  new(dirs_from([path]))
13
51
  end
@@ -217,6 +255,7 @@ module Gem
217
255
  def map_stubs(pattern)
218
256
  @dirs.flat_map do |dir|
219
257
  base_dir = File.dirname dir
258
+ base_dir = File.dirname base_dir if self.class.abi_scoped_spec_dir?(dir)
220
259
  gems_dir = File.join base_dir, "gems"
221
260
  Gem::Specification.gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
222
261
  end
@@ -9,14 +9,18 @@ class Gem::StubSpecification < Gem::BasicSpecification
9
9
  # :nodoc:
10
10
  PREFIX = "# stub: "
11
11
 
12
+ # :nodoc:
13
+ TARGET_PREFIX = "# stub-target: "
14
+
12
15
  # :nodoc:
13
16
  OPEN_MODE = "r:UTF-8:-"
14
17
 
15
18
  class StubLine # :nodoc: all
16
19
  attr_reader :name, :version, :platform, :require_paths, :extensions,
17
- :full_name
20
+ :full_name, :content_address
18
21
 
19
22
  NO_EXTENSIONS = [].freeze
23
+ NO_TARGET = {}.freeze
20
24
 
21
25
  # These are common require paths.
22
26
  REQUIRE_PATHS = { # :nodoc:
@@ -33,7 +37,7 @@ class Gem::StubSpecification < Gem::BasicSpecification
33
37
  "lib" => ["lib"].freeze,
34
38
  }.freeze
35
39
 
36
- def initialize(data, extensions)
40
+ def initialize(data, extensions, target = NO_TARGET)
37
41
  parts = data[PREFIX.length..-1].split(" ", 4)
38
42
  @name = -parts[0]
39
43
  @version = if Gem::Version.correct?(parts[1])
@@ -42,12 +46,17 @@ class Gem::StubSpecification < Gem::BasicSpecification
42
46
  Gem::Version.new(0)
43
47
  end
44
48
 
45
- @platform = Gem::Platform.new parts[2]
49
+ suffix = parts[2]
50
+ target_platform = target["platform"]
51
+ @platform = Gem::Platform.new(target_platform || suffix)
52
+ @content_address = suffix if Gem::ContentAddress.content_addressed_row?(suffix, target_platform, validate_ruby_abi: false)
46
53
  @extensions = extensions
47
- @full_name = if platform == Gem::Platform::RUBY
54
+ @full_name = if @content_address
55
+ "#{name}-#{version}-#{content_address}"
56
+ elsif platform == Gem::Platform::RUBY
48
57
  "#{name}-#{version}"
49
58
  else
50
- "#{name}-#{version}-#{platform}"
59
+ "#{name}-#{version}-#{suffix}"
51
60
  end
52
61
 
53
62
  path_list = parts.last
@@ -110,18 +119,27 @@ class Gem::StubSpecification < Gem::BasicSpecification
110
119
  file.readline # discard encoding line
111
120
  stubline = file.readline
112
121
  if stubline.start_with?(PREFIX)
113
- extline = file.readline
114
-
115
- extensions =
116
- if extline.delete_prefix!(PREFIX)
117
- extline.chomp!
118
- extline.split "\0"
119
- else
120
- StubLine::NO_EXTENSIONS
122
+ line = file.readline
123
+
124
+ if line.delete_prefix!(PREFIX)
125
+ line.chomp!
126
+ extensions = line.split "\0"
127
+ line = file.readline
128
+ else
129
+ extensions = StubLine::NO_EXTENSIONS
130
+ end
131
+
132
+ target = StubLine::NO_TARGET
133
+ if line.delete_prefix!(TARGET_PREFIX)
134
+ line.chomp!
135
+ target = line.split(",").to_h do |pair|
136
+ key, value = pair.split("=", 2)
137
+ [key, value]
121
138
  end
139
+ end
122
140
 
123
141
  stubline.chomp! # readline(chomp: true) allocates 3x as much as .readline.chomp!
124
- @data = StubLine.new stubline, extensions
142
+ @data = StubLine.new stubline, extensions, target
125
143
  end
126
144
  rescue EOFError
127
145
  end
@@ -162,6 +180,10 @@ class Gem::StubSpecification < Gem::BasicSpecification
162
180
  data.platform
163
181
  end
164
182
 
183
+ def content_address # :nodoc:
184
+ data.content_address
185
+ end
186
+
165
187
  ##
166
188
  # Extensions for this gem
167
189
 
@@ -208,13 +230,14 @@ class Gem::StubSpecification < Gem::BasicSpecification
208
230
  self.class === other &&
209
231
  name == other.name &&
210
232
  version == other.version &&
211
- platform == other.platform
233
+ platform == other.platform &&
234
+ content_address == other.content_address
212
235
  end
213
236
 
214
237
  alias_method :eql?, :== # :nodoc:
215
238
 
216
239
  def hash # :nodoc:
217
- name.hash ^ version.hash ^ platform.hash
240
+ [name, version, platform, content_address].hash
218
241
  end
219
242
 
220
243
  def <=>(other) # :nodoc:
@@ -272,6 +272,8 @@ class Gem::Uninstaller
272
272
 
273
273
  safe_delete { rm_r full_gem_path, exclusions: exclusions }
274
274
  safe_delete { FileUtils.rm_r spec.extension_dir }
275
+ safe_delete { FileUtils.rm_f File.join(spec.build_info_dir, "#{spec.full_name}.mkmf.log") }
276
+ safe_delete { FileUtils.rm_f File.join(spec.build_info_dir, "#{spec.full_name}.gem_make.out") }
275
277
 
276
278
  old_platform_name = spec.original_name
277
279
 
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Based on ActiveSupport's AtomicFile implementation
4
+ # Copyright (c) David Heinemeier Hansson
5
+ # https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/file/atomic.rb
6
+ # Licensed under the MIT License
7
+
8
+ module Gem
9
+ class AtomicFileWriter
10
+ ##
11
+ # Write to a file atomically. Useful for situations where you don't
12
+ # want other processes or threads to see half-written files.
13
+
14
+ def self.open(file_name)
15
+ require "securerandom" unless defined?(SecureRandom)
16
+
17
+ old_stat = begin
18
+ File.stat(file_name)
19
+ rescue SystemCallError
20
+ nil
21
+ end
22
+
23
+ # Names can't be longer than 255B
24
+ tmp_suffix = ".tmp.#{SecureRandom.hex}"
25
+ dirname = File.dirname(file_name)
26
+ basename = File.basename(file_name)
27
+ base_slice = byteslice_at_char_boundary(basename, 254 - tmp_suffix.bytesize)
28
+ tmp_path = File.join(dirname, ".#{base_slice}#{tmp_suffix}")
29
+
30
+ # The temporary name is longer than the final one, so on Windows a
31
+ # writable destination can still map to a path beyond the 260-character
32
+ # MAX_PATH limit. Trim the random suffix first, keeping at least 8 hex
33
+ # characters to avoid collisions, then shorten the basename if that is not
34
+ # enough. Recomputing the basename from the trimmed suffix would just let
35
+ # it grow back, so trim the already-sliced basename instead.
36
+ if tmp_path.length >= 260 && Gem.win_platform?
37
+ overflow = tmp_path.length - 259
38
+ trim = [tmp_suffix.bytesize - (".tmp.".bytesize + 8), overflow].min
39
+ tmp_suffix = tmp_suffix.byteslice(0, tmp_suffix.bytesize - trim)
40
+ overflow -= trim
41
+ base_slice = byteslice_at_char_boundary(base_slice, [base_slice.bytesize - overflow, 0].max) if overflow > 0
42
+ tmp_path = File.join(dirname, ".#{base_slice}#{tmp_suffix}")
43
+ end
44
+
45
+ flags = File::RDWR | File::CREAT | File::EXCL | File::BINARY
46
+ flags |= File::SHARE_DELETE if defined?(File::SHARE_DELETE)
47
+
48
+ renamed = false
49
+ temp_file = File.open(tmp_path, flags)
50
+
51
+ begin
52
+ temp_file.binmode
53
+ if old_stat
54
+ # Set correct permissions on new file
55
+ begin
56
+ temp_file.chown(old_stat.uid, old_stat.gid)
57
+ # This operation will affect filesystem ACL's
58
+ temp_file.chmod(old_stat.mode)
59
+ rescue Errno::EPERM, Errno::EACCES
60
+ # Changing file ownership failed, moving on.
61
+ end
62
+ end
63
+
64
+ return_val = yield temp_file
65
+
66
+ # Any data still buffered is handed to the filesystem on close, so a
67
+ # failing flush must surface while the destination is still intact.
68
+ # That means closing the temporary file before the rename. Note this
69
+ # does not fsync, so the write is atomic but not crash durable.
70
+ temp_file.close
71
+ File.rename(tmp_path, file_name)
72
+ renamed = true
73
+
74
+ return_val
75
+ ensure
76
+ unless renamed
77
+ begin
78
+ temp_file.close
79
+ rescue StandardError
80
+ nil
81
+ ensure
82
+ # The unlink runs from an ensure so that a non-StandardError raised by
83
+ # the close above, a second Ctrl-C for instance, still reaches it. An
84
+ # interrupt landing on the unlink itself is not covered.
85
+ begin
86
+ File.unlink(tmp_path)
87
+ rescue StandardError
88
+ nil
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ # Returns the longest prefix of string that is at most max_bytesize bytes
96
+ # and ends on a character boundary. A string that is invalid in its own
97
+ # encoding would be cut back to its last valid prefix, discarding an
98
+ # unbounded part of the name, so it is sliced as raw bytes instead and can
99
+ # still be cut mid-character.
100
+ def self.byteslice_at_char_boundary(string, max_bytesize)
101
+ sliced = string.byteslice(0, max_bytesize)
102
+ if string.valid_encoding?
103
+ sliced = sliced.byteslice(0, sliced.bytesize - 1) until sliced.valid_encoding?
104
+ end
105
+ sliced
106
+ end
107
+ private_class_method :byteslice_at_char_boundary
108
+ end
109
+ end
@@ -3,7 +3,7 @@ module Gem::Net
3
3
  # Gem::Net::HTTP exception class.
4
4
  # You cannot use Gem::Net::HTTPExceptions directly; instead, you must use
5
5
  # its subclasses.
6
- module HTTPExceptions
6
+ module HTTPExceptions # :nodoc:
7
7
  def initialize(msg, res) #:nodoc:
8
8
  super msg
9
9
  @response = res
@@ -12,6 +12,7 @@ module Gem::Net
12
12
  alias data response #:nodoc: obsolete
13
13
  end
14
14
 
15
+ # :stopdoc:
15
16
  class HTTPError < ProtocolError
16
17
  include HTTPExceptions
17
18
  end
@@ -19,16 +19,13 @@ class Gem::Net::HTTPGenericRequest
19
19
 
20
20
  if Gem::URI === uri_or_path then
21
21
  raise ArgumentError, "not an HTTP Gem::URI" unless Gem::URI::HTTP === uri_or_path
22
- hostname = uri_or_path.hostname
22
+ hostname = uri_or_path.host
23
23
  raise ArgumentError, "no host component for Gem::URI" unless (hostname && hostname.length > 0)
24
24
  @uri = uri_or_path.dup
25
- host = @uri.hostname.dup
26
- host << ":" << @uri.port.to_s if @uri.port != @uri.default_port
27
25
  @path = uri_or_path.request_uri
28
26
  raise ArgumentError, "no HTTP request path given" unless @path
29
27
  else
30
28
  @uri = nil
31
- host = nil
32
29
  raise ArgumentError, "no HTTP request path given" unless uri_or_path
33
30
  raise ArgumentError, "HTTP request path is empty" if uri_or_path.empty?
34
31
  @path = uri_or_path.dup
@@ -51,7 +48,7 @@ class Gem::Net::HTTPGenericRequest
51
48
  initialize_http_header initheader
52
49
  self['Accept'] ||= '*/*'
53
50
  self['User-Agent'] ||= 'Ruby'
54
- self['Host'] ||= host if host
51
+ self['Host'] ||= @uri.authority if @uri
55
52
  @body = nil
56
53
  @body_stream = nil
57
54
  @body_data = nil
@@ -245,7 +242,7 @@ class Gem::Net::HTTPGenericRequest
245
242
  end
246
243
 
247
244
  if host = self['host']
248
- host.sub!(/:.*/m, '')
245
+ host = Gem::URI.parse("//#{host}").host # Remove a port component from the existing Host header
249
246
  elsif host = @uri.host
250
247
  else
251
248
  host = addr
@@ -264,6 +261,8 @@ class Gem::Net::HTTPGenericRequest
264
261
 
265
262
  private
266
263
 
264
+ # :stopdoc:
265
+
267
266
  class Chunker #:nodoc:
268
267
  def initialize(sock)
269
268
  @sock = sock
@@ -179,7 +179,9 @@
179
179
  # - #each_value: Passes each string field value to the block.
180
180
  #
181
181
  module Gem::Net::HTTPHeader
182
+ # The maximum length of HTTP header keys.
182
183
  MAX_KEY_LENGTH = 1024
184
+ # The maximum length of HTTP header values.
183
185
  MAX_FIELD_LENGTH = 65536
184
186
 
185
187
  def initialize_http_header(initheader) #:nodoc:
@@ -267,6 +269,7 @@ module Gem::Net::HTTPHeader
267
269
  end
268
270
  end
269
271
 
272
+ # :stopdoc:
270
273
  private def set_field(key, val)
271
274
  case val
272
275
  when Enumerable
@@ -294,6 +297,7 @@ module Gem::Net::HTTPHeader
294
297
  ary.push val
295
298
  end
296
299
  end
300
+ # :startdoc:
297
301
 
298
302
  # Returns the array field value for the given +key+,
299
303
  # or +nil+ if there is no such field;
@@ -490,7 +494,7 @@ module Gem::Net::HTTPHeader
490
494
 
491
495
  alias canonical_each each_capitalized
492
496
 
493
- def capitalize(name)
497
+ def capitalize(name) # :nodoc:
494
498
  name.to_s.split('-'.freeze).map {|s| s.capitalize }.join('-'.freeze)
495
499
  end
496
500
  private :capitalize
@@ -957,12 +961,12 @@ module Gem::Net::HTTPHeader
957
961
  @header['proxy-authorization'] = [basic_encode(account, password)]
958
962
  end
959
963
 
960
- def basic_encode(account, password)
964
+ def basic_encode(account, password) # :nodoc:
961
965
  'Basic ' + ["#{account}:#{password}"].pack('m0')
962
966
  end
963
967
  private :basic_encode
964
968
 
965
- # Returns whether the HTTP session is to be closed.
969
+ # Returns whether the HTTP session is to be closed.
966
970
  def connection_close?
967
971
  token = /(?:\A|,)\s*close\s*(?:\z|,)/i
968
972
  @header['connection']&.grep(token) {return true}
@@ -970,7 +974,7 @@ module Gem::Net::HTTPHeader
970
974
  false
971
975
  end
972
976
 
973
- # Returns whether the HTTP session is to be kept alive.
977
+ # Returns whether the HTTP session is to be kept alive.
974
978
  def connection_keep_alive?
975
979
  token = /(?:\A|,)\s*keep-alive\s*(?:\z|,)/i
976
980
  @header['connection']&.grep(token) {return true}
@@ -29,6 +29,7 @@
29
29
  # - Gem::Net::HTTP#get: sends +GET+ request, returns response object.
30
30
  #
31
31
  class Gem::Net::HTTP::Get < Gem::Net::HTTPRequest
32
+ # :stopdoc:
32
33
  METHOD = 'GET'
33
34
  REQUEST_HAS_BODY = false
34
35
  RESPONSE_HAS_BODY = true
@@ -60,6 +61,7 @@ end
60
61
  # - Gem::Net::HTTP#head: sends +HEAD+ request, returns response object.
61
62
  #
62
63
  class Gem::Net::HTTP::Head < Gem::Net::HTTPRequest
64
+ # :stopdoc:
63
65
  METHOD = 'HEAD'
64
66
  REQUEST_HAS_BODY = false
65
67
  RESPONSE_HAS_BODY = false
@@ -95,6 +97,7 @@ end
95
97
  # - Gem::Net::HTTP#post: sends +POST+ request, returns response object.
96
98
  #
97
99
  class Gem::Net::HTTP::Post < Gem::Net::HTTPRequest
100
+ # :stopdoc:
98
101
  METHOD = 'POST'
99
102
  REQUEST_HAS_BODY = true
100
103
  RESPONSE_HAS_BODY = true
@@ -130,6 +133,7 @@ end
130
133
  # - Gem::Net::HTTP#put: sends +PUT+ request, returns response object.
131
134
  #
132
135
  class Gem::Net::HTTP::Put < Gem::Net::HTTPRequest
136
+ # :stopdoc:
133
137
  METHOD = 'PUT'
134
138
  REQUEST_HAS_BODY = true
135
139
  RESPONSE_HAS_BODY = true
@@ -162,6 +166,7 @@ end
162
166
  # - Gem::Net::HTTP#delete: sends +DELETE+ request, returns response object.
163
167
  #
164
168
  class Gem::Net::HTTP::Delete < Gem::Net::HTTPRequest
169
+ # :stopdoc:
165
170
  METHOD = 'DELETE'
166
171
  REQUEST_HAS_BODY = false
167
172
  RESPONSE_HAS_BODY = true
@@ -193,6 +198,7 @@ end
193
198
  # - Gem::Net::HTTP#options: sends +OPTIONS+ request, returns response object.
194
199
  #
195
200
  class Gem::Net::HTTP::Options < Gem::Net::HTTPRequest
201
+ # :stopdoc:
196
202
  METHOD = 'OPTIONS'
197
203
  REQUEST_HAS_BODY = false
198
204
  RESPONSE_HAS_BODY = true
@@ -224,6 +230,7 @@ end
224
230
  # - Gem::Net::HTTP#trace: sends +TRACE+ request, returns response object.
225
231
  #
226
232
  class Gem::Net::HTTP::Trace < Gem::Net::HTTPRequest
233
+ # :stopdoc:
227
234
  METHOD = 'TRACE'
228
235
  REQUEST_HAS_BODY = false
229
236
  RESPONSE_HAS_BODY = true
@@ -258,6 +265,7 @@ end
258
265
  # - Gem::Net::HTTP#patch: sends +PATCH+ request, returns response object.
259
266
  #
260
267
  class Gem::Net::HTTP::Patch < Gem::Net::HTTPRequest
268
+ # :stopdoc:
261
269
  METHOD = 'PATCH'
262
270
  REQUEST_HAS_BODY = true
263
271
  RESPONSE_HAS_BODY = true
@@ -285,6 +293,7 @@ end
285
293
  # - Gem::Net::HTTP#propfind: sends +PROPFIND+ request, returns response object.
286
294
  #
287
295
  class Gem::Net::HTTP::Propfind < Gem::Net::HTTPRequest
296
+ # :stopdoc:
288
297
  METHOD = 'PROPFIND'
289
298
  REQUEST_HAS_BODY = true
290
299
  RESPONSE_HAS_BODY = true
@@ -308,6 +317,7 @@ end
308
317
  # - Gem::Net::HTTP#proppatch: sends +PROPPATCH+ request, returns response object.
309
318
  #
310
319
  class Gem::Net::HTTP::Proppatch < Gem::Net::HTTPRequest
320
+ # :stopdoc:
311
321
  METHOD = 'PROPPATCH'
312
322
  REQUEST_HAS_BODY = true
313
323
  RESPONSE_HAS_BODY = true
@@ -331,6 +341,7 @@ end
331
341
  # - Gem::Net::HTTP#mkcol: sends +MKCOL+ request, returns response object.
332
342
  #
333
343
  class Gem::Net::HTTP::Mkcol < Gem::Net::HTTPRequest
344
+ # :stopdoc:
334
345
  METHOD = 'MKCOL'
335
346
  REQUEST_HAS_BODY = true
336
347
  RESPONSE_HAS_BODY = true
@@ -354,6 +365,7 @@ end
354
365
  # - Gem::Net::HTTP#copy: sends +COPY+ request, returns response object.
355
366
  #
356
367
  class Gem::Net::HTTP::Copy < Gem::Net::HTTPRequest
368
+ # :stopdoc:
357
369
  METHOD = 'COPY'
358
370
  REQUEST_HAS_BODY = false
359
371
  RESPONSE_HAS_BODY = true
@@ -377,6 +389,7 @@ end
377
389
  # - Gem::Net::HTTP#move: sends +MOVE+ request, returns response object.
378
390
  #
379
391
  class Gem::Net::HTTP::Move < Gem::Net::HTTPRequest
392
+ # :stopdoc:
380
393
  METHOD = 'MOVE'
381
394
  REQUEST_HAS_BODY = false
382
395
  RESPONSE_HAS_BODY = true
@@ -400,6 +413,7 @@ end
400
413
  # - Gem::Net::HTTP#lock: sends +LOCK+ request, returns response object.
401
414
  #
402
415
  class Gem::Net::HTTP::Lock < Gem::Net::HTTPRequest
416
+ # :stopdoc:
403
417
  METHOD = 'LOCK'
404
418
  REQUEST_HAS_BODY = true
405
419
  RESPONSE_HAS_BODY = true
@@ -423,8 +437,8 @@ end
423
437
  # - Gem::Net::HTTP#unlock: sends +UNLOCK+ request, returns response object.
424
438
  #
425
439
  class Gem::Net::HTTP::Unlock < Gem::Net::HTTPRequest
440
+ # :stopdoc:
426
441
  METHOD = 'UNLOCK'
427
442
  REQUEST_HAS_BODY = true
428
443
  RESPONSE_HAS_BODY = true
429
444
  end
430
-
@@ -153,6 +153,7 @@ class Gem::Net::HTTPResponse
153
153
  end
154
154
 
155
155
  private
156
+ # :stopdoc:
156
157
 
157
158
  def read_status_line(sock)
158
159
  str = sock.readline
@@ -259,7 +260,7 @@ class Gem::Net::HTTPResponse
259
260
  # header.
260
261
  attr_accessor :ignore_eof
261
262
 
262
- def inspect
263
+ def inspect # :nodoc:
263
264
  "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
264
265
  end
265
266