bundler 1.17.3 → 2.4.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2786 -1256
  3. data/LICENSE.md +18 -19
  4. data/README.md +10 -14
  5. data/bundler.gemspec +13 -33
  6. data/exe/bundle +15 -8
  7. data/exe/bundler +1 -1
  8. data/lib/bundler/.document +1 -0
  9. data/lib/bundler/build_metadata.rb +4 -12
  10. data/lib/bundler/capistrano.rb +4 -4
  11. data/lib/bundler/cli/add.rb +28 -16
  12. data/lib/bundler/cli/binstubs.rb +12 -4
  13. data/lib/bundler/cli/cache.rb +24 -17
  14. data/lib/bundler/cli/check.rb +5 -3
  15. data/lib/bundler/cli/clean.rb +1 -1
  16. data/lib/bundler/cli/common.rb +41 -13
  17. data/lib/bundler/cli/config.rb +170 -86
  18. data/lib/bundler/cli/console.rb +3 -3
  19. data/lib/bundler/cli/doctor.rb +27 -10
  20. data/lib/bundler/cli/exec.rb +8 -25
  21. data/lib/bundler/cli/fund.rb +36 -0
  22. data/lib/bundler/cli/gem.rb +261 -48
  23. data/lib/bundler/cli/info.rb +53 -9
  24. data/lib/bundler/cli/init.rb +7 -3
  25. data/lib/bundler/cli/inject.rb +1 -1
  26. data/lib/bundler/cli/install.rb +39 -67
  27. data/lib/bundler/cli/issue.rb +8 -7
  28. data/lib/bundler/cli/list.rb +19 -11
  29. data/lib/bundler/cli/lock.rb +11 -4
  30. data/lib/bundler/cli/open.rb +14 -9
  31. data/lib/bundler/cli/outdated.rb +153 -122
  32. data/lib/bundler/cli/platform.rb +8 -6
  33. data/lib/bundler/cli/plugin.rb +19 -2
  34. data/lib/bundler/cli/pristine.rb +6 -1
  35. data/lib/bundler/cli/remove.rb +1 -2
  36. data/lib/bundler/cli/show.rb +3 -3
  37. data/lib/bundler/cli/update.rb +49 -18
  38. data/lib/bundler/cli/viz.rb +1 -1
  39. data/lib/bundler/cli.rb +269 -165
  40. data/lib/bundler/compact_index_client/cache.rb +7 -24
  41. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  42. data/lib/bundler/compact_index_client/updater.rb +58 -57
  43. data/lib/bundler/compact_index_client.rb +28 -18
  44. data/lib/bundler/constants.rb +1 -1
  45. data/lib/bundler/current_ruby.rb +26 -11
  46. data/lib/bundler/definition.rb +432 -464
  47. data/lib/bundler/dependency.rb +29 -71
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/digest.rb +71 -0
  50. data/lib/bundler/dsl.rb +85 -117
  51. data/lib/bundler/endpoint_specification.rb +16 -14
  52. data/lib/bundler/env.rb +11 -16
  53. data/lib/bundler/environment_preserver.rb +32 -5
  54. data/lib/bundler/errors.rb +31 -14
  55. data/lib/bundler/feature_flag.rb +12 -33
  56. data/lib/bundler/fetcher/base.rb +7 -9
  57. data/lib/bundler/fetcher/compact_index.rb +47 -40
  58. data/lib/bundler/fetcher/dependency.rb +3 -7
  59. data/lib/bundler/fetcher/downloader.rb +17 -12
  60. data/lib/bundler/fetcher/index.rb +5 -32
  61. data/lib/bundler/fetcher.rb +51 -43
  62. data/lib/bundler/force_platform.rb +18 -0
  63. data/lib/bundler/friendly_errors.rb +49 -54
  64. data/lib/bundler/gem_helper.rb +81 -46
  65. data/lib/bundler/gem_helpers.rb +44 -28
  66. data/lib/bundler/gem_tasks.rb +1 -1
  67. data/lib/bundler/gem_version_promoter.rb +54 -99
  68. data/lib/bundler/graph.rb +5 -5
  69. data/lib/bundler/index.rb +16 -54
  70. data/lib/bundler/injector.rb +51 -17
  71. data/lib/bundler/inline.rb +28 -29
  72. data/lib/bundler/installer/gem_installer.rb +22 -23
  73. data/lib/bundler/installer/parallel_installer.rb +39 -52
  74. data/lib/bundler/installer/standalone.rb +62 -12
  75. data/lib/bundler/installer.rb +47 -98
  76. data/lib/bundler/lazy_specification.rb +88 -52
  77. data/lib/bundler/lockfile_generator.rb +4 -4
  78. data/lib/bundler/lockfile_parser.rb +41 -72
  79. data/{man → lib/bundler/man}/bundle-add.1 +29 -5
  80. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +22 -4
  81. data/{man → lib/bundler/man}/bundle-binstubs.1 +6 -4
  82. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +3 -5
  83. data/lib/bundler/man/bundle-cache.1 +61 -0
  84. data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +24 -17
  85. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  86. data/{man → lib/bundler/man}/bundle-clean.1 +2 -2
  87. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +1 -1
  88. data/{man → lib/bundler/man}/bundle-config.1 +78 -63
  89. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +96 -88
  90. data/lib/bundler/man/bundle-console.1 +53 -0
  91. data/lib/bundler/man/bundle-console.1.ronn +44 -0
  92. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  93. data/{man → lib/bundler/man}/bundle-exec.1 +6 -6
  94. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +6 -6
  95. data/lib/bundler/man/bundle-gem.1 +105 -0
  96. data/lib/bundler/man/bundle-gem.1.ronn +117 -0
  97. data/lib/bundler/man/bundle-help.1 +13 -0
  98. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  99. data/{man → lib/bundler/man}/bundle-info.1 +3 -3
  100. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +3 -3
  101. data/{man → lib/bundler/man}/bundle-init.1 +6 -2
  102. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +3 -1
  103. data/{man → lib/bundler/man}/bundle-inject.1 +5 -2
  104. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +3 -1
  105. data/{man → lib/bundler/man}/bundle-install.1 +42 -37
  106. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +42 -38
  107. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  108. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  109. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  110. data/{man → lib/bundler/man}/bundle-open.1 +22 -2
  111. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +9 -1
  112. data/{man → lib/bundler/man}/bundle-outdated.1 +15 -18
  113. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +13 -19
  114. data/{man → lib/bundler/man}/bundle-platform.1 +16 -6
  115. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +14 -7
  116. data/lib/bundler/man/bundle-plugin.1 +81 -0
  117. data/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  118. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  119. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  120. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  121. data/{man → lib/bundler/man}/bundle-update.1 +8 -8
  122. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +8 -7
  123. data/lib/bundler/man/bundle-version.1 +35 -0
  124. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  125. data/{man → lib/bundler/man}/bundle-viz.1 +4 -1
  126. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +2 -0
  127. data/{man → lib/bundler/man}/bundle.1 +17 -12
  128. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +14 -9
  129. data/{man → lib/bundler/man}/gemfile.5 +139 -92
  130. data/{man → lib/bundler/man}/gemfile.5.ronn +118 -96
  131. data/{man → lib/bundler/man}/index.txt +5 -1
  132. data/lib/bundler/match_metadata.rb +13 -0
  133. data/lib/bundler/match_platform.rb +1 -2
  134. data/lib/bundler/match_remote_metadata.rb +29 -0
  135. data/lib/bundler/mirror.rb +10 -12
  136. data/lib/bundler/plugin/api/source.rb +29 -15
  137. data/lib/bundler/plugin/api.rb +1 -1
  138. data/lib/bundler/plugin/dsl.rb +1 -1
  139. data/lib/bundler/plugin/index.rb +32 -9
  140. data/lib/bundler/plugin/installer/git.rb +0 -4
  141. data/lib/bundler/plugin/installer/rubygems.rb +1 -9
  142. data/lib/bundler/plugin/installer.rb +40 -24
  143. data/lib/bundler/plugin/source_list.rb +5 -1
  144. data/lib/bundler/plugin.rb +103 -43
  145. data/lib/bundler/process_lock.rb +1 -1
  146. data/lib/bundler/remote_specification.rb +12 -9
  147. data/lib/bundler/resolver/base.rb +107 -0
  148. data/lib/bundler/resolver/candidate.rb +94 -0
  149. data/lib/bundler/resolver/incompatibility.rb +15 -0
  150. data/lib/bundler/resolver/package.rb +72 -0
  151. data/lib/bundler/resolver/root.rb +25 -0
  152. data/lib/bundler/resolver/spec_group.rb +49 -73
  153. data/lib/bundler/resolver.rb +355 -301
  154. data/lib/bundler/retry.rb +4 -4
  155. data/lib/bundler/ruby_dsl.rb +7 -1
  156. data/lib/bundler/ruby_version.rb +12 -40
  157. data/lib/bundler/rubygems_ext.rb +237 -92
  158. data/lib/bundler/rubygems_gem_installer.rb +87 -21
  159. data/lib/bundler/rubygems_integration.rb +180 -516
  160. data/lib/bundler/runtime.rb +26 -41
  161. data/lib/bundler/safe_marshal.rb +31 -0
  162. data/lib/bundler/self_manager.rb +168 -0
  163. data/lib/bundler/settings.rb +164 -120
  164. data/lib/bundler/setup.rb +14 -12
  165. data/lib/bundler/shared_helpers.rb +62 -103
  166. data/lib/bundler/similarity_detector.rb +3 -3
  167. data/lib/bundler/source/git/git_proxy.rb +292 -128
  168. data/lib/bundler/source/git.rb +114 -64
  169. data/lib/bundler/source/metadata.rb +9 -9
  170. data/lib/bundler/source/path/installer.rb +11 -32
  171. data/lib/bundler/source/path.rb +29 -18
  172. data/lib/bundler/source/rubygems/remote.rb +3 -4
  173. data/lib/bundler/source/rubygems.rb +181 -208
  174. data/lib/bundler/source/rubygems_aggregate.rb +68 -0
  175. data/lib/bundler/source.rb +31 -11
  176. data/lib/bundler/source_list.rb +108 -67
  177. data/lib/bundler/source_map.rb +71 -0
  178. data/lib/bundler/spec_set.rb +96 -72
  179. data/lib/bundler/stub_specification.rb +45 -37
  180. data/lib/bundler/templates/Executable +3 -5
  181. data/lib/bundler/templates/Executable.bundler +22 -18
  182. data/lib/bundler/templates/Executable.standalone +4 -4
  183. data/lib/bundler/templates/Gemfile +0 -2
  184. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  185. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  186. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  187. data/lib/bundler/templates/newgem/Gemfile.tt +22 -2
  188. data/lib/bundler/templates/newgem/README.md.tt +13 -15
  189. data/lib/bundler/templates/newgem/Rakefile.tt +43 -5
  190. data/lib/bundler/templates/newgem/bin/console.tt +1 -4
  191. data/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
  192. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  193. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  194. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  195. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  196. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  197. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
  198. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  199. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
  200. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  201. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  202. data/lib/bundler/templates/newgem/newgem.gemspec.tt +37 -41
  203. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  204. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  205. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  206. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  207. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  208. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  209. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/test_newgem.rb.tt} +3 -1
  210. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  211. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  212. data/lib/bundler/ui/rg_proxy.rb +2 -2
  213. data/lib/bundler/ui/shell.rb +39 -20
  214. data/lib/bundler/ui/silent.rb +21 -5
  215. data/lib/bundler/ui.rb +3 -3
  216. data/lib/bundler/uri_credentials_filter.rb +10 -4
  217. data/lib/bundler/uri_normalizer.rb +23 -0
  218. data/lib/bundler/vendor/.document +1 -0
  219. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  220. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  221. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  222. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  223. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +128 -0
  224. data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  225. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1493 -425
  226. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  227. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  228. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  229. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  230. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +302 -462
  231. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  232. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  233. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  234. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  235. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  236. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  237. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  238. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  239. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  240. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  241. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  242. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  243. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  244. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  245. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  246. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  247. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  248. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  249. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  250. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +3 -2
  251. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
  252. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +25 -14
  253. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +20 -10
  254. data/lib/bundler/vendor/thor/lib/thor/actions.rb +34 -15
  255. data/lib/bundler/vendor/thor/lib/thor/base.rb +63 -43
  256. data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
  257. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  258. data/lib/bundler/vendor/thor/lib/thor/error.rb +83 -0
  259. data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
  260. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
  261. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
  262. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  263. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  264. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  265. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +7 -3
  266. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +20 -7
  267. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +40 -6
  268. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  269. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  270. data/lib/bundler/vendor/thor/lib/thor/runner.rb +15 -14
  271. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +88 -13
  272. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +10 -2
  273. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -3
  274. data/lib/bundler/vendor/thor/lib/thor/shell.rb +5 -5
  275. data/lib/bundler/vendor/thor/lib/thor/util.rb +18 -2
  276. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  277. data/lib/bundler/vendor/thor/lib/thor.rb +16 -9
  278. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  279. data/lib/bundler/vendor/tsort/lib/tsort.rb +452 -0
  280. data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  281. data/lib/bundler/vendor/uri/lib/uri/common.rb +729 -0
  282. data/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  283. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  284. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1587 -0
  285. data/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
  286. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  287. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  288. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  289. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  290. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  291. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +119 -0
  292. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  293. data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  294. data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  295. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  296. data/lib/bundler/vendored_fileutils.rb +1 -6
  297. data/lib/bundler/vendored_persistent.rb +2 -39
  298. data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
  299. data/lib/bundler/vendored_thor.rb +2 -2
  300. data/lib/bundler/vendored_tsort.rb +4 -0
  301. data/lib/bundler/vendored_uri.rb +4 -0
  302. data/lib/bundler/version.rb +5 -20
  303. data/lib/bundler/vlad.rb +2 -2
  304. data/lib/bundler/worker.rb +26 -15
  305. data/lib/bundler/yaml_serializer.rb +3 -4
  306. data/lib/bundler.rb +285 -190
  307. metadata +157 -218
  308. data/exe/bundle_ruby +0 -60
  309. data/lib/bundler/cli/package.rb +0 -49
  310. data/lib/bundler/compatibility_guard.rb +0 -14
  311. data/lib/bundler/dep_proxy.rb +0 -48
  312. data/lib/bundler/gem_remote_fetcher.rb +0 -43
  313. data/lib/bundler/gemdeps.rb +0 -29
  314. data/lib/bundler/psyched_yaml.rb +0 -37
  315. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  316. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  317. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  318. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  319. data/lib/bundler/templates/gems.rb +0 -8
  320. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -3
  321. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  322. data/lib/bundler/templates/newgem/travis.yml.tt +0 -7
  323. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  324. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  325. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -81
  326. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  327. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  328. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  329. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  330. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  331. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  332. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  333. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  334. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -136
  335. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -223
  336. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
  337. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  338. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -101
  339. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  340. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -837
  341. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  342. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  343. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -12
  344. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  345. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
  346. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
  347. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
  348. data/lib/bundler/version_ranges.rb +0 -76
  349. data/man/bundle-add.1.txt +0 -52
  350. data/man/bundle-binstubs.1.txt +0 -48
  351. data/man/bundle-check.1.txt +0 -33
  352. data/man/bundle-clean.1.txt +0 -26
  353. data/man/bundle-config.1.txt +0 -529
  354. data/man/bundle-doctor.1.txt +0 -44
  355. data/man/bundle-exec.1.txt +0 -178
  356. data/man/bundle-gem.1 +0 -80
  357. data/man/bundle-gem.1.txt +0 -91
  358. data/man/bundle-gem.ronn +0 -78
  359. data/man/bundle-info.1.txt +0 -21
  360. data/man/bundle-init.1.txt +0 -34
  361. data/man/bundle-inject.1.txt +0 -32
  362. data/man/bundle-install.1.txt +0 -396
  363. data/man/bundle-list.1.txt +0 -43
  364. data/man/bundle-lock.1.txt +0 -93
  365. data/man/bundle-open.1.txt +0 -29
  366. data/man/bundle-outdated.1.txt +0 -131
  367. data/man/bundle-package.1 +0 -55
  368. data/man/bundle-package.1.txt +0 -79
  369. data/man/bundle-platform.1.txt +0 -57
  370. data/man/bundle-pristine.1.txt +0 -44
  371. data/man/bundle-remove.1.txt +0 -34
  372. data/man/bundle-show.1.txt +0 -27
  373. data/man/bundle-update.1.txt +0 -391
  374. data/man/bundle-viz.1.txt +0 -39
  375. data/man/bundle.1.txt +0 -116
  376. data/man/gemfile.5.txt +0 -653
  377. /data/lib/bundler/{ssl_certs → man}/.document +0 -0
  378. /data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  379. /data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  380. /data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  381. /data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  382. /data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  383. /data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
