bundler 1.17.2 → 2.2.33

Sign up to get free protection for your applications and to get access to all the features.
Files changed (322) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2095 -1251
  3. data/LICENSE.md +18 -19
  4. data/README.md +10 -11
  5. data/bundler.gemspec +10 -28
  6. data/exe/bundle +22 -3
  7. data/lib/bundler/build_metadata.rb +4 -12
  8. data/lib/bundler/capistrano.rb +4 -4
  9. data/lib/bundler/cli/add.rb +28 -16
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +24 -17
  12. data/lib/bundler/cli/check.rb +4 -2
  13. data/lib/bundler/cli/clean.rb +1 -1
  14. data/lib/bundler/cli/common.rb +39 -13
  15. data/lib/bundler/cli/config.rb +161 -86
  16. data/lib/bundler/cli/console.rb +1 -1
  17. data/lib/bundler/cli/doctor.rb +20 -9
  18. data/lib/bundler/cli/exec.rb +8 -25
  19. data/lib/bundler/cli/fund.rb +36 -0
  20. data/lib/bundler/cli/gem.rb +213 -32
  21. data/lib/bundler/cli/info.rb +42 -7
  22. data/lib/bundler/cli/init.rb +2 -2
  23. data/lib/bundler/cli/inject.rb +1 -1
  24. data/lib/bundler/cli/install.rb +34 -44
  25. data/lib/bundler/cli/issue.rb +8 -7
  26. data/lib/bundler/cli/list.rb +19 -11
  27. data/lib/bundler/cli/lock.rb +5 -1
  28. data/lib/bundler/cli/open.rb +11 -8
  29. data/lib/bundler/cli/outdated.rb +142 -118
  30. data/lib/bundler/cli/plugin.rb +19 -2
  31. data/lib/bundler/cli/pristine.rb +6 -1
  32. data/lib/bundler/cli/remove.rb +1 -2
  33. data/lib/bundler/cli/show.rb +2 -2
  34. data/lib/bundler/cli/update.rb +43 -16
  35. data/lib/bundler/cli.rb +211 -150
  36. data/lib/bundler/compact_index_client/cache.rb +6 -14
  37. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  38. data/lib/bundler/compact_index_client/updater.rb +15 -28
  39. data/lib/bundler/compact_index_client.rb +28 -12
  40. data/lib/bundler/current_ruby.rb +14 -11
  41. data/lib/bundler/definition.rb +207 -368
  42. data/lib/bundler/dep_proxy.rb +16 -9
  43. data/lib/bundler/dependency.rb +19 -14
  44. data/lib/bundler/deployment.rb +1 -1
  45. data/lib/bundler/digest.rb +71 -0
  46. data/lib/bundler/dsl.rb +81 -81
  47. data/lib/bundler/endpoint_specification.rb +1 -1
  48. data/lib/bundler/env.rb +9 -14
  49. data/lib/bundler/environment_preserver.rb +29 -3
  50. data/lib/bundler/errors.rb +20 -3
  51. data/lib/bundler/feature_flag.rb +14 -33
  52. data/lib/bundler/fetcher/base.rb +1 -1
  53. data/lib/bundler/fetcher/compact_index.rb +28 -14
  54. data/lib/bundler/fetcher/dependency.rb +1 -1
  55. data/lib/bundler/fetcher/downloader.rb +14 -8
  56. data/lib/bundler/fetcher/index.rb +8 -8
  57. data/lib/bundler/fetcher.rb +22 -17
  58. data/lib/bundler/friendly_errors.rb +29 -48
  59. data/lib/bundler/gem_helper.rb +79 -43
  60. data/lib/bundler/gem_helpers.rb +38 -29
  61. data/lib/bundler/gem_tasks.rb +1 -1
  62. data/lib/bundler/gem_version_promoter.rb +5 -5
  63. data/lib/bundler/graph.rb +3 -3
  64. data/lib/bundler/index.rb +9 -9
  65. data/lib/bundler/injector.rb +33 -13
  66. data/lib/bundler/inline.rb +41 -30
  67. data/lib/bundler/installer/gem_installer.rb +9 -18
  68. data/lib/bundler/installer/parallel_installer.rb +50 -33
  69. data/lib/bundler/installer/standalone.rb +30 -11
  70. data/lib/bundler/installer.rb +39 -66
  71. data/lib/bundler/lazy_specification.rb +63 -28
  72. data/lib/bundler/lockfile_generator.rb +1 -1
  73. data/lib/bundler/lockfile_parser.rb +19 -52
  74. data/lib/bundler/{ssl_certs → man}/.document +0 -0
  75. data/{man → lib/bundler/man}/bundle-add.1 +10 -2
  76. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +7 -1
  77. data/{man → lib/bundler/man}/bundle-binstubs.1 +6 -4
  78. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +3 -5
  79. data/lib/bundler/man/bundle-cache.1 +55 -0
  80. data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +15 -15
  81. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  82. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  83. data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  84. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  85. data/{man → lib/bundler/man}/bundle-config.1 +59 -60
  86. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +77 -78
  87. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  88. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  89. data/{man → lib/bundler/man}/bundle-exec.1 +2 -2
  90. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +1 -1
  91. data/{man → lib/bundler/man}/bundle-gem.1 +38 -3
  92. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +46 -7
  93. data/{man → lib/bundler/man}/bundle-info.1 +1 -1
  94. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  95. data/{man → lib/bundler/man}/bundle-init.1 +2 -2
  96. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +1 -1
  97. data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  98. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  99. data/{man → lib/bundler/man}/bundle-install.1 +37 -7
  100. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +34 -7
  101. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  102. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  103. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  104. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  105. data/{man → lib/bundler/man}/bundle-open.1 +1 -1
  106. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  107. data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  108. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  109. data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  110. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  111. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  112. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  113. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  114. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  115. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  116. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  117. data/{man → lib/bundler/man}/bundle-update.1 +7 -7
  118. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +6 -6
  119. data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  120. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  121. data/{man → lib/bundler/man}/bundle.1 +7 -3
  122. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +5 -2
  123. data/{man → lib/bundler/man}/gemfile.5 +44 -21
  124. data/{man → lib/bundler/man}/gemfile.5.ronn +24 -20
  125. data/{man → lib/bundler/man}/index.txt +1 -1
  126. data/lib/bundler/match_platform.rb +1 -1
  127. data/lib/bundler/mirror.rb +5 -5
  128. data/lib/bundler/plugin/api/source.rb +27 -7
  129. data/lib/bundler/plugin/api.rb +1 -1
  130. data/lib/bundler/plugin/dsl.rb +1 -1
  131. data/lib/bundler/plugin/index.rb +27 -4
  132. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  133. data/lib/bundler/plugin/installer.rb +35 -22
  134. data/lib/bundler/plugin/source_list.rb +5 -1
  135. data/lib/bundler/plugin.rb +100 -42
  136. data/lib/bundler/psyched_yaml.rb +0 -15
  137. data/lib/bundler/remote_specification.rb +5 -4
  138. data/lib/bundler/resolver/spec_group.rb +57 -53
  139. data/lib/bundler/resolver.rb +127 -113
  140. data/lib/bundler/retry.rb +4 -4
  141. data/lib/bundler/ruby_version.rb +5 -20
  142. data/lib/bundler/rubygems_ext.rb +103 -79
  143. data/lib/bundler/rubygems_gem_installer.rb +69 -8
  144. data/lib/bundler/rubygems_integration.rb +181 -446
  145. data/lib/bundler/runtime.rb +24 -34
  146. data/lib/bundler/settings.rb +159 -110
  147. data/lib/bundler/setup.rb +11 -12
  148. data/lib/bundler/shared_helpers.rb +56 -90
  149. data/lib/bundler/similarity_detector.rb +3 -3
  150. data/lib/bundler/source/git/git_proxy.rb +106 -105
  151. data/lib/bundler/source/git.rb +66 -39
  152. data/lib/bundler/source/metadata.rb +9 -9
  153. data/lib/bundler/source/path/installer.rb +10 -10
  154. data/lib/bundler/source/path.rb +23 -12
  155. data/lib/bundler/source/rubygems/remote.rb +3 -4
  156. data/lib/bundler/source/rubygems.rb +136 -120
  157. data/lib/bundler/source/rubygems_aggregate.rb +68 -0
  158. data/lib/bundler/source.rb +27 -6
  159. data/lib/bundler/source_list.rb +101 -66
  160. data/lib/bundler/source_map.rb +58 -0
  161. data/lib/bundler/spec_set.rb +49 -53
  162. data/lib/bundler/stub_specification.rb +40 -34
  163. data/lib/bundler/templates/Executable.bundler +24 -15
  164. data/lib/bundler/templates/Gemfile +1 -1
  165. data/lib/bundler/templates/gems.rb +1 -1
  166. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  167. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  168. data/lib/bundler/templates/newgem/Gemfile.tt +19 -2
  169. data/lib/bundler/templates/newgem/README.md.tt +7 -5
  170. data/lib/bundler/templates/newgem/Rakefile.tt +23 -5
  171. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  172. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  173. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  174. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +27 -0
  175. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  176. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  177. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  178. data/lib/bundler/templates/newgem/newgem.gemspec.tt +29 -40
  179. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  180. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  181. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  182. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  183. data/lib/bundler/templates/newgem/standard.yml.tt +2 -0
  184. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  185. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  186. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  187. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  188. data/lib/bundler/templates/newgem/travis.yml.tt +0 -1
  189. data/lib/bundler/ui/rg_proxy.rb +1 -1
  190. data/lib/bundler/ui/shell.rb +7 -11
  191. data/lib/bundler/ui.rb +3 -3
  192. data/lib/bundler/uri_credentials_filter.rb +10 -4
  193. data/lib/bundler/vendor/.document +1 -0
  194. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  195. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  196. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  197. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
  198. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +126 -0
  199. data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  200. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +273 -147
  201. data/lib/bundler/vendor/molinillo/LICENSE +9 -0
  202. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  203. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  204. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  205. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  206. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  207. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +6 -6
  208. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  209. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -3
  210. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +39 -11
  211. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +38 -6
  212. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +4 -4
  213. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  214. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
  215. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +53 -51
  216. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -2
  217. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +5 -6
  218. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  219. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  220. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  221. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  222. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +302 -462
  223. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  224. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  225. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +3 -2
  226. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
  227. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +20 -9
  228. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +19 -8
  229. data/lib/bundler/vendor/thor/lib/thor/actions.rb +28 -13
  230. data/lib/bundler/vendor/thor/lib/thor/base.rb +63 -43
  231. data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
  232. data/lib/bundler/vendor/thor/lib/thor/error.rb +78 -0
  233. data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
  234. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
  235. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
  236. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  237. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  238. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  239. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +7 -3
  240. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +20 -7
  241. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +21 -5
  242. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  243. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  244. data/lib/bundler/vendor/thor/lib/thor/runner.rb +15 -14
  245. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +65 -8
  246. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +10 -2
  247. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -3
  248. data/lib/bundler/vendor/thor/lib/thor/shell.rb +4 -4
  249. data/lib/bundler/vendor/thor/lib/thor/util.rb +18 -2
  250. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  251. data/lib/bundler/vendor/thor/lib/thor.rb +16 -9
  252. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  253. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  254. data/lib/bundler/vendor/tsort/lib/tsort.rb +453 -0
  255. data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  256. data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
  257. data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
  258. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  259. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
  260. data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
  261. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  262. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  263. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
  264. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
  265. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  266. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
  267. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  268. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  269. data/lib/bundler/vendored_fileutils.rb +1 -6
  270. data/lib/bundler/vendored_molinillo.rb +1 -1
  271. data/lib/bundler/vendored_persistent.rb +7 -12
  272. data/lib/bundler/vendored_thor.rb +2 -2
  273. data/lib/bundler/vendored_tmpdir.rb +4 -0
  274. data/lib/bundler/vendored_tsort.rb +4 -0
  275. data/lib/bundler/vendored_uri.rb +4 -0
  276. data/lib/bundler/version.rb +1 -20
  277. data/lib/bundler/version_ranges.rb +51 -5
  278. data/lib/bundler/vlad.rb +2 -2
  279. data/lib/bundler/worker.rb +21 -8
  280. data/lib/bundler/yaml_serializer.rb +3 -4
  281. data/lib/bundler.rb +248 -118
  282. metadata +115 -190
  283. data/exe/bundle_ruby +0 -60
  284. data/lib/bundler/cli/package.rb +0 -49
  285. data/lib/bundler/compatibility_guard.rb +0 -14
  286. data/lib/bundler/gem_remote_fetcher.rb +0 -43
  287. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  288. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  289. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  290. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  291. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  292. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  293. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  294. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
  295. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
  296. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
  297. data/man/bundle-add.1.txt +0 -52
  298. data/man/bundle-binstubs.1.txt +0 -48
  299. data/man/bundle-check.1.txt +0 -33
  300. data/man/bundle-clean.1.txt +0 -26
  301. data/man/bundle-config.1.txt +0 -529
  302. data/man/bundle-doctor.1.txt +0 -44
  303. data/man/bundle-exec.1.txt +0 -178
  304. data/man/bundle-gem.1.txt +0 -91
  305. data/man/bundle-info.1.txt +0 -21
  306. data/man/bundle-init.1.txt +0 -34
  307. data/man/bundle-inject.1.txt +0 -32
  308. data/man/bundle-install.1.txt +0 -396
  309. data/man/bundle-list.1.txt +0 -43
  310. data/man/bundle-lock.1.txt +0 -93
  311. data/man/bundle-open.1.txt +0 -29
  312. data/man/bundle-outdated.1.txt +0 -131
  313. data/man/bundle-package.1 +0 -55
  314. data/man/bundle-package.1.txt +0 -79
  315. data/man/bundle-platform.1.txt +0 -57
  316. data/man/bundle-pristine.1.txt +0 -44
  317. data/man/bundle-remove.1.txt +0 -34
  318. data/man/bundle-show.1.txt +0 -27
  319. data/man/bundle-update.1.txt +0 -391
  320. data/man/bundle-viz.1.txt +0 -39
  321. data/man/bundle.1.txt +0 -113
  322. data/man/gemfile.5.txt +0 -653
