bundler 1.9.0 → 1.17.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (328) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1157 -6
  3. data/README.md +33 -6
  4. data/bundler.gemspec +51 -18
  5. data/exe/bundle +31 -0
  6. data/{bin → exe}/bundle_ruby +10 -6
  7. data/exe/bundler +4 -0
  8. data/lib/bundler.rb +326 -207
  9. data/lib/bundler/build_metadata.rb +53 -0
  10. data/lib/bundler/capistrano.rb +9 -3
  11. data/lib/bundler/cli.rb +522 -141
  12. data/lib/bundler/cli/add.rb +35 -0
  13. data/lib/bundler/cli/binstubs.rb +22 -11
  14. data/lib/bundler/cli/cache.rb +7 -6
  15. data/lib/bundler/cli/check.rb +11 -8
  16. data/lib/bundler/cli/clean.rb +7 -8
  17. data/lib/bundler/cli/common.rb +53 -7
  18. data/lib/bundler/cli/config.rb +84 -49
  19. data/lib/bundler/cli/console.rb +13 -8
  20. data/lib/bundler/cli/doctor.rb +140 -0
  21. data/lib/bundler/cli/exec.rb +77 -16
  22. data/lib/bundler/cli/gem.rb +120 -52
  23. data/lib/bundler/cli/info.rb +50 -0
  24. data/lib/bundler/cli/init.rb +21 -7
  25. data/lib/bundler/cli/inject.rb +37 -10
  26. data/lib/bundler/cli/install.rb +139 -78
  27. data/lib/bundler/cli/issue.rb +40 -0
  28. data/lib/bundler/cli/list.rb +58 -0
  29. data/lib/bundler/cli/lock.rb +63 -0
  30. data/lib/bundler/cli/open.rb +9 -6
  31. data/lib/bundler/cli/outdated.rb +221 -35
  32. data/lib/bundler/cli/package.rb +11 -7
  33. data/lib/bundler/cli/platform.rb +7 -4
  34. data/lib/bundler/cli/plugin.rb +24 -0
  35. data/lib/bundler/cli/pristine.rb +47 -0
  36. data/lib/bundler/cli/remove.rb +18 -0
  37. data/lib/bundler/cli/show.rb +11 -10
  38. data/lib/bundler/cli/update.rb +47 -29
  39. data/lib/bundler/cli/viz.rb +12 -8
  40. data/lib/bundler/compact_index_client.rb +109 -0
  41. data/lib/bundler/compact_index_client/cache.rb +118 -0
  42. data/lib/bundler/compact_index_client/updater.rb +116 -0
  43. data/lib/bundler/compatibility_guard.rb +14 -0
  44. data/lib/bundler/constants.rb +3 -1
  45. data/lib/bundler/current_ruby.rb +47 -137
  46. data/lib/bundler/definition.rb +599 -230
  47. data/lib/bundler/dep_proxy.rb +15 -10
  48. data/lib/bundler/dependency.rb +54 -25
  49. data/lib/bundler/deployment.rb +12 -2
  50. data/lib/bundler/deprecate.rb +33 -4
  51. data/lib/bundler/dsl.rb +383 -99
  52. data/lib/bundler/endpoint_specification.rb +72 -7
  53. data/lib/bundler/env.rb +121 -41
  54. data/lib/bundler/environment_preserver.rb +59 -0
  55. data/lib/bundler/errors.rb +158 -0
  56. data/lib/bundler/feature_flag.rb +74 -0
  57. data/lib/bundler/fetcher.rb +171 -280
  58. data/lib/bundler/fetcher/base.rb +52 -0
  59. data/lib/bundler/fetcher/compact_index.rb +126 -0
  60. data/lib/bundler/fetcher/dependency.rb +82 -0
  61. data/lib/bundler/fetcher/downloader.rb +84 -0
  62. data/lib/bundler/fetcher/index.rb +52 -0
  63. data/lib/bundler/friendly_errors.rb +113 -58
  64. data/lib/bundler/gem_helper.rb +73 -46
  65. data/lib/bundler/gem_helpers.rb +85 -9
  66. data/lib/bundler/gem_remote_fetcher.rb +43 -0
  67. data/lib/bundler/gem_tasks.rb +6 -1
  68. data/lib/bundler/gem_version_promoter.rb +190 -0
  69. data/lib/bundler/gemdeps.rb +29 -0
  70. data/lib/bundler/graph.rb +32 -49
  71. data/lib/bundler/index.rb +79 -67
  72. data/lib/bundler/injector.rb +219 -30
  73. data/lib/bundler/inline.rb +74 -0
  74. data/lib/bundler/installer.rb +191 -206
  75. data/lib/bundler/installer/gem_installer.rb +85 -0
  76. data/lib/bundler/installer/parallel_installer.rb +233 -0
  77. data/lib/bundler/installer/standalone.rb +53 -0
  78. data/lib/bundler/lazy_specification.rb +53 -13
  79. data/lib/bundler/lockfile_generator.rb +95 -0
  80. data/lib/bundler/lockfile_parser.rb +157 -62
  81. data/lib/bundler/match_platform.rb +15 -4
  82. data/lib/bundler/mirror.rb +223 -0
  83. data/lib/bundler/plugin.rb +292 -0
  84. data/lib/bundler/plugin/api.rb +81 -0
  85. data/lib/bundler/plugin/api/source.rb +306 -0
  86. data/lib/bundler/plugin/dsl.rb +53 -0
  87. data/lib/bundler/plugin/events.rb +61 -0
  88. data/lib/bundler/plugin/index.rb +162 -0
  89. data/lib/bundler/plugin/installer.rb +96 -0
  90. data/lib/bundler/plugin/installer/git.rb +38 -0
  91. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  92. data/lib/bundler/plugin/source_list.rb +27 -0
  93. data/lib/bundler/process_lock.rb +24 -0
  94. data/lib/bundler/psyched_yaml.rb +17 -6
  95. data/lib/bundler/remote_specification.rb +68 -11
  96. data/lib/bundler/resolver.rb +263 -229
  97. data/lib/bundler/resolver/spec_group.rb +106 -0
  98. data/lib/bundler/retry.rb +25 -19
  99. data/lib/bundler/ruby_dsl.rb +9 -2
  100. data/lib/bundler/ruby_version.rb +101 -66
  101. data/lib/bundler/rubygems_ext.rb +77 -37
  102. data/lib/bundler/rubygems_gem_installer.rb +106 -0
  103. data/lib/bundler/rubygems_integration.rb +450 -163
  104. data/lib/bundler/runtime.rb +133 -103
  105. data/lib/bundler/settings.rb +344 -83
  106. data/lib/bundler/settings/validator.rb +102 -0
  107. data/lib/bundler/setup.rb +7 -3
  108. data/lib/bundler/shared_helpers.rb +284 -54
  109. data/lib/bundler/similarity_detector.rb +21 -21
  110. data/lib/bundler/source.rb +68 -15
  111. data/lib/bundler/source/gemspec.rb +18 -0
  112. data/lib/bundler/source/git.rb +90 -55
  113. data/lib/bundler/source/git/git_proxy.rb +135 -35
  114. data/lib/bundler/source/metadata.rb +62 -0
  115. data/lib/bundler/source/path.rb +84 -61
  116. data/lib/bundler/source/path/installer.rb +53 -17
  117. data/lib/bundler/source/rubygems.rb +282 -122
  118. data/lib/bundler/source/rubygems/remote.rb +69 -0
  119. data/lib/bundler/source_list.rb +107 -22
  120. data/lib/bundler/spec_set.rb +83 -45
  121. data/lib/bundler/ssl_certs/certificate_manager.rb +8 -7
  122. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
  123. data/lib/bundler/ssl_certs/{DigiCertHighAssuranceEVRootCA.pem → rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem} +0 -0
  124. data/lib/bundler/ssl_certs/{AddTrustExternalCARoot-2048.pem → rubygems.org/AddTrustExternalCARoot.pem} +0 -0
  125. data/lib/bundler/stub_specification.rb +108 -0
  126. data/lib/bundler/templates/.document +1 -0
  127. data/lib/bundler/templates/Executable +19 -6
  128. data/lib/bundler/templates/Executable.bundler +105 -0
  129. data/lib/bundler/templates/Executable.standalone +6 -4
  130. data/lib/bundler/templates/Gemfile +4 -1
  131. data/lib/bundler/templates/gems.rb +8 -0
  132. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +68 -7
  133. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  134. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  135. data/lib/bundler/templates/newgem/README.md.tt +19 -11
  136. data/lib/bundler/templates/newgem/Rakefile.tt +10 -6
  137. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  138. data/lib/bundler/templates/newgem/bin/setup.tt +2 -1
  139. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  140. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  141. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  142. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  143. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  144. data/lib/bundler/templates/newgem/newgem.gemspec.tt +31 -15
  145. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  146. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +3 -5
  147. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -2
  148. data/lib/bundler/templates/newgem/test/{test_newgem.rb.tt → newgem_test.rb.tt} +2 -2
  149. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +4 -0
  150. data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
  151. data/lib/bundler/ui.rb +5 -3
  152. data/lib/bundler/ui/rg_proxy.rb +5 -7
  153. data/lib/bundler/ui/shell.rb +69 -18
  154. data/lib/bundler/ui/silent.rb +26 -1
  155. data/lib/bundler/uri_credentials_filter.rb +37 -0
  156. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  173. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/specification_provider.rb +11 -0
  174. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/ui.rb +6 -2
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
  176. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/resolver.rb +6 -3
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
  178. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  179. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  180. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  181. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor.rb +47 -22
  182. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions.rb +31 -29
  183. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_file.rb +3 -2
  184. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_link.rb +3 -2
  185. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/directory.rb +3 -3
  186. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/empty_directory.rb +16 -8
  187. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/file_manipulation.rb +66 -18
  188. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/inject_into_file.rb +18 -16
  189. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/base.rb +67 -44
  190. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/command.rb +13 -11
  191. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  192. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
  193. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
  194. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/error.rb +3 -3
  195. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/group.rb +14 -14
  196. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/invocation.rb +4 -5
  197. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor.rb +2 -2
  198. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/basic.rb +2 -0
  199. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/readline.rb +0 -0
  200. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  201. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/argument.rb +4 -7
  202. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/arguments.rb +16 -16
  203. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/option.rb +42 -21
  204. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/options.rb +13 -10
  205. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/rake_compat.rb +1 -1
  206. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/runner.rb +35 -33
  207. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell.rb +4 -4
  208. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/basic.rb +49 -33
  209. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/color.rb +2 -2
  210. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/html.rb +5 -5
  211. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/util.rb +8 -7
  212. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/version.rb +1 -1
  213. data/lib/bundler/vendored_fileutils.rb +9 -0
  214. data/lib/bundler/vendored_molinillo.rb +4 -5
  215. data/lib/bundler/vendored_persistent.rb +45 -4
  216. data/lib/bundler/vendored_thor.rb +8 -5
  217. data/lib/bundler/version.rb +23 -1
  218. data/lib/bundler/version_ranges.rb +76 -0
  219. data/lib/bundler/vlad.rb +8 -2
  220. data/lib/bundler/worker.rb +39 -6
  221. data/lib/bundler/yaml_serializer.rb +90 -0
  222. data/man/bundle-add.1 +58 -0
  223. data/man/bundle-add.1.txt +52 -0
  224. data/man/bundle-add.ronn +40 -0
  225. data/man/bundle-binstubs.1 +40 -0
  226. data/man/bundle-binstubs.1.txt +48 -0
  227. data/man/bundle-binstubs.ronn +43 -0
  228. data/man/bundle-check.1 +31 -0
  229. data/man/bundle-check.1.txt +33 -0
  230. data/man/bundle-check.ronn +26 -0
  231. data/man/bundle-clean.1 +24 -0
  232. data/man/bundle-clean.1.txt +26 -0
  233. data/man/bundle-clean.ronn +18 -0
  234. data/man/bundle-config.1 +497 -0
  235. data/man/bundle-config.1.txt +529 -0
  236. data/man/bundle-config.ronn +256 -31
  237. data/man/bundle-doctor.1 +44 -0
  238. data/man/bundle-doctor.1.txt +44 -0
  239. data/man/bundle-doctor.ronn +33 -0
  240. data/man/bundle-exec.1 +165 -0
  241. data/man/bundle-exec.1.txt +178 -0
  242. data/man/bundle-exec.ronn +19 -3
  243. data/man/bundle-gem.1 +80 -0
  244. data/man/bundle-gem.1.txt +91 -0
  245. data/man/bundle-gem.ronn +78 -0
  246. data/man/bundle-info.1 +20 -0
  247. data/man/bundle-info.1.txt +21 -0
  248. data/man/bundle-info.ronn +17 -0
  249. data/man/bundle-init.1 +25 -0
  250. data/man/bundle-init.1.txt +34 -0
  251. data/man/bundle-init.ronn +29 -0
  252. data/man/bundle-inject.1 +33 -0
  253. data/man/bundle-inject.1.txt +32 -0
  254. data/man/bundle-inject.ronn +22 -0
  255. data/man/bundle-install.1 +308 -0
  256. data/man/bundle-install.1.txt +396 -0
  257. data/man/bundle-install.ronn +64 -67
  258. data/man/bundle-list.1 +50 -0
  259. data/man/bundle-list.1.txt +43 -0
  260. data/man/bundle-list.ronn +33 -0
  261. data/man/bundle-lock.1 +84 -0
  262. data/man/bundle-lock.1.txt +93 -0
  263. data/man/bundle-lock.ronn +94 -0
  264. data/man/bundle-open.1 +32 -0
  265. data/man/bundle-open.1.txt +29 -0
  266. data/man/bundle-open.ronn +19 -0
  267. data/man/bundle-outdated.1 +155 -0
  268. data/man/bundle-outdated.1.txt +131 -0
  269. data/man/bundle-outdated.ronn +111 -0
  270. data/man/bundle-package.1 +55 -0
  271. data/man/bundle-package.1.txt +79 -0
  272. data/man/bundle-package.ronn +14 -8
  273. data/man/bundle-platform.1 +61 -0
  274. data/man/bundle-platform.1.txt +57 -0
  275. data/man/bundle-platform.ronn +1 -1
  276. data/man/bundle-pristine.1 +34 -0
  277. data/man/bundle-pristine.1.txt +44 -0
  278. data/man/bundle-pristine.ronn +34 -0
  279. data/man/bundle-remove.1 +31 -0
  280. data/man/bundle-remove.1.txt +34 -0
  281. data/man/bundle-remove.ronn +23 -0
  282. data/man/bundle-show.1 +23 -0
  283. data/man/bundle-show.1.txt +27 -0
  284. data/man/bundle-show.ronn +21 -0
  285. data/man/bundle-update.1 +394 -0
  286. data/man/bundle-update.1.txt +391 -0
  287. data/man/bundle-update.ronn +180 -18
  288. data/man/bundle-viz.1 +39 -0
  289. data/man/bundle-viz.1.txt +39 -0
  290. data/man/bundle-viz.ronn +30 -0
  291. data/man/bundle.1 +136 -0
  292. data/man/bundle.1.txt +116 -0
  293. data/man/bundle.ronn +46 -33
  294. data/man/gemfile.5 +689 -0
  295. data/man/gemfile.5.ronn +127 -79
  296. data/man/gemfile.5.txt +653 -0
  297. data/man/index.txt +25 -7
  298. metadata +242 -95
  299. data/.gitignore +0 -16
  300. data/.rspec +0 -3
  301. data/.travis.yml +0 -110
  302. data/CODE_OF_CONDUCT.md +0 -40
  303. data/CONTRIBUTING.md +0 -32
  304. data/DEVELOPMENT.md +0 -119
  305. data/ISSUES.md +0 -96
  306. data/Rakefile +0 -302
  307. data/UPGRADING.md +0 -103
  308. data/bin/bundle +0 -21
  309. data/bin/bundler +0 -21
  310. data/lib/bundler/anonymizable_uri.rb +0 -32
  311. data/lib/bundler/environment.rb +0 -42
  312. data/lib/bundler/gem_installer.rb +0 -9
  313. data/lib/bundler/gem_path_manipulation.rb +0 -8
  314. data/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  315. data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  316. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  317. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  318. data/lib/bundler/templates/newgem/.travis.yml.tt +0 -3
  319. data/lib/bundler/templates/newgem/test/minitest_helper.rb.tt +0 -4
  320. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo.rb +0 -5
  321. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/dependency_graph.rb +0 -266
  322. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/errors.rb +0 -69
  323. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/gem_metadata.rb +0 -3
  324. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolution.rb +0 -412
  325. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/state.rb +0 -43
  326. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +0 -10
  327. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +0 -98
  328. data/lib/bundler/vendor/thor-0.19.1/lib/thor/parser.rb +0 -4
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Rubygems
6
+ class Remote
7
+ attr_reader :uri, :anonymized_uri, :original_uri
8
+
9
+ def initialize(uri)
10
+ orig_uri = uri
11
+ uri = Bundler.settings.mirror_for(uri)
12
+ @original_uri = orig_uri if orig_uri != uri
13
+ fallback_auth = Bundler.settings.credentials_for(uri)
14
+
15
+ @uri = apply_auth(uri, fallback_auth).freeze
16
+ @anonymized_uri = remove_auth(@uri).freeze
17
+ end
18
+
19
+ # @return [String] A slug suitable for use as a cache key for this
20
+ # remote.
21
+ #
22
+ def cache_slug
23
+ @cache_slug ||= begin
24
+ return nil unless SharedHelpers.md5_available?
25
+
26
+ cache_uri = original_uri || uri
27
+
28
+ # URI::File of Ruby 2.6 returns empty string when given "file://".
29
+ host = defined?(URI::File) && cache_uri.is_a?(URI::File) ? nil : cache_uri.host
30
+
31
+ uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
32
+ uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
33
+
34
+ uri_parts[-1] = uri_digest
35
+ uri_parts.compact.join(".")
36
+ end
37
+ end
38
+
39
+ def to_s
40
+ "rubygems remote at #{anonymized_uri}"
41
+ end
42
+
43
+ private
44
+
45
+ def apply_auth(uri, auth)
46
+ if auth && uri.userinfo.nil?
47
+ uri = uri.dup
48
+ uri.userinfo = auth
49
+ end
50
+
51
+ uri
52
+ rescue URI::InvalidComponentError
53
+ error_message = "Please CGI escape your usernames and passwords before " \
54
+ "setting them for authentication."
55
+ raise HTTPError.new(error_message)
56
+ end
57
+
58
+ def remove_auth(uri)
59
+ if uri.userinfo
60
+ uri = uri.dup
61
+ uri.user = uri.password = nil
62
+ end
63
+
64
+ uri
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,34 +1,67 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class SourceList
3
5
  attr_reader :path_sources,
