bundler 2.2.27 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (353) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1328 -4
  3. data/README.md +4 -8
  4. data/bundler.gemspec +11 -11
  5. data/exe/bundle +5 -26
  6. data/exe/bundler +1 -1
  7. data/lib/bundler/.document +1 -0
  8. data/lib/bundler/build_metadata.rb +4 -4
  9. data/lib/bundler/capistrano.rb +1 -1
  10. data/lib/bundler/checksum.rb +254 -0
  11. data/lib/bundler/ci_detector.rb +75 -0
  12. data/lib/bundler/cli/add.rb +7 -5
  13. data/lib/bundler/cli/binstubs.rb +10 -6
  14. data/lib/bundler/cli/cache.rb +1 -1
  15. data/lib/bundler/cli/check.rb +4 -4
  16. data/lib/bundler/cli/common.rb +13 -3
  17. data/lib/bundler/cli/config.rb +18 -8
  18. data/lib/bundler/cli/console.rb +2 -5
  19. data/lib/bundler/cli/doctor.rb +16 -9
  20. data/lib/bundler/cli/exec.rb +2 -1
  21. data/lib/bundler/cli/fund.rb +1 -1
  22. data/lib/bundler/cli/gem.rb +153 -40
  23. data/lib/bundler/cli/info.rb +27 -17
  24. data/lib/bundler/cli/init.rb +6 -2
  25. data/lib/bundler/cli/inject.rb +1 -1
  26. data/lib/bundler/cli/install.rb +34 -42
  27. data/lib/bundler/cli/issue.rb +5 -4
  28. data/lib/bundler/cli/lock.rb +54 -28
  29. data/lib/bundler/cli/open.rb +9 -9
  30. data/lib/bundler/cli/outdated.rb +34 -29
  31. data/lib/bundler/cli/platform.rb +8 -6
  32. data/lib/bundler/cli/plugin.rb +9 -15
  33. data/lib/bundler/cli/pristine.rb +38 -30
  34. data/lib/bundler/cli/remove.rb +1 -2
  35. data/lib/bundler/cli/show.rb +5 -5
  36. data/lib/bundler/cli/update.rb +12 -7
  37. data/lib/bundler/cli/viz.rb +1 -1
  38. data/lib/bundler/cli.rb +265 -313
  39. data/lib/bundler/compact_index_client/cache.rb +53 -67
  40. data/lib/bundler/compact_index_client/cache_file.rb +148 -0
  41. data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  42. data/lib/bundler/compact_index_client/parser.rb +84 -0
  43. data/lib/bundler/compact_index_client/updater.rb +73 -77
  44. data/lib/bundler/compact_index_client.rb +59 -87
  45. data/lib/bundler/constants.rb +9 -2
  46. data/lib/bundler/current_ruby.rb +12 -16
  47. data/lib/bundler/definition.rb +604 -347
  48. data/lib/bundler/dependency.rb +33 -71
  49. data/lib/bundler/digest.rb +71 -0
  50. data/lib/bundler/dsl.rb +136 -102
  51. data/lib/bundler/endpoint_specification.rb +42 -16
  52. data/lib/bundler/env.rb +5 -7
  53. data/lib/bundler/environment_preserver.rb +8 -22
  54. data/lib/bundler/errors.rb +113 -13
  55. data/lib/bundler/feature_flag.rb +1 -2
  56. data/lib/bundler/fetcher/base.rb +11 -11
  57. data/lib/bundler/fetcher/compact_index.rb +32 -52
  58. data/lib/bundler/fetcher/dependency.rb +3 -7
  59. data/lib/bundler/fetcher/downloader.rb +17 -16
  60. data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  61. data/lib/bundler/fetcher/index.rb +2 -29
  62. data/lib/bundler/fetcher.rb +98 -83
  63. data/lib/bundler/force_platform.rb +16 -0
  64. data/lib/bundler/friendly_errors.rb +29 -40
  65. data/lib/bundler/gem_helper.rb +12 -24
  66. data/lib/bundler/gem_helpers.rb +47 -7
  67. data/lib/bundler/gem_version_promoter.rb +68 -109
  68. data/lib/bundler/graph.rb +9 -9
  69. data/lib/bundler/index.rb +71 -79
  70. data/lib/bundler/injector.rb +25 -13
  71. data/lib/bundler/inline.rb +41 -28
  72. data/lib/bundler/installer/gem_installer.rb +22 -13
  73. data/lib/bundler/installer/parallel_installer.rb +19 -66
  74. data/lib/bundler/installer/standalone.rb +58 -17
  75. data/lib/bundler/installer.rb +31 -93
  76. data/lib/bundler/lazy_specification.rb +151 -72
  77. data/lib/bundler/lockfile_generator.rb +13 -4
  78. data/lib/bundler/lockfile_parser.rb +146 -71
  79. data/lib/bundler/man/bundle-add.1 +54 -44
  80. data/lib/bundler/man/bundle-add.1.ronn +62 -21
  81. data/lib/bundler/man/bundle-binstubs.1 +10 -19
  82. data/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  83. data/lib/bundler/man/bundle-cache.1 +38 -25
  84. data/lib/bundler/man/bundle-cache.1.ronn +40 -4
  85. data/lib/bundler/man/bundle-check.1 +7 -14
  86. data/lib/bundler/man/bundle-check.1.ronn +7 -2
  87. data/lib/bundler/man/bundle-clean.1 +4 -11
  88. data/lib/bundler/man/bundle-clean.1.ronn +1 -1
  89. data/lib/bundler/man/bundle-config.1 +48 -227
  90. data/lib/bundler/man/bundle-config.1.ronn +41 -34
  91. data/lib/bundler/man/bundle-console.1 +33 -0
  92. data/lib/bundler/man/bundle-console.1.ronn +39 -0
  93. data/lib/bundler/man/bundle-doctor.1 +5 -19
  94. data/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  95. data/lib/bundler/man/bundle-env.1 +9 -0
  96. data/lib/bundler/man/bundle-env.1.ronn +10 -0
  97. data/lib/bundler/man/bundle-exec.1 +20 -78
  98. data/lib/bundler/man/bundle-exec.1.ronn +12 -10
  99. data/lib/bundler/man/bundle-fund.1 +22 -0
  100. data/lib/bundler/man/bundle-fund.1.ronn +25 -0
  101. data/lib/bundler/man/bundle-gem.1 +57 -72
  102. data/lib/bundler/man/bundle-gem.1.ronn +57 -9
  103. data/lib/bundler/man/bundle-help.1 +9 -0
  104. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  105. data/lib/bundler/man/bundle-info.1 +8 -11
  106. data/lib/bundler/man/bundle-info.1.ronn +9 -5
  107. data/lib/bundler/man/bundle-init.1 +7 -12
  108. data/lib/bundler/man/bundle-init.1.ronn +4 -1
  109. data/lib/bundler/man/bundle-inject.1 +17 -19
  110. data/lib/bundler/man/bundle-inject.1.ronn +12 -2
  111. data/lib/bundler/man/bundle-install.1 +43 -163
  112. data/lib/bundler/man/bundle-install.1.ronn +33 -51
  113. data/lib/bundler/man/bundle-issue.1 +45 -0
  114. data/lib/bundler/man/bundle-issue.1.ronn +37 -0
  115. data/lib/bundler/man/bundle-licenses.1 +9 -0
  116. data/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  117. data/lib/bundler/man/bundle-list.1 +4 -19
  118. data/lib/bundler/man/bundle-list.1.ronn +4 -1
  119. data/lib/bundler/man/bundle-lock.1 +25 -34
  120. data/lib/bundler/man/bundle-lock.1.ronn +25 -4
  121. data/lib/bundler/man/bundle-open.1 +18 -18
  122. data/lib/bundler/man/bundle-open.1.ronn +10 -1
  123. data/lib/bundler/man/bundle-outdated.1 +23 -75
  124. data/lib/bundler/man/bundle-outdated.1.ronn +21 -22
  125. data/lib/bundler/man/bundle-platform.1 +16 -28
  126. data/lib/bundler/man/bundle-platform.1.ronn +14 -7
  127. data/lib/bundler/man/bundle-plugin.1 +58 -0
  128. data/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  129. data/lib/bundler/man/bundle-pristine.1 +5 -16
  130. data/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  131. data/lib/bundler/man/bundle-remove.1 +4 -14
  132. data/lib/bundler/man/bundle-remove.1.ronn +1 -1
  133. data/lib/bundler/man/bundle-show.1 +7 -11
  134. data/lib/bundler/man/bundle-show.1.ronn +4 -0
  135. data/lib/bundler/man/bundle-update.1 +31 -144
  136. data/lib/bundler/man/bundle-update.1.ronn +16 -7
  137. data/lib/bundler/man/bundle-version.1 +22 -0
  138. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  139. data/lib/bundler/man/bundle-viz.1 +9 -18
  140. data/lib/bundler/man/bundle-viz.1.ronn +9 -3
  141. data/lib/bundler/man/bundle.1 +17 -51
  142. data/lib/bundler/man/bundle.1.ronn +12 -7
  143. data/lib/bundler/man/gemfile.5 +132 -346
  144. data/lib/bundler/man/gemfile.5.ronn +127 -86
  145. data/lib/bundler/man/index.txt +8 -0
  146. data/lib/bundler/match_metadata.rb +17 -0
  147. data/lib/bundler/match_platform.rb +1 -2
  148. data/lib/bundler/match_remote_metadata.rb +29 -0
  149. data/lib/bundler/materialization.rb +59 -0
  150. data/lib/bundler/mirror.rb +8 -10
  151. data/lib/bundler/plugin/api/source.rb +11 -14
  152. data/lib/bundler/plugin/events.rb +24 -0
  153. data/lib/bundler/plugin/index.rb +13 -5
  154. data/lib/bundler/plugin/installer/git.rb +0 -4
  155. data/lib/bundler/plugin/installer/path.rb +18 -0
  156. data/lib/bundler/plugin/installer/rubygems.rb +0 -8
  157. data/lib/bundler/plugin/installer.rb +43 -20
  158. data/lib/bundler/plugin/source_list.rb +4 -4
  159. data/lib/bundler/plugin.rb +35 -7
  160. data/lib/bundler/process_lock.rb +10 -14
  161. data/lib/bundler/remote_specification.rb +17 -6
  162. data/lib/bundler/resolver/base.rb +117 -0
  163. data/lib/bundler/resolver/candidate.rb +82 -0
  164. data/lib/bundler/resolver/incompatibility.rb +15 -0
  165. data/lib/bundler/resolver/package.rb +90 -0
  166. data/lib/bundler/resolver/root.rb +25 -0
  167. data/lib/bundler/resolver/spec_group.rb +54 -66
  168. data/lib/bundler/resolver.rb +440 -306
  169. data/lib/bundler/retry.rb +2 -2
  170. data/lib/bundler/ruby_dsl.rb +42 -7
  171. data/lib/bundler/ruby_version.rb +22 -22
  172. data/lib/bundler/rubygems_ext.rb +323 -84
  173. data/lib/bundler/rubygems_gem_installer.rb +93 -65
  174. data/lib/bundler/rubygems_integration.rb +89 -237
  175. data/lib/bundler/runtime.rb +30 -20
  176. data/lib/bundler/safe_marshal.rb +31 -0
  177. data/lib/bundler/self_manager.rb +205 -0
  178. data/lib/bundler/settings.rb +145 -58
  179. data/lib/bundler/setup.rb +13 -1
  180. data/lib/bundler/shared_helpers.rb +94 -51
  181. data/lib/bundler/source/git/git_proxy.rb +283 -82
  182. data/lib/bundler/source/git.rb +187 -78
  183. data/lib/bundler/source/metadata.rb +16 -16
  184. data/lib/bundler/source/path/installer.rb +1 -22
  185. data/lib/bundler/source/path.rb +17 -27
  186. data/lib/bundler/source/rubygems/remote.rb +1 -1
  187. data/lib/bundler/source/rubygems.rb +165 -245
  188. data/lib/bundler/source/rubygems_aggregate.rb +1 -1
  189. data/lib/bundler/source.rb +7 -6
  190. data/lib/bundler/source_list.rb +41 -33
  191. data/lib/bundler/source_map.rb +15 -2
  192. data/lib/bundler/spec_set.rb +193 -58
  193. data/lib/bundler/stub_specification.rb +39 -7
  194. data/lib/bundler/templates/Executable +3 -5
  195. data/lib/bundler/templates/Executable.bundler +7 -12
  196. data/lib/bundler/templates/Executable.standalone +4 -4
  197. data/lib/bundler/templates/Gemfile +0 -2
  198. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  199. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  200. data/lib/bundler/templates/newgem/Gemfile.tt +5 -2
  201. data/lib/bundler/templates/newgem/README.md.tt +12 -12
  202. data/lib/bundler/templates/newgem/Rakefile.tt +28 -4
  203. data/lib/bundler/templates/newgem/bin/console.tt +0 -4
  204. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  205. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  206. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  207. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  208. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  209. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  210. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +20 -10
  211. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  212. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  213. data/lib/bundler/templates/newgem/newgem.gemspec.tt +26 -18
  214. data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  215. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  216. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  217. data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  218. data/lib/bundler/ui/rg_proxy.rb +1 -1
  219. data/lib/bundler/ui/shell.rb +61 -16
  220. data/lib/bundler/ui/silent.rb +33 -6
  221. data/lib/bundler/uri_credentials_filter.rb +3 -3
  222. data/lib/bundler/uri_normalizer.rb +23 -0
  223. data/lib/bundler/vendor/.document +1 -0
  224. data/lib/bundler/vendor/connection_pool/.document +1 -0
  225. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  226. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  227. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  228. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  229. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +92 -78
  230. data/lib/bundler/vendor/fileutils/.document +1 -0
  231. data/lib/bundler/vendor/fileutils/COPYING +56 -0
  232. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -418
  233. data/lib/bundler/vendor/net-http-persistent/.document +1 -0
  234. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  235. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  236. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  237. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  238. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  239. data/lib/bundler/vendor/pub_grub/.document +1 -0
  240. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  241. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  242. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  243. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  244. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  245. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  246. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  247. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  248. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  249. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  250. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  251. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  252. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  253. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  254. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  255. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  256. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  257. data/lib/bundler/vendor/securerandom/.document +1 -0
  258. data/lib/bundler/vendor/securerandom/COPYING +56 -0
  259. data/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  260. data/lib/bundler/vendor/thor/.document +1 -0
  261. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  262. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  263. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  264. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  265. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +15 -19
  266. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +16 -6
  267. data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -17
  268. data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  269. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  270. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +10 -0
  271. data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -20
  272. data/lib/bundler/vendor/thor/lib/thor/group.rb +12 -1
  273. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  274. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  275. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +17 -1
  276. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  277. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +28 -9
  278. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +65 -8
  279. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  280. data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  281. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +56 -162
  282. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  283. data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  284. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -46
  285. data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  286. data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  287. data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  288. data/lib/bundler/vendor/thor/lib/thor/shell.rb +2 -2
  289. data/lib/bundler/vendor/thor/lib/thor/util.rb +9 -8
  290. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  291. data/lib/bundler/vendor/thor/lib/thor.rb +166 -8
  292. data/lib/bundler/vendor/tsort/.document +1 -0
  293. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  294. data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  295. data/lib/bundler/vendor/uri/.document +1 -0
  296. data/lib/bundler/vendor/uri/COPYING +56 -0
  297. data/lib/bundler/vendor/uri/lib/uri/common.rb +351 -219
  298. data/lib/bundler/vendor/uri/lib/uri/file.rb +10 -4
  299. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +3 -3
  300. data/lib/bundler/vendor/uri/lib/uri/generic.rb +49 -39
  301. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -3
  302. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -2
  303. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +2 -2
  304. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  305. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -3
  306. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +26 -26
  307. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +131 -50
  308. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  309. data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  310. data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  311. data/lib/bundler/vendor/uri/lib/uri.rb +12 -12
  312. data/lib/bundler/vendored_net_http.rb +23 -0
  313. data/lib/bundler/vendored_persistent.rb +0 -36
  314. data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
  315. data/lib/bundler/vendored_securerandom.rb +12 -0
  316. data/lib/bundler/vendored_timeout.rb +12 -0
  317. data/lib/bundler/{vendored_tmpdir.rb → vendored_tsort.rb} +1 -1
  318. data/lib/bundler/vendored_uri.rb +18 -1
  319. data/lib/bundler/version.rb +5 -1
  320. data/lib/bundler/vlad.rb +1 -1
  321. data/lib/bundler/worker.rb +7 -9
  322. data/lib/bundler/yaml_serializer.rb +22 -13
  323. data/lib/bundler.rb +176 -151
  324. metadata +98 -41
  325. data/lib/bundler/dep_proxy.rb +0 -55
  326. data/lib/bundler/gemdeps.rb +0 -29
  327. data/lib/bundler/psyched_yaml.rb +0 -22
  328. data/lib/bundler/templates/gems.rb +0 -8
  329. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  330. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  331. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
  332. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  333. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  334. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  335. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  336. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  337. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  338. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  339. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  340. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  341. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  342. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  343. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  344. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
  345. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  346. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  347. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  348. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  349. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  350. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  351. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  352. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  353. data/lib/bundler/version_ranges.rb +0 -122
