bundler 1.11.1 → 2.2.6

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 +2125 -840
  3. data/LICENSE.md +18 -19
  4. data/README.md +33 -11
  5. data/bundler.gemspec +34 -21
  6. data/exe/bundle +36 -6
  7. data/exe/bundler +2 -18
  8. data/lib/bundler.rb +435 -160
  9. data/lib/bundler/build_metadata.rb +45 -0
  10. data/lib/bundler/capistrano.rb +9 -3
  11. data/lib/bundler/cli.rb +550 -130
  12. data/lib/bundler/cli/add.rb +47 -0
  13. data/lib/bundler/cli/binstubs.rb +26 -10
  14. data/lib/bundler/cli/cache.rb +25 -17
  15. data/lib/bundler/cli/check.rb +8 -7
  16. data/lib/bundler/cli/clean.rb +8 -8
  17. data/lib/bundler/cli/common.rb +69 -9
  18. data/lib/bundler/cli/config.rb +170 -76
  19. data/lib/bundler/cli/console.rb +6 -1
  20. data/lib/bundler/cli/doctor.rb +140 -0
  21. data/lib/bundler/cli/exec.rb +63 -21
  22. data/lib/bundler/cli/fund.rb +36 -0
  23. data/lib/bundler/cli/gem.rb +158 -42
  24. data/lib/bundler/cli/info.rb +73 -0
  25. data/lib/bundler/cli/init.rb +22 -7
  26. data/lib/bundler/cli/inject.rb +38 -10
  27. data/lib/bundler/cli/install.rb +139 -104
  28. data/lib/bundler/cli/issue.rb +40 -0
  29. data/lib/bundler/cli/list.rb +60 -0
  30. data/lib/bundler/cli/lock.rb +27 -5
  31. data/lib/bundler/cli/open.rb +13 -5
  32. data/lib/bundler/cli/outdated.rb +251 -46
  33. data/lib/bundler/cli/platform.rb +6 -2
  34. data/lib/bundler/cli/plugin.rb +41 -0
  35. data/lib/bundler/cli/pristine.rb +52 -0
  36. data/lib/bundler/cli/remove.rb +18 -0
  37. data/lib/bundler/cli/show.rb +5 -4
  38. data/lib/bundler/cli/update.rb +67 -26
  39. data/lib/bundler/cli/viz.rb +11 -6
  40. data/lib/bundler/compact_index_client.rb +125 -0
  41. data/lib/bundler/compact_index_client/cache.rb +110 -0
  42. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  43. data/lib/bundler/compact_index_client/updater.rb +104 -0
  44. data/lib/bundler/constants.rb +2 -0
  45. data/lib/bundler/current_ruby.rb +51 -174
  46. data/lib/bundler/definition.rb +533 -216
  47. data/lib/bundler/dep_proxy.rb +18 -8
  48. data/lib/bundler/dependency.rb +39 -12
  49. data/lib/bundler/deployment.rb +7 -0
  50. data/lib/bundler/deprecate.rb +31 -2
  51. data/lib/bundler/dsl.rb +188 -91
  52. data/lib/bundler/endpoint_specification.rb +51 -10
  53. data/lib/bundler/env.rb +116 -48
  54. data/lib/bundler/environment_preserver.rb +82 -0
  55. data/lib/bundler/errors.rb +108 -31
  56. data/lib/bundler/feature_flag.rb +60 -0
  57. data/lib/bundler/fetcher.rb +81 -52
  58. data/lib/bundler/fetcher/base.rb +15 -3
  59. data/lib/bundler/fetcher/compact_index.rb +140 -0
  60. data/lib/bundler/fetcher/dependency.rb +36 -42
  61. data/lib/bundler/fetcher/downloader.rb +39 -12
  62. data/lib/bundler/fetcher/index.rb +34 -9
  63. data/lib/bundler/friendly_errors.rb +132 -88
  64. data/lib/bundler/gem_helper.rb +92 -50
  65. data/lib/bundler/gem_helpers.rb +90 -5
  66. data/lib/bundler/gem_tasks.rb +3 -1
  67. data/lib/bundler/gem_version_promoter.rb +190 -0
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +20 -41
  70. data/lib/bundler/index.rb +74 -57
  71. data/lib/bundler/injector.rb +242 -31
  72. data/lib/bundler/inline.rb +49 -23
  73. data/lib/bundler/installer.rb +190 -74
  74. data/lib/bundler/installer/gem_installer.rb +33 -20
  75. data/lib/bundler/installer/parallel_installer.rb +201 -97
  76. data/lib/bundler/installer/standalone.rb +10 -6
  77. data/lib/bundler/lazy_specification.rb +74 -10
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +126 -74
  80. data/lib/bundler/{ssl_certs → man}/.document +0 -0
  81. data/lib/bundler/man/bundle-add.1 +66 -0
  82. data/lib/bundler/man/bundle-add.1.ronn +46 -0
  83. data/lib/bundler/man/bundle-binstubs.1 +42 -0
  84. data/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
  85. data/lib/bundler/man/bundle-cache.1 +55 -0
  86. data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +22 -16
  87. data/lib/bundler/man/bundle-check.1 +31 -0
  88. data/lib/bundler/man/bundle-check.1.ronn +26 -0
  89. data/lib/bundler/man/bundle-clean.1 +24 -0
  90. data/lib/bundler/man/bundle-clean.1.ronn +18 -0
  91. data/lib/bundler/man/bundle-config.1 +488 -0
  92. data/lib/bundler/man/bundle-config.1.ronn +388 -0
  93. data/lib/bundler/man/bundle-doctor.1 +44 -0
  94. data/lib/bundler/man/bundle-doctor.1.ronn +33 -0
  95. data/lib/bundler/man/bundle-exec.1 +165 -0
  96. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +20 -4
  97. data/lib/bundler/man/bundle-gem.1 +102 -0
  98. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +37 -13
  99. data/lib/bundler/man/bundle-info.1 +20 -0
  100. data/lib/bundler/man/bundle-info.1.ronn +17 -0
  101. data/lib/bundler/man/bundle-init.1 +25 -0
  102. data/lib/bundler/man/bundle-init.1.ronn +29 -0
  103. data/lib/bundler/man/bundle-inject.1 +33 -0
  104. data/lib/bundler/man/bundle-inject.1.ronn +22 -0
  105. data/lib/bundler/man/bundle-install.1 +338 -0
  106. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +82 -76
  107. data/lib/bundler/man/bundle-list.1 +50 -0
  108. data/lib/bundler/man/bundle-list.1.ronn +33 -0
  109. data/lib/bundler/man/bundle-lock.1 +84 -0
  110. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +47 -0
  111. data/lib/bundler/man/bundle-open.1 +32 -0
  112. data/lib/bundler/man/bundle-open.1.ronn +19 -0
  113. data/lib/bundler/man/bundle-outdated.1 +155 -0
  114. data/lib/bundler/man/bundle-outdated.1.ronn +111 -0
  115. data/lib/bundler/man/bundle-platform.1 +61 -0
  116. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +1 -1
  117. data/lib/bundler/man/bundle-pristine.1 +34 -0
  118. data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  119. data/lib/bundler/man/bundle-remove.1 +31 -0
  120. data/lib/bundler/man/bundle-remove.1.ronn +23 -0
  121. data/lib/bundler/man/bundle-show.1 +23 -0
  122. data/lib/bundler/man/bundle-show.1.ronn +21 -0
  123. data/lib/bundler/man/bundle-update.1 +394 -0
  124. data/lib/bundler/man/bundle-update.1.ronn +350 -0
  125. data/lib/bundler/man/bundle-viz.1 +39 -0
  126. data/lib/bundler/man/bundle-viz.1.ronn +30 -0
  127. data/lib/bundler/man/bundle.1 +136 -0
  128. data/lib/bundler/man/bundle.1.ronn +111 -0
  129. data/lib/bundler/man/gemfile.5 +686 -0
  130. data/{man → lib/bundler/man}/gemfile.5.ronn +117 -95
  131. data/lib/bundler/man/index.txt +25 -0
  132. data/lib/bundler/match_platform.rb +15 -4
  133. data/lib/bundler/mirror.rb +223 -0
  134. data/lib/bundler/plugin.rb +330 -0
  135. data/lib/bundler/plugin/api.rb +81 -0
  136. data/lib/bundler/plugin/api/source.rb +304 -0
  137. data/lib/bundler/plugin/dsl.rb +53 -0
  138. data/lib/bundler/plugin/events.rb +61 -0
  139. data/lib/bundler/plugin/index.rb +182 -0
  140. data/lib/bundler/plugin/installer.rb +109 -0
  141. data/lib/bundler/plugin/installer/git.rb +38 -0
  142. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  143. data/lib/bundler/plugin/source_list.rb +27 -0
  144. data/lib/bundler/process_lock.rb +24 -0
  145. data/lib/bundler/psyched_yaml.rb +2 -6
  146. data/lib/bundler/remote_specification.rb +42 -9
  147. data/lib/bundler/resolver.rb +312 -225
  148. data/lib/bundler/resolver/spec_group.rb +122 -0
  149. data/lib/bundler/retry.rb +11 -5
  150. data/lib/bundler/ruby_dsl.rb +9 -2
  151. data/lib/bundler/ruby_version.rb +84 -61
  152. data/lib/bundler/rubygems_ext.rb +92 -53
  153. data/lib/bundler/rubygems_gem_installer.rb +84 -0
  154. data/lib/bundler/rubygems_integration.rb +320 -395
  155. data/lib/bundler/runtime.rb +87 -75
  156. data/lib/bundler/settings.rb +297 -119
  157. data/lib/bundler/settings/validator.rb +102 -0
  158. data/lib/bundler/setup.rb +13 -12
  159. data/lib/bundler/shared_helpers.rb +234 -53
  160. data/lib/bundler/similarity_detector.rb +5 -3
  161. data/lib/bundler/source.rb +63 -4
  162. data/lib/bundler/source/gemspec.rb +18 -0
  163. data/lib/bundler/source/git.rb +97 -50
  164. data/lib/bundler/source/git/git_proxy.rb +138 -65
  165. data/lib/bundler/source/metadata.rb +67 -0
  166. data/lib/bundler/source/path.rb +83 -47
  167. data/lib/bundler/source/path/installer.rb +42 -11
  168. data/lib/bundler/source/rubygems.rb +231 -116
  169. data/lib/bundler/source/rubygems/remote.rb +30 -1
  170. data/lib/bundler/source_list.rb +103 -21
  171. data/lib/bundler/spec_set.rb +96 -51
  172. data/lib/bundler/stub_specification.rb +87 -4
  173. data/lib/bundler/templates/.document +1 -0
  174. data/lib/bundler/templates/Executable +14 -1
  175. data/lib/bundler/templates/Executable.bundler +114 -0
  176. data/lib/bundler/templates/Executable.standalone +6 -4
  177. data/lib/bundler/templates/Gemfile +4 -1
  178. data/lib/bundler/templates/gems.rb +8 -0
  179. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +79 -44
  180. data/lib/bundler/templates/newgem/Gemfile.tt +18 -2
  181. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  182. data/lib/bundler/templates/newgem/README.md.tt +16 -10
  183. data/lib/bundler/templates/newgem/Rakefile.tt +22 -8
  184. data/lib/bundler/templates/newgem/bin/console.tt +2 -1
  185. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  186. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  187. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  188. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  189. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  190. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  191. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  192. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +9 -6
  193. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +6 -4
  194. data/lib/bundler/templates/newgem/newgem.gemspec.tt +27 -28
  195. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  196. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  197. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +4 -4
  198. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -2
  199. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +3 -1
  200. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  201. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  202. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  203. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  204. data/lib/bundler/ui.rb +5 -3
  205. data/lib/bundler/ui/rg_proxy.rb +3 -1
  206. data/lib/bundler/ui/shell.rb +54 -21
  207. data/lib/bundler/ui/silent.rb +26 -1
  208. data/lib/bundler/uri_credentials_filter.rb +43 -0
  209. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
  210. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
  211. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
  212. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  213. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1764 -0
  214. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +11 -5
  215. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  216. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  217. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +113 -134
  218. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  219. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  220. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  221. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  222. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  223. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  224. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  225. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  226. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +158 -0
  227. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +82 -8
  228. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +4 -1
  229. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -0
  230. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +6 -2
  231. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +555 -150
  232. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +6 -3
  233. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +19 -12
  234. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +310 -467
  235. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  236. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  237. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  238. data/lib/bundler/vendor/thor/lib/thor.rb +58 -25
  239. data/lib/bundler/vendor/thor/lib/thor/actions.rb +50 -33
  240. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  241. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +5 -3
  242. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +9 -19
  243. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  244. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +79 -22
  245. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +33 -20
  246. data/lib/bundler/vendor/thor/lib/thor/base.rb +110 -67
  247. data/lib/bundler/vendor/thor/lib/thor/command.rb +33 -24
  248. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  249. data/lib/bundler/vendor/thor/lib/thor/error.rb +81 -3
  250. data/lib/bundler/vendor/thor/lib/thor/group.rb +16 -16
  251. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +5 -5
  252. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  253. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  254. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  255. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  256. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  257. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  258. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +18 -18
  259. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +60 -26
  260. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +31 -13
  261. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  262. data/lib/bundler/vendor/thor/lib/thor/runner.rb +42 -39
  263. data/lib/bundler/vendor/thor/lib/thor/shell.rb +5 -5
  264. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +109 -39
  265. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +7 -3
  266. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +5 -5
  267. data/lib/bundler/vendor/thor/lib/thor/util.rb +26 -9
  268. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  269. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  270. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  271. data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
  272. data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
  273. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  274. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
  275. data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
  276. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  277. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  278. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
  279. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
  280. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  281. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
  282. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  283. data/lib/bundler/vendored_fileutils.rb +4 -0
  284. data/lib/bundler/vendored_molinillo.rb +3 -1
  285. data/lib/bundler/vendored_persistent.rb +45 -9
  286. data/lib/bundler/vendored_thor.rb +8 -3
  287. data/lib/bundler/vendored_tmpdir.rb +4 -0
  288. data/lib/bundler/vendored_uri.rb +4 -0
  289. data/lib/bundler/version.rb +7 -4
  290. data/lib/bundler/version_ranges.rb +122 -0
  291. data/lib/bundler/vlad.rb +8 -2
  292. data/lib/bundler/worker.rb +38 -6
  293. data/lib/bundler/yaml_serializer.rb +89 -0
  294. metadata +164 -158
  295. data/.gitignore +0 -16
  296. data/.rspec +0 -3
  297. data/.rubocop.yml +0 -105
  298. data/.rubocop_todo.yml +0 -120
  299. data/.travis.yml +0 -97
  300. data/CODE_OF_CONDUCT.md +0 -42
  301. data/CONTRIBUTING.md +0 -32
  302. data/DEVELOPMENT.md +0 -118
  303. data/ISSUES.md +0 -96
  304. data/Rakefile +0 -309
  305. data/bin/rake +0 -14
  306. data/bin/rspec +0 -10
  307. data/bin/rubocop +0 -11
  308. data/exe/bundle_ruby +0 -60
  309. data/lib/bundler/cli/package.rb +0 -45
  310. data/lib/bundler/environment.rb +0 -41
  311. data/lib/bundler/gem_path_manipulation.rb +0 -8
  312. data/lib/bundler/gem_remote_fetcher.rb +0 -41
  313. data/lib/bundler/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  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/DigiCertHighAssuranceEVRootCA.pem +0 -23
  317. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  318. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  319. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -64
  320. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  321. data/lib/bundler/vendor/net/http/faster.rb +0 -26
  322. data/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb +0 -128
  323. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -10
  324. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -98
  325. data/man/bundle-config.ronn +0 -187
  326. data/man/bundle-update.ronn +0 -188
  327. data/man/bundle.ronn +0 -98
  328. data/man/index.txt +0 -8
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class FeatureFlag
5
+ def self.settings_flag(flag, &default)
6
+ unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
7
+ raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
8
+ end
9
+
10
+ settings_method("#{flag}?", flag, &default)
11
+ end
12
+ private_class_method :settings_flag
13
+
14
+ def self.settings_option(key, &default)
15
+ settings_method(key, key, &default)
16
+ end
17
+ private_class_method :settings_option
18
+
19
+ def self.settings_method(name, key, &default)
20
+ define_method(name) do
21
+ value = Bundler.settings[key]
22
+ value = instance_eval(&default) if value.nil?
23
+ value
24
+ end
25
+ end
26
+ private_class_method :settings_method
27
+
28
+ (1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }
29
+
30
+ settings_flag(:allow_bundler_dependency_conflicts) { bundler_3_mode? }
31
+ settings_flag(:allow_offline_install) { bundler_3_mode? }
32
+ settings_flag(:auto_clean_without_path) { bundler_3_mode? }
33
+ settings_flag(:cache_all) { bundler_3_mode? }
34
+ settings_flag(:default_install_uses_path) { bundler_3_mode? }
35
+ settings_flag(:deployment_means_frozen) { bundler_3_mode? }
36
+ settings_flag(:disable_multisource) { bundler_3_mode? }
37
+ settings_flag(:forget_cli_options) { bundler_3_mode? }
38
+ settings_flag(:global_gem_cache) { bundler_3_mode? }
39
+ settings_flag(:only_update_to_newer_versions) { bundler_3_mode? }
40
+ settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
41
+ settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
42
+ settings_flag(:print_only_version_number) { bundler_3_mode? }
43
+ settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
44
+ settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
45
+ settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
46
+ settings_flag(:update_requires_all_flag) { bundler_4_mode? }
47
+ settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
48
+
49
+ settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
50
+
51
+ def initialize(bundler_version)
52
+ @bundler_version = Gem::Version.create(bundler_version)
53
+ end
54
+
55
+ def major_version
56
+ @bundler_version.segments.first
57
+ end
58
+ private :major_version
59
+ end
60
+ end
@@ -1,22 +1,29 @@
1
- require "bundler/vendored_persistent"
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "vendored_persistent"
2
4
  require "cgi"
