rubygems-update 3.3.26 → 3.4.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (554) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1334 -1088
  3. data/CONTRIBUTING.md +31 -8
  4. data/Manifest.txt +49 -35
  5. data/POLICIES.md +15 -13
  6. data/README.md +19 -6
  7. data/bundler/CHANGELOG.md +290 -1
  8. data/bundler/README.md +3 -6
  9. data/bundler/UPGRADING.md +1 -1
  10. data/bundler/bundler.gemspec +2 -2
  11. data/bundler/exe/bundle +5 -16
  12. data/bundler/lib/bundler/build_metadata.rb +2 -2
  13. data/bundler/lib/bundler/cli/add.rb +1 -1
  14. data/bundler/lib/bundler/cli/binstubs.rb +5 -1
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +1 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/init.rb +2 -2
  21. data/bundler/lib/bundler/cli/install.rb +2 -3
  22. data/bundler/lib/bundler/cli/lock.rb +8 -5
  23. data/bundler/lib/bundler/cli/open.rb +6 -4
  24. data/bundler/lib/bundler/cli/outdated.rb +1 -3
  25. data/bundler/lib/bundler/cli/viz.rb +1 -1
  26. data/bundler/lib/bundler/cli.rb +45 -2
  27. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  28. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  29. data/bundler/lib/bundler/constants.rb +1 -1
  30. data/bundler/lib/bundler/current_ruby.rb +2 -0
  31. data/bundler/lib/bundler/definition.rb +163 -82
  32. data/bundler/lib/bundler/dependency.rb +13 -12
  33. data/bundler/lib/bundler/digest.rb +1 -1
  34. data/bundler/lib/bundler/dsl.rb +3 -3
  35. data/bundler/lib/bundler/endpoint_specification.rb +0 -4
  36. data/bundler/lib/bundler/env.rb +1 -1
  37. data/bundler/lib/bundler/environment_preserver.rb +3 -2
  38. data/bundler/lib/bundler/errors.rb +1 -11
  39. data/bundler/lib/bundler/feature_flag.rb +0 -1
  40. data/bundler/lib/bundler/fetcher/compact_index.rb +9 -11
  41. data/bundler/lib/bundler/fetcher/dependency.rb +2 -6
  42. data/bundler/lib/bundler/fetcher/downloader.rb +2 -5
  43. data/bundler/lib/bundler/fetcher.rb +4 -8
  44. data/bundler/lib/bundler/force_platform.rb +18 -0
  45. data/bundler/lib/bundler/friendly_errors.rb +0 -3
  46. data/bundler/lib/bundler/gem_version_promoter.rb +52 -86
  47. data/bundler/lib/bundler/graph.rb +3 -3
  48. data/bundler/lib/bundler/index.rb +7 -15
  49. data/bundler/lib/bundler/injector.rb +2 -2
  50. data/bundler/lib/bundler/inline.rb +8 -10
  51. data/bundler/lib/bundler/installer/parallel_installer.rb +3 -33
  52. data/bundler/lib/bundler/installer/standalone.rb +12 -8
  53. data/bundler/lib/bundler/installer.rb +10 -24
  54. data/bundler/lib/bundler/lazy_specification.rb +42 -42
  55. data/bundler/lib/bundler/lockfile_generator.rb +2 -2
  56. data/bundler/lib/bundler/lockfile_parser.rb +17 -16
  57. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  58. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  59. data/bundler/lib/bundler/man/bundle-cache.1 +3 -3
  60. data/bundler/lib/bundler/man/bundle-cache.1.ronn +2 -2
  61. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  62. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  63. data/bundler/lib/bundler/man/bundle-config.1 +2 -5
  64. data/bundler/lib/bundler/man/bundle-config.1.ronn +1 -4
  65. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  66. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  67. data/bundler/lib/bundler/man/bundle-exec.1 +5 -5
  68. data/bundler/lib/bundler/man/bundle-exec.1.ronn +5 -5
  69. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  70. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  71. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  72. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  73. data/bundler/lib/bundler/man/bundle-init.1 +5 -1
  74. data/bundler/lib/bundler/man/bundle-init.1.ronn +2 -0
  75. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  76. data/bundler/lib/bundler/man/bundle-install.1 +1 -30
  77. data/bundler/lib/bundler/man/bundle-install.1.ronn +0 -29
  78. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  79. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  80. data/bundler/lib/bundler/man/bundle-open.1 +22 -2
  81. data/bundler/lib/bundler/man/bundle-open.1.ronn +9 -1
  82. data/bundler/lib/bundler/man/bundle-outdated.1 +13 -9
  83. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  84. data/bundler/lib/bundler/man/bundle-platform.1 +2 -2
  85. data/bundler/lib/bundler/man/bundle-platform.1.ronn +1 -1
  86. data/bundler/lib/bundler/man/bundle-plugin.1 +1 -1
  87. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  88. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  89. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  90. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  91. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  92. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  93. data/bundler/lib/bundler/man/bundle.1 +1 -1
  94. data/bundler/lib/bundler/man/gemfile.5 +2 -2
  95. data/bundler/lib/bundler/man/gemfile.5.ronn +1 -1
  96. data/bundler/lib/bundler/mirror.rb +5 -7
  97. data/bundler/lib/bundler/plugin/index.rb +4 -4
  98. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  99. data/bundler/lib/bundler/plugin/installer.rb +5 -2
  100. data/bundler/lib/bundler/plugin.rb +1 -1
  101. data/bundler/lib/bundler/remote_specification.rb +2 -6
  102. data/bundler/lib/bundler/resolver/base.rb +72 -15
  103. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  104. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  105. data/bundler/lib/bundler/resolver/package.rb +72 -0
  106. data/bundler/lib/bundler/resolver/root.rb +25 -0
  107. data/bundler/lib/bundler/resolver/spec_group.rb +26 -36
  108. data/bundler/lib/bundler/resolver.rb +324 -277
  109. data/bundler/lib/bundler/ruby_version.rb +1 -1
  110. data/bundler/lib/bundler/rubygems_ext.rb +16 -9
  111. data/bundler/lib/bundler/rubygems_gem_installer.rb +4 -2
  112. data/bundler/lib/bundler/rubygems_integration.rb +10 -14
  113. data/bundler/lib/bundler/runtime.rb +2 -6
  114. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  115. data/bundler/lib/bundler/settings.rb +4 -10
  116. data/bundler/lib/bundler/setup.rb +4 -1
  117. data/bundler/lib/bundler/shared_helpers.rb +2 -1
  118. data/bundler/lib/bundler/source/git/git_proxy.rb +237 -74
  119. data/bundler/lib/bundler/source/git.rb +48 -30
  120. data/bundler/lib/bundler/source/metadata.rb +0 -1
  121. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  122. data/bundler/lib/bundler/source/path.rb +6 -6
  123. data/bundler/lib/bundler/source/rubygems.rb +26 -81
  124. data/bundler/lib/bundler/source.rb +1 -1
  125. data/bundler/lib/bundler/source_list.rb +8 -2
  126. data/bundler/lib/bundler/spec_set.rb +22 -14
  127. data/bundler/lib/bundler/templates/Executable +1 -1
  128. data/bundler/lib/bundler/templates/Executable.bundler +5 -10
  129. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  130. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  131. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  132. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  133. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  134. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  135. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  136. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  137. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  138. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  139. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  140. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  141. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  142. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  143. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  144. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +9 -2
  145. data/bundler/lib/bundler/ui/shell.rb +35 -12
  146. data/bundler/lib/bundler/ui/silent.rb +21 -5
  147. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  148. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  149. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  150. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  151. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1351 -409
  152. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  153. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  154. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  155. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  156. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  157. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  158. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  159. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  160. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  161. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  162. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  163. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  164. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  165. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  166. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  167. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  168. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  169. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  170. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  171. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  172. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  173. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  174. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  175. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  176. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  177. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  178. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  179. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  180. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  181. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +15 -9
  182. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +11 -6
  183. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  184. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  185. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  186. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  187. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  188. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  189. data/bundler/lib/bundler/version.rb +5 -1
  190. data/bundler/lib/bundler/worker.rb +5 -7
  191. data/bundler/lib/bundler.rb +21 -72
  192. data/{bin → exe}/gem +3 -4
  193. data/{bin → exe}/update_rubygems +8 -6
  194. data/lib/rubygems/available_set.rb +1 -0
  195. data/lib/rubygems/basic_specification.rb +1 -0
  196. data/lib/rubygems/bundler_version_finder.rb +1 -1
  197. data/lib/rubygems/command.rb +16 -7
  198. data/lib/rubygems/command_manager.rb +23 -8
  199. data/lib/rubygems/commands/build_command.rb +4 -0
  200. data/lib/rubygems/commands/cert_command.rb +1 -0
  201. data/lib/rubygems/commands/check_command.rb +1 -0
  202. data/lib/rubygems/commands/cleanup_command.rb +1 -0
  203. data/lib/rubygems/commands/contents_command.rb +1 -0
  204. data/lib/rubygems/commands/dependency_command.rb +1 -0
  205. data/lib/rubygems/commands/environment_command.rb +1 -0
  206. data/lib/rubygems/commands/exec_command.rb +249 -0
  207. data/lib/rubygems/commands/fetch_command.rb +2 -1
  208. data/lib/rubygems/commands/generate_index_command.rb +1 -0
  209. data/lib/rubygems/commands/help_command.rb +4 -3
  210. data/lib/rubygems/commands/install_command.rb +8 -3
  211. data/lib/rubygems/commands/list_command.rb +1 -0
  212. data/lib/rubygems/commands/lock_command.rb +1 -0
  213. data/lib/rubygems/commands/mirror_command.rb +1 -0
  214. data/lib/rubygems/commands/open_command.rb +1 -0
  215. data/lib/rubygems/commands/outdated_command.rb +1 -0
  216. data/lib/rubygems/commands/owner_command.rb +6 -3
  217. data/lib/rubygems/commands/pristine_command.rb +10 -0
  218. data/lib/rubygems/commands/push_command.rb +1 -0
  219. data/lib/rubygems/commands/query_command.rb +1 -0
  220. data/lib/rubygems/commands/rdoc_command.rb +4 -2
  221. data/lib/rubygems/commands/search_command.rb +1 -0
  222. data/lib/rubygems/commands/server_command.rb +1 -0
  223. data/lib/rubygems/commands/setup_command.rb +4 -3
  224. data/lib/rubygems/commands/signin_command.rb +1 -0
  225. data/lib/rubygems/commands/signout_command.rb +1 -0
  226. data/lib/rubygems/commands/sources_command.rb +1 -0
  227. data/lib/rubygems/commands/specification_command.rb +1 -0
  228. data/lib/rubygems/commands/stale_command.rb +1 -0
  229. data/lib/rubygems/commands/uninstall_command.rb +4 -0
  230. data/lib/rubygems/commands/unpack_command.rb +2 -1
  231. data/lib/rubygems/commands/update_command.rb +2 -7
  232. data/lib/rubygems/commands/which_command.rb +1 -0
  233. data/lib/rubygems/commands/yank_command.rb +1 -0
  234. data/lib/rubygems/config_file.rb +34 -0
  235. data/lib/rubygems/core_ext/kernel_gem.rb +0 -5
  236. data/lib/rubygems/core_ext/kernel_require.rb +108 -114
  237. data/lib/rubygems/core_ext/kernel_warn.rb +33 -37
  238. data/lib/rubygems/core_ext/tcpsocket_init.rb +2 -0
  239. data/lib/rubygems/defaults.rb +17 -2
  240. data/lib/rubygems/dependency.rb +6 -2
  241. data/lib/rubygems/dependency_installer.rb +25 -24
  242. data/lib/rubygems/dependency_list.rb +1 -0
  243. data/lib/rubygems/deprecate.rb +3 -2
  244. data/lib/rubygems/doctor.rb +1 -0
  245. data/lib/rubygems/errors.rb +1 -0
  246. data/lib/rubygems/exceptions.rb +11 -3
  247. data/lib/rubygems/ext/build_error.rb +1 -0
  248. data/lib/rubygems/ext/builder.rb +23 -7
  249. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  250. data/lib/rubygems/ext/cargo_builder.rb +145 -110
  251. data/lib/rubygems/ext/configure_builder.rb +1 -0
  252. data/lib/rubygems/ext/ext_conf_builder.rb +4 -2
  253. data/lib/rubygems/ext/rake_builder.rb +5 -3
  254. data/lib/rubygems/ext.rb +1 -0
  255. data/lib/rubygems/gem_runner.rb +1 -0
  256. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  257. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  258. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  259. data/lib/rubygems/gemcutter_utilities.rb +53 -6
  260. data/lib/rubygems/indexer.rb +2 -1
  261. data/lib/rubygems/install_default_message.rb +1 -0
  262. data/lib/rubygems/install_message.rb +1 -0
  263. data/lib/rubygems/install_update_options.rb +1 -0
  264. data/lib/rubygems/installer.rb +22 -6
  265. data/lib/rubygems/local_remote_options.rb +1 -0
  266. data/lib/rubygems/mock_gem_ui.rb +1 -0
  267. data/lib/rubygems/name_tuple.rb +1 -0
  268. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  269. data/lib/rubygems/package/digest_io.rb +1 -0
  270. data/lib/rubygems/package/file_source.rb +1 -0
  271. data/lib/rubygems/package/io_source.rb +1 -0
  272. data/lib/rubygems/package/old.rb +1 -0
  273. data/lib/rubygems/package/source.rb +1 -0
  274. data/lib/rubygems/package/tar_header.rb +13 -12
  275. data/lib/rubygems/package/tar_reader/entry.rb +89 -7
  276. data/lib/rubygems/package/tar_reader.rb +1 -28
  277. data/lib/rubygems/package/tar_writer.rb +1 -0
  278. data/lib/rubygems/package.rb +1 -0
  279. data/lib/rubygems/package_task.rb +1 -0
  280. data/lib/rubygems/path_support.rb +1 -0
  281. data/lib/rubygems/platform.rb +4 -5
  282. data/lib/rubygems/psych_tree.rb +1 -0
  283. data/lib/rubygems/rdoc.rb +1 -0
  284. data/lib/rubygems/remote_fetcher.rb +1 -0
  285. data/lib/rubygems/request/http_pool.rb +1 -0
  286. data/lib/rubygems/request/https_pool.rb +1 -0
  287. data/lib/rubygems/request.rb +1 -0
  288. data/lib/rubygems/request_set/gem_dependency_api.rb +105 -105
  289. data/lib/rubygems/request_set/lockfile/parser.rb +1 -0
  290. data/lib/rubygems/request_set/lockfile/tokenizer.rb +2 -0
  291. data/lib/rubygems/request_set/lockfile.rb +1 -0
  292. data/lib/rubygems/request_set.rb +3 -2
  293. data/lib/rubygems/requirement.rb +9 -8
  294. data/lib/rubygems/resolver/activation_request.rb +1 -0
  295. data/lib/rubygems/resolver/api_set.rb +1 -0
  296. data/lib/rubygems/resolver/api_specification.rb +1 -0
  297. data/lib/rubygems/resolver/best_set.rb +1 -0
  298. data/lib/rubygems/resolver/composed_set.rb +1 -0
  299. data/lib/rubygems/resolver/conflict.rb +1 -0
  300. data/lib/rubygems/resolver/current_set.rb +1 -0
  301. data/lib/rubygems/resolver/dependency_request.rb +1 -0
  302. data/lib/rubygems/resolver/git_set.rb +1 -0
  303. data/lib/rubygems/resolver/git_specification.rb +1 -0
  304. data/lib/rubygems/resolver/index_set.rb +1 -0
  305. data/lib/rubygems/resolver/index_specification.rb +1 -0
  306. data/lib/rubygems/resolver/installed_specification.rb +1 -0
  307. data/lib/rubygems/resolver/installer_set.rb +5 -2
  308. data/lib/rubygems/resolver/local_specification.rb +1 -0
  309. data/lib/rubygems/resolver/lock_set.rb +1 -0
  310. data/lib/rubygems/resolver/lock_specification.rb +1 -0
  311. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  312. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  313. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  314. data/lib/rubygems/resolver/molinillo.rb +1 -0
  315. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  316. data/lib/rubygems/resolver/set.rb +1 -0
  317. data/lib/rubygems/resolver/source_set.rb +2 -0
  318. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  319. data/lib/rubygems/resolver/specification.rb +1 -0
  320. data/lib/rubygems/resolver/stats.rb +2 -1
  321. data/lib/rubygems/resolver/vendor_set.rb +1 -0
  322. data/lib/rubygems/resolver/vendor_specification.rb +1 -0
  323. data/lib/rubygems/resolver.rb +1 -0
  324. data/lib/rubygems/s3_uri_signer.rb +4 -2
  325. data/lib/rubygems/safe_yaml.rb +2 -0
  326. data/lib/rubygems/security/policies.rb +41 -40
  327. data/lib/rubygems/security/policy.rb +1 -0
  328. data/lib/rubygems/security/signer.rb +1 -0
  329. data/lib/rubygems/security/trust_dir.rb +2 -1
  330. data/lib/rubygems/security.rb +4 -16
  331. data/lib/rubygems/security_option.rb +1 -0
  332. data/lib/rubygems/shellwords.rb +3 -0
  333. data/lib/rubygems/source/git.rb +1 -1
  334. data/lib/rubygems/source/installed.rb +1 -0
  335. data/lib/rubygems/source/local.rb +1 -0
  336. data/lib/rubygems/source/lock.rb +1 -0
  337. data/lib/rubygems/source/specific_file.rb +1 -0
  338. data/lib/rubygems/source/vendor.rb +1 -0
  339. data/lib/rubygems/source.rb +2 -2
  340. data/lib/rubygems/spec_fetcher.rb +1 -0
  341. data/lib/rubygems/specification.rb +58 -52
  342. data/lib/rubygems/specification_policy.rb +21 -0
  343. data/lib/rubygems/stub_specification.rb +10 -8
  344. data/lib/rubygems/text.rb +2 -2
  345. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  346. data/lib/rubygems/uninstaller.rb +1 -0
  347. data/lib/rubygems/update_suggestion.rb +69 -0
  348. data/lib/rubygems/user_interaction.rb +2 -0
  349. data/lib/rubygems/util/licenses.rb +3 -2
  350. data/lib/rubygems/util/list.rb +1 -0
  351. data/lib/rubygems/util.rb +2 -5
  352. data/lib/rubygems/validator.rb +2 -1
  353. data/lib/rubygems/version.rb +2 -2
  354. data/lib/rubygems/version_option.rb +1 -0
  355. data/lib/rubygems.rb +32 -11
  356. data/rubygems-update.gemspec +6 -4
  357. data/setup.rb +1 -0
  358. data/test/rubygems/bad_rake.rb +1 -0
  359. data/test/rubygems/bundler_test_gem.rb +421 -0
  360. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  361. data/test/rubygems/good_rake.rb +1 -0
  362. data/test/rubygems/helper.rb +23 -6
  363. data/test/rubygems/installer_test_case.rb +1 -0
  364. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  365. data/test/rubygems/package/tar_test_case.rb +51 -15
  366. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -0
  367. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  368. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -0
  369. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  370. data/test/rubygems/rubygems_plugin.rb +1 -0
  371. data/test/rubygems/simple_gem.rb +2 -1
  372. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  373. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +2 -0
  374. data/test/rubygems/test_bundled_ca.rb +3 -2
  375. data/test/rubygems/test_config.rb +2 -1
  376. data/test/rubygems/test_deprecate.rb +2 -1
  377. data/test/rubygems/test_exit.rb +7 -1
  378. data/test/rubygems/test_gem.rb +41 -421
  379. data/test/rubygems/test_gem_available_set.rb +1 -0
  380. data/test/rubygems/test_gem_bundler_version_finder.rb +5 -3
  381. data/test/rubygems/test_gem_command.rb +1 -0
  382. data/test/rubygems/test_gem_command_manager.rb +67 -1
  383. data/test/rubygems/test_gem_commands_build_command.rb +11 -0
  384. data/test/rubygems/test_gem_commands_cert_command.rb +1 -0
  385. data/test/rubygems/test_gem_commands_check_command.rb +1 -0
  386. data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -0
  387. data/test/rubygems/test_gem_commands_contents_command.rb +1 -0
  388. data/test/rubygems/test_gem_commands_dependency_command.rb +1 -0
  389. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  390. data/test/rubygems/test_gem_commands_exec_command.rb +853 -0
  391. data/test/rubygems/test_gem_commands_fetch_command.rb +1 -0
  392. data/test/rubygems/test_gem_commands_generate_index_command.rb +1 -0
  393. data/test/rubygems/test_gem_commands_help_command.rb +1 -0
  394. data/test/rubygems/test_gem_commands_info_command.rb +1 -0
  395. data/test/rubygems/test_gem_commands_install_command.rb +21 -1
  396. data/test/rubygems/test_gem_commands_list_command.rb +1 -0
  397. data/test/rubygems/test_gem_commands_lock_command.rb +1 -0
  398. data/test/rubygems/test_gem_commands_mirror.rb +1 -0
  399. data/test/rubygems/test_gem_commands_open_command.rb +1 -0
  400. data/test/rubygems/test_gem_commands_outdated_command.rb +1 -0
  401. data/test/rubygems/test_gem_commands_owner_command.rb +103 -7
  402. data/test/rubygems/test_gem_commands_pristine_command.rb +50 -1
  403. data/test/rubygems/test_gem_commands_push_command.rb +110 -6
  404. data/test/rubygems/test_gem_commands_query_command.rb +1 -0
  405. data/test/rubygems/test_gem_commands_search_command.rb +1 -0
  406. data/test/rubygems/test_gem_commands_server_command.rb +1 -0
  407. data/test/rubygems/test_gem_commands_setup_command.rb +4 -11
  408. data/test/rubygems/test_gem_commands_signin_command.rb +1 -0
  409. data/test/rubygems/test_gem_commands_sources_command.rb +1 -0
  410. data/test/rubygems/test_gem_commands_specification_command.rb +1 -0
  411. data/test/rubygems/test_gem_commands_stale_command.rb +1 -0
  412. data/test/rubygems/test_gem_commands_uninstall_command.rb +32 -14
  413. data/test/rubygems/test_gem_commands_unpack_command.rb +1 -0
  414. data/test/rubygems/test_gem_commands_update_command.rb +7 -6
  415. data/test/rubygems/test_gem_commands_which_command.rb +1 -0
  416. data/test/rubygems/test_gem_commands_yank_command.rb +120 -1
  417. data/test/rubygems/test_gem_config_file.rb +2 -1
  418. data/test/rubygems/test_gem_dependency.rb +3 -0
  419. data/test/rubygems/test_gem_dependency_installer.rb +35 -0
  420. data/test/rubygems/test_gem_dependency_list.rb +1 -0
  421. data/test/rubygems/test_gem_dependency_resolution_error.rb +1 -0
  422. data/test/rubygems/test_gem_doctor.rb +1 -0
  423. data/test/rubygems/test_gem_ext_builder.rb +7 -8
  424. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +4 -4
  425. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.lock → ext/custom_name_lib/Cargo.lock} +22 -32
  426. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{Cargo.toml → ext/custom_name_lib/Cargo.toml} +1 -1
  427. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/{src → ext/custom_name_lib/src}/lib.rs +1 -1
  428. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +3 -0
  429. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +36 -32
  430. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  431. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  432. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  433. data/test/rubygems/test_gem_ext_cargo_builder.rb +33 -44
  434. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +17 -16
  435. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +5 -20
  436. data/test/rubygems/test_gem_ext_cmake_builder.rb +1 -0
  437. data/test/rubygems/test_gem_ext_configure_builder.rb +1 -0
  438. data/test/rubygems/test_gem_ext_rake_builder.rb +1 -0
  439. data/test/rubygems/test_gem_gem_runner.rb +8 -2
  440. data/test/rubygems/test_gem_gemcutter_utilities.rb +130 -48
  441. data/test/rubygems/test_gem_impossible_dependencies_error.rb +1 -0
  442. data/test/rubygems/test_gem_indexer.rb +40 -20
  443. data/test/rubygems/test_gem_install_update_options.rb +1 -0
  444. data/test/rubygems/test_gem_installer.rb +120 -5
  445. data/test/rubygems/test_gem_local_remote_options.rb +1 -0
  446. data/test/rubygems/test_gem_name_tuple.rb +1 -0
  447. data/test/rubygems/test_gem_package.rb +0 -25
  448. data/test/rubygems/test_gem_package_old.rb +1 -0
  449. data/test/rubygems/test_gem_package_tar_header.rb +14 -13
  450. data/test/rubygems/test_gem_package_tar_reader.rb +49 -1
  451. data/test/rubygems/test_gem_package_tar_reader_entry.rb +152 -6
  452. data/test/rubygems/test_gem_package_tar_writer.rb +1 -0
  453. data/test/rubygems/test_gem_package_task.rb +1 -0
  454. data/test/rubygems/test_gem_path_support.rb +1 -0
  455. data/test/rubygems/test_gem_platform.rb +60 -60
  456. data/test/rubygems/test_gem_rdoc.rb +1 -0
  457. data/test/rubygems/test_gem_remote_fetcher.rb +6 -5
  458. data/test/rubygems/test_gem_request.rb +10 -4
  459. data/test/rubygems/test_gem_request_connection_pools.rb +1 -0
  460. data/test/rubygems/test_gem_request_set.rb +3 -2
  461. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +11 -10
  462. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -0
  463. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +7 -6
  464. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -0
  465. data/test/rubygems/test_gem_requirement.rb +2 -1
  466. data/test/rubygems/test_gem_resolver.rb +1 -0
  467. data/test/rubygems/test_gem_resolver_activation_request.rb +1 -0
  468. data/test/rubygems/test_gem_resolver_api_set.rb +13 -12
  469. data/test/rubygems/test_gem_resolver_api_specification.rb +20 -19
  470. data/test/rubygems/test_gem_resolver_best_set.rb +1 -0
  471. data/test/rubygems/test_gem_resolver_composed_set.rb +1 -0
  472. data/test/rubygems/test_gem_resolver_conflict.rb +1 -0
  473. data/test/rubygems/test_gem_resolver_dependency_request.rb +1 -0
  474. data/test/rubygems/test_gem_resolver_git_set.rb +10 -9
  475. data/test/rubygems/test_gem_resolver_git_specification.rb +3 -2
  476. data/test/rubygems/test_gem_resolver_index_set.rb +1 -0
  477. data/test/rubygems/test_gem_resolver_index_specification.rb +1 -0
  478. data/test/rubygems/test_gem_resolver_installed_specification.rb +1 -0
  479. data/test/rubygems/test_gem_resolver_installer_set.rb +1 -0
  480. data/test/rubygems/test_gem_resolver_local_specification.rb +1 -0
  481. data/test/rubygems/test_gem_resolver_lock_set.rb +1 -0
  482. data/test/rubygems/test_gem_resolver_lock_specification.rb +1 -0
  483. data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -0
  484. data/test/rubygems/test_gem_resolver_specification.rb +1 -0
  485. data/test/rubygems/test_gem_resolver_vendor_set.rb +1 -0
  486. data/test/rubygems/test_gem_resolver_vendor_specification.rb +1 -0
  487. data/test/rubygems/test_gem_security.rb +1 -0
  488. data/test/rubygems/test_gem_security_policy.rb +10 -10
  489. data/test/rubygems/test_gem_security_signer.rb +1 -0
  490. data/test/rubygems/test_gem_security_trust_dir.rb +3 -2
  491. data/test/rubygems/test_gem_silent_ui.rb +1 -0
  492. data/test/rubygems/test_gem_source.rb +2 -1
  493. data/test/rubygems/test_gem_source_fetch_problem.rb +1 -0
  494. data/test/rubygems/test_gem_source_git.rb +14 -12
  495. data/test/rubygems/test_gem_source_installed.rb +2 -1
  496. data/test/rubygems/test_gem_source_list.rb +1 -0
  497. data/test/rubygems/test_gem_source_local.rb +1 -0
  498. data/test/rubygems/test_gem_source_lock.rb +4 -3
  499. data/test/rubygems/test_gem_source_specific_file.rb +1 -0
  500. data/test/rubygems/test_gem_source_subpath_problem.rb +1 -0
  501. data/test/rubygems/test_gem_source_vendor.rb +2 -1
  502. data/test/rubygems/test_gem_spec_fetcher.rb +1 -0
  503. data/test/rubygems/test_gem_specification.rb +95 -39
  504. data/test/rubygems/test_gem_stream_ui.rb +34 -3
  505. data/test/rubygems/test_gem_stub_specification.rb +1 -0
  506. data/test/rubygems/test_gem_text.rb +1 -0
  507. data/test/rubygems/test_gem_uninstaller.rb +6 -5
  508. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +1 -0
  509. data/test/rubygems/test_gem_update_suggestion.rb +209 -0
  510. data/test/rubygems/test_gem_uri.rb +2 -0
  511. data/test/rubygems/test_gem_uri_formatter.rb +1 -0
  512. data/test/rubygems/test_gem_util.rb +1 -0
  513. data/test/rubygems/test_gem_version.rb +3 -2
  514. data/test/rubygems/test_gem_version_option.rb +1 -0
  515. data/test/rubygems/test_kernel.rb +12 -17
  516. data/test/rubygems/test_project_sanity.rb +32 -3
  517. data/test/rubygems/test_remote_fetch_error.rb +2 -1
  518. data/test/rubygems/test_require.rb +70 -55
  519. data/test/rubygems/test_rubygems.rb +2 -0
  520. data/test/rubygems/test_webauthn_listener.rb +143 -0
  521. data/test/rubygems/test_webauthn_listener_response.rb +93 -0
  522. data/test/rubygems/test_webauthn_poller.rb +124 -0
  523. data/test/rubygems/utilities.rb +45 -3
  524. data/test/test_changelog_generator.rb +1 -1
  525. metadata +59 -43
  526. data/bundler/lib/bundler/templates/gems.rb +0 -5
  527. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  528. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  529. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  530. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  531. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  532. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  533. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  534. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  535. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  536. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  537. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  538. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  539. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  540. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  541. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  542. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  543. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  544. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  545. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  546. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  547. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  548. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  549. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  550. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  551. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  552. data/bundler/lib/bundler/version_ranges.rb +0 -122
  553. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  554. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