@@ -39,7 +39,7 @@ module Bundler
39
39
  # is present to be compatible with `Definition` and is used by
40
40
  # rubygems source.
41
41
  module Source
42
- attr_reader :uri, :options, :name
42
+ attr_reader :uri, :options, :name, :checksum_store
43
43
  attr_accessor :dependency_names
44
44
 
45
45
  def initialize(opts)
@@ -48,6 +48,7 @@ module Bundler
48
48
  @uri = opts["uri"]
49
49
  @type = opts["type"]
50
50
  @name = opts["name"] || "#{@type} at #{@uri}"
51
+ @checksum_store = Checksum::Store.new
51
52
  end
52
53
 
53
54
  # This is used by the default `spec` method to constructs the
@@ -95,7 +96,7 @@ module Bundler
95
96
  #
96
97
  # Note: Do not override if you don't know what you are doing.
97
98
  def post_install(spec, disable_exts = false)
98
- opts = { :env_shebang => false, :disable_extensions => disable_exts }
99
+ opts = { env_shebang: false, disable_extensions: disable_exts }
99
100
  installer = Bundler::Source::Path::Installer.new(spec, opts)
100
101
  installer.post_install
101
102
  end
@@ -106,7 +107,7 @@ module Bundler
106
107
  def install_path
107
108
  @install_path ||=