4
- :git_sources
6
+ :git_sources,
7
+ :plugin_sources,
8
+ :global_rubygems_source,
9
+ :metadata_source
5
10
 
6
11
  def initialize
7
- @path_sources = []
8
- @git_sources = []
9
- @rubygems_aggregate = Source::Rubygems.new
10
- @rubygems_sources = []
12
+ @path_sources = []
13
+ @git_sources = []
14
+ @plugin_sources = []
15
+ @global_rubygems_source = nil
16
+ @rubygems_aggregate = rubygems_aggregate_class.new
17
+ @rubygems_sources = []
18
+ @metadata_source = Source::Metadata.new
11
19
  end
12
20
 
13
21
  def add_path_source(options = {})
14
- add_source_to_list Source::Path.new(options), path_sources
22
+ if options["gemspec"]
23
+ add_source_to_list Source::Gemspec.new(options), path_sources
24
+ else
25
+ add_source_to_list Source::Path.new(options), path_sources
26
+ end
15
27
  end
16
28
 
17
29
  def add_git_source(options = {})
18
- add_source_to_list Source::Git.new(options), git_sources
30
+ add_source_to_list(Source::Git.new(options), git_sources).tap do |source|
31
+ warn_on_git_protocol(source)
32
+ end
19
33
  end