@@ -2,11 +2,12 @@
2
2
 
3
3
  module Bundler
4
4
  class Source
5
- autoload :Gemspec, "bundler/source/gemspec"
6
- autoload :Git, "bundler/source/git"
7
- autoload :Metadata, "bundler/source/metadata"
8
- autoload :Path, "bundler/source/path"
9
- autoload :Rubygems, "bundler/source/rubygems"
5
+ autoload :Gemspec, File.expand_path("source/gemspec", __dir__)
6
+ autoload :Git, File.expand_path("source/git", __dir__)
7
+ autoload :Metadata, File.expand_path("source/metadata", __dir__)
8
+ autoload :Path, File.expand_path("source/path", __dir__)
9
+ autoload :Rubygems, File.expand_path("source/rubygems", __dir__)
10
+ autoload :RubygemsAggregate, File.expand_path("source/rubygems_aggregate", __dir__)
10
11
 
11
12
  attr_accessor :dependency_names
12
13
 
@@ -14,13 +15,12 @@ module Bundler
14
15
  specs.unmet_dependency_names
15
16
  end
16
17
 
17
- def version_message(spec)
18
+ def version_message(spec, locked_spec = nil)
18
19
  message = "#{spec.name} #{spec.version}"
19
20
  message += " (#{spec.platform})" if spec.platform != Gem::Platform::RUBY && !spec.platform.nil?