3
5
  require "securerandom"
4
6
  require "zlib"
7
+ require "rubygems/request"
5
8
 
6
9
  module Bundler
7
10
  # Handles all the fetching with the rubygems server
8
11
  class Fetcher
9
- autoload :Downloader, "bundler/fetcher/downloader"
10
- autoload :Dependency, "bundler/fetcher/dependency"
11
- autoload :Index, "bundler/fetcher/index"
12
+ autoload :CompactIndex, File.expand_path("fetcher/compact_index", __dir__)
13
+ autoload :Downloader, File.expand_path("fetcher/downloader", __dir__)
14
+ autoload :Dependency, File.expand_path("fetcher/dependency", __dir__)
15
+ autoload :Index, File.expand_path("fetcher/index", __dir__)
12
16
 
13
17
  # This error is raised when it looks like the network is down
14
18
  class NetworkDownError < HTTPError; end
19
+ # This error is raised if we should rate limit our requests to the API
20
+ class TooManyRequestsError < HTTPError; end
15
21
  # This error is raised if the API returns a 413 (only printed in verbose)
16
22
  class FallbackError < HTTPError; end
17
23
  # This is the error raised if OpenSSL fails the cert verification
18
24
  class CertificateFailureError < HTTPError
19
25
  def initialize(remote_uri)