108
109
  begin
109
- base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
110
+ base_name = File.basename(Gem::URI.parse(uri).normalize.path)
110
111
 
111
112
  gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
112
113
  end
@@ -130,7 +131,7 @@ module Bundler
130
131
  Bundler::Index.build do |index|
131
132
  files.each do |file|
132
133
  next unless spec = Bundler.load_gemspec(file)
133
- Bundler.rubygems.set_installed_by_version(spec)
134
+ spec.installed_by_version = Gem::VERSION
134
135
 
135
136
  spec.source = self
136
137
  Bundler.rubygems.validate(spec)
@@ -175,7 +176,7 @@ module Bundler
175
176
  #
176
177
  # This is used by `app_cache_path`
177
178
  def app_cache_dirname
178
- base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
179
+ base_name = File.basename(Gem::URI.parse(uri).normalize.path)
179
180
  "#{base_name}-#{uri_hash}"
180
181
  end
181
182
 
@@ -195,6 +196,7 @@ module Bundler
195
196
 
196
197
  FileUtils.rm_rf(new_cache_path)
197
198
  FileUtils.cp_r(install_path, new_cache_path)
199
+ FileUtils.rm_rf(app_cache_path.join(".git"))
198
200
  FileUtils.touch(app_cache_path.join(".bundlecache"))