20
21
 
21
- if Bundler.locked_gems
22
- locked_spec = Bundler.locked_gems.specs.find {|s| s.name == spec.name }
23
- locked_spec_version = locked_spec.version if locked_spec
22
+ if locked_spec
23
+ locked_spec_version = locked_spec.version
24
24
  if locked_spec_version && spec.version != locked_spec_version
25
25
  message += Bundler.ui.add_color(" (was #{locked_spec_version})", version_color(spec.version, locked_spec_version))
26
26
  end
@@ -33,6 +33,18 @@ module Bundler
33
33
  spec.source == self
34
34
  end
35
35
 
36
+ def local!; end
37
+
38
+ def local_only!; end
39
+
40
+ def cached!; end
41
+
42
+ def remote!; end
43
+
44
+ def add_dependency_names(names)
45
+ @dependency_names = Array(dependency_names) | Array(names)
46
+ end
47
+
36
48
  # it's possible that gems from one source depend on gems from some
37
49
  # other source, so now we download gemspecs and iterate over those
38
50
  # dependencies, looking for gems we don't have info on yet.
@@ -42,6 +54,10 @@ module Bundler
42
54
  specs.dependency_names
43
55
  end
44
56
 
57
+ def spec_names
58
+ specs.spec_names
59
+ end
60
+
45
61
  def include?(other)