26
+ remote_uri = filter_uri(remote_uri)
20
27
  super "Could not verify the SSL certificate for #{remote_uri}.\nThere" \
21
28
  " is a chance you are experiencing a man-in-the-middle attack, but" \
22
29
  " most likely your system doesn't have the CA certificates needed" \
@@ -37,14 +44,16 @@ module Bundler
37
44
  # This error is raised if HTTP authentication is required, but not provided.
38
45
  class AuthenticationRequiredError < HTTPError
39
46
  def initialize(remote_uri)
47
+ remote_uri = filter_uri(remote_uri)
40
48
  super "Authentication is required for #{remote_uri}.\n" \
41
49
  "Please supply credentials for this source. You can do this by running:\n" \
42
- " bundle config #{remote_uri} username:password"
50
+ " bundle config set --global #{remote_uri} username:password"
43
51
  end
44
52
  end
45
53
  # This error is raised if HTTP authentication is provided, but incorrect.
46
54
  class BadAuthenticationError < HTTPError
47
55
  def initialize(remote_uri)
56
+ remote_uri = filter_uri(remote_uri)
48
57
  super "Bad username or password for #{remote_uri}.\n" \
49
58
  "Please double-check your credentials and correct them."
50
59
  end
@@ -52,10 +61,17 @@ module Bundler
52
61
 