199
201
  end
200
202
 
@@ -258,7 +260,7 @@ module Bundler
258
260
  @dependencies |= Array(names)
259
261
  end
260
262
 
261
- # Note: Do not override if you don't know what you are doing.
263
+ # NOTE: Do not override if you don't know what you are doing.
262
264
  def can_lock?(spec)
263
265
  spec.source == self
264
266
  end
@@ -283,8 +285,9 @@ module Bundler
283
285
  def to_s
284
286
  "plugin source for #{@type} with uri #{@uri}"
285
287
  end
288
+ alias_method :identifier, :to_s
286
289
 
287
- # Note: Do not override if you don't know what you are doing.
290
+ # NOTE: Do not override if you don't know what you are doing.
288
291
  def include?(other)
289
292
  other == self
290
293
  end
@@ -293,7 +296,7 @@ module Bundler
293
296
  SharedHelpers.digest(:SHA1).hexdigest(uri)
294
297
  end
295
298
 
296
- # Note: Do not override if you don't know what you are doing.
299
+ # NOTE: Do not override if you don't know what you are doing.
297
300
  def gem_install_dir
298
301
  Bundler.install_path
299
302
  end
@@ -307,12 +310,6 @@ module Bundler
307
310
  Bundler.root
308
311
  end
309
312
 
310
- # @private
311
- # Returns true
312
- def bundler_plugin_api_source?
313
- true
314
- end
315
-
316
313
  # @private
317
314
  # This API on source might not be stable, and for now we expect plugins
