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
@@ -0,0 +1,332 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Skip reloading when an identical copy (e.g. the one shipped inside the Bundler
4
+ # gem) was already required from a different path, to avoid redefinition warnings.
5
+ return if defined?(Gem::CredentialStore::SERVICE_NAME)
6
+
7
+ ##
8
+ # Gem::CredentialStore is opt-in storage for authentication secrets (API
9
+ # keys, host credentials) in the operating system's native secret store
10
+ # instead of a plain text file:
11
+ #
12
+ # * macOS: Keychain, via the +security+ command line tool.
13
+ # * Linux: the Secret Service API (GNOME Keyring, KWallet, ...), via
14
+ # +secret-tool+.
15
+ # * Windows: Credential Manager, via the +Windows.Security.Credentials.PasswordVault+
16
+ # API from PowerShell.
17
+ #
18
+ # A third party can add another backend (1Password, pass, HashiCorp Vault,
19
+ # ...) by shipping a gem that provides
20
+ # <tt>rubygems/credential_store/backends/<name></tt> and calls
21
+ # .register_backend from it. Users then select it by name instead of +true+
22
+ # (see .resolve_backend).
23
+ #
24
+ # Every public method traps all errors and returns +nil+/+false+ instead of
25
+ # raising, so that callers can transparently fall back to their existing
26
+ # file-based storage when the native store is unavailable or fails (a
27
+ # locked keychain over SSH, a headless Linux session without a keyring
28
+ # daemon, ...).
29
+
30
+ class Gem::CredentialStore
31
+ SERVICE_NAME = "rubygems"
32
+
33
+ ##
34
+ # Returns the store to use for +spec+, or +nil+ when the credential store
35
+ # is off. +spec+ is either +true+ (use this platform's native backend) or
36
+ # the name of a registered backend such as "1password". +service+ names
37
+ # the account namespace within the backend, so RubyGems and Bundler keep
38
+ # separate credentials in one native store. The store is memoized per
39
+ # +spec+ and +service+ for the life of the process, so the read cache and
40
+ # any expensive backend startup are shared across callers. A test may
41
+ # install a stand-in via #instance= that is returned here for any enabled
42
+ # +spec+, or inject a shared backend via #backend=.
43
+
44
+ def self.for(spec, service: SERVICE_NAME)
45
+ return nil unless spec
46
+ return @override if defined?(@override) && @override
47
+
48
+ backend = defined?(@override_backend) && @override_backend ? @override_backend : backend_for(spec)
49
+ (@instances ||= {})[[spec, service]] ||= new(backend: backend, service: service)
50
+ end
51
+
52
+ ##
53
+ # The default-backed store for this platform, i.e. <tt>for(true)</tt>.
54
+ # Kept for callers and tests that only care about the native backend.
55
+
56
+ def self.instance
57
+ self.for(true)
58
+ end
59
+
60
+ ##
61
+ # Installs a stand-in store that .for returns for any enabled setting.
62
+ # Intended for tests that inject a fake backend.
63
+
64
+ def self.instance=(store)
65
+ @override = store
66
+ end
67
+
68
+ ##
69
+ # Installs a shared backend that .for wraps for every spec and service.
70
+ # Intended for tests that need RubyGems and Bundler credentials to land in
71
+ # one backend under their own service names.
72
+
73
+ def self.backend=(backend)
74
+ @override_backend = backend
75
+ end
76
+
77
+ ##
78
+ # Clears the memoized stores, the injected overrides, and the warned
79
+ # messages. Intended for tests only.
80
+
81
+ def self.reset!
82
+ @override = nil
83
+ @override_backend = nil
84
+ @instances = nil
85
+ @warned = nil
86
+ @warn_handler = nil
87
+ end
88
+
89
+ ##
90
+ # Warns once per distinct message. A single flag for every message would
91
+ # let an early warning about, say, a misspelled backend name suppress the
92
+ # later warning that a secret was written in plain text.
93
+
94
+ def self.warn_once(message)
95
+ @warned ||= {}
96
+ return if @warned.key?(message)
97
+
98
+ @warned[message] = true
99
+
100
+ if defined?(@warn_handler) && @warn_handler
101
+ @warn_handler.call(message)
102
+ else
103
+ Gem.ui.alert_warning message
104
+ end
105
+ end
106
+
107
+ ##
108
+ # Sends warnings to +handler+ (anything responding to #call) instead of
109
+ # Gem.ui. Bundler sets this because it replaces Gem.ui with a subclass of
110
+ # Gem::SilentUI, which discards alert_warning entirely, so a credential
111
+ # store failure would otherwise be silent for the whole bundle command.
112
+
113
+ def self.warn_handler=(handler)
114
+ @warn_handler = handler
115
+ end
116
+
117
+ ##
118
+ # Registers +backend+ under +name+ so it can be selected with
119
+ # <tt>credential_store = <name></tt>. A third-party backend gem calls this
120
+ # from the file RubyGems loads for that name (see .resolve_backend).
121
+
122
+ def self.register_backend(name, backend)
123
+ (@backends ||= {})[name.to_s] = backend
124
+ end
125
+
126
+ BACKEND_NAME = /\A[a-z0-9_-]+\z/
127
+
128
+ ##
129
+ # Resolves a registered backend by +name+, requiring
130
+ # <tt>rubygems/credential_store/backends/<name></tt> on first use so a
131
+ # backend shipped as its own gem loads only when actually selected.
132
+ # Returns +nil+ (warning once) when the name is malformed or no gem
133
+ # provides it, which makes callers fall back to file storage. The fixed
134
+ # require prefix and the restricted name charset keep the setting a piece
135
+ # of data, never a path or a command.
136
+
137
+ def self.resolve_backend(name)
138
+ # The setting can carry bytes Regexp#match? would reject. A name that gets
139
+ # past the match is ASCII only, so the require path it builds stays sound.
140
+ name = name.to_s.b
141
+ unless BACKEND_NAME.match?(name)
142
+ warn_once "Ignoring invalid credential store backend name #{name.inspect}."
143
+ return nil
144
+ end
145
+
146
+ return @backends[name] if @backends&.key?(name)
147
+
148
+ begin
149
+ require "rubygems/credential_store/backends/#{name}"
150
+ rescue LoadError
151
+ warn_once "Credential store backend #{name.inspect} is not installed. " \
152
+ "Install a gem that provides rubygems/credential_store/backends/#{name}, " \
153
+ "or unset the credential_store setting. Falling back to file storage."
154
+ return nil
155
+ end
156
+
157
+ @backends && @backends[name]
158
+ end
159
+
160
+ def self.backend_for(spec)
161
+ spec == true ? default_backend : resolve_backend(spec)
162
+ end
163
+ private_class_method :backend_for
164
+
165
+ def self.default_backend
166
+ if Gem.win_platform?
167
+ require_relative "credential_store/native/windows"
168
+ WindowsBackend
169
+ elsif RUBY_PLATFORM.include?("darwin")
170
+ require_relative "credential_store/native/macos"
171
+ MacOSBackend
172
+ elsif RUBY_PLATFORM.include?("linux")
173
+ require_relative "credential_store/native/linux"
174
+ LinuxBackend if LinuxBackend.available?
175
+ end
176
+ end
177
+
178
+ ##
179
+ # +backend+ is only used by tests to inject a fake backend regardless of
180
+ # the platform the test suite happens to run on. +service+ is the account
181
+ # namespace this store reads and writes under.
182
+
183
+ def initialize(backend: self.class.default_backend, service: SERVICE_NAME)
184
+ @backend = backend
185
+ @service = service
186
+ @cache = {}
187
+ end
188
+
189
+ ##
190
+ # True if a native credential backend is usable on this platform.
191
+
192
+ def available?
193
+ !@backend.nil?
194
+ end
195
+
196
+ ##
197
+ # Returns the secret stored for +account+, or +nil+ if there is none or
198
+ # the backend is unavailable/fails.
199
+
200
+ def get(account)
201
+ return nil unless @backend
202
+ return @cache[account] if @cache.key?(account)
203
+
204
+ @cache[account] = @backend.get(@service, account)
205
+ rescue StandardError => e
206
+ warn_failure(:read, e)
207
+ # Retrying means another subprocess and, on some platforms, another
208
+ # authorization prompt. #read_failed? keeps this apart from an absent one.
209
+ (@failed ||= {})[account] = true
210
+ @cache[account] = nil
211
+ end
212
+
213
+ ##
214
+ # True when #get returned +nil+ for +account+ because the backend could not
215
+ # answer, rather than because nothing is stored under it. Callers that would
216
+ # otherwise fall back to a different credential need the difference: a
217
+ # missing entry means "use something else", an unreadable one does not.
218
+
219
+ def read_failed?(account)
220
+ return false unless defined?(@failed) && @failed
221
+
222
+ @failed.key?(account)
223
+ end
224
+
225
+ ##
226
+ # Stores +secret+ for +account+. Returns +true+ on success.
227
+
228
+ def set(account, secret)
229
+ return false unless @backend
230
+
231
+ validate_credential(account, secret)
232
+
233
+ if @backend.set(@service, account, secret)
234
+ @cache[account] = secret
235
+ @failed&.delete(account)
236
+ invalidate_list
237
+ true
238
+ else
239
+ false
240
+ end
241
+ rescue StandardError => e
242
+ warn_failure(:write, e)
243
+ false
244
+ end
245
+
246
+ ##
247
+ # Removes the secret stored for +account+. Returns +true+ if the entry is
248
+ # gone, whether or not it existed beforehand.
249
+
250
+ def delete(account)
251
+ return false unless @backend
252
+
253
+ result = @backend.delete(@service, account)
254
+ @cache.delete(account)
255
+ @failed&.delete(account)
256
+ invalidate_list
257
+ result
258
+ rescue StandardError => e
259
+ warn_failure(:remove, e)
260
+ false
261
+ end
262
+
263
+ ##
264
+ # The accounts this store holds, or +nil+ when the backend cannot
265
+ # enumerate them. Listing is optional in the backend protocol: the native
266
+ # backends implement it, but a third-party backend that only resolves
267
+ # credentials on demand has nothing to enumerate. Callers must treat +nil+
268
+ # as "unknown", not as "empty". Secrets are never returned.
269
+
270
+ def list
271
+ return nil unless @backend.respond_to?(:list)
272
+ return @list if defined?(@list)
273
+
274
+ @list = @backend.list(@service)
275
+ rescue StandardError => e
276
+ warn_failure(:list, e)
277
+ # Remembered for the same reason #get remembers a failed read.
278
+ @list = nil
279
+ end
280
+
281
+ ##
282
+ # Removes every entry this store owns (all accounts under its service).
283
+ # Returns +true+ when the store is now clear. Used by +gem signout+ to end
284
+ # every session at once, mirroring deletion of the whole credentials file.
285
+
286
+ def delete_all
287
+ return false unless @backend
288
+
289
+ result = @backend.delete_all(@service)
290
+ @cache.clear
291
+ @failed = nil
292
+ invalidate_list
293
+ result
294
+ rescue StandardError => e
295
+ warn_failure(:remove, e)
296
+ false
297
+ end
298
+
299
+ private
300
+
301
+ # The listing is memoized, so a write has to drop it.
302
+ def invalidate_list
303
+ remove_instance_variable(:@list) if defined?(@list)
304
+ end
305
+
306
+ # The macOS keychain hands non-printable bytes back as hex through the only
307
+ # read-back its CLI offers. Applied to every backend so the same value is
308
+ # stored, or refused for the same reason, everywhere.
309
+ PRINTABLE_ASCII = /\A[\x20-\x7e]*\z/
310
+
311
+ # What happens after a failure depends on the operation, so the warning has
312
+ # to say the right thing for each.
313
+ OUTCOMES = {
314
+ read: "any copy left in the config file will be used instead",
315
+ write: "falling back to file storage",
316
+ remove: "the credential is still in the store",
317
+ list: "stored credentials will not be listed",
318
+ }.freeze
319
+
320
+ # A newline in an account would start a second command in the macOS batch
321
+ # input. #set turns the raise back into a warning and a false.
322
+ def validate_credential(account, secret)
323
+ raise ArgumentError, "credential secret must be printable ASCII" unless secret.to_s.b.match?(PRINTABLE_ASCII)
324
+ raise ArgumentError, "credential account must not contain a newline" if account.to_s.include?("\n")
325
+ raise ArgumentError, "credential service must not contain a newline" if @service.to_s.include?("\n")
326
+ end
327
+
328
+ def warn_failure(operation, error)
329
+ self.class.warn_once "Credential store #{operation} failed for #{@service}" \
330
+ " (#{error.class}: #{error.message}); #{OUTCOMES[operation]}."
331
+ end
332
+ end
@@ -148,6 +148,15 @@ module Gem
148
148
  @cache_home ||= ENV["XDG_CACHE_HOME"] || File.join(Gem.user_home, ".cache")
149
149
  end
150
150
 
151
+ ##
152
+ # The path to the global gem cache directory.
153
+ # This is used when global_gem_cache is enabled to share .gem files
154
+ # across all Ruby installations.
155
+
156
+ def self.global_gem_cache_path
157
+ File.join(cache_home, "gem", "gems")
158
+ end
159
+
151
160
  ##
152
161
  # The path to standard location of the user's data directory.
153
162
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../rubygems"
4
+ require_relative "cooldown"
4
5
  require_relative "dependency_list"
5
6
  require_relative "package"
6
7
  require_relative "installer"
@@ -43,6 +44,12 @@ class Gem::DependencyInstaller
43
44
 
44
45
  attr_reader :installed_gems
45
46
 
47
+ ##
48
+ # Per-gem summary entries for the newest versions the cooldown kept out
49
+ # of the last resolution. See Gem::Cooldown.output_skipped_summary.
50
+
51
+ attr_reader :cooldown_skipped
52
+
46
53
  ##
47
54
  # Creates a new installer instance.
48
55
  #
@@ -88,6 +95,10 @@ class Gem::DependencyInstaller
88
95
  @dir_mode = options[:dir_mode]
89
96
  @data_mode = options[:data_mode]
90
97
  @prog_mode = options[:prog_mode]
98
+ @build_extension = options[:build_extension]
99
+ @install_plugin = options[:install_plugin]
100
+ @cooldown = Gem::Cooldown.from_options options
101
+ @cooldown_skipped = []
91
102
 
92
103
  # Indicates that we should not try to update any deps unless
93
104
  # we absolutely must.
@@ -169,6 +180,8 @@ class Gem::DependencyInstaller
169
180
  dir_mode: @dir_mode,
170
181
  data_mode: @data_mode,
171
182
  prog_mode: @prog_mode,
183
+ build_extension: @build_extension,
184
+ install_plugin: @install_plugin,
172
185
  }