53
62
  # Exceptions classes that should bypass retry attempts. If your password didn't work the
54
63
  # first time, it's not going to the third time.
55
- AUTH_ERRORS = [AuthenticationRequiredError, BadAuthenticationError, Net::HTTPBadGateway,
56
- Net::HTTPBadRequest, Net::HTTPForbidden, Net::HTTPMethodNotAllowed,
57
- Net::HTTPMovedPermanently, Net::HTTPNotImplemented, Net::HTTPNotFound,
58
- Net::HTTPRequestEntityTooLarge, Net::HTTPNoContent]
64
+ NET_ERRORS = [:HTTPBadGateway, :HTTPBadRequest, :HTTPFailedDependency,
65
+ :HTTPForbidden, :HTTPInsufficientStorage, :HTTPMethodNotAllowed,
66
+ :HTTPMovedPermanently, :HTTPNoContent, :HTTPNotFound,
67
+ :HTTPNotImplemented, :HTTPPreconditionFailed, :HTTPRequestEntityTooLarge,
68
+ :HTTPRequestURITooLong, :HTTPUnauthorized, :HTTPUnprocessableEntity,
69
+ :HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze
70
+ FAIL_ERRORS = begin
71
+ fail_errors = [AuthenticationRequiredError, BadAuthenticationError, FallbackError]
72
+ fail_errors << Gem::Requirement::BadRequirementError if defined?(Gem::Requirement::BadRequirementError)
73
+ fail_errors.concat(NET_ERRORS.map {|e| SharedHelpers.const_get_safely(e, Net) }.compact)
74
+ end.freeze
59
75
 
60
76
  class << self
61
77
  attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries
@@ -81,13 +97,14 @@ module Bundler
81
97
  spec -= [nil, "ruby", ""]
82
98
  spec_file_name = "#{spec.join "-"}.gemspec"
83
99
 
84
- uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
100
+ uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
85
101
  if uri.scheme == "file"
86
- Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path))
102
+ path = Bundler.rubygems.correct_for_windows_path(uri.path)
103
+ Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
87
104
  elsif cached_spec_path = gemspec_cached_path(spec_file_name)