46
62
  other == self
47
63
  end
@@ -50,6 +66,10 @@ module Bundler
50
66
  "#<#{self.class}:0x#{object_id} #{self}>"
51
67
  end
52
68
 
69
+ def identifier
70
+ to_s
71
+ end
72
+
53
73
  def path?
54
74
  instance_of?(Bundler::Source::Path)
55
75
  end
@@ -63,7 +83,7 @@ module Bundler
63
83
  )
64
84
  end
65
85
 
66
- private
86
+ private
67
87
 
68
88
  def version_color(spec_version, locked_spec_version)
69
89
  if Gem::Version.correct?(spec_version) && Gem::Version.correct?(locked_spec_version)
@@ -80,7 +100,7 @@ module Bundler
80
100
  end
81
101
 
82
102
  def print_using_message(message)
83
- if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages?
103
+ if !message.include?("(was ")
84
104
  Bundler.ui.debug message
85
105
  else
86
106
  Bundler.ui.info message
@@ -5,24 +5,49 @@ module Bundler
5
5
  attr_reader :path_sources,
6
6
  :git_sources,
7
7
  :plugin_sources,
8
- :global_rubygems_source,
8
+ :global_path_source,
9
9
  :metadata_source
10
10
 
11
+ def global_rubygems_source
12
+ @global_rubygems_source ||= rubygems_aggregate_class.new("allow_local" => true)
13
+ end
14
+
11
15
  def initialize