20
34
 
21
35
  def add_rubygems_source(options = {})
22
36
  add_source_to_list Source::Rubygems.new(options), @rubygems_sources
23
37
  end
24
38
 
39
+ def add_plugin_source(source, options = {})
40
+ add_source_to_list Plugin.source(source).new(options), @plugin_sources
41
+ end
42
+
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
+
25
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
26
55
  @rubygems_aggregate.add_remote(uri)
27
56
  @rubygems_aggregate
28
57
  end
29
58
 
59
+ def default_source
60
+ global_rubygems_source || @rubygems_aggregate
61
+ end
62
+
30
63
  def rubygems_sources
31
- @rubygems_sources + [@rubygems_aggregate]
64
+ @rubygems_sources + [default_source]
32
65
  end
33
66
 
34
67
  def rubygems_remotes
@@ -36,34 +69,42 @@ module Bundler
36
69
  end
37
70
 
38
71
  def all_sources
39
- path_sources + git_sources + rubygems_sources
72
+ path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
40
73
  end
41
74
 
42
75
  def get(source)
43
- source_list_for(source).find { |s| source == s }
76
+ source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) }
44
77
  end
45
78
 
46
79
  def lock_sources
47
- lock_sources = (path_sources + git_sources).sort_by(&:to_s)
48
- lock_sources << combine_rubygems_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)
84
+ else
85
+ lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
86
+ lock_sources << combine_rubygems_sources
87
+ end
49
88
  end