173
186
  options[:install_dir] = @install_dir if @only_install_dir
174
187
 
@@ -206,6 +219,7 @@ class Gem::DependencyInstaller
206
219
  request_set.development_shallow = @dev_shallow
207
220
  request_set.soft_missing = @force
208
221
  request_set.prerelease = @prerelease
222
+ request_set.cooldown = @cooldown
209
223
 
210
224
  installer_set = Gem::Resolver::InstallerSet.new @domain
211
225
  installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir
@@ -254,6 +268,7 @@ class Gem::DependencyInstaller
254
268
  request_set.resolve installer_set
255
269
 
256
270
  @errors.concat request_set.errors
271
+ @cooldown_skipped = request_set.resolver&.cooldown_skipped || []
257
272
 
258
273
  request_set
259
274
  end
@@ -21,7 +21,7 @@ class Gem::Doctor
21
21
 
22
22
  REPOSITORY_EXTENSION_MAP = [ # :nodoc:
23
23
  ["specifications", ".gemspec"],
24
- ["build_info", ".info"],
24
+ ["build_info", ".info", ".mkmf.log", ".gem_make.out"],
25
25
  ["cache", ".gem"],
26
26
  ["doc", ""],
27
27
  ["extensions", ""],
@@ -92,15 +92,15 @@ class Gem::Doctor
92
92
  # Cleans up children of this gem repository
93
93
 
94
94
  def doctor_children # :nodoc:
95
- REPOSITORY_EXTENSION_MAP.each do |sub_directory, extension|
96
- doctor_child sub_directory, extension
95
+ REPOSITORY_EXTENSION_MAP.each do |sub_directory, *extensions|
96
+ doctor_child sub_directory, *extensions
97
97
  end
98
98
  end
99
99
 
100
100
  ##
101
- # Removes files in +sub_directory+ with +extension+
101
+ # Removes files in +sub_directory+ with any of +extensions+
102
102
 
103
- def doctor_child(sub_directory, extension) # :nodoc:
103
+ def doctor_child(sub_directory, *extensions) # :nodoc:
104
104
  directory = File.join(@gem_repository, sub_directory)
105
105
 
106
106
  Dir.entries(directory).sort.each do |ent|
@@ -109,12 +109,18 @@ class Gem::Doctor
109
109
  child = File.join(directory, ent)
110
110
  next unless File.exist?(child)
111
111
 
112
- basename = File.basename(child, extension)
112
+ basename = strip_extension File.basename(child), extensions
113
113
  next if installed_specs.include? basename
114
114
  next if /^rubygems-\d/.match?(basename)
115
115
  next if sub_directory == "specifications" && basename == "default"
116
116
  next if sub_directory == "plugins" && Gem.plugin_suffix_regexp =~ basename
117
117
 
118
+ if sub_directory == "specifications" && File.directory?(child) &&
119
+ Gem::ContentAddress.valid_ruby_abi?(ent)
120
+ doctor_child(File.join(sub_directory, ent), *extensions) if ent == Gem.ruby_abi && !File.symlink?(child)
121
+ next
122
+ end
123
+
118
124
  type = File.directory?(child) ? "directory" : "file"
119
125
 
120
126
  action = if @dry_run
@@ -129,4 +135,15 @@ class Gem::Doctor
129
135
  rescue Errno::ENOENT
130
136
  # ignore
131
137
  end
138
+
139
+ ##
140
+ # Removes the first of +extensions+ that +name+ ends with
141
+
142
+ def strip_extension(name, extensions) # :nodoc:
143
+ extension = extensions.find do |ext|
144
+ !ext.empty? && name.end_with?(ext)
145
+ end
146
+
147
+ extension ? name.delete_suffix(extension) : name
148
+ end
132
149
  end
@@ -33,22 +33,24 @@ class Gem::DependencyError < Gem::Exception; end
33
33
  class Gem::DependencyRemovalException < Gem::Exception; end
34
34
 
35
35
  ##
36
- # Raised by Gem::Resolver when a Gem::Dependency::Conflict reaches the
37
- # toplevel. Indicates which dependencies were incompatible through #conflict
38
- # and #conflicting_dependencies
36
+ # Raised by Gem::Resolver when dependency resolution fails.
39
37
 
40
38
  class Gem::DependencyResolutionError < Gem::DependencyError
41
- attr_reader :conflict
42
-
43
39
  def initialize(conflict)
44
- @conflict = conflict
45
- a, b = conflicting_dependencies
40
+ @explanation = conflict.explanation
41
+ super @explanation
42
+ end
46
43
 
47
- super "conflicting dependencies #{a} and #{b}\n#{@conflict.explanation}"
44
+ def explanation
45
+ @explanation
46
+ end
47
+
48
+ def conflict
49
+ nil
48
50
  end
49
51
 
50
52
  def conflicting_dependencies
51
- @conflict.conflicting_dependencies
53
+ []
52
54
  end
53
55
  end
54
56
 
@@ -126,40 +128,6 @@ end
126
128
 
127
129
  Gem.deprecate_constant :SpecificGemNotFoundException
128
130
 
129
- ##
130
- # Raised by Gem::Resolver when dependencies conflict and create the
131
- # inability to find a valid possible spec for a request.
132
-
133
- class Gem::ImpossibleDependenciesError < Gem::Exception
134
- attr_reader :conflicts
135
- attr_reader :request
136
-
137
- def initialize(request, conflicts)
138
- @request = request
139
- @conflicts = conflicts
140
-
141
- super build_message
142
- end
143
-
144
- def build_message # :nodoc:
145
- requester = @request.requester
146
- requester = requester ? requester.spec.full_name : "The user"
147
- dependency = @request.dependency
148
-
149
- message = "#{requester} requires #{dependency} but it conflicted:\n".dup
150
-
151
- @conflicts.each do |_, conflict|
152
- message << conflict.explanation
153
- end
154
-
155
- message
156
- end
157
-
158
- def dependency
159
- @request.dependency
160
- end
161
- end
162
-
163
131
  class Gem::InstallError < Gem::Exception; end
164
132
 
165
133
  class Gem::RuntimeRequirementNotMetError < Gem::InstallError
@@ -220,9 +220,11 @@ ERROR: Failed to build gem native extension.
220
220
  #{output}
221
221
 
222
222
  Gem files will remain installed in #{@gem_dir} for inspection.
223
- Results logged to #{gem_make_out}
224
223
  EOF
225
224
 
225
+ # Losing the log must not cost the user the build error itself.
226
+ message += "Results logged to #{gem_make_out}\n" if gem_make_out
227
+
226
228
  raise Gem::Ext::BuildError, message, backtrace
227
229
  end
228
230
 
@@ -243,13 +245,72 @@ EOF
243
245
 
244
246
  verbose { results.join("\n") }
245
247
 
246
- write_gem_make_out results.join "\n"
248
+ # Build logs are noisy, non-reproducible artifacts that are not meant to
249
+ # be installed. Drop the ones this build left behind, plus any written
250
+ # into the extension directory by a RubyGems old enough to put them there.
251
+ FileUtils.rm_f mkmf_log_candidates(extension_dir, dest_path)
252
+ FileUtils.rm_f File.join(dest_path, "gem_make.out")
253
+ FileUtils.rm_f [build_log_path("mkmf.log"), build_log_path("gem_make.out")]
254
+ rescue Gem::Ext::Builder::NoMakefileError => e
255
+ # extconf ran fine but produced no Makefile, so the extension was skipped
256
+ # rather than built and installing carries on. Keep the log that says why
257
+ # it was skipped, out of the installation tree but still reachable.
258
+ results << e.message
259
+ results << "Skipping make for #{extension} as no Makefile was found."
260
+
261
+ verbose { results.join("\n") }
262
+
263
+ preserve_mkmf_log extension_dir, dest_path
264
+ write_gem_make_out results.join("\n")
247
265
  rescue StandardError => e
248
266
  results << e.message
267
+
268
+ mkmf_log_dest = preserve_mkmf_log(extension_dir, dest_path)
269
+ if mkmf_log_dest
270
+ results << "To see why this extension failed to compile, please check the mkmf.log which can be found here:"
271
+ results << " #{mkmf_log_dest}"
272
+ end
273
+
249
274
  build_error(results.join("\n"), $@)
250
275
  end
251
276
  end
252
277
 
278
+ ##
279
+ # Where a build log of +kind+ for this gem lives in the build_info directory.
280
+
281
+ def build_log_path(kind) # :nodoc:
282
+ File.join @spec.build_info_dir, "#{@spec.full_name}.#{kind}"
283
+ end
284
+
285
+ ##
286
+ # Moves the mkmf.log this build left behind into the build_info directory and
287
+ # returns its new path, or nil when there is none or it cannot be kept.
288
+ # Keeping a log must never replace the build error the caller is reporting,
289
+ # so a filesystem failure here is swallowed.
290
+
291
+ def preserve_mkmf_log(extension_dir, dest_path) # :nodoc:
292
+ mkmf_log = mkmf_log_candidates(extension_dir, dest_path).find {|log| File.exist?(log) }
293
+ return unless mkmf_log
294
+
295
+ destination = build_log_path "mkmf.log"
296
+
297
+ FileUtils.mkdir_p @spec.build_info_dir
298
+ FileUtils.mv mkmf_log, destination
299
+
300
+ destination
301
+ rescue SystemCallError
302
+ nil
303
+ end
304
+
305
+ ##
306
+ # Places a completed build may have left an mkmf.log, most specific first.
307
+ # Gem::Ext::ExtConfBuilder parks it in +dest_path+ so that the "clean" target
308
+ # cannot delete it; the other builders leave it where extconf ran.
309
+
310
+ def mkmf_log_candidates(extension_dir, dest_path) # :nodoc:
311
+ [File.join(dest_path, "mkmf.log"), File.join(extension_dir, "mkmf.log")]
312
+ end
313
+
253
314
  ##
254
315
  # Builds extensions. Valid types of extensions are extconf.rb files,
255
316
  # configure scripts and rakefiles or mkrf_conf files.
@@ -277,17 +338,21 @@ EOF
277
338
  end
278
339
 
279
340
  ##
280
- # Writes +output+ to gem_make.out in the extension install directory.
341
+ # Writes +output+ to gem_make.out in the build_info directory and returns its
342
+ # path, or nil when it cannot be written. Only called when the extension was
343
+ # not built, to keep build logs out of the installation tree.
281
344
 
282
345
  def write_gem_make_out(output) # :nodoc:
283
- destination = File.join @spec.extension_dir, "gem_make.out"
346
+ destination = build_log_path "gem_make.out"
284
347
 
285
- FileUtils.mkdir_p @spec.extension_dir
348
+ FileUtils.mkdir_p @spec.build_info_dir
286
349
 
287
350
  File.open destination, "wb" do |io|
288
351
  io.puts output
289
352
  end
290
353
 
291
354
  destination
355
+ rescue SystemCallError
356
+ nil
292
357
  end
293
358
  end
@@ -269,10 +269,6 @@ EOF
269
269
  LinkFlagConverter.convert(arg)
270
270
  end
271
271
 
272
- def msvc_target?
273
- makefile_config("target_os").include?("msvc")
274
- end
275
-
276
272
  def darwin_target?
277
273
  makefile_config("target_os").include?("darwin")
278
274
  end
@@ -281,11 +277,6 @@ EOF
281
277
  makefile_config("target_os").include?("mingw")
282
278
  end
283
279
 
284
- def win_target?
285
- target_platform = RbConfig::CONFIG["target_os"]
286
- !!Gem::WIN_PATTERNS.find {|r| target_platform =~ r }
287
- end
288
-
289
280
  # Interpolate substitution vars in the arg (i.e. $(DEFFILE))
290
281
  def maybe_resolve_ldflag_variable(input_arg, dest_dir, crate_name)
291
282
  var_matches = input_arg.match(/\$\((\w+)\)/)