@@ -7,12 +7,10 @@ module Bundler
7
7
  class Rubygems < Source
8
8
  autoload :Remote, File.expand_path("rubygems/remote", __dir__)
9
9
 
10
- # Use the API when installing less than X gems
11
- API_REQUEST_LIMIT = 500
12
10
  # Ask for X gems per API request
13
11
  API_REQUEST_SIZE = 50
14
12
 
15
- attr_reader :remotes, :caches
13
+ attr_reader :remotes
16
14
 
17
15
  def initialize(options = {})
18
16
  @options = options
@@ -21,11 +19,14 @@ module Bundler
21
19
  @allow_remote = false
22
20
  @allow_cached = false
23
21
  @allow_local = options["allow_local"] || false
24
- @caches = [cache_path, *Bundler.rubygems.gem_cache]
25
22
 
26
23
  Array(options["remotes"]).reverse_each {|r| add_remote(r) }
27
24
  end
28
25
 
26
+ def caches
27
+ @caches ||= [cache_path, *Bundler.rubygems.gem_cache]
28
+ end
29
+
29
30
  def local_only!
30
31
  @specs = nil
31
32
  @allow_local = true
@@ -122,6 +123,7 @@ module Bundler
122
123
  end
123
124
  end
124
125
  alias_method :name, :identifier