50
89
 
90
+ # Returns true if there are changes
51
91
  def replace_sources!(replacement_sources)
52
92
  return true if replacement_sources.empty?
53
93
 
54
- [path_sources, git_sources].each do |source_list|
94
+ [path_sources, git_sources, plugin_sources].each do |source_list|
55
95
  source_list.map! do |source|
56
- replacement_sources.find { |s| s == source } || source
96
+ replacement_sources.find {|s| s == source } || source
57
97
  end
58
98
  end
59
99
 
60
- replacement_rubygems =
61
- replacement_sources.detect { |s| s.is_a?(Source::Rubygems) }
100
+ replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? &&
101
+ replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
62
102
  @rubygems_aggregate = replacement_rubygems if replacement_rubygems
63
103
 
64
- # Return true if there were changes
65
- lock_sources.to_set != replacement_sources.to_set ||
66
- rubygems_remotes.to_set != replacement_rubygems.remotes.to_set
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
106
+
107
+ false
67
108
  end
68
109
 
69
110
  def cached!
@@ -80,6 +121,10 @@ module Bundler
80
121
 
81
122
  private
82
123
 
124
+ def rubygems_aggregate_class
125
+ Source::Rubygems
126
+ end
127
+
83
128
  def add_source_to_list(source, list)