12
16
  @path_sources = []
13
17
  @git_sources = []
14
18
  @plugin_sources = []
15
19
  @global_rubygems_source = nil
16
- @rubygems_aggregate = rubygems_aggregate_class.new
20
+ @global_path_source = nil
17
21
  @rubygems_sources = []
18
22
  @metadata_source = Source::Metadata.new
23
+
24
+ @merged_gem_lockfile_sections = false
25
+ end
26
+
27
+ def merged_gem_lockfile_sections?
28
+ @merged_gem_lockfile_sections
29
+ end
30
+
31
+ def merged_gem_lockfile_sections!(replacement_source)
32
+ @merged_gem_lockfile_sections = true
33
+ @global_rubygems_source = replacement_source
34
+ end
35
+
36
+ def aggregate_global_source?
37
+ global_rubygems_source.multiple_remotes?
38
+ end
39
+
40
+ def implicit_global_source?
41
+ global_rubygems_source.no_remotes?
19
42
  end
20
43
 
21
44
  def add_path_source(options = {})
22
45
  if options["gemspec"]
23
46
  add_source_to_list Source::Gemspec.new(options), path_sources
24
47
  else
25
- add_source_to_list Source::Path.new(options), path_sources
48
+ path_source = add_source_to_list Source::Path.new(options), path_sources
49
+ @global_path_source ||= path_source if options["global"]
50
+ path_source
26
51
  end
27
52
  end
28
53
 
@@ -33,35 +58,31 @@ module Bundler
33
58
  end
34
59
 
35
60
  def add_rubygems_source(options = {})
36
- add_source_to_list Source::Rubygems.new(options), @rubygems_sources
61
+ new_source = Source::Rubygems.new(options)
62
+ return @global_rubygems_source if @global_rubygems_source == new_source
63
+
64
+ add_source_to_list new_source, @rubygems_sources
37
65
  end
38
66
 
39
67
  def add_plugin_source(source, options = {})
40
68
  add_source_to_list Plugin.source(source).new(options), @plugin_sources
41
69
  end
42
70
 
43
- def global_rubygems_source=(uri)
44
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
45
- @global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri)
46
- end
47
- add_rubygems_remote(uri)
48
- end
49
-
50
- def add_rubygems_remote(uri)
51
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
52
- return if Bundler.feature_flag.disable_multisource?
53
- raise InvalidOption, "`lockfile_uses_separate_rubygems_sources` cannot be set without `disable_multisource` being set"
54
- end
55
- @rubygems_aggregate.add_remote(uri)
56
- @rubygems_aggregate
71
+ def add_global_rubygems_remote(uri)
72
+ global_rubygems_source.add_remote(uri)
73
+ global_rubygems_source
57
74
  end
58
75
 
59
76
  def default_source
60
- global_rubygems_source || @rubygems_aggregate
77
+ global_path_source || global_rubygems_source
61
78
  end
62
79
 
63
80
  def rubygems_sources
64
- @rubygems_sources + [default_source]
81
+ non_global_rubygems_sources + [global_rubygems_source]
82
+ end
83
+
84
+ def non_global_rubygems_sources
85
+ @rubygems_sources
65
86
  end
66
87
 
67
88
  def rubygems_remotes
@@ -72,39 +93,51 @@ module Bundler
72
93
  path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
73
94
  end
74
95
 
96
+ def non_default_explicit_sources
97
+ all_sources - [default_source, metadata_source]
98
+ end
99
+
75
100
  def get(source)
76
- source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) }
101
+ source_list_for(source).find {|s| equivalent_source?(source, s) }
77
102
  end
78
103
 
79
104
  def lock_sources
80
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
81
- [[default_source], @rubygems_sources, git_sources, path_sources, plugin_sources].map do |sources|
82
- sources.sort_by(&:to_s)
83
- end.flatten(1)
105
+ lock_other_sources + lock_rubygems_sources
106
+ end
107
+
108
+ def lock_other_sources
109
+ (path_sources + git_sources + plugin_sources).sort_by(&:identifier)
110
+ end
111
+
112
+ def lock_rubygems_sources
113
+ if merged_gem_lockfile_sections?
114
+ [combine_rubygems_sources]
84
115
  else
85
- lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
86
- lock_sources << combine_rubygems_sources
116
+ rubygems_sources.sort_by(&:identifier)
87
117
  end
88
118
  end
89
119
 
90
120
  # Returns true if there are changes
91
121
  def replace_sources!(replacement_sources)
92
- return true if replacement_sources.empty?
122
+ return false if replacement_sources.empty?
93
123
 