126
+ alias_method :to_gemfile, :identifier
125
127
 
126
128
  def specs
127
129
  @specs ||= begin
@@ -145,7 +147,7 @@ module Bundler
145
147
  end
146
148
 
147
149
  if installed?(spec) && !force
148
- print_using_message "Using #{version_message(spec)}"
150
+ print_using_message "Using #{version_message(spec, options[:previous_spec])}"
149
151
  return nil # no post-install message
150
152
  end
151
153
 
@@ -160,27 +162,20 @@ module Bundler
160
162
 
161
163
  return if Bundler.settings[:no_install]
162
164
 
163
- if requires_sudo?
164
- install_path = Bundler.tmp(spec.full_name)
165
- bin_path = install_path.join("bin")
166
- else
167
- install_path = rubygems_dir
168
- bin_path = Bundler.system_bindir
169
- end
170
-
171
- Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
165
+ install_path = rubygems_dir
166
+ bin_path = Bundler.system_bindir
172
167
 
173
168
  require_relative "../rubygems_gem_installer"
174
169
 
175
170
  installer = Bundler::RubyGemsGemInstaller.at(
176
171
  path,
177
- :security_policy => Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
178
- :install_dir => install_path.to_s,
179
- :bin_dir => bin_path.to_s,
172
+ :security_policy => Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
173
+ :install_dir => install_path.to_s,
174
+ :bin_dir => bin_path.to_s,
180
175
  :ignore_dependencies => true,
181
- :wrappers => true,
182
- :env_shebang => true,
183
- :build_args => options[:build_args],
176
+ :wrappers => true,
177
+ :env_shebang => true,
178
+ :build_args => options[:build_args],
184
179
  :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
185
180
  :bundler_extension_cache_path => extension_cache_path(spec)
186
181
  )