84
129
  list.unshift(source).uniq!
85
130
  source
@@ -87,9 +132,10 @@ module Bundler
87
132
 
88
133
  def source_list_for(source)
89
134
  case source
90
- when Source::Git then git_sources
91
- when Source::Path then path_sources
92
- when Source::Rubygems then rubygems_sources
135
+ when Source::Git then git_sources
136
+ when Source::Path then path_sources
137
+ when Source::Rubygems then rubygems_sources
138
+ when Plugin::API::Source then plugin_sources
93
139
  else raise ArgumentError, "Invalid source: #{source.inspect}"
94
140
  end
95
141
  end
@@ -97,5 +143,44 @@ module Bundler
97
143
  def combine_rubygems_sources
98
144
  Source::Rubygems.new("remotes" => rubygems_remotes)
99
145
  end
146
+
147
+ def warn_on_git_protocol(source)
148
+ return if Bundler.settings["git.allow_insecure"]
149
+
150
+ if source.uri =~ /^git\:/
151
+ Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
152
+ "which transmits data without encryption. Disable this warning with " \
153
+ "`bundle config git.allow_insecure true`, or switch to the `https` " \
154
+ "protocol to keep your data secure."
155
+ end
156
+ end
157
+
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
+ 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)
179
+ end
180
+
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) }
184
+ end
100
185
  end
