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,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Settings
5
+ class Validator
6
+ class Rule
7
+ attr_reader :description
8
+
9
+ def initialize(keys, description, &validate)
10
+ @keys = keys
11
+ @description = description
12
+ @validate = validate
13
+ end
14
+
15
+ def validate!(key, value, settings)
16
+ instance_exec(key, value, settings, &@validate)
17
+ end
18
+
19
+ def fail!(key, value, *reasons)
20
+ reasons.unshift @description
21
+ raise InvalidOption, "Setting `#{key}` to #{value.inspect} failed:\n#{reasons.map {|r| " - #{r}" }.join("\n")}"
22
+ end
23
+
24
+ def set(settings, key, value, *reasons)
25
+ hash_key = k(key)
26
+ return if settings[hash_key] == value
27
+ reasons.unshift @description
28
+ Bundler.ui.info "Setting `#{key}` to #{value.inspect}, since #{reasons.join(", ")}"
29
+ if value.nil?
30
+ settings.delete(hash_key)
31
+ else
32
+ settings[hash_key] = value
33
+ end
34
+ end
35
+
36
+ def k(key)
37
+ Bundler.settings.key_for(key)
38
+ end
39
+ end
40
+
41
+ def self.rules
42
+ @rules ||= Hash.new {|h, k| h[k] = [] }
43
+ end
44
+ private_class_method :rules
45
+
46
+ def self.rule(keys, description, &blk)
47
+ rule = Rule.new(keys, description, &blk)
48
+ keys.each {|k| rules[k] << rule }
49
+ end
50
+ private_class_method :rule
51
+
52
+ def self.validate!(key, value, settings)
53
+ rules_to_validate = rules[key]
54
+ rules_to_validate.each {|rule| rule.validate!(key, value, settings) }
55
+ end
56
+
57
+ rule %w[path path.system], "path and path.system are mutually exclusive" do |key, value, settings|
58
+ if key == "path" && value
59
+ set(settings, "path.system", nil)
60
+ elsif key == "path.system" && value
61
+ set(settings, :path, nil)
62
+ end
63
+ end
64
+
65
+ rule %w[with without], "a group cannot be in both `with` & `without` simultaneously" do |key, value, settings|
66
+ with = settings.fetch(k(:with), "").split(":").map(&:to_sym)
67
+ without = settings.fetch(k(:without), "").split(":").map(&:to_sym)
68
+
69
+ other_key = key == "with" ? :without : :with
70
+ other_setting = key == "with" ? without : with
71
+
72
+ conflicting = with & without
73
+ if conflicting.any?
74
+ fail!(key, value, "`#{other_key}` is current set to #{other_setting.inspect}", "the `#{conflicting.join("`, `")}` groups conflict")
75
+ end
76
+ end
77
+
78
+ rule %w[path], "relative paths are expanded relative to the current working directory" do |key, value, settings|
79
+ next if value.nil?
80
+
81
+ path = Pathname.new(value)
82
+ next if !path.relative? || !Bundler.feature_flag.path_relative_to_cwd?
83
+
84
+ path = path.expand_path
85
+
86
+ root = begin
87
+ Bundler.root
88
+ rescue GemfileNotFound
89
+ Pathname.pwd.expand_path
90
+ end
91
+
92
+ path = begin
93
+ path.relative_path_from(root)
94
+ rescue ArgumentError
95
+ path
96
+ end
97
+
98
+ set(settings, key, path.to_s)
99
+ end
100
+ end
101
+ end
102
+ end
@@ -1,9 +1,11 @@
1
- require 'bundler/shared_helpers'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/shared_helpers"
2
4
 
3
5
  if Bundler::SharedHelpers.in_bundle?
4
- require 'bundler'
6
+ require "bundler"
5
7
 
6
- if STDOUT.tty? || ENV['BUNDLER_FORCE_TTY']
8
+ if STDOUT.tty? || ENV["BUNDLER_FORCE_TTY"]
7
9
  begin
8
10
  Bundler.setup
9
11
  rescue Bundler::BundlerError => e
@@ -21,4 +23,6 @@ if Bundler::SharedHelpers.in_bundle?
21
23
  # Add bundler to the load path after disabling system gems
22
24
  bundler_lib = File.expand_path("../..", __FILE__)
23
25
  $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
26
+
27
+ Bundler.ui = nil
24
28
  end
@@ -1,13 +1,19 @@
1
- require 'pathname'
2
- require 'rubygems'
1
+ # frozen_string_literal: true
3
2
 
4
- require 'bundler/constants'
5
- require 'bundler/rubygems_integration'
6
- require 'bundler/current_ruby'
3
+ require "bundler/compatibility_guard"
4
+
5
+ require "pathname"
6
+ require "rubygems"
7
+
8
+ require "bundler/version"
9
+ require "bundler/constants"
10
+ require "bundler/rubygems_integration"
11
+ require "bundler/current_ruby"
7
12
 