318
315
  # to download all specs in `#specs`, so we implement the method for
@@ -56,6 +56,30 @@ module Bundler
56
56
  # Includes an Array of Bundler::Dependency objects
57
57
  # GEM_AFTER_INSTALL_ALL = "after-install-all"
58
58
  define :GEM_AFTER_INSTALL_ALL, "after-install-all"
59
+
60
+ # @!parse
61
+ # A hook called before each individual gem is required
62
+ # Includes a Bundler::Dependency.
63
+ # GEM_BEFORE_REQUIRE = "before-require"
64
+ define :GEM_BEFORE_REQUIRE, "before-require"
65
+
66
+ # @!parse
67
+ # A hook called after each individual gem is required
68
+ # Includes a Bundler::Dependency.
69
+ # GEM_AFTER_REQUIRE = "after-require"
70
+ define :GEM_AFTER_REQUIRE, "after-require"
71
+
72
+ # @!parse
73
+ # A hook called before any gems require
74
+ # Includes an Array of Bundler::Dependency objects.
75
+ # GEM_BEFORE_REQUIRE_ALL = "before-require-all"
76
+ define :GEM_BEFORE_REQUIRE_ALL, "before-require-all"
77
+
78
+ # @!parse
79
+ # A hook called after all gems required
80
+ # Includes an Array of Bundler::Dependency objects.
81
+ # GEM_AFTER_REQUIRE_ALL = "after-require-all"
82
+ define :GEM_AFTER_REQUIRE_ALL, "after-require-all"
59
83
  end
60
84
  end
61
85
  end
@@ -136,6 +136,14 @@ module Bundler
136
136
  @hooks[event] || []
137
137
  end
138
138
 
139
+ # This plugin is installed inside the .bundle/plugin directory,
140
+ # and thus is managed solely by Bundler
141
+ def installed_in_plugin_root?(name)
142
+ return false unless (path = installed?(name))
143
+
144
+ path.start_with?("#{Plugin.root}/")
145
+ end
146
+
139
147
  private
140
148
 
141
149
  # Reads the index file from the directory and initializes the instance
@@ -146,7 +154,7 @@ module Bundler
146
154
  # @param [Boolean] is the index file global index
147
155
  def load_index(index_file, global = false)
148
156
  SharedHelpers.filesystem_access(index_file, :read) do |index_f|
149
- valid_file = index_f && index_f.exist? && !index_f.size.zero?
157
+ valid_file = index_f&.exist? && !index_f.size.zero?
150
158
  break unless valid_file
151
159
 
152
160
  data = index_f.read
@@ -167,11 +175,11 @@ module Bundler
167
175
  # to be only String key value pairs)
168
176
  def save_index
169
177
  index = {
170
- "commands" => @commands,
171
- "hooks" => @hooks,
172
- "load_paths" => @load_paths,
178
+ "commands" => @commands,
179
+ "hooks" => @hooks,
180
+ "load_paths" => @load_paths,
173
181
  "plugin_paths" => @plugin_paths,
174
- "sources" => @sources,
182
+ "sources" => @sources,
175
183
  }
176
184
 
177
185
  require_relative "../yaml_serializer"
@@ -20,10 +20,6 @@ module Bundler
20
20
  end
21
21
  end
22
22
 
23
- def version_message(spec)
24
- "#{spec.name} #{spec.version}"
25
- end
26
-
27
23
  def root
28
24
  Plugin.root
29
25
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module Plugin
5
+ class Installer
6
+ class Path < Bundler::Source::Path
7
+ def root
8
+ SharedHelpers.in_bundle? ? Bundler.root : Plugin.root
9
+ end
10
+
11
+ def generate_bin(spec, disable_extensions = false)
12
+ # Need to find a way without code duplication
13
+ # For now, we can ignore this
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -4,16 +4,8 @@ module Bundler
4
4
  module Plugin
5
5
  class Installer
6
6
  class Rubygems < Bundler::Source::Rubygems
7
- def version_message(spec)
8
- "#{spec.name} #{spec.version}"
9
- end
10
-
11
7
  private
12
8
 
13
- def requires_sudo?
14
- false # Will change on implementation of project level plugins
15
- end
16
-
17
9
  def rubygems_dir
18
10
  Plugin.root
19
11
  end
@@ -10,6 +10,7 @@ module Bundler
10
10
  class Installer
11
11
  autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
12
12
  autoload :Git, File.expand_path("installer/git", __dir__)
13
+ autoload :Path, File.expand_path("installer/path", __dir__)
13
14
 
14
15
  def install(names, options)
15
16
  check_sources_consistency!(options)
@@ -18,10 +19,10 @@ module Bundler
18
19
 
19
20
  if options[:git]
20
21
  install_git(names, version, options)
21
- elsif options[:local_git]
22
- install_local_git(names, version, options)
22
+ elsif options[:path]
23
+ install_path(names, version, options[:path])
23
24
  else
24
- sources = options[:source] || Bundler.rubygems.sources
25
+ sources = options[:source] || Gem.sources
25
26
  install_rubygems(names, version, sources)
26
27
  end
27
28
  end
@@ -33,7 +34,7 @@ module Bundler
33
34
  # @return [Hash] map of names to their specs they are installed with
34
35
  def install_definition(definition)
35
36
  def definition.lock(*); end
36
- definition.resolve_remotely!
37
+ definition.remotely!
37
38
  specs = definition.specs