101
186
  end
@@ -1,37 +1,32 @@
1
- require 'tsort'
2
- require 'forwardable'
1
+ # frozen_string_literal: true
2
+
3
+ require "tsort"
4
+ require "forwardable"
5
+ require "set"
3
6
 
4
7
  module Bundler
5
8
  class SpecSet
6
9
  extend Forwardable
7
10
  include TSort, Enumerable
8
11
 
9
- def_delegators :@specs, :<<, :length, :add, :remove
12
+ def_delegators :@specs, :<<, :length, :add, :remove, :size, :empty?
10
13
  def_delegators :sorted, :each
11
14
 
12
15
  def initialize(specs)
13
- @specs = specs.sort_by { |s| s.name }
16
+ @specs = specs
14
17
  end
15
18
 
16
- def for(dependencies, skip = [], check = false, match_current_platform = false)
17
- handled, deps, specs = {}, dependencies.dup, []
18
- skip << 'bundler'
19
-
20
- until deps.empty?
21
- dep = deps.shift
22
- next if handled[dep] || skip.include?(dep.name)
23
-
24
- spec = lookup[dep.name].find do |s|
25
- if match_current_platform
26
- Gem::Platform.match(s.platform)
27
- else
28
- s.match_platform(dep.__platform)
29
- end
30
- end
19
+ def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true)
20
+ handled = Set.new
21
+ deps = dependencies.dup
22
+ specs = []
23
+ skip += ["bundler"]
31
24
 