8
13
  module Gem
9
14
  class Dependency
10
- if !instance_methods.map { |m| m.to_s }.include?("requirement")
15
+ # This is only needed for RubyGems < 1.4
16
+ unless method_defined? :requirement
11
17
  def requirement
12
18
  version_requirements
13
19
  end
@@ -17,51 +23,52 @@ end
17
23
 
18
24
  module Bundler
19
25
  module SharedHelpers
20
- attr_accessor :gem_loaded
26
+ def root
27
+ gemfile = find_gemfile
28
+ raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
29
+ Pathname.new(gemfile).untaint.expand_path.parent
30
+ end
21
31
 
22
32
  def default_gemfile
23
- gemfile = find_gemfile
33
+ gemfile = find_gemfile(:order_matters)
24
34
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
25
- Pathname.new(gemfile)
35
+ Pathname.new(gemfile).untaint.expand_path
26
36
  end
27
37
 
28
38
  def default_lockfile
29
39
  gemfile = default_gemfile
30
40
 
31
41
  case gemfile.basename.to_s
32
- when 'gems.rb' then Pathname.new(gemfile.sub(/.rb$/, '.locked'))
42
+ when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked"))
33
43
  else Pathname.new("#{gemfile}.lock")
34
- end
44
+ end.untaint
35
45
  end
36
46
 
37
47
  def default_bundle_dir
38
- global_bundle_dir = File.join(Bundler.rubygems.user_home, ".bundle")
39
48
  bundle_dir = find_directory(".bundle")
49
+ return nil unless bundle_dir
40
50
 
41
- if bundle_dir && bundle_dir != global_bundle_dir
42
- Pathname.new(bundle_dir)
43
- else
44
- nil
45
- end
51
+ bundle_dir = Pathname.new(bundle_dir)
52
+
53
+ global_bundle_dir = Bundler.user_home.join(".bundle")
54
+ return nil if bundle_dir == global_bundle_dir
55
+
56
+ bundle_dir
46
57
  end
47
58
 
48
59
  def in_bundle?
49
60
  find_gemfile
50
61
  end
51
62
 
52
- def chdir_monitor
53
- Bundler.rubygems.ext_lock
54
- end
55
-
56
63
  def chdir(dir, &blk)
57
- chdir_monitor.synchronize do
64
+ Bundler.rubygems.ext_lock.synchronize do
58
65
  Dir.chdir dir, &blk
59
66
  end
60
67
  end
61
68
 
62
69
  def pwd
63
- chdir_monitor.synchronize do
64
- Dir.pwd
70
+ Bundler.rubygems.ext_lock.synchronize do
71
+ Pathname.pwd
65
72
  end
66
73
  end
67
74
 
@@ -79,37 +86,179 @@ module Bundler
79
86
  end
80
87
 
81
88
  def set_bundle_environment
82
- # Set PATH
83
- paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR)
84
- paths.unshift "#{Bundler.bundle_path}/bin"
85
- ENV["PATH"] = paths.uniq.join(File::PATH_SEPARATOR)
89
+ set_bundle_variables
90
+ set_path
91
+ set_rubyopt
92
+ set_rubylib
93
+ end
86
94
 
87
- # Set RUBYOPT
88
- rubyopt = [ENV["RUBYOPT"]].compact
89
- if rubyopt.empty? || rubyopt.first !~ /-rbundler\/setup/
90
- rubyopt.unshift %|-rbundler/setup|
91
- ENV["RUBYOPT"] = rubyopt.join(' ')
95
+ # Rescues permissions errors raised by file system operations
96
+ # (ie. Errno:EACCESS, Errno::EAGAIN) and raises more friendly errors instead.
97
+ #
98
+ # @param path [String] the path that the action will be attempted to
99
+ # @param action [Symbol, #to_s] the type of operation that will be
100
+ # performed. For example: :write, :read, :exec
101
+ #
102
+ # @yield path
103
+ #
104
+ # @raise [Bundler::PermissionError] if Errno:EACCES is raised in the
105
+ # given block
106
+ # @raise [Bundler::TemporaryResourceError] if Errno:EAGAIN is raised in the
107
+ # given block
108
+ #
109
+ # @example
110
+ # filesystem_access("vendor/cache", :write) do
111
+ # FileUtils.mkdir_p("vendor/cache")
112
+ # end
113
+ #
114
+ # @see {Bundler::PermissionError}
115
+ 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)
119
+ rescue Errno::EACCES
120
+ raise PermissionError.new(path, action)
121
+ rescue Errno::EAGAIN
122
+ raise TemporaryResourceError.new(path, action)
123
+ rescue Errno::EPROTO
124
+ raise VirtualProtocolError.new
125
+ rescue Errno::ENOSPC
126
+ raise NoSpaceOnDeviceError.new(path, action)
127
+ rescue *[const_get_safely(:ENOTSUP, Errno)].compact
128
+ raise OperationNotSupportedError.new(path, action)
129
+ rescue Errno::EEXIST, Errno::ENOENT
130
+ raise
131
+ rescue SystemCallError => e
132
+ raise GenericSystemCallError.new(e, "There was an error accessing `#{path}`.")
133
+ end
134
+
135
+ def const_get_safely(constant_name, namespace)
136
+ const_in_namespace = namespace.constants.include?(constant_name.to_s) ||
137
+ namespace.constants.include?(constant_name.to_sym)
138
+ return nil unless const_in_namespace
139
+ namespace.const_get(constant_name)
140
+ end
141
+
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}"
92
146
  end