@@ -1,38 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/compatibility_guard"
4
-
5
3
  require "pathname"
6
- require "rubygems"
7
-
8
- require "bundler/version"
9
- require "bundler/constants"
10
- require "bundler/rubygems_integration"
11
- require "bundler/current_ruby"
12
-
13
- module Gem
14
- class Dependency
15
- # This is only needed for RubyGems < 1.4
16
- unless method_defined? :requirement
17
- def requirement
18
- version_requirements
19
- end
20
- end
21
- end
22
- end
4
+ require "rbconfig"
5
+
6
+ require_relative "version"
7
+ require_relative "constants"
8
+ require_relative "rubygems_integration"
9
+ require_relative "current_ruby"
23
10
 
24
11
  module Bundler
25
12
  module SharedHelpers
26
13
  def root
27
14
  gemfile = find_gemfile
28
15
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
29
- Pathname.new(gemfile).untaint.expand_path.parent
16
+ Pathname.new(gemfile).tap{|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path.parent
30
17
  end
31
18
 
32
19
  def default_gemfile
33
- gemfile = find_gemfile(:order_matters)
20
+ gemfile = find_gemfile
34
21
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
35
- Pathname.new(gemfile).untaint.expand_path
22
+ Pathname.new(gemfile).tap{|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path
36
23
  end
37
24
 
38
25
  def default_lockfile
@@ -41,7 +28,7 @@ module Bundler
41
28
  case gemfile.basename.to_s
42
29
  when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked"))
43
30
  else Pathname.new("#{gemfile}.lock")
44
- end.untaint
31
+ end.tap{|x| x.untaint if RUBY_VERSION < "2.7" }
45
32
  end
46
33
 
47
34
  def default_bundle_dir
@@ -113,9 +100,7 @@ module Bundler
113
100
  #
114
101
  # @see {Bundler::PermissionError}
115
102
  def filesystem_access(path, action = :write, &block)
116
- # Use block.call instead of yield because of a bug in Ruby 2.2.2
117
- # See https://github.com/bundler/bundler/issues/5341 for details
118
- block.call(path.dup.untaint)
103
+ yield(path.dup.tap{|x| x.untaint if RUBY_VERSION < "2.7" })
119
104
  rescue Errno::EACCES
120
105
  raise PermissionError.new(path, action)
121
106
  rescue Errno::EAGAIN
@@ -139,41 +124,32 @@ module Bundler
139
124
  namespace.const_get(constant_name)
140
125
  end
141
126
 
142
- def major_deprecation(major_version, message)
143
- if Bundler.bundler_major_version >= major_version
144
- require "bundler/errors"
145
- raise DeprecatedError, "[REMOVED FROM #{major_version}.0] #{message}"
127
+ def major_deprecation(major_version, message, print_caller_location: false)
128
+ if print_caller_location
129
+ caller_location = caller_locations(2, 2).first
130
+ message = "#{message} (called at #{caller_location.path}:#{caller_location.lineno})"
131
+ end
132
+
133
+ bundler_major_version = Bundler.bundler_major_version
134
+ if bundler_major_version > major_version
135
+ require_relative "errors"
136
+ raise DeprecatedError, "[REMOVED] #{message}"
146
137
  end
147
138
 
148
- return unless prints_major_deprecations?
149
- @major_deprecation_ui ||= Bundler::UI::Shell.new("no-color" => true)
150
- ui = Bundler.ui.is_a?(@major_deprecation_ui.class) ? Bundler.ui : @major_deprecation_ui
151
- ui.warn("[DEPRECATED FOR #{major_version}.0] #{message}")
139
+ return unless bundler_major_version >= major_version && prints_major_deprecations?
140
+ Bundler.ui.warn("[DEPRECATED] #{message}")
152
141
  end
153
142
 
154
143
  def print_major_deprecations!
155
144
  multiple_gemfiles = search_up(".") do |dir|
156
145
  gemfiles = gemfile_names.select {|gf| File.file? File.expand_path(gf, dir) }
157
146
  next if gemfiles.empty?
158
- break false if gemfiles.size == 1
159
- end
160
- if multiple_gemfiles && Bundler.bundler_major_version == 1
161
- Bundler::SharedHelpers.major_deprecation 2, \
162
- "gems.rb and gems.locked will be preferred to Gemfile and Gemfile.lock."
163
- end
164
-
165
- if RUBY_VERSION < "2"
166
- major_deprecation(2, "Bundler will only support ruby >= 2.0, you are running #{RUBY_VERSION}")
167
- end
168
- return if Bundler.rubygems.provides?(">= 2")
169
- major_deprecation(2, "Bundler will only support rubygems >= 2.0, you are running #{Bundler.rubygems.version}")
170
- end
171
-
172
- def trap(signal, override = false, &block)
173
- prior = Signal.trap(signal) do
174
- block.call
175
- prior.call unless override
147
+ break gemfiles.size != 1
176
148
  end
149
+ return unless multiple_gemfiles
150
+ message = "Multiple gemfiles (gems.rb and Gemfile) detected. " \
151
+ "Make sure you remove Gemfile and Gemfile.lock since bundler is ignoring them in favor of gems.rb and gems.rb.locked."
152
+ Bundler.ui.warn message
177
153
  end
178
154
 
179
155
  def ensure_same_dependencies(spec, old_deps, new_deps)
@@ -211,11 +187,11 @@ module Bundler
211
187
  return @md5_available if defined?(@md5_available)
212
188
  @md5_available = begin
213
189
  require "openssl"
214
- OpenSSL::Digest::MD5.digest("")
190
+ ::OpenSSL::Digest.digest("MD5", "")
215
191
  true
216
192
  rescue LoadError
217
193
  true
218
- rescue OpenSSL::Digest::DigestError
194
+ rescue ::OpenSSL::Digest::DigestError
219
195
  false
220
196
  end
221
197
  end
@@ -229,7 +205,7 @@ module Bundler
229
205
  filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
230
206
  end
231
207
 
232
- private
208
+ private
233
209
 
234
210
  def validate_bundle_path
235
211
  path_separator = Bundler.rubygems.path_separator
@@ -243,16 +219,14 @@ module Bundler
243
219
  raise Bundler::PathError, message
244
220
  end
245
221
 
246
- def find_gemfile(order_matters = false)
222
+ def find_gemfile
247
223
  given = ENV["BUNDLE_GEMFILE"]
248
224
  return given if given && !given.empty?
249
- names = gemfile_names
250
- names.reverse! if order_matters && Bundler.feature_flag.prefer_gems_rb?
251
- find_file(*names)
225
+ find_file(*gemfile_names)
252
226
  end
253
227
 
254
228
  def gemfile_names
255
- ["Gemfile", "gems.rb"]
229
+ ["gems.rb", "Gemfile"]
256
230
  end
257
231
 
258
232
  def find_file(*names)
@@ -269,14 +243,14 @@ module Bundler
269
243
 
270
244
  def search_up(*names)
271
245
  previous = nil
272
- current = File.expand_path(SharedHelpers.pwd).untaint
246
+ current = File.expand_path(SharedHelpers.pwd).tap{|x| x.untaint if RUBY_VERSION < "2.7" }
273
247
 
274
248
  until !File.directory?(current) || current == previous
275
249
  if ENV["BUNDLE_SPEC_RUN"]
276
250
  # avoid stepping above the tmp directory when testing
277
- gemspec = if ENV["BUNDLE_RUBY"] && ENV["BUNDLE_GEM"]
251
+ gemspec = if ENV["GEM_COMMAND"]
278
252
  # for Ruby Core
279
- "lib/bundler.gemspec"
253
+ "lib/bundler/bundler.gemspec"
280
254
  else
281
255
  "bundler.gemspec"
282
256
  end
@@ -306,21 +280,17 @@ module Bundler
306
280
  public :set_env
307
281
 
308
282
  def set_bundle_variables
309
- begin
310
- exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
311
- unless File.exist?(exe_file)
312
- exe_file = File.expand_path("../../../exe/bundle", __FILE__)
313
- end
314
- Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
315
- rescue Gem::GemNotFoundException
316
- exe_file = File.expand_path("../../../exe/bundle", __FILE__)
317
- # for Ruby core repository
318
- exe_file = File.expand_path("../../../../bin/bundle", __FILE__) unless File.exist?(exe_file)
319
- Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
320
- end
283
+ # bundler exe & lib folders have same root folder, typical gem installation
284
+ exe_file = File.expand_path("../../../exe/bundle", __FILE__)
285
+
286
+ # for Ruby core repository testing
287
+ exe_file = File.expand_path("../../../libexec/bundle", __FILE__) unless File.exist?(exe_file)
288
+
289
+ # bundler is a default gem, exe path is separate
290
+ exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION) unless File.exist?(exe_file)
321
291
 
322
- # Set BUNDLE_GEMFILE
323
- Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile(:order_matters).to_s
292
+ Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
293
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
324
294
  Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
325
295
  end
326
296
 
@@ -333,14 +303,15 @@ module Bundler
333
303
 
334
304
  def set_rubyopt
335
305
  rubyopt = [ENV["RUBYOPT"]].compact
336
- return if !rubyopt.empty? && rubyopt.first =~ %r{-rbundler/setup}
337
- rubyopt.unshift %(-rbundler/setup)
306
+ setup_require = "-r#{File.expand_path("setup", __dir__)}"
307
+ return if !rubyopt.empty? && rubyopt.first =~ /#{setup_require}/
308
+ rubyopt.unshift setup_require
338
309
  Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
339
310
  end
340
311
 
341
312
  def set_rubylib
342
313
  rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR)