88
105
  Bundler.load_gemspec(cached_spec_path)
89
106
  else
90
- Bundler.load_marshal Gem.inflate(downloader.fetch uri)
107
+ Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
91
108
  end
92
109
  rescue MarshalError
93
110
  raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
@@ -96,7 +113,7 @@ module Bundler
96
113
 
97
114
  # return the specs in the bundler format as an index with retries
98
115
  def specs_with_retry(gem_names, source)
99
- Bundler::Retry.new("fetcher").attempts do
116
+ Bundler::Retry.new("fetcher", FAIL_ERRORS).attempts do
100
117
  specs(gem_names, source)
101
118
  end
102
119
  end
@@ -106,20 +123,25 @@ module Bundler
106
123
  old = Bundler.rubygems.sources
107
124
  index = Bundler::Index.new
108
125
 
109
- specs = {}
110
- fetchers.dup.each do |f|
111
- break unless f.api_fetcher? && !gem_names || !specs = f.specs(gem_names)
112
- fetchers.delete(f)
126
+ if Bundler::Fetcher.disable_endpoint
127
+ @use_api = false
128
+ specs = fetchers.last.specs(gem_names)
129
+ else
130
+ specs = []
131
+ fetchers.shift until fetchers.first.available? || fetchers.empty?
132
+ fetchers.dup.each do |f|
133
+ break unless f.api_fetcher? && !gem_names || !specs = f.specs(gem_names)
134
+ fetchers.delete(f)
135
+ end
136
+ @use_api = false if fetchers.none?(&:api_fetcher?)
113
137
  end