93
147
 
94
- # Set RUBYLIB
95
- rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR)
96
- rubylib.unshift File.expand_path('../..', __FILE__)
97
- ENV["RUBYLIB"] = rubylib.uniq.join(File::PATH_SEPARATOR)
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}")
152
+ end
153
+
154
+ def print_major_deprecations!
155
+ multiple_gemfiles = search_up(".") do |dir|
156
+ gemfiles = gemfile_names.select {|gf| File.file? File.expand_path(gf, dir) }
157
+ 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
176
+ end
177
+ end
178
+
179
+ def ensure_same_dependencies(spec, old_deps, new_deps)
180
+ new_deps = new_deps.reject {|d| d.type == :development }
181
+ old_deps = old_deps.reject {|d| d.type == :development }
182
+
183
+ without_type = proc {|d| Gem::Dependency.new(d.name, d.requirements_list.sort) }
184
+ new_deps.map!(&without_type)
185
+ old_deps.map!(&without_type)
186
+
187
+ extra_deps = new_deps - old_deps
188
+ return if extra_deps.empty?
189
+
190
+ Bundler.ui.debug "#{spec.full_name} from #{spec.remote} has either corrupted API or lockfile dependencies" \
191
+ " (was expecting #{old_deps.map(&:to_s)}, but the real spec has #{new_deps.map(&:to_s)})"
192
+ raise APIResponseMismatchError,
193
+ "Downloading #{spec.full_name} revealed dependencies not in the API or the lockfile (#{extra_deps.join(", ")})." \
194
+ "\nEither installing with `--full-index` or running `bundle update #{spec.name}` should fix the problem."
195
+ end
196
+
197
+ def pretty_dependency(dep, print_source = false)
198
+ msg = String.new(dep.name)
199
+ msg << " (#{dep.requirement})" unless dep.requirement == Gem::Requirement.default
200
+
201
+ if dep.is_a?(Bundler::Dependency)
202
+ platform_string = dep.platforms.join(", ")
203
+ msg << " " << platform_string if !platform_string.empty? && platform_string != Gem::Platform::RUBY
204
+ end
205
+
206
+ msg << " from the `#{dep.source}` source" if print_source && dep.source
207
+ msg
208
+ end
209
+
210
+ def md5_available?
211
+ return @md5_available if defined?(@md5_available)
212
+ @md5_available = begin
213
+ require "openssl"
214
+ OpenSSL::Digest::MD5.digest("")
215
+ true
216
+ rescue LoadError
217
+ true
218
+ rescue OpenSSL::Digest::DigestError
219
+ false
220
+ end
221
+ end
222
+
223
+ def digest(name)
224
+ require "digest"
225
+ Digest(name)
226
+ end
227
+
228
+ def write_to_gemfile(gemfile_path, contents)
229
+ filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
98
230
  end
99
231
 
100
232
  private
101
233
 
102
- def find_gemfile
103
- given = ENV['BUNDLE_GEMFILE']
234
+ def validate_bundle_path
235
+ path_separator = Bundler.rubygems.path_separator
236
+ return unless Bundler.bundle_path.to_s.split(path_separator).size > 1
237
+ message = "Your bundle path contains text matching #{path_separator.inspect}, " \
238
+ "which is the path separator for your system. Bundler cannot " \
239
+ "function correctly when the Bundle path contains the " \
240
+ "system's PATH separator. Please change your " \
241
+ "bundle path to not match #{path_separator.inspect}." \
242
+ "\nYour current bundle path is '#{Bundler.bundle_path}'."
243
+ raise Bundler::PathError, message
244
+ end
245
+
246
+ def find_gemfile(order_matters = false)
247
+ given = ENV["BUNDLE_GEMFILE"]
104
248
  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)
252
+ end
105
253
 
106
- find_file('Gemfile', 'gems.rb')
254
+ def gemfile_names
255
+ ["Gemfile", "gems.rb"]
107
256
  end