@@ -209,34 +204,7 @@ module Bundler
209
204
  spec.full_gem_path = installed_spec.full_gem_path
210
205
  spec.loaded_from = installed_spec.loaded_from
211
206
 
212
- # SUDO HAX
213
- if requires_sudo?
214
- Bundler.rubygems.repository_subdirectories.each do |name|
215
- src = File.join(install_path, name, "*")
216
- dst = File.join(rubygems_dir, name)
217
- if name == "extensions" && Dir.glob(src).any?
218
- src = File.join(src, "*/*")
219
- ext_src = Dir.glob(src).first
220
- ext_src.gsub!(src[0..-6], "")
221
- dst = File.dirname(File.join(dst, ext_src))
222
- end
223
- SharedHelpers.filesystem_access(dst) do |p|
224
- Bundler.mkdir_p(p)
225
- end
226
- Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any?
227
- end
228
-
229
- spec.executables.each do |exe|
230
- SharedHelpers.filesystem_access(Bundler.system_bindir) do |p|
231
- Bundler.mkdir_p(p)
232
- end
233
- Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/"
234
- end
235
- end
236
-
237
207
  spec.post_install_message
238
- ensure
239
- Bundler.rm_rf(install_path) if requires_sudo?
240
208
  end
241
209
 
242
210
  def cache(spec, custom_path = nil)