114
- @use_api = false if fetchers.none?(&:api_fetcher?)
115
138
 
116
- specs[remote_uri].each do |name, version, platform, dependencies|
139
+ specs.each do |name, version, platform, dependencies, metadata|
117
140
  next if name == "bundler"
118
- spec = nil
119
- if dependencies
120
- spec = EndpointSpecification.new(name, version, platform, dependencies)
141
+ spec = if dependencies
142
+ EndpointSpecification.new(name, version, platform, dependencies, metadata)
121
143
  else
122
- spec = RemoteSpecification.new(name, version, platform, self)
144
+ RemoteSpecification.new(name, version, platform, self)
123
145
  end
124
146
  spec.source = source
125
147
  spec.remote = @remote
@@ -137,32 +159,33 @@ module Bundler
137
159
  def use_api
138
160
  return @use_api if defined?(@use_api)
139
161
 
140
- if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
141
- @use_api = false
162
+ fetchers.shift until fetchers.first.available?
163
+
164
+ @use_api = if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
165
+ false
142
166
  else
143
- fetchers.reject! {|f| f.api_fetcher? && !f.api_available? }
144
- @use_api = fetchers.any?(&:api_fetcher?)
167
+ fetchers.first.api_fetcher?
145
168
  end
146
169
  end
147
170
 
148
171
  def user_agent
149
172
  @user_agent ||= begin
150
- ruby = Bundler.ruby_version
173
+ ruby = Bundler::RubyVersion.system
151
174
 
152
- agent = "bundler/#{Bundler::VERSION}"
175
+ agent = String.new("bundler/#{Bundler::VERSION}")
153
176
  agent << " rubygems/#{Gem::VERSION}"
154
- agent << " ruby/#{ruby.version}"
177
+ agent << " ruby/#{ruby.versions_string(ruby.versions)}"
155
178
  agent << " (#{ruby.host})"
156
179
  agent << " command/#{ARGV.first}"
157
180
 
158
181
  if ruby.engine != "ruby"
159
182
  # engine_version raises on unknown engines
160
183
  engine_version = begin
161
- ruby.engine_version
162
- rescue
184
+ ruby.engine_versions
185
+ rescue RuntimeError
163
186
  "???"
164
187
  end
165
- agent << " #{ruby.engine}/#{engine_version}"
188
+ agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
166
189
  end
167
190
 
168
191
  agent << " options/#{Bundler.settings.all.join(",")}"
@@ -185,18 +208,17 @@ module Bundler
185
208
  end
186
209
 
187
210
  def http_proxy
188
- if uri = connection.proxy_uri
189
- uri.to_s
190
- end
211
+ return unless uri = connection.proxy_uri
212
+ uri.to_s
191
213
  end
192
214
 
193
215
  def inspect
194
216
  "#<#{self.class}:0x#{object_id} uri=#{uri}>"
195
217
  end
196
218
 
197
- private
219
+ private
198
220
 
199
- FETCHERS = [Dependency, Index]
221
+ FETCHERS = [CompactIndex, Dependency, Index].freeze
200
222
 
201
223
  def cis