108
257
 
109
258
  def find_file(*names)
110
- search_up(*names) {|filename|
259
+ search_up(*names) do |filename|
111
260
  return filename if File.file?(filename)
112
- }
261
+ end
113
262
  end
114
263
 
115
264
  def find_directory(*names)
@@ -120,33 +269,114 @@ module Bundler
120
269
 
121
270
  def search_up(*names)
122
271
  previous = nil
123
- current = File.expand_path(SharedHelpers.pwd)
272
+ current = File.expand_path(SharedHelpers.pwd).untaint
124
273
 
125
274
  until !File.directory?(current) || current == previous
126
- if ENV['BUNDLE_SPEC_RUN']
275
+ if ENV["BUNDLE_SPEC_RUN"]
127
276
  # avoid stepping above the tmp directory when testing
128
- return nil if File.file?(File.join(current, 'bundler.gemspec'))
277
+ gemspec = if ENV["BUNDLE_RUBY"] && ENV["BUNDLE_GEM"]
278
+ # for Ruby Core
279
+ "lib/bundler.gemspec"
280
+ else
281
+ "bundler.gemspec"
282
+ end
283
+
284
+ # avoid stepping above the tmp directory when testing
285
+ return nil if File.file?(File.join(current, gemspec))
129
286
  end
130
287
 
131
288
  names.each do |name|
132
289
  filename = File.join(current, name)
133
290
  yield filename
134
291
  end
135
- current, previous = File.expand_path("..", current), current
292
+ previous = current
293
+ current = File.expand_path("..", current)
294
+ end
295
+ end
296
+
297
+ def set_env(key, value)
298
+ raise ArgumentError, "new key #{key}" unless EnvironmentPreserver::BUNDLER_KEYS.include?(key)
299
+ orig_key = "#{EnvironmentPreserver::BUNDLER_PREFIX}#{key}"
300
+ orig = ENV[key]
301
+ orig ||= EnvironmentPreserver::INTENTIONALLY_NIL
302
+ ENV[orig_key] ||= orig
303
+
304
+ ENV[key] = value
305
+ end
306
+ public :set_env
307
+
308
+ 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
136
320
  end
321
+
322
+ # Set BUNDLE_GEMFILE
323
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile(:order_matters).to_s
324
+ Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
325
+ end
326
+
327
+ def set_path
328
+ validate_bundle_path
329
+ paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR)
330
+ paths.unshift "#{Bundler.bundle_path}/bin"
331
+ Bundler::SharedHelpers.set_env "PATH", paths.uniq.join(File::PATH_SEPARATOR)
332
+ end
333
+
334
+ def set_rubyopt
335
+ rubyopt = [ENV["RUBYOPT"]].compact
336
+ return if !rubyopt.empty? && rubyopt.first =~ %r{-rbundler/setup}
337
+ rubyopt.unshift %(-rbundler/setup)
338
+ Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
339
+ end
340
+
341
+ def set_rubylib
342
+ rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR)
343
+ rubylib.unshift bundler_ruby_lib
344
+ Bundler::SharedHelpers.set_env "RUBYLIB", rubylib.uniq.join(File::PATH_SEPARATOR)
345
+ end
346
+
347
+ def bundler_ruby_lib
348
+ resolve_path File.expand_path("../..", __FILE__)
137
349
  end
138
350
 
139
351
  def clean_load_path
140
352
  # handle 1.9 where system gems are always on the load path
141
- if defined?(::Gem)
142
- me = File.expand_path("../../", __FILE__)
143
- $LOAD_PATH.reject! do |p|
144
- next if File.expand_path(p) =~ /^#{Regexp.escape(me)}/
145
- p != File.dirname(__FILE__) &&
146
- Bundler.rubygems.gem_path.any?{|gp| p =~ /^#{Regexp.escape(gp)}/ }
147
- end
148
- $LOAD_PATH.uniq!
353
+ return unless defined?(::Gem)
354
+
355
+ bundler_lib = bundler_ruby_lib
356
+
357
+ loaded_gem_paths = Bundler.rubygems.loaded_gem_paths
358
+
359
+ $LOAD_PATH.reject! do |p|
360
+ next if resolve_path(p).start_with?(bundler_lib)
361
+ loaded_gem_paths.delete(p)
149
362
  end
363
+ $LOAD_PATH.uniq!
364
+ end
365
+
366
+ def resolve_path(path)
367
+ expanded = File.expand_path(path)
368
+ return expanded unless File.respond_to?(:realpath) && File.exist?(expanded)
369
+
370
+ File.realpath(expanded)
371
+ end
372
+
373
+ 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"
378
+ return false if Bundler::Deprecate.skip
379
+ true
150
380
  end
151
381
 
152
382
  extend self