@@ -326,7 +294,7 @@ module Bundler
326
294
  end
327
295
 
328
296
  def dependency_api_available?
329
- api_fetchers.any?
297
+ @allow_remote && api_fetchers.any?
330
298
  end
331
299
 
332
300
  protected
@@ -360,9 +328,9 @@ module Bundler
360
328
 
361
329
  def cached_path(spec)
362
330
  global_cache_path = download_cache_path(spec)
363
- @caches << global_cache_path if global_cache_path
331
+ caches << global_cache_path if global_cache_path
364
332
 
365
- possibilities = @caches.map {|p| package_path(p, spec) }
333
+ possibilities = caches.map {|p| package_path(p, spec) }
366
334
  possibilities.find {|p| File.exist?(p) }
367
335
  end
368
336
 
@@ -371,8 +339,7 @@ module Bundler
371
339
  end
372
340
 
373
341
  def normalize_uri(uri)
374
- uri = uri.to_s
375
- uri = "#{uri}/" unless uri =~ %r{/$}
342
+ uri = URINormalizer.normalize_suffix(uri.to_s)
376
343
  require_relative "../vendored_uri"
377
344
  uri = Bundler::URI(uri)
378
345
  raise ArgumentError, "The source must be an absolute URI. For example:\n" \
@@ -415,7 +382,6 @@ module Bundler
415
382
  idx = @allow_local ? installed_specs.dup : Index.new