343
- rubylib.unshift bundler_ruby_lib
314
+ rubylib.unshift bundler_ruby_lib unless RbConfig::CONFIG["rubylibdir"] == bundler_ruby_lib
344
315
  Bundler::SharedHelpers.set_env "RUBYLIB", rubylib.uniq.join(File::PATH_SEPARATOR)
345
316
  end
346
317
 
@@ -349,15 +320,11 @@ module Bundler
349
320
  end
350
321
 
351
322
  def clean_load_path
352
- # handle 1.9 where system gems are always on the load path
353
- return unless defined?(::Gem)
354
-
355
- bundler_lib = bundler_ruby_lib
356
-
357
323
  loaded_gem_paths = Bundler.rubygems.loaded_gem_paths
358
324
 
359
325
  $LOAD_PATH.reject! do |p|
360
- next if resolve_path(p).start_with?(bundler_lib)
326
+ resolved_path = resolve_path(p)
327
+ next if $LOADED_FEATURES.any? {|lf| lf.start_with?(resolved_path) }
361
328
  loaded_gem_paths.delete(p)
362
329
  end
363
330
  $LOAD_PATH.uniq!
@@ -371,10 +338,9 @@ module Bundler
371
338
  end
372
339
 
373
340
  def prints_major_deprecations?