32
- handled[dep] = true
25
+ loop do
26
+ break unless dep = deps.shift
27
+ next if !handled.add?(dep) || skip.include?(dep.name)
33
28
 
34
- if spec
29
+ if spec = spec_for_dependency(dep, match_current_platform)
35
30
  specs << spec
36
31
 
37
32
  spec.dependencies.each do |d|
@@ -41,10 +36,15 @@ module Bundler
41
36
  end
42
37
  elsif check
43
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
44
44
  end
45
45
  end
46
46
 
47
- if spec = lookup['bundler'].first
47
+ if spec = lookup["bundler"].first
48
48
  specs << spec
49
49
  end
50
50
 
@@ -80,42 +80,69 @@ module Bundler
80
80
  end
81
81
 
82
82
  def materialize(deps, missing_specs = nil)
83
- materialized = self.for(deps, [], false, true).to_a
84
- deps = materialized.map {|s| s.name }.uniq
83
+ materialized = self.for(deps, [], false, true, !missing_specs).to_a
84
+ deps = materialized.map(&:name).uniq
85
85
  materialized.map! do |s|
86
86
  next s unless s.is_a?(LazySpecification)
87
87
  s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
88
88
  spec = s.__materialize__
89
- if missing_specs
90
- missing_specs << s unless spec
91
- else
92
- raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
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
93
94
  end