94
- [path_sources, git_sources, plugin_sources].each do |source_list|
95
- source_list.map! do |source|
96
- replacement_sources.find {|s| s == source } || source
97
- end
98
- end
124
+ @rubygems_sources, @path_sources, @git_sources, @plugin_sources = map_sources(replacement_sources)
125
+ @global_rubygems_source = global_replacement_source(replacement_sources)
126
+
127
+ different_sources?(lock_sources, replacement_sources)
128
+ end
99
129
 
100
- replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? &&
101
- replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
102
- @rubygems_aggregate = replacement_rubygems if replacement_rubygems
130
+ # Returns true if there are changes
131
+ def expired_sources?(replacement_sources)
132
+ return false if replacement_sources.empty?
133
+
134
+ lock_sources = dup_with_replaced_sources(replacement_sources).lock_sources
103
135
 
104
- return true if !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources)
105
- return true if replacement_rubygems && rubygems_remotes.to_set != replacement_rubygems.remotes.to_set
136
+ different_sources?(lock_sources, replacement_sources)
137
+ end
106
138
 
107
- false
139
+ def local_only!
140
+ all_sources.each(&:local_only!)
108
141
  end
109
142
 
110
143
  def cached!
@@ -115,11 +148,39 @@ module Bundler
115
148
  all_sources.each(&:remote!)
116
149
  end
117
150
 
118
- def rubygems_primary_remotes
119
- @rubygems_aggregate.remotes
151
+ private
152
+
153
+ def dup_with_replaced_sources(replacement_sources)
154
+ new_source_list = dup
155
+ new_source_list.replace_sources!(replacement_sources)
156
+ new_source_list
120
157
  end
121
158
 
122
- private
159
+ def map_sources(replacement_sources)
160
+ rubygems, git, plugin = [@rubygems_sources, @git_sources, @plugin_sources].map do |sources|
161
+ sources.map do |source|
162
+ replacement_sources.find {|s| s == source } || source
163
+ end
164
+ end
165
+
166
+ path = @path_sources.map do |source|
167
+ replacement_sources.find {|s| s == (source.is_a?(Source::Gemspec) ? source.as_path_source : source) } || source
168
+ end
169
+
170
+ [rubygems, path, git, plugin]
171
+ end
172
+
173
+ def global_replacement_source(replacement_sources)
174
+ replacement_source = replacement_sources.find {|s| s == global_rubygems_source }
175
+ return global_rubygems_source unless replacement_source
176
+
177
+ replacement_source.local!
178
+ replacement_source
179
+ end
180
+
181
+ def different_sources?(lock_sources, replacement_sources)
182
+ !equivalent_sources?(lock_sources, replacement_sources)
183
+ end
123
184
 
124
185
  def rubygems_aggregate_class
125
186
  Source::Rubygems
@@ -147,40 +208,20 @@ module Bundler
147
208
  def warn_on_git_protocol(source)
148
209
  return if Bundler.settings["git.allow_insecure"]
149
210
 
150
- if source.uri =~ /^git\:/
211
+ if /^git\:/.match?(source.uri)
151
212
  Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
152
213
  "which transmits data without encryption. Disable this warning with " \
153
- "`bundle config git.allow_insecure true`, or switch to the `https` " \
214
+ "`bundle config set --local git.allow_insecure true`, or switch to the `https` " \
154
215
  "protocol to keep your data secure."
155
216
  end
156
217
  end
157
218
 
158
- def equal_sources?(lock_sources, replacement_sources)
159
- lock_sources.to_set == replacement_sources.to_set
160
- end
161
-
162
- def equal_source?(source, other_source)
163
- source == other_source
164
- end
165
-
166
- def equivalent_source?(source, other_source)
167
- return false unless Bundler.settings[:allow_deployment_source_credential_changes] && source.is_a?(Source::Rubygems)
168
-
169
- equivalent_rubygems_sources?([source], [other_source])
170
- end
171
-
172
219
  def equivalent_sources?(lock_sources, replacement_sources)
173
- return false unless Bundler.settings[:allow_deployment_source_credential_changes]
174
-
175
- lock_rubygems_sources, lock_other_sources = lock_sources.partition {|s| s.is_a?(Source::Rubygems) }
176
- replacement_rubygems_sources, replacement_other_sources = replacement_sources.partition {|s| s.is_a?(Source::Rubygems) }
177
-
178
- equivalent_rubygems_sources?(lock_rubygems_sources, replacement_rubygems_sources) && equal_sources?(lock_other_sources, replacement_other_sources)
220
+ lock_sources.sort_by(&:identifier) == replacement_sources.sort_by(&:identifier)
179
221
  end
180
222
 
181
- def equivalent_rubygems_sources?(lock_sources, replacement_sources)
182
- actual_remotes = replacement_sources.map(&:remotes).flatten.uniq
183
- lock_sources.all? {|s| s.equivalent_remotes?(actual_remotes) }
223
+ def equivalent_source?(source, other_source)
224
+ source == other_source
184
225
  end
185
226
  end