38
39
 
39
40
  install_from_specs specs
@@ -45,20 +46,40 @@ module Bundler
45
46
  if options.key?(:git) && options.key?(:local_git)
46
47
  raise InvalidOption, "Remote and local plugin git sources can't be both specified"
47
48
  end
49
+
50
+ # back-compat; local_git is an alias for git
51
+ if options.key?(:local_git)
52
+ Bundler::SharedHelpers.major_deprecation(2, "--local_git is deprecated, use --git")
53
+ options[:git] = options.delete(:local_git)
54
+ end
55
+
56
+ if (options.keys & [:source, :git, :path]).length > 1
57
+ raise InvalidOption, "Only one of --source, --git, or --path may be specified"
58
+ end
59
+
60
+ if (options.key?(:branch) || options.key?(:ref)) && !options.key?(:git)
61
+ raise InvalidOption, "--#{options.key?(:branch) ? "branch" : "ref"} can only be used with git sources"
62
+ end
63
+
64
+ if options.key?(:branch) && options.key?(:ref)
65
+ raise InvalidOption, "--branch and --ref can't be both specified"
66
+ end
48
67
  end
49
68
 
50
69
  def install_git(names, version, options)
51
- uri = options.delete(:git)
52
- options["uri"] = uri
70
+ source_list = SourceList.new
71
+ source = source_list.add_git_source({ "uri" => options[:git],
72
+ "branch" => options[:branch],
73
+ "ref" => options[:ref] })
53
74
 
54
- install_all_sources(names, version, options, options[:source])
75
+ install_all_sources(names, version, source_list, source)
55
76
  end
56
77
 
57
- def install_local_git(names, version, options)
58
- uri = options.delete(:local_git)
59
- options["uri"] = uri
78
+ def install_path(names, version, path)
79
+ source_list = SourceList.new
80
+ source = source_list.add_path_source({ "path" => path, "root_path" => SharedHelpers.pwd })
60
81
 
61
- install_all_sources(names, version, options, options[:source])
82
+ install_all_sources(names, version, source_list, source)
62
83
  end
63
84
 
64
85
  # Installs the plugin from rubygems source and returns the path where the
@@ -70,21 +91,23 @@ module Bundler
70
91
  #
71
92
  # @return [Hash] map of names to the specs of plugins installed
72
93
  def install_rubygems(names, version, sources)
73
- install_all_sources(names, version, nil, sources)
74
- end
75
-
76
- def install_all_sources(names, version, git_source_options, rubygems_source)
77
94
  source_list = SourceList.new
78
95
 
79
- source_list.add_git_source(git_source_options) if git_source_options
80
- Array(rubygems_source).each {|remote| source_list.add_global_rubygems_remote(remote) } if rubygems_source
96
+ Array(sources).each {|remote| source_list.add_global_rubygems_remote(remote) }
81
97
 
82
- deps = names.map {|name| Dependency.new name, version }
98
+ install_all_sources(names, version, source_list)
99
+ end
100
+
101
+ def install_all_sources(names, version, source_list, source = nil)
102
+ deps = names.map {|name| Dependency.new(name, version, { "source" => source }) }
83
103
 
84
104
  Bundler.configure_gem_home_and_path(Plugin.root)
85
105
 
86
- definition = Definition.new(nil, deps, source_list, true)
87
- install_definition(definition)
106
+ Bundler.settings.temporary(deployment: false, frozen: false) do
107
+ definition = Definition.new(nil, deps, source_list, true)
108
+
109
+ install_definition(definition)
110
+ end
88
111
  end
89
112
 
90
113
  # Installs the plugins and deps from the provided specs and returns map of
@@ -9,6 +9,10 @@ module Bundler
9
9
  add_source_to_list Plugin::Installer::Git.new(options), git_sources
10
10
  end
11
11
 
12
+ def add_path_source(options = {})
13
+ add_source_to_list Plugin::Installer::Path.new(options), path_sources
14
+ end
15
+
12
16
  def add_rubygems_source(options = {})
13
17
  add_source_to_list Plugin::Installer::Rubygems.new(options), @rubygems_sources
14
18
  end
@@ -17,10 +21,6 @@ module Bundler
17
21
  path_sources + git_sources + rubygems_sources + [metadata_source]
18
22
  end
19
23
 
20
- def default_source
21
- git_sources.first || global_rubygems_source
22
- end
23
-
24
24
  private
25
25
 
26
26
  def rubygems_aggregate_class
@@ -15,7 +15,7 @@ module Bundler
15
15
  class UnknownSourceError < PluginError; end
16
16
  class PluginInstallError < PluginError; end
17
17
 
18
- PLUGIN_FILE_NAME = "plugins.rb".freeze
18
+ PLUGIN_FILE_NAME = "plugins.rb"
19
19
 
20
20
  module_function
21
21
 
@@ -36,6 +36,8 @@ module Bundler
36
36
  # @param [Hash] options various parameters as described in description.
37
37
  # Refer to cli/plugin for available options
38
38
  def install(names, options)
39
+ raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]
40
+
39
41
  specs = Installer.new.install(names, options)
40
42
 
41
43
  save_plugins names, specs
@@ -60,7 +62,8 @@ module Bundler
60
62
  if names.any?
61
63
  names.each do |name|
62
64
  if index.installed?(name)
63
- Bundler.rm_rf(index.plugin_path(name))
65
+ path = index.plugin_path(name).to_s
66
+ Bundler.rm_rf(path) if index.installed_in_plugin_root?(name)
64
67
  index.unregister_plugin(name)