416
383
 
417
384
  Dir["#{cache_path}/*.gem"].each do |gemfile|
418
- next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
419
385
  s ||= Bundler.rubygems.spec_from_gem(gemfile)
420
386
  s.source = self
421
387
  idx << s
@@ -436,12 +402,11 @@ module Bundler
436
402
  # gather lists from non-api sites
437
403
  fetch_names(index_fetchers, nil, idx, false)
438
404
 
439
- # because ensuring we have all the gems we need involves downloading
440
- # the gemspecs of those gems, if the non-api sites contain more than
441
- # about 500 gems, we treat all sites as non-api for speed.
442
- allow_api = idx.size < API_REQUEST_LIMIT && dependency_names.size < API_REQUEST_LIMIT
443
- Bundler.ui.debug "Need to query more than #{API_REQUEST_LIMIT} gems." \
444
- " Downloading full index instead..." unless allow_api
405
+ # legacy multi-remote sources need special logic to figure out
406
+ # dependency names and that logic can be very costly if one remote
407
+ # uses the dependency API but others don't. So use full indexes
408
+ # consistently in that particular case.
409
+ allow_api = !multiple_remotes?
445
410
 
446
411
  fetch_names(api_fetchers, allow_api && dependency_names, idx, false)
447
412
  end
@@ -475,38 +440,18 @@ module Bundler
475
440
  gem_path = package_path(cache_path, spec)
476
441
  return gem_path if File.exist?(gem_path)
477
442
 
478
- if requires_sudo?
479
- download_path = Bundler.tmp(spec.full_name)
480
- download_cache_path = default_cache_path_for(download_path)
481
- else
482
- download_cache_path = cache_path
483
- end
484
-
485
- SharedHelpers.filesystem_access(download_cache_path) do |p|
443
+ SharedHelpers.filesystem_access(cache_path) do |p|
486
444
  FileUtils.mkdir_p(p)
487
445
  end
488
- download_gem(spec, download_cache_path, previous_spec)
489
-
490
- if requires_sudo?
491
- SharedHelpers.filesystem_access(cache_path) do |p|
492
- Bundler.mkdir_p(p)
493
- end
494
- Bundler.sudo "mv #{package_path(download_cache_path, spec)} #{gem_path}"
495
- end
446
+ download_gem(spec, cache_path, previous_spec)
496
447
 
497
448
  gem_path
498
- ensure
499
- Bundler.rm_rf(download_path) if requires_sudo?
500
449
  end
501
450
 
502
451
  def installed?(spec)
503
452
  installed_specs[spec].any? && !spec.deleted_gem?
504
453
  end
505
454
 
506
- def requires_sudo?
507
- Bundler.requires_sudo?
508
- end
509
-
510
455
  def rubygems_dir
511
456
  Bundler.bundle_path
512
457
  end
@@ -100,7 +100,7 @@ module Bundler
100
100
  end
101
101
 
102
102
  def print_using_message(message)
103
- if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages?
103
+ if !message.include?("(was ")
104
104
  Bundler.ui.debug message
105
105
  else
106
106
  Bundler.ui.info message
@@ -161,11 +161,17 @@ module Bundler
161
161
  end
162
162
 
163
163
  def map_sources(replacement_sources)
164
- [@rubygems_sources, @path_sources, @git_sources, @plugin_sources].map do |sources|
164
+ rubygems, git, plugin = [@rubygems_sources, @git_sources, @plugin_sources].map do |sources|
165
165
  sources.map do |source|
166
166
  replacement_sources.find {|s| s == source } || source
167
167
  end
168
168
  end
169
+
170
+ path = @path_sources.map do |source|
171
+ replacement_sources.find {|s| s == (source.is_a?(Source::Gemspec) ? source.as_path_source : source) } || source
172
+ end
173
+
174
+ [rubygems, path, git, plugin]
169
175
  end
170
176
 
171
177
  def global_replacement_source(replacement_sources)
@@ -206,7 +212,7 @@ module Bundler
206
212
  def warn_on_git_protocol(source)
207
213
  return if Bundler.settings["git.allow_insecure"]
208
214
 
209
- if source.uri =~ /^git\:/
215
+ if /^git\:/.match?(source.uri)
210
216
  Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
211
217
  "which transmits data without encryption. Disable this warning with " \
212
218
  "`bundle config set --local git.allow_insecure true`, or switch to the `https` " \
@@ -24,6 +24,7 @@ module Bundler
24
24
 
25
25
  name = dep[0].name
26
26
  platform = dep[1]
27
+ incomplete = false
27
28
 
28
29
  key = [name, platform]
29
30
  next if handled.key?(key)
@@ -36,14 +37,19 @@ module Bundler
36
37
 