374
- require "bundler"
375
- deprecation_release = Bundler::VERSION.split(".").drop(1).include?("99")
376
- return false if !deprecation_release && !Bundler.settings[:major_deprecations]
377
- require "bundler/deprecate"
341
+ require_relative "../bundler"
342
+ return false if Bundler.settings[:silence_deprecations]
343
+ require_relative "deprecate"
378
344
  return false if Bundler::Deprecate.skip
379
345
  true
380
346
  end
@@ -26,9 +26,9 @@ module Bundler
26
26
  end
27
27
  end
28
28
 
29
- protected
29
+ protected
30
30
 
31
- # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36
31
+ # https://www.informit.com/articles/article.aspx?p=683059&seqNum=36
32
32
  def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1)
33
33
  # ins, del, sub are weighted costs
34
34
  return nil if this.nil?
@@ -51,7 +51,7 @@ module Bundler
51
51
  dm[i][j] = [
52
52
  dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub),
53
53
  dm[i][j - 1] + ins,
54
- dm[i - 1][j] + del
54
+ dm[i - 1][j] + del,
55
55
  ].min
56
56
  end
57
57
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "shellwords"
4
- require "tempfile"
5
3
  module Bundler
6
4
  class Source
7
5
  class Git
@@ -17,27 +15,31 @@ module Bundler
17
15
  class GitNotAllowedError < GitError