186
227
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class SourceMap
5
+ attr_reader :sources, :dependencies, :locked_specs
6
+
7
+ def initialize(sources, dependencies, locked_specs)
8
+ @sources = sources
9
+ @dependencies = dependencies
10
+ @locked_specs = locked_specs
11
+ end
12
+
13
+ def pinned_spec_names(skip = nil)
14
+ direct_requirements.reject {|_, source| source == skip }.keys
15
+ end
16
+
17
+ def all_requirements
18
+ requirements = direct_requirements.dup
19
+
20
+ unmet_deps = sources.non_default_explicit_sources.map do |source|
21
+ (source.spec_names - pinned_spec_names).each do |indirect_dependency_name|
22
+ previous_source = requirements[indirect_dependency_name]
23
+ if previous_source.nil?
24
+ requirements[indirect_dependency_name] = source
25
+ else
26
+ no_ambiguous_sources = Bundler.feature_flag.bundler_3_mode?
27
+
28
+ msg = ["The gem '#{indirect_dependency_name}' was found in multiple relevant sources."]
29
+ msg.concat [previous_source, source].map {|s| " * #{s}" }.sort
30
+ msg << "You #{no_ambiguous_sources ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
31
+ msg = msg.join("\n")
32
+
33
+ raise SecurityError, msg if no_ambiguous_sources
34
+ Bundler.ui.warn "Warning: #{msg}"
35
+ end
36
+ end
37
+
38
+ source.unmet_deps
39
+ end
40
+
41
+ sources.default_source.add_dependency_names(unmet_deps.flatten - requirements.keys)
42
+
43
+ requirements
44
+ end
45
+
46
+ def direct_requirements
47
+ @direct_requirements ||= begin
48
+ requirements = {}
49
+ default = sources.default_source
50
+ dependencies.each do |dep|
51
+ dep_source = dep.source || default
52
+ dep_source.add_dependency_names(dep.name)
53
+ requirements[dep.name] = dep_source
54
+ end
55
+ requirements
56
+ end
57
+ end
58
+
59
+ def locked_requirements
60
+ @locked_requirements ||= begin
61
+ requirements = {}
62
+ locked_specs.each do |locked_spec|
63
+ source = locked_spec.source
64
+ source.add_dependency_names(locked_spec.name)
65
+ requirements[locked_spec.name] = source
66
+ end
67
+ requirements
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,58 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tsort"
4
- require "forwardable"
5
- require "set"
3
+ require_relative "vendored_tsort"
6
4
 
7
5
  module Bundler
8
6
  class SpecSet
9
- extend Forwardable
10
- include TSort, Enumerable
7
+ include Enumerable
8
+ include TSort
11
9
 
12
- def_delegators :@specs, :<<, :length, :add, :remove, :size, :empty?
13
- def_delegators :sorted, :each
10
+ attr_reader :incomplete_specs
14
11
 
15
- def initialize(specs)
12
+ def initialize(specs, incomplete_specs = [])
16
13
  @specs = specs
14
+ @incomplete_specs = incomplete_specs
17
15
  end
18
16
 
19
- def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true)
20
- handled = Set.new
21
- deps = dependencies.dup
17
+ def for(dependencies, check = false, platforms = [nil])
18
+ handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
19
+ deps = dependencies.product(platforms)
22
20
  specs = []
23
- skip += ["bundler"]
24
21
 
25
22
  loop do
26
23
  break unless dep = deps.shift
27
- next if !handled.add?(dep) || skip.include?(dep.name)
28
24
 
29
- if spec = spec_for_dependency(dep, match_current_platform)
30
- specs << spec
25
+ name = dep[0].name
26
+ platform = dep[1]
27
+ incomplete = false
31
28
 
32
- spec.dependencies.each do |d|
29
+ key = [name, platform]
30
+ next if handled.key?(key)
31
+
32
+ handled[key] = true
33
+
34
+ specs_for_dep = specs_for_dependency(*dep)
35
+ if specs_for_dep.any?
36
+ specs.concat(specs_for_dep)
37
+
38
+ specs_for_dep.first.dependencies.each do |d|
33
39
  next if d.type == :development
34
- d = DepProxy.new(d, dep.__platform) unless match_current_platform
35
- deps << d
40
+ incomplete = true if d.name != "bundler" && lookup[d.name].empty?
41
+ deps << [d, dep[1]]
36
42
  end
37
- elsif check
38
- return false
39
- elsif raise_on_missing
40
- others = lookup[dep.name] if match_current_platform
41
- message = "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?"
42
- message += " Found #{others.join(", ")} that did not match the current platform." if others && !others.empty?
43
- raise GemNotFound, message
43
+ else
44
+ incomplete = true
44
45
  end
45
- end
46
46
 
47
- if spec = lookup["bundler"].first
48
- specs << spec
47
+ if incomplete && check
48
+ @incomplete_specs += lookup[name].any? ? lookup[name] : [LazySpecification.new(name, nil, nil)]
49
+ end
49
50
  end
50
51
 
51
- check ? true : SpecSet.new(specs)
52
- end
53
-
54
- def valid_for?(deps)
55
- self.for(deps, [], true)
52
+ specs.uniq
56
53
  end
57
54
 
58
55
  def [](key)
@@ -64,7 +61,12 @@ module Bundler
64
61
  @specs << value
65
62
  @lookup = nil
66
63
  @sorted = nil
67
- value
64
+ end
65
+
66
+ def delete(specs)
67
+ specs.each {|spec| @specs.delete(spec) }
68
+ @lookup = nil
69
+ @sorted = nil
68
70
  end
69
71
 