94
- spec if spec
95
+ spec
96
+ end
97
+ SpecSet.new(missing_specs ? materialized.compact : materialized)
98
+ end
99
+
100
+ # Materialize for all the specs in the spec set, regardless of what platform they're for
101
+ # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
102
+ # @return [Array<Gem::Specification>]
103
+ def materialized_for_all_platforms
104
+ names = @specs.map(&:name).uniq
105
+ @specs.map do |s|
106
+ next s unless s.is_a?(LazySpecification)
107
+ s.source.dependency_names = names if s.source.respond_to?(:dependency_names=)
108
+ spec = s.__materialize__
109
+ raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
110
+ spec
95
111
  end
96
- SpecSet.new(materialized.compact)
97
112
  end
98
113
 
99
114
  def merge(set)
100
115
  arr = sorted.dup
101
- set.each do |s|
102
- next if arr.any? { |s2| s2.name == s.name && s2.version == s.version && s2.platform == s.platform }
103
- arr << s
116
+ set.each do |set_spec|
117
+ full_name = set_spec.full_name
118
+ next if arr.any? {|spec| spec.full_name == full_name }
119
+ arr << set_spec
104
120
  end
105
121
  SpecSet.new(arr)
106
122
  end
107
123
 
124
+ def find_by_name_and_platform(name, platform)
125
+ @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
126
+ end
127
+
128
+ def what_required(spec)
129
+ unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
130
+ return [spec]
131
+ end
132
+ what_required(req) << spec
133
+ end
134
+
108
135
  private
109
136
 
110
137
  def sorted
111
- rake = @specs.find { |s| s.name == 'rake' }
138
+ rake = @specs.find {|s| s.name == "rake" }
112
139
  begin
113
140
  @sorted ||= ([rake] + tsort).compact.uniq
114
141
  rescue TSort::Cyclic => error
115
142
  cgems = extract_circular_gems(error)
116
- raise CyclicDependencyError, "Your Gemfile requires gems that depend" \
117
- " depend on each other, creating an infinite loop. Please remove" \
118
- " either gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
143
+ raise CyclicDependencyError, "Your bundle requires gems that depend" \
144
+ " on each other, creating an infinite loop. Please remove either" \
145
+ " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
119
146
  end
120
147
  end
121
148
 
@@ -129,11 +156,8 @@ module Bundler
129
156
 
130
157
  def lookup
131
158
  @lookup ||= begin
132
- lookup = Hash.new { |h,k| h[k] = [] }
133
- specs = @specs.sort_by do |s|
134
- s.platform.to_s == 'ruby' ? "\0" : s.platform.to_s
135
- end
136
- specs.reverse_each do |s|
159
+ lookup = Hash.new {|h, k| h[k] = [] }
160
+ Index.sort_specs(@specs).reverse_each do |s|
137
161
  lookup[s.name] << s
138
162
  end
139
163
  lookup
@@ -141,13 +165,27 @@ module Bundler
141
165
  end
142
166
 
143
167
  def tsort_each_node
144
- @specs.each { |s| yield s }
168
+ # MUST sort by name for backwards compatibility
169
+ @specs.sort_by(&:name).each {|s| yield s }
170
+ end
171
+
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
145
183
  end
146
184
 
147
185
  def tsort_each_child(s)
148
- s.dependencies.sort_by { |d| d.name }.each do |d|
186
+ s.dependencies.sort_by(&:name).each do |d|
149
187
  next if d.type == :development
150
- lookup[d.name].each { |s2| yield s2 }
188
+ lookup[d.name].each {|s2| yield s2 }
151
189
  end
152
190
  end
153
191
  end