18
16
  def initialize(command)
19
17
  msg = String.new
20
- msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, "
21
- msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues "
18
+ msg << "Bundler is trying to run `#{command}` at runtime. You probably need to run `bundle install`. However, "
19
+ msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
22
20
  msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
23
21
  super msg
24
22
  end
25
23
  end
26
24
 
27
25
  class GitCommandError < GitError
28
- def initialize(command, path = nil, extra_info = nil)
26
+ attr_reader :command
27
+
28
+ def initialize(command, path, extra_info = nil)
29
+ @command = command
30
+
29
31
  msg = String.new
30
- msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed."
32
+ msg << "Git error: command `#{command}` in directory #{path} has failed."
31
33
  msg << "\n#{extra_info}" if extra_info
32
- msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist?
34
+ msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
33
35
  super msg
34
36
  end
35
37
  end
36
38
 
37
- class MissingGitRevisionError < GitError
38
- def initialize(ref, repo)
39
+ class MissingGitRevisionError < GitCommandError
40
+ def initialize(command, destination_path, ref, repo)
39
41
  msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
40
- super msg
42
+ super command, destination_path, msg
41
43
  end
42
44
  end
43
45
 
@@ -54,31 +56,22 @@ module Bundler
54
56
  @ref = ref