70
72
  def sort!
@@ -79,38 +81,39 @@ module Bundler
79
81
  lookup.dup
80
82
  end
81
83
 
82
- def materialize(deps, missing_specs = nil)
83
- materialized = self.for(deps, [], false, true, !missing_specs).to_a
84
- deps = materialized.map(&:name).uniq
85
- materialized.map! do |s|
86
- next s unless s.is_a?(LazySpecification)
87
- s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
88
- spec = s.__materialize__
89
- unless spec
90
- unless missing_specs
91
- raise GemNotFound, "Could not find #{s.full_name} in any of the sources"
92
- end
93
- missing_specs << s
94
- end
95
- spec
96
- end
97
- SpecSet.new(missing_specs ? materialized.compact : materialized)
84
+ def materialize(deps)
85
+ materialized = self.for(deps, true)
86
+
87
+ SpecSet.new(materialized, incomplete_specs)
98
88
  end
99
89
 
100
90
  # Materialize for all the specs in the spec set, regardless of what platform they're for
101
91
  # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
102
92
  # @return [Array<Gem::Specification>]
103
93
  def materialized_for_all_platforms
104
- names = @specs.map(&:name).uniq
105
94
  @specs.map do |s|
106
95
  next s unless s.is_a?(LazySpecification)
107
- s.source.dependency_names = names if s.source.respond_to?(:dependency_names=)
108
- spec = s.__materialize__
96
+ s.source.remote!
97
+ spec = s.materialize_for_installation
109
98
  raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
110
99
  spec
111
100
  end
112
101
  end
113
102
 
103
+ def incomplete_ruby_specs?(deps)
104
+ return false if @specs.empty?
105
+
106
+ @incomplete_specs = []
107
+
108
+ self.for(deps, true, [Gem::Platform::RUBY])
109
+
110
+ @incomplete_specs.any?
111
+ end
112
+
113
+ def missing_specs
114
+ @specs.select {|s| s.is_a?(LazySpecification) }
115
+ end
116
+
114
117
  def merge(set)
115
118
  arr = sorted.dup
116
119
  set.each do |set_spec|
@@ -121,10 +124,20 @@ module Bundler
121
124
  SpecSet.new(arr)
122
125
  end
123
126
 
127
+ def -(other)
128
+ SpecSet.new(to_a - other.to_a)
129
+ end
130
+
124
131
  def find_by_name_and_platform(name, platform)
125
132
  @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
126
133
  end
127
134
 
135
+ def delete_by_name(name)
136
+ @specs.reject! {|spec| spec.name == name }
137
+ @lookup = nil
138
+ @sorted = nil
139
+ end
140
+
128
141
  def what_required(spec)
129
142
  unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
130
143
  return [spec]
@@ -132,7 +145,27 @@ module Bundler
132
145
  what_required(req) << spec
133
146
  end
134
147
 
135
- private
148
+ def <<(spec)
149
+ @specs << spec
150
+ end
151
+
152
+ def length
153
+ @specs.length
154
+ end
155
+
156
+ def size
157
+ @specs.size
158
+ end
159
+
160
+ def empty?
161
+ @specs.empty?
162
+ end
163
+
164
+ def each(&b)
165
+ sorted.each(&b)
166
+ end
167
+
168
+ private
136
169
 
137
170
  def sorted
138
171
  rake = @specs.find {|s| s.name == "rake" }
@@ -142,22 +175,18 @@ module Bundler
142
175
  cgems = extract_circular_gems(error)
143
176
  raise CyclicDependencyError, "Your bundle requires gems that depend" \
144
177
  " on each other, creating an infinite loop. Please remove either" \
145
- " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
178
+ " gem '#{cgems[0]}' or gem '#{cgems[1]}' and try again."
146
179
  end
147
180
  end
148
181
 
149
182
  def extract_circular_gems(error)
150
- if Bundler.current_ruby.mri? && Bundler.current_ruby.on_19?
151
- error.message.scan(/(\w+) \([^)]/).flatten
152
- else
153
- error.message.scan(/@name="(.*?)"/).flatten
154
- end
183
+ error.message.scan(/@name="(.*?)"/).flatten
155
184
  end
156
185
 
157
186
  def lookup
158
187
  @lookup ||= begin
159
188
  lookup = Hash.new {|h, k| h[k] = [] }
160
- Index.sort_specs(@specs).reverse_each do |s|
189
+ @specs.each do |s|
161
190
  lookup[s.name] << s
162
191
  end
163
192
  lookup
@@ -169,17 +198,12 @@ module Bundler
169
198
  @specs.sort_by(&:name).each {|s| yield s }
170
199
  end
171
200
 
172
- def spec_for_dependency(dep, match_current_platform)
173
- specs_for_platforms = lookup[dep.name]
174
- if match_current_platform
175
- Bundler.rubygems.platforms.reverse_each do |pl|
176
- match = GemHelpers.select_best_platform_match(specs_for_platforms, pl)
177
- return match if match
178
- end
179
- nil
180
- else
181
- GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform)
182
- end
201
+ def specs_for_dependency(dep, platform)
202
+ specs_for_name = lookup[dep.name]
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
183
207
  end
184
208
 
185
209
  def tsort_each_child(s)