202
224
  env_cis = {
@@ -207,8 +229,9 @@ module Bundler
207
229
  "BUILDBOX" => "buildbox",
208
230
  "GO_SERVER_URL" => "go",
209
231
  "SNAP_CI" => "snap",
232
+ "GITLAB_CI" => "gitlab",
210
233
  "CI_NAME" => ENV["CI_NAME"],
211
- "CI" => "ci"
234
+ "CI" => "ci",
212
235
  }
213
236
  env_cis.find_all {|env, _| ENV[env] }.map {|_, ci| ci }
214
237
  end
@@ -220,9 +243,9 @@ module Bundler
220
243
  Bundler.settings[:ssl_client_cert]
221
244
  raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)
222
245
 
223
- con = Net::HTTP::Persistent.new "bundler", :ENV
246
+ con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
224
247
  if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
225
- con.proxy = URI.parse(gem_proxy)
248
+ con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
226
249
  end
227
250
 
228
251
  if remote_uri.scheme == "https"
@@ -231,13 +254,17 @@ module Bundler
231
254
  con.cert_store = bundler_cert_store
232
255
  end
233
256
 
234
- if Bundler.settings[:ssl_client_cert]
235
- pem = File.read(Bundler.settings[:ssl_client_cert])
257
+ ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
258
+ (Bundler.rubygems.configuration.ssl_client_cert if
259
+ Bundler.rubygems.configuration.respond_to?(:ssl_client_cert))
260
+ if ssl_client_cert
261
+ pem = File.read(ssl_client_cert)
236
262
  con.cert = OpenSSL::X509::Certificate.new(pem)
237
263
  con.key = OpenSSL::PKey::RSA.new(pem)
238
264
  end
239
265
 
240
266
  con.read_timeout = Fetcher.api_timeout
267
+ con.open_timeout = Fetcher.api_timeout
241
268
  con.override_headers["User-Agent"] = user_agent
242
269
  con.override_headers["X-Gemfile-Source"] = @remote.original_uri.to_s if @remote.original_uri
243
270
  con
@@ -255,26 +282,28 @@ module Bundler
255
282
  Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
256
283
  Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
257
284
  Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
258
- Net::HTTP::Persistent::Error, Zlib::BufError
259
- ]
285
+ PersistentHTTP::Error, Zlib::BufError, Errno::EHOSTUNREACH
286
+ ].freeze
260
287
 
261
288
  def bundler_cert_store
262
289
  store = OpenSSL::X509::Store.new
263
- if Bundler.settings[:ssl_ca_cert]
264
- if File.directory? Bundler.settings[:ssl_ca_cert]
265
- store.add_path Bundler.settings[:ssl_ca_cert]
290
+ ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
291
+ (Bundler.rubygems.configuration.ssl_ca_cert if
292
+ Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert))
293
+ if ssl_ca_cert
294
+ if File.directory? ssl_ca_cert
295
+ store.add_path ssl_ca_cert
266
296
  else
267
- store.add_file Bundler.settings[:ssl_ca_cert]
297
+ store.add_file ssl_ca_cert
268
298
  end
269
299
  else
270
300
  store.set_default_paths
271
- certs = File.expand_path("../ssl_certs/*.pem", __FILE__)
272
- Dir.glob(certs).each {|c| store.add_file c }
301
+ Gem::Request.get_cert_files.each {|c| store.add_file c }
273
302
  end
274
303
  store
275
304
  end
276
305
 
277
- private
306
+ private
278
307
 
279
308
  def remote_uri
280
309
  @remote.uri
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class Fetcher
3
5
  class Base
@@ -20,7 +22,7 @@ module Bundler
20
22
  @fetch_uri ||= begin
21
23
  if remote_uri.host == "rubygems.org"
22
24
  uri = remote_uri.dup
23
- uri.host = "bundler.rubygems.org"
25
+ uri.host = "index.rubygems.org"
24
26
  uri
25
27
  else
26
28
  remote_uri
@@ -28,13 +30,23 @@ module Bundler
28
30
  end
29
31
  end
30
32
 
31
- def api_available?
32
- api_fetcher?
33
+ def available?
34
+ true
33
35
  end
34
36
 
35
37
  def api_fetcher?
36
38
  false
37
39
  end
40
+
41
+ private
42
+
43
+ def log_specs(debug_msg)
44
+ if Bundler.ui.debug?
45
+ Bundler.ui.debug debug_msg
46
+ else
47
+ Bundler.ui.info ".", false
48
+ end
49
+ end
38
50
  end
39
51
  end
40
52
  end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+ require_relative "../worker"