55
57
  @revision = revision
56
58
  @git = git
57
- raise GitNotInstalledError.new if allow? && !Bundler.git_present?
58
59
  end
59
60
 
60
61
  def revision
61
- return @revision if @revision
62
-
63
- begin
64
- @revision ||= find_local_revision
65
- rescue GitCommandError
66
- raise MissingGitRevisionError.new(ref, URICredentialsFilter.credential_filtered_uri(uri))
67
- end
68
-
69
- @revision
62
+ @revision ||= find_local_revision
70
63
  end
71
64
 
72
65
  def branch
73
- @branch ||= allowed_in_path do
74
- git("rev-parse --abbrev-ref HEAD").strip
66
+ @branch ||= allowed_with_path do
67
+ git("rev-parse", "--abbrev-ref", "HEAD", :dir => path).strip
75
68
  end
76
69
  end
77
70
 
78
71
  def contains?(commit)
79
- allowed_in_path do
80
- result = git_null("branch --contains #{commit}")
81
- $? == 0 && result =~ /^\* (.*)$/
72
+ allowed_with_path do
73
+ result, status = git_null("branch", "--contains", commit, :dir => path)
74
+ status.success? && result =~ /^\* (.*)$/
82
75
  end
83
76
  end
84
77
 
@@ -92,20 +85,22 @@ module Bundler
92
85
 