65
68
  Bundler.ui.info "Uninstalled plugin #{name}"
66
69
  else
@@ -98,7 +101,7 @@ module Bundler
98
101
  # @param [Pathname] gemfile path
99
102
  # @param [Proc] block that can be evaluated for (inline) Gemfile
100
103
  def gemfile_install(gemfile = nil, &inline)
101
- Bundler.settings.temporary(:frozen => false, :deployment => false) do
104
+ Bundler.settings.temporary(frozen: false, deployment: false) do
102
105
  builder = DSL.new
103
106
  if block_given?
104
107
  builder.instance_eval(&inline)
@@ -195,7 +198,7 @@ module Bundler
195
198
  # @param [Hash] The options that are present in the lock file
196
199
  # @return [API::Source] the instance of the class that handles the source
197
200
  # type passed in locked_opts
198
- def source_from_lock(locked_opts)
201
+ def from_lock(locked_opts)
199
202
  src = source(locked_opts["type"])
200
203
 
201
204
  src.new(locked_opts.merge("uri" => locked_opts["remote"]))
@@ -225,7 +228,7 @@ module Bundler
225
228
  plugins = index.hook_plugins(event)
226
229
  return unless plugins.any?
227
230
 
228
- (plugins - @loaded_plugin_names).each {|name| load_plugin(name) }
231
+ plugins.each {|name| load_plugin(name) }
229
232
 
230
233
  @hooks_by_event[event].each {|blk| blk.call(*args, &arg_blk) }
231
234
  end
@@ -237,6 +240,11 @@ module Bundler
237
240
  Index.new.installed?(plugin)
238
241
  end
239
242
 
243
+ # @return [true, false] whether the plugin is loaded
244
+ def loaded?(plugin)
245
+ @loaded_plugin_names.include?(plugin)
246
+ end
247
+
240
248
  # Post installation processing and registering with index
241
249
  #
242
250
  # @param [Array<String>] plugins list to be installed
@@ -299,7 +307,7 @@ module Bundler
299
307
  @hooks_by_event = Hash.new {|h, k| h[k] = [] }
300
308
 
301
309
  load_paths = spec.load_paths
302
- Bundler.rubygems.add_to_load_path(load_paths)
310
+ Gem.add_to_load_path(*load_paths)
303
311
  path = Pathname.new spec.full_gem_path
304
312
 
305
313
  begin
@@ -327,13 +335,33 @@ module Bundler
327
335
  # @param [String] name of the plugin
328
336
  def load_plugin(name)
329
337
  return unless name && !name.empty?
338
+ return if loaded?(name)
330
339
 
331
340
  # Need to ensure before this that plugin root where the rest of gems
332
341
  # are installed to be on load path to support plugin deps. Currently not
333
342
  # done to avoid conflicts
334
343
  path = index.plugin_path(name)
335
344
 
336
- Bundler.rubygems.add_to_load_path(index.load_paths(name))
345
+ paths = index.load_paths(name)
346
+ invalid_paths = paths.reject {|p| File.directory?(p) }
347
+
348
+ if invalid_paths.any?
349
+ Bundler.ui.warn <<~MESSAGE
350
+ The following plugin paths don't exist: #{invalid_paths.join(", ")}.
351
+
352
+ This can happen if the plugin was installed with a different version of Ruby that has since been uninstalled.
353
+
354
+ If you would like to reinstall the plugin, run:
355
+
356
+ bundler plugin uninstall #{name} && bundler plugin install #{name}
357
+
358
+ Continuing without installing plugin #{name}.
359
+ MESSAGE
360
+
361
+ return
362
+ end
363
+
364
+ Gem.add_to_load_path(*paths)
337
365
 
338
366
  load path.join(PLUGIN_FILE_NAME)
339
367
 
@@ -2,23 +2,19 @@
2
2
 
3
3
  module Bundler
4
4
  class ProcessLock
5
- def self.lock(bundle_path = Bundler.bundle_path)
5
+ def self.lock(bundle_path = Bundler.bundle_path, &block)
6
6
  lock_file_path = File.join(bundle_path, "bundler.lock")
7
- has_lock = false
7
+ base_lock_file_path = lock_file_path.delete_suffix(".lock")
8
8
 
9
- File.open(lock_file_path, "w") do |f|
10
- f.flock(File::LOCK_EX)
11
- has_lock = true
12
- yield
13
- f.flock(File::LOCK_UN)
9
+ require "fileutils" if Bundler.rubygems.provides?("< 3.6.0")
10
+
11
+ begin
12
+ SharedHelpers.filesystem_access(lock_file_path, :write) do
13
+ Gem.open_file_with_lock(base_lock_file_path, &block)
14
+ end
15
+ rescue PermissionError
16
+ block.call
14
17
  end
15
- rescue Errno::EACCES, Errno::ENOLCK, *[SharedHelpers.const_get_safely(:ENOTSUP, Errno)].compact
16
- # In the case the user does not have access to
17
- # create the lock file or is using NFS where
18
- # locks are not available we skip locking.
19
- yield
20
- ensure
21
- FileUtils.rm_f(lock_file_path) if has_lock
22
18
  end
23
19
  end
24
20
  end
@@ -6,19 +6,26 @@ module Bundler
6
6
  # be seeded with what we're given from the source's abbreviated index - the
7
7
  # full specification will only be fetched when necessary.