37
38
  specs_for_dep.first.dependencies.each do |d|
38
39
  next if d.type == :development
40
+ incomplete = true if d.name != "bundler" && lookup[d.name].empty?
39
41
  deps << [d, dep[1]]
40
42
  end
41
- elsif check
42
- @incomplete_specs += lookup[name]
43
+ else
44
+ incomplete = true
45
+ end
46
+
47
+ if incomplete && check
48
+ @incomplete_specs += lookup[name].any? ? lookup[name] : [LazySpecification.new(name, nil, nil)]
43
49
  end
44
50
  end
45
51
 
46
- specs
52
+ specs.uniq
47
53
  end
48
54
 
49
55
  def [](key)
@@ -57,8 +63,8 @@ module Bundler
57
63
  @sorted = nil
58
64
  end
59
65
 
60
- def delete(spec)
61
- @specs.delete(spec)
66
+ def delete(specs)
67
+ specs.each {|spec| @specs.delete(spec) }
62
68
  @lookup = nil
63
69
  @sorted = nil
64
70
  end
@@ -95,6 +101,10 @@ module Bundler
95
101
  end
96
102
 
97
103
  def incomplete_ruby_specs?(deps)
104
+ return false if @specs.empty?
105
+
106
+ @incomplete_specs = []
107
+
98
108
  self.for(deps, true, [Gem::Platform::RUBY])
99
109
 
100
110
  @incomplete_specs.any?
@@ -122,8 +132,8 @@ module Bundler
122
132
  @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
123
133
  end
124
134
 
125
- def delete_by_name_and_version(name, version)
126
- @specs.reject! {|spec| spec.name == name && spec.version == version }
135
+ def delete_by_name(name)
136
+ @specs.reject! {|spec| spec.name == name }
127
137
  @lookup = nil
128
138
  @sorted = nil
129
139
  end
@@ -165,7 +175,7 @@ module Bundler
165
175
  cgems = extract_circular_gems(error)
166
176
  raise CyclicDependencyError, "Your bundle requires gems that depend" \
167
177
  " on each other, creating an infinite loop. Please remove either" \
168
- " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
178
+ " gem '#{cgems[0]}' or gem '#{cgems[1]}' and try again."
169
179
  end
170
180
  end
171
181
 
@@ -190,12 +200,10 @@ module Bundler
190
200
 
191
201
  def specs_for_dependency(dep, platform)
192
202
  specs_for_name = lookup[dep.name]
193
- if platform.nil?
194
- matching_specs = specs_for_name.map {|s| s.materialize_for_installation if Gem::Platform.match_spec?(s) }.compact
195
- GemHelpers.sort_best_platform_match(matching_specs, Bundler.local_platform)
196
- else
197
- GemHelpers.select_best_platform_match(specs_for_name, dep.force_ruby_platform ? Gem::Platform::RUBY : platform)
198
- end
203
+ target_platform = dep.force_ruby_platform ? Gem::Platform::RUBY : (platform || Bundler.local_platform)
204
+ matching_specs = GemHelpers.select_best_platform_match(specs_for_name, target_platform)
205
+ matching_specs.map!(&:materialize_for_installation).compact! if platform.nil?
206
+ matching_specs
199
207
  end
200
208
 
201
209
  def tsort_each_child(s)
@@ -13,7 +13,7 @@ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("<%= relative_gemfile_path %>", __dir
13
13
  bundle_binstub = File.expand_path("bundle", __dir__)
14
14
 
15
15
  if File.file?(bundle_binstub)
16
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
16
+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
17
17
  load(bundle_binstub)
18
18
  else
19
19
  abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
@@ -47,7 +47,7 @@ m = Module.new do
47
47
  def lockfile
48
48
  lockfile =
49
49
  case File.basename(gemfile)
50
- when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, ".locked")
51
51
  else "#{gemfile}.lock"
52
52
  end
53
53
  File.expand_path(lockfile)
@@ -62,8 +62,9 @@ m = Module.new do
62
62
 
63
63
  def bundler_requirement
64
64
  @bundler_requirement ||=
65
- env_var_version || cli_arg_version ||
66
- bundler_requirement_for(lockfile_version)
65
+ env_var_version ||
66
+ cli_arg_version ||
67
+ bundler_requirement_for(lockfile_version)
67
68
  end
68
69
 
69
70
  def bundler_requirement_for(version)
@@ -71,13 +72,7 @@ m = Module.new do
71
72
 
72
73
  bundler_gem_version = Gem::Version.new(version)
73
74
 
74
- requirement = bundler_gem_version.approximate_recommendation
75
-
76
- return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
77
-
78
- requirement += ".a" if bundler_gem_version.prerelease?
79
-
80
- requirement
75
+ bundler_gem_version.approximate_recommendation
81
76
  end
82
77
 
83
78
  def load_bundler!
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %>
2
+ # frozen_string_literal: true
3
+
2
4
  #
3
5
  # This file was generated by Bundler.
4
6
  #
@@ -0,0 +1,7 @@
1
+ # This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
2
+ # a Rust project. Your extensions dependencies should be added to the Cargo.toml
3
+ # in the ext/ directory.
4
+
5
+ [workspace]
6
+ members = ["./ext/<%= config[:name] %>"]
7
+ resolver = "2"
@@ -9,6 +9,9 @@ gem "rake", "~> 13.0"
9
9
  <%- if config[:ext] -%>
10
10
 
11
11
  gem "rake-compiler"
12
+ <%- if config[:ext] == 'rust' -%>
13
+ gem "rb_sys", "~> 0.9.63"
14
+ <%- end -%>
12
15
  <%- end -%>
13
16
  <%- if config[:test] -%>
14
17
 
@@ -1,18 +1,20 @@
1
1
  # <%= config[:constant_name] %>
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/<%= config[:namespaced_path] %>`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ TODO: Delete this and the text below, and describe your gem
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/<%= config[:namespaced_path] %>`. To experiment with that code, run `bin/console` for an interactive prompt.
6
6
 
7
7
  ## Installation
8
8
 
9
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+
9
11
  Install the gem and add to the application's Gemfile by executing:
10
12
 
11
- $ bundle add <%= config[:name] %>
13
+ $ bundle add UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
12
14
 
13
15
  If bundler is not being used to manage dependencies, install the gem by executing:
14
16
 
15
- $ gem install <%= config[:name] %>
17
+ $ gem install UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
16
18
 
17
19
  ## Usage
18
20
 
@@ -39,7 +39,17 @@ require "standard/rake"
39
39
 
40
40
  <% end -%>
41
41
  <% if config[:ext] -%>
42
- <% default_task_names.unshift(:clobber, :compile) -%>
42
+ <% default_task_names.unshift(:compile) -%>
43
+ <% default_task_names.unshift(:clobber) unless config[:ext] == 'rust' -%>
44
+ <% if config[:ext] == 'rust' -%>
45
+ require "rb_sys/extensiontask"
46
+
47
+ task build: :compile
48
+
49
+ RbSys::ExtensionTask.new(<%= config[:name].inspect %>) do |ext|
50
+ ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
51
+ end
52
+ <% else -%>
43
53
  require "rake/extensiontask"