93
86
  def checkout
94
87
  return if path.exist? && has_revision_cached?
95
- extra_ref = "#{Shellwords.shellescape(ref)}:#{Shellwords.shellescape(ref)}" if ref && ref.start_with?("refs/")
88
+ extra_ref = "#{ref}:#{ref}" if ref && ref.start_with?("refs/")
96
89
 
97
90
  Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}"
98
91
 
92
+ configured_uri = configured_uri_for(uri).to_s
93
+
99
94
  unless path.exist?
100
95
  SharedHelpers.filesystem_access(path.dirname) do |p|
101
96
  FileUtils.mkdir_p(p)
102
97
  end
103
- git_retry %(clone #{uri_escaped_with_configured_credentials} "#{path}" --bare --no-hardlinks --quiet)
98
+ git_retry "clone", "--bare", "--no-hardlinks", "--quiet", "--", configured_uri, path.to_s
104
99
  return unless extra_ref
105
100
  end
106
101
 
107
- in_path do
108
- git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref})
102
+ with_path do
103
+ git_retry(*["fetch", "--force", "--quiet", "--tags", "--", configured_uri, "refs/heads/*:refs/heads/*", extra_ref].compact, :dir => path)
109
104
  end
110
105
  end
111
106
 
@@ -119,66 +114,69 @@ module Bundler
119
114
  SharedHelpers.filesystem_access(destination) do |p|
120
115
  FileUtils.rm_rf(p)
121
116
  end
122
- git_retry %(clone --no-checkout --quiet "#{path}" "#{destination}")
117
+ git_retry "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
123
118
  File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
124
119
  rescue Errno::EEXIST => e
125
- file_path = e.message[%r{.*?(/.*)}, 1]
120
+ file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
126
121
  raise GitError, "Bundler could not install a gem because it needs to " \
127
122
  "create a directory, but a file exists - #{file_path}. Please delete " \
128
123
  "this file and try again."
129
124
  end
130
125
  end
131
126
  # method 2
132
- SharedHelpers.chdir(destination) do
133
- git_retry %(fetch --force --quiet --tags "#{path}")
127
+ git_retry "fetch", "--force", "--quiet", "--tags", path.to_s, :dir => destination
134
128
 
135
- begin
136
- git "reset --hard #{@revision}"
137
- rescue GitCommandError
138
- raise MissingGitRevisionError.new(@revision, URICredentialsFilter.credential_filtered_uri(uri))
139
- end
129
+ begin
130
+ git "reset", "--hard", @revision, :dir => destination
131
+ rescue GitCommandError => e
132
+ raise MissingGitRevisionError.new(e.command, destination, @revision, URICredentialsFilter.credential_filtered_uri(uri))
133
+ end
140
134
 
141
- if submodules
142
- git_retry "submodule update --init --recursive"
143
- elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
144
- git_retry "submodule deinit --all --force"
145
- end
135
+ if submodules
136
+ git_retry "submodule", "update", "--init", "--recursive", :dir => destination
137
+ elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
138
+ inner_command = "git -C $toplevel submodule deinit --force $sm_path"
139
+ git_retry "submodule", "foreach", "--quiet", inner_command, :dir => destination
146
140
  end
147
141
  end
148
142
 
149
- private
143
+ private
144
+
145
+ def git_null(*command, dir: nil)
146
+ check_allowed(command)
147
+
148
+ out, status = SharedHelpers.with_clean_git_env do
149
+ capture_and_ignore_stderr(*capture3_args_for(command, dir))
150
+ end
150
151
 
151
- # TODO: Do not rely on /dev/null.
152
- # Given that open3 is not cross platform until Ruby 1.9.3,
153
- # the best solution is to pipe to /dev/null if it exists.
154
- # If it doesn't, everything will work fine, but the user
155
- # will get the $stderr messages as well.
156
- def git_null(command)
157
- git("#{command} 2>#{Bundler::NULL}", false)
152
+ [URICredentialsFilter.credential_filtered_string(out, uri), status]
158
153
  end
159
154
 
160
- def git_retry(command)
161
- Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do
162
- git(command)
155
+ def git_retry(*command, dir: nil)
156
+ command_with_no_credentials = check_allowed(command)
157
+
158
+ Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
159
+ git(*command, :dir => dir)
163
160
  end
164
161
  end
165
162
 
166
- def git(command, check_errors = true, error_msg = nil)
167
- command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
168
- raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
163
+ def git(*command, dir: nil)
164
+ command_with_no_credentials = check_allowed(command)
169
165
 
170
- out = SharedHelpers.with_clean_git_env do
171
- capture_and_filter_stderr(uri) { `git #{command}` }
166
+ out, status = SharedHelpers.with_clean_git_env do
167
+ capture_and_filter_stderr(*capture3_args_for(command, dir))
172
168
  end