5
+
6
+ module Bundler
7
+ autoload :CompactIndexClient, File.expand_path("../compact_index_client", __dir__)
8
+
9
+ class Fetcher
10
+ class CompactIndex < Base
11
+ def self.compact_index_request(method_name)
12
+ method = instance_method(method_name)
13
+ undef_method(method_name)
14
+ define_method(method_name) do |*args, &blk|
15
+ begin
16
+ method.bind(self).call(*args, &blk)
17
+ rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
18
+ raise HTTPError, e.message
19
+ rescue AuthenticationRequiredError
20
+ # Fail since we got a 401 from the server.
21
+ raise
22
+ rescue HTTPError => e
23
+ Bundler.ui.trace(e)
24
+ nil
25
+ end
26
+ end
27
+ end
28
+
29
+ def specs(gem_names)
30
+ specs_for_names(gem_names)
31
+ end
32
+ compact_index_request :specs
33
+
34
+ def specs_for_names(gem_names)
35
+ gem_info = []
36
+ complete_gems = []
37
+ remaining_gems = gem_names.dup
38
+
39
+ until remaining_gems.empty?
40
+ log_specs "Looking up gems #{remaining_gems.inspect}"
41
+
42
+ deps = begin
43
+ parallel_compact_index_client.dependencies(remaining_gems)
44
+ rescue TooManyRequestsError
45
+ @bundle_worker.stop if @bundle_worker
46
+ @bundle_worker = nil # reset it. Not sure if necessary
47
+ serial_compact_index_client.dependencies(remaining_gems)
48
+ end
49
+ next_gems = deps.map {|d| d[3].map(&:first).flatten(1) }.flatten(1).uniq
50
+ deps.each {|dep| gem_info << dep }
51
+ complete_gems.concat(deps.map(&:first)).uniq!
52
+ remaining_gems = next_gems - complete_gems
53
+ end
54
+ @bundle_worker.stop if @bundle_worker
55
+ @bundle_worker = nil # reset it. Not sure if necessary
56
+
57
+ gem_info
58
+ end
59
+
60
+ def fetch_spec(spec)
61
+ spec -= [nil, "ruby", ""]
62
+ contents = compact_index_client.spec(*spec)
63
+ return nil if contents.nil?
64
+ contents.unshift(spec.first)
65
+ contents[3].map! {|d| Gem::Dependency.new(*d) }
66
+ EndpointSpecification.new(*contents)
67
+ end
68
+ compact_index_request :fetch_spec
69
+
70
+ def available?
71
+ return nil unless SharedHelpers.md5_available?
72
+ user_home = Bundler.user_home
73
+ return nil unless user_home.directory? && user_home.writable?
74
+ # Read info file checksums out of /versions, so we can know if gems are up to date
75
+ fetch_uri.scheme != "file" && compact_index_client.update_and_parse_checksums!
76
+ rescue CompactIndexClient::Updater::MisMatchedChecksumError => e
77
+ Bundler.ui.debug(e.message)
78
+ nil
79
+ end
80
+ compact_index_request :available?
81
+
82
+ def api_fetcher?
83
+ true
84
+ end
85
+
86
+ private
87
+
88
+ def compact_index_client
89
+ @compact_index_client ||=
90
+ SharedHelpers.filesystem_access(cache_path) do
91
+ CompactIndexClient.new(cache_path, client_fetcher)
92
+ end
93
+ end
94
+
95
+ def parallel_compact_index_client
96
+ compact_index_client.execution_mode = lambda do |inputs, &blk|
97
+ func = lambda {|object, _index| blk.call(object) }
98
+ worker = bundle_worker(func)
99
+ inputs.each {|input| worker.enq(input) }
100
+ inputs.map { worker.deq }
101
+ end
102
+
103
+ compact_index_client
104
+ end
105
+
106
+ def serial_compact_index_client
107
+ compact_index_client.sequential_execution_mode!
108
+ compact_index_client
109
+ end
110
+
111
+ def bundle_worker(func = nil)
112
+ @bundle_worker ||= begin
113
+ worker_name = "Compact Index (#{display_uri.host})"
114
+ Bundler::Worker.new(Bundler.current_ruby.rbx? ? 1 : 25, worker_name, func)
115
+ end
116
+ @bundle_worker.tap do |worker|
117
+ worker.instance_variable_set(:@func, func) if func
118
+ end
119
+ end
120
+
121
+ def cache_path
122
+ Bundler.user_cache.join("compact_index", remote.cache_slug)
123
+ end
124
+
125
+ def client_fetcher
126
+ ClientFetcher.new(self, Bundler.ui)
127
+ end
128
+
129
+ ClientFetcher = Struct.new(:fetcher, :ui) do
130
+ def call(path, headers)
131
+ fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
132
+ rescue NetworkDownError => e
133
+ raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"]
134
+ ui.warn "Using the cached data for the new index because of a network error: #{e}"
135
+ Net::HTTPNotModified.new(nil, nil, nil)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end