44
54
 
45
55
  task build: :compile
@@ -47,6 +57,7 @@ task build: :compile
47
57
  Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext|
48
58
  ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
49
59
  end
60
+ <% end -%>
50
61
 
51
62
  <% end -%>
52
63
  <% if default_task_names.size == 1 -%>
@@ -7,9 +7,5 @@ require "<%= config[:namespaced_path] %>"
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
9
9
 
10
- # (If you use this, don't forget to add pry to your Gemfile!)
11
- # require "pry"
12
- # Pry.start
13
-
14
10
  require "irb"
15
11
  IRB.start(__FILE__)
@@ -3,8 +3,20 @@ jobs:
3
3
  build:
4
4
  docker:
5
5
  - image: ruby:<%= RUBY_VERSION %>
6
+ <%- if config[:ext] == 'rust' -%>
7
+ environment:
8
+ RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN: 'true'
9
+ <%- end -%>
6
10
  steps:
7
11
  - checkout
12
+ <%- if config[:ext] == 'rust' -%>
13
+ - run:
14
+ name: Install Rust/Cargo dependencies
15
+ command: apt-get update && apt-get install -y clang
16
+ - run:
17
+ name: Install a RubyGems version that can compile rust extensions
18
+ command: gem update --system '<%= ::Gem.rubygems_version %>'
19
+ <%- end -%>
8
20
  - run:
9
21
  name: Run the default task
10
22
  command: |
@@ -0,0 +1,15 @@
1
+ [package]
2
+ name = <%= config[:name].inspect %>
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ authors = ["<%= config[:author] %> <<%= config[:email] %>>"]
6
+ <%- if config[:mit] -%>
7
+ license = "MIT"
8
+ <%- end -%>
9
+ publish = false
10
+
11
+ [lib]
12
+ crate-type = ["cdylib"]
13
+
14
+ [dependencies]
15
+ magnus = { version = "0.6" }
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+
5
+ # Makes all symbols private by default to avoid unintended conflict
6
+ # with other gems. To explicitly export symbols you can use RUBY_FUNC_EXPORTED
7
+ # selectively, or entirely remove this flag.
8
+ append_cflags("-fvisibility=hidden")
9
+
10
+ create_makefile(<%= config[:makefile_path].inspect %>)
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+ require "rb_sys/mkmf"
5
+
6
+ create_rust_makefile(<%= config[:makefile_path].inspect %>)
@@ -2,7 +2,7 @@
2
2
 
3
3
  VALUE rb_m<%= config[:constant_array].join %>;
4
4
 
5
- void
5
+ RUBY_FUNC_EXPORTED void
6
6
  Init_<%= config[:underscored_name] %>(void)
7
7
  {
8
8
  rb_m<%= config[:constant_array].join %> = rb_define_module(<%= config[:constant_name].inspect %>);
@@ -0,0 +1,12 @@
1
+ use magnus::{function, prelude::*, Error, Ruby};
2
+
3
+ fn hello(subject: String) -> String {
4
+ format!("Hello from Rust, {subject}!")
5
+ }
6
+
7
+ #[magnus::init]
8
+ fn init(ruby: &Ruby) -> Result<(), Error> {
9
+ let module = ruby.<%= config[:constant_array].map {|c| "define_module(#{c.dump})?"}.join(".") %>;
10
+ module.define_singleton_method("hello", function!(hello, 1))?;
11
+ Ok(())
12
+ }
@@ -18,10 +18,20 @@ jobs:
18
18
 
19
19
  steps:
20
20
  - uses: actions/checkout@v3
21
+ <%- if config[:ext] == 'rust' -%>
22
+ - name: Set up Ruby & Rust
23
+ uses: oxidize-rb/actions/setup-ruby-and-rust@v1
24
+ with:
25
+ ruby-version: ${{ matrix.ruby }}
26
+ bundler-cache: true
27
+ cargo-cache: true
28
+ rubygems: '<%= ::Gem.rubygems_version %>'
29
+ <%- else -%>
21
30
  - name: Set up Ruby
22
31
  uses: ruby/setup-ruby@v1
23
32
  with:
24
33
  ruby-version: ${{ matrix.ruby }}
25
34
  bundler-cache: true
35
+ <%- end -%>
26
36
  - name: Run the default task
27
37
  run: bundle exec rake
@@ -12,6 +12,9 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ <%- if config[:ext] == 'rust' -%>
16
+ target/
17
+ <%- end -%>
15
18
  <%- end -%>
16
19
  <%- if config[:test] == "rspec" -%>
17
20
 
@@ -2,9 +2,17 @@ default:
2
2
  image: ruby:<%= RUBY_VERSION %>
3
3
 
4
4
  before_script:
5
+ <%- if config[:ext] == 'rust' -%>
6
+ - apt-get update && apt-get install -y clang
7
+ - gem update --system '<%= ::Gem.rubygems_version %>'
8
+ <%- end -%>
5
9
  - gem install bundler -v <%= Bundler::VERSION %>
6
10
  - bundle install
7
11
 
8
12
  example_job:
13
+ <%- if config[:ext] == 'rust' -%>
14
+ variables:
15
+ RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN: 'true'
16
+ <%- end -%>
9
17
  script:
10
18
  - bundle exec rake
@@ -15,6 +15,9 @@ Gem::Specification.new do |spec|
15
15
  spec.license = "MIT"
16
16
  <%- end -%>
17
17
  spec.required_ruby_version = ">= <%= config[:required_ruby_version] %>"
18
+ <%- if config[:ext] == 'rust' -%>
19
+ spec.required_rubygems_version = ">= <%= config[:rust_builder_required_rubygems_version] %>"
20
+ <%- end -%>
18
21
 
19
22
  spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
20
23
 
@@ -26,15 +29,19 @@ Gem::Specification.new do |spec|
26
29
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
30
  spec.files = Dir.chdir(__dir__) do
28
31
  `git ls-files -z`.split("\x0").reject do |f|
29
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
32
+ (File.expand_path(f) == __FILE__) ||
33
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
30
34
  end
31
35
  end
32
36
  spec.bindir = "exe"
33
37
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
34
38
  spec.require_paths = ["lib"]
35
- <%- if config[:ext] -%>
39
+ <%- if config[:ext] == 'c' -%>
36
40
  spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"]
37
41
  <%- end -%>
42
+ <%- if config[:ext] == 'rust' -%>
43
+ spec.extensions = ["ext/<%= config[:underscored_name] %>/Cargo.toml"]
44
+ <%- end -%>
38
45
 
39
46
  # Uncomment to register a new dependency of your gem
40
47
  # spec.add_dependency "example-gem", "~> 1.0"