173
169
 
174
- stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri)
175
- raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success?
176
- stdout_with_no_credentials
170
+ filtered_out = URICredentialsFilter.credential_filtered_string(out, uri)
171
+
172
+ raise GitCommandError.new(command_with_no_credentials, dir || SharedHelpers.pwd, filtered_out) unless status.success?
173
+
174
+ filtered_out
177
175
  end
178
176
 
179
177
  def has_revision_cached?
180
178
  return unless @revision
181
- in_path { git("cat-file -e #{@revision}") }
179
+ with_path { git("cat-file", "-e", @revision, :dir => path) }
182
180
  true
183
181
  rescue GitError
184
182
  false
@@ -189,29 +187,17 @@ module Bundler
189
187
  end
190
188
 
191
189
  def find_local_revision
192
- allowed_in_path do
193
- git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip
194
- end
195
- end
196
-
197
- # Escape the URI for git commands
198
- def uri_escaped_with_configured_credentials
199
- remote = configured_uri_for(uri)
200
- if Bundler::WINDOWS
201
- # Windows quoting requires double quotes only, with double quotes
202
- # inside the string escaped by being doubled.
203
- '"' + remote.gsub('"') { '""' } + '"'
204
- else
205
- # Bash requires single quoted strings, with the single quotes escaped
206
- # by ending the string, escaping the quote, and restarting the string.
207
- "'" + remote.gsub("'") { "'\\''" } + "'"
190
+ allowed_with_path do
191
+ git("rev-parse", "--verify", ref || "HEAD", :dir => path).strip
208
192
  end
193
+ rescue GitCommandError => e
194
+ raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
209
195
  end
210
196
 
211
197
  # Adds credentials to the URI as Fetcher#configured_uri_for does
212
198
  def configured_uri_for(uri)
213
199
  if /https?:/ =~ uri
214
- remote = URI(uri)
200
+ remote = Bundler::URI(uri)
215
201
  config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
216
202
  remote.userinfo ||= config_auth
217
203
  remote.to_s
@@ -221,40 +207,55 @@ module Bundler
221
207
  end
222
208
 
223
209
  def allow?
224
- @git ? @git.allow_git_ops? : true
210
+ allowed = @git ? @git.allow_git_ops? : true
211
+
212
+ raise GitNotInstalledError.new if allowed && !Bundler.git_present?
213
+
214
+ allowed
225
215
  end
226
216
 
227
- def in_path(&blk)
217
+ def with_path(&blk)
228
218
  checkout unless path.exist?
229
- _ = URICredentialsFilter # load it before we chdir
230
- SharedHelpers.chdir(path, &blk)
219
+ blk.call
231
220
  end
232
221
 
233
- def allowed_in_path
234
- return in_path { yield } if allow?
222
+ def allowed_with_path
223
+ return with_path { yield } if allow?
235
224
  raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
236
225
  end
237
226
 
238
- # TODO: Replace this with Open3 when upgrading to bundler 2
239
- # Similar to #git_null, as Open3 is not cross-platform,
240
- # a temporary way is to use Tempfile to capture the stderr.
241
- # When replacing this using Open3, make sure git_null is
242
- # also replaced by Open3, so stdout and stderr all got handled properly.
243
- def capture_and_filter_stderr(uri)
244
- return_value, captured_err = ""
245
- backup_stderr = STDERR.dup
246
- begin
247
- Tempfile.open("captured_stderr") do |f|
248
- STDERR.reopen(f)
249
- return_value = yield
250
- f.rewind
251
- captured_err = f.read
252
- end
253
- ensure
254
- STDERR.reopen backup_stderr
227
+ def check_allowed(command)
228
+ require "shellwords"
229
+ command_with_no_credentials = URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
230
+ raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
231
+ command_with_no_credentials
232
+ end
233
+
234
+ def capture_and_filter_stderr(*cmd)
235
+ require "open3"
236
+ return_value, captured_err, status = Open3.capture3(*cmd)
237
+ Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) unless captured_err.empty?
238
+ [return_value, status]
239
+ end
240
+
241
+ def capture_and_ignore_stderr(*cmd)
242
+ require "open3"
243
+ return_value, _, status = Open3.capture3(*cmd)
244
+ [return_value, status]
245
+ end
246
+
247
+ def capture3_args_for(cmd, dir)
248
+ return ["git", *cmd] unless dir
249
+
250
+ if Bundler.feature_flag.bundler_3_mode? || supports_minus_c?
251
+ ["git", "-C", dir.to_s, *cmd]
252
+ else
253
+ ["git", *cmd, { :chdir => dir.to_s }]
255
254
  end
256
- $stderr.puts URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
257
- return_value
255
+ end
256
+
257
+ def supports_minus_c?
258
+ @supports_minus_c ||= Gem::Version.new(version) >= Gem::Version.new("1.8.5")
258
259
  end
259
260
  end
260
261
  end