8
8
  class RemoteSpecification
9
+ include MatchRemoteMetadata
9
10
  include MatchPlatform
10
11
  include Comparable
11
12
 
12
13
  attr_reader :name, :version, :platform
13
14
  attr_writer :dependencies
14
- attr_accessor :source, :remote
15
+ attr_accessor :source, :remote, :locked_platform
15
16
 
16
17
  def initialize(name, version, platform, spec_fetcher)
17
18
  @name = name
18
19
  @version = Gem::Version.create version
19
- @platform = platform
20
+ @original_platform = platform || Gem::Platform::RUBY
21
+ @platform = Gem::Platform.new(platform)
20
22
  @spec_fetcher = spec_fetcher
21
23
  @dependencies = nil
24
+ @locked_platform = nil
25
+ end
26
+
27
+ def insecurely_materialized?
28
+ @locked_platform.to_s != @platform.to_s
22
29
  end
23
30
 
24
31
  # Needed before installs, since the arch matters then and quick
@@ -28,10 +35,10 @@ module Bundler
28
35
  end
29
36
 
30
37
  def full_name
31
- if platform == Gem::Platform::RUBY || platform.nil?
38
+ @full_name ||= if @platform == Gem::Platform::RUBY
32
39
  "#{@name}-#{@version}"
33
40
  else
34
- "#{@name}-#{@version}-#{platform}"
41
+ "#{@name}-#{@version}-#{@platform}"
35
42
  end
36
43
  end
37
44
 
@@ -86,6 +93,10 @@ module Bundler
86
93
  end
87
94
  end
88
95
 
96
+ def runtime_dependencies
97
+ dependencies.select(&:runtime?)
98
+ end
99
+
89
100
  def git_version
90
101
  return unless loaded_from && source.is_a?(Bundler::Source::Git)
91
102
  " #{source.revision[0..6]}"
@@ -98,9 +109,9 @@ module Bundler
98
109
  end
99
110
 
100
111
  def _remote_specification
101
- @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
112
+ @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @original_platform])
102
113
  @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
103
- " missing from the server! Try installing with `--full-index` as a workaround.")
114
+ " missing from the server!")
104
115
  end
105
116
 
106
117
  def method_missing(method, *args, &blk)
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "package"
4
+
5
+ module Bundler
6
+ class Resolver
7
+ class Base
8
+ attr_reader :packages, :requirements, :source_requirements
9
+
10
+ def initialize(source_requirements, dependencies, base, platforms, options)
11
+ @source_requirements = source_requirements
12
+
13
+ @base = base
14
+
15
+ @packages = Hash.new do |hash, name|
16
+ hash[name] = Package.new(name, platforms, **options)
17
+ end
18
+
19
+ @requirements = dependencies.filter_map do |dep|
20
+ dep_platforms = dep.gem_platforms(platforms)
21
+
22
+ # Dependencies scoped to external platforms are ignored
23
+ next if dep_platforms.empty?
24
+
25
+ name = dep.name
26
+
27
+ @packages[name] = Package.new(name, dep_platforms, **options.merge(dependency: dep))
28
+
29
+ dep
30
+ end
31
+ end
32
+
33
+ def [](name)
34
+ @base[name]
35
+ end
36
+
37
+ def delete(specs)
38
+ @base.delete(specs)
39
+ end
40
+
41
+ def get_package(name)
42
+ @packages[name]
43
+ end
44
+
45
+ def base_requirements
46
+ @base_requirements ||= build_base_requirements
47
+ end
48
+
49
+ def unlock_names(names)
50
+ indirect_pins = indirect_pins(names)
51
+
52
+ if indirect_pins.any?
53
+ loosen_names(indirect_pins)
54
+ else
55
+ pins = pins(names)
56
+
57
+ if pins.any?
58
+ loosen_names(pins)
59
+ else
60
+ unrestrict_names(names)
61
+ end
62
+ end
63
+ end
64
+
65
+ def include_prereleases(names)
66
+ names.each do |name|
67
+ get_package(name).consider_prereleases!
68
+ end
69
+ end
70
+
71
+ def include_remote_specs(names)
72
+ names.each do |name|
73
+ get_package(name).consider_remote_versions!
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def indirect_pins(names)
80
+ names.select {|name| @base_requirements[name].exact? && @requirements.none? {|dep| dep.name == name } }
81
+ end
82
+
83
+ def pins(names)
84
+ names.select {|name| @base_requirements[name].exact? }
85
+ end
86
+
87
+ def loosen_names(names)
88
+ names.each do |name|
89
+ version = @base_requirements[name].requirements.first[1]
90
+
91
+ @base_requirements[name] = Gem::Requirement.new(">= #{version}")
92
+
93
+ @base.delete_by_name(name)
94
+ end
95
+ end
96
+
97
+ def unrestrict_names(names)
98
+ names.each do |name|
99
+ @base_requirements.delete(name)
100
+ end
101
+ end
102
+
103
+ def build_base_requirements
104
+ base_requirements = {}
105
+ @base.each do |ls|
106
+ if ls.source_changed? && ls.source.specs.search(ls.name).empty?
107
+ raise GemNotFound, "Could not find gem '#{ls.name}' in #{ls.source}"
108
+ end
109
+
110
+ req = Gem::Requirement.new(ls.version)
111
+ base_requirements[ls.name] = req
112
+ end
113
+ base_requirements
114
+ end
115
+ end
116
+ end
117
+ end