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,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class GemInstaller
5
+ attr_reader :spec, :standalone, :worker, :force, :installer
6
+
7
+ def initialize(spec, installer, standalone = false, worker = 0, force = false)
8
+ @spec = spec
9
+ @installer = installer
10
+ @standalone = standalone
11
+ @worker = worker
12
+ @force = force
13
+ end
14
+
15
+ def install_from_spec
16
+ post_install_message = spec_settings ? install_with_settings : install
17
+ Bundler.ui.debug "#{worker}: #{spec.name} (#{spec.version}) from #{spec.loaded_from}"
18
+ generate_executable_stubs
19
+ return true, post_install_message
20
+ rescue Bundler::InstallHookError, Bundler::SecurityError, APIResponseMismatchError
21
+ raise
22
+ rescue Errno::ENOSPC
23
+ return false, out_of_space_message
24
+ rescue StandardError => e
25
+ return false, specific_failure_message(e)
26
+ end
27
+
28
+ private
29
+
30
+ def specific_failure_message(e)
31
+ message = "#{e.class}: #{e.message}\n"
32
+ message += " " + e.backtrace.join("\n ") + "\n\n" if Bundler.ui.debug?
33
+ message = message.lines.first + Bundler.ui.add_color(message.lines.drop(1).join, :clear)
34
+ message + Bundler.ui.add_color(failure_message, :red)
35
+ end
36
+
37
+ def failure_message
38
+ return install_error_message if spec.source.options["git"]
39
+ "#{install_error_message}\n#{gem_install_message}"
40
+ end
41
+
42
+ def install_error_message
43
+ "An error occurred while installing #{spec.name} (#{spec.version}), and Bundler cannot continue."
44
+ end
45
+
46
+ def gem_install_message
47
+ source = spec.source
48
+ return unless source.respond_to?(:remotes)
49
+
50
+ if source.remotes.size == 1
51
+ "Make sure that `gem install #{spec.name} -v '#{spec.version}' --source '#{source.remotes.first}'` succeeds before bundling."
52
+ else
53
+ "Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling."
54
+ end
55
+ end
56
+
57
+ def spec_settings
58
+ # Fetch the build settings, if there are any
59
+ Bundler.settings["build.#{spec.name}"]
60
+ end
61
+
62
+ def install
63
+ spec.source.install(spec, :force => force, :ensure_builtin_gems_cached => standalone, :build_args => Array(spec_settings))
64
+ end
65
+
66
+ def install_with_settings
67
+ # Build arguments are global, so this is mutexed
68
+ Bundler.rubygems.install_with_build_args([spec_settings]) { install }
69
+ end
70
+
71
+ def out_of_space_message
72
+ "#{install_error_message}\nYour disk is out of space. Free some space to be able to install your bundle."
73
+ end
74
+
75
+ def generate_executable_stubs
76
+ return if Bundler.feature_flag.forget_cli_options?
77
+ return if Bundler.settings[:inline]
78
+ if Bundler.settings[:bin] && standalone
79
+ installer.generate_standalone_bundler_executable_stubs(spec)
80
+ elsif Bundler.settings[:bin]
81
+ installer.generate_bundler_executable_stubs(spec, :force => true)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,233 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/worker"
4
+ require "bundler/installer/gem_installer"
5
+
6
+ module Bundler
7
+ class ParallelInstaller
8
+ class SpecInstallation
9
+ attr_accessor :spec, :name, :post_install_message, :state, :error
10
+ def initialize(spec)
11
+ @spec = spec
12
+ @name = spec.name
13
+ @state = :none
14
+ @post_install_message = ""
15
+ @error = nil
16
+ end
17
+
18
+ def installed?
19
+ state == :installed
20
+ end
21
+
22
+ def enqueued?
23
+ state == :enqueued
24
+ end
25
+
26
+ def failed?
27
+ state == :failed
28
+ end
29
+
30
+ def installation_attempted?
31
+ installed? || failed?
32
+ end
33
+
34
+ # Only true when spec in neither installed nor already enqueued
35
+ def ready_to_enqueue?
36
+ !enqueued? && !installation_attempted?
37
+ end
38
+
39
+ def has_post_install_message?
40
+ !post_install_message.empty?
41
+ end
42
+
43
+ def ignorable_dependency?(dep)
44
+ dep.type == :development || dep.name == @name
45
+ end
46
+
47
+ # Checks installed dependencies against spec's dependencies to make
48
+ # sure needed dependencies have been installed.
49
+ def dependencies_installed?(all_specs)
50
+ installed_specs = all_specs.select(&:installed?).map(&:name)
51
+ dependencies.all? {|d| installed_specs.include? d.name }
52
+ end
53
+
54
+ # Represents only the non-development dependencies, the ones that are
55
+ # itself and are in the total list.
56
+ def dependencies
57
+ @dependencies ||= begin
58
+ all_dependencies.reject {|dep| ignorable_dependency? dep }
59
+ end
60
+ end
61
+
62
+ def missing_lockfile_dependencies(all_spec_names)
63
+ deps = all_dependencies.reject {|dep| ignorable_dependency? dep }
64
+ deps.reject {|dep| all_spec_names.include? dep.name }
65
+ end
66
+
67
+ # Represents all dependencies
68
+ def all_dependencies
69
+ @spec.dependencies
70
+ end
71
+
72
+ def to_s
73
+ "#<#{self.class} #{@spec.full_name} (#{state})>"
74
+ end
75
+ end
76
+
77
+ def self.call(*args)
78
+ new(*args).call
79
+ end
80
+
81
+ attr_reader :size
82
+
83
+ def initialize(installer, all_specs, size, standalone, force)
84
+ @installer = installer
85
+ @size = size
86
+ @standalone = standalone
87
+ @force = force
88
+ @specs = all_specs.map {|s| SpecInstallation.new(s) }
89
+ @spec_set = all_specs
90
+ @rake = @specs.find {|s| s.name == "rake" }
91
+ end
92
+
93
+ def call
94
+ # Since `autoload` has the potential for threading issues on 1.8.7
95
+ # TODO: remove in bundler 2.0
96
+ require "bundler/gem_remote_fetcher" if RUBY_VERSION < "1.9"
97
+
98
+ check_for_corrupt_lockfile
99
+
100
+ if @size > 1
101
+ install_with_worker
102
+ else
103
+ install_serially
104
+ end
105
+
106
+ handle_error if @specs.any?(&:failed?)
107
+ @specs
108
+ ensure
109
+ worker_pool && worker_pool.stop
110
+ end
111
+
112
+ def check_for_corrupt_lockfile
113
+ missing_dependencies = @specs.map do |s|
114
+ [
115
+ s,
116
+ s.missing_lockfile_dependencies(@specs.map(&:name)),
117
+ ]
118
+ end.reject { |a| a.last.empty? }
119
+ return if missing_dependencies.empty?
120
+
121
+ warning = []
122
+ warning << "Your lockfile was created by an old Bundler that left some things out."
123
+ if @size != 1
124
+ warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time."
125
+ @size = 1
126
+ end
127
+ warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile."
128
+ warning << "The missing gems are:"
129
+
130
+ missing_dependencies.each do |spec, missing|
131
+ warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}"
132
+ end
133
+
134
+ Bundler.ui.warn(warning.join("\n"))
135
+ end
136
+
137
+ private
138
+
139
+ def install_with_worker
140
+ enqueue_specs
141
+ process_specs until finished_installing?
142
+ end
143
+
144
+ def install_serially
145
+ until finished_installing?
146
+ raise "failed to find a spec to enqueue while installing serially" unless spec_install = @specs.find(&:ready_to_enqueue?)
147
+ spec_install.state = :enqueued
148
+ do_install(spec_install, 0)
149
+ end
150
+ end
151
+
152
+ def worker_pool
153
+ @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda { |spec_install, worker_num|
154
+ do_install(spec_install, worker_num)
155
+ }
156
+ end
157
+
158
+ def do_install(spec_install, worker_num)
159
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
160
+ gem_installer = Bundler::GemInstaller.new(
161
+ spec_install.spec, @installer, @standalone, worker_num, @force
162
+ )
163
+ success, message = begin
164
+ gem_installer.install_from_spec
165
+ rescue RuntimeError => e
166
+ raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
167
+ end
168
+ if success
169
+ spec_install.state = :installed
170
+ spec_install.post_install_message = message unless message.nil?
171
+ else
172
+ spec_install.state = :failed
173
+ spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
174
+ end
175
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
176
+ spec_install
177
+ end
178
+
179
+ # Dequeue a spec and save its post-install message and then enqueue the
180
+ # remaining specs.
181
+ # Some specs might've had to wait til this spec was installed to be
182
+ # processed so the call to `enqueue_specs` is important after every
183
+ # dequeue.
184
+ def process_specs
185
+ worker_pool.deq
186
+ enqueue_specs
187
+ end
188
+
189
+ def finished_installing?
190
+ @specs.all? do |spec|
191
+ return true if spec.failed?
192
+ spec.installed?
193
+ end
194
+ end
195
+
196
+ def handle_error
197
+ errors = @specs.select(&:failed?).map(&:error)
198
+ if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
199
+ raise exception
200
+ end
201
+ raise Bundler::InstallError, errors.map(&:to_s).join("\n\n")
202
+ end
203
+
204
+ def require_tree_for_spec(spec)
205
+ tree = @spec_set.what_required(spec)
206
+ t = String.new("In #{File.basename(SharedHelpers.default_gemfile)}:\n")
207
+ tree.each_with_index do |s, depth|
208
+ t << " " * depth.succ << s.name
209
+ unless tree.last == s
210
+ t << %( was resolved to #{s.version}, which depends on)
211
+ end
212
+ t << %(\n)
213
+ end
214
+ t
215
+ end
216
+
217
+ # Keys in the remains hash represent uninstalled gems specs.
218
+ # We enqueue all gem specs that do not have any dependencies.
219
+ # Later we call this lambda again to install specs that depended on
220
+ # previously installed specifications. We continue until all specs
221
+ # are installed.
222
+ def enqueue_specs
223
+ @specs.select(&:ready_to_enqueue?).each do |spec|
224
+ next if @rake && !@rake.installed? && spec.name != @rake.name
225
+
226
+ if spec.dependencies_installed? @specs
227
+ spec.state = :enqueued
228
+ worker_pool.enq spec
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Standalone
5
+ def initialize(groups, definition)
6
+ @specs = groups.empty? ? definition.requested_specs : definition.specs_for(groups.map(&:to_sym))
7
+ end
8
+
9
+ def generate
10
+ SharedHelpers.filesystem_access(bundler_path) do |p|
11
+ FileUtils.mkdir_p(p)
12
+ end
13
+ File.open File.join(bundler_path, "setup.rb"), "w" do |file|
14
+ file.puts "require 'rbconfig'"
15
+ file.puts "# ruby 1.8.7 doesn't define RUBY_ENGINE"
16
+ file.puts "ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'"
17
+ file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
18
+ file.puts "path = File.expand_path('..', __FILE__)"
19
+ paths.each do |path|
20
+ file.puts %($:.unshift "\#{path}/#{path}")
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def paths
28
+ @specs.map do |spec|
29
+ next if spec.name == "bundler"
30
+ Array(spec.require_paths).map do |path|
31
+ gem_path(path, spec).sub(version_dir, '#{ruby_engine}/#{ruby_version}')
32
+ # This is a static string intentionally. It's interpolated at a later time.
33
+ end
34
+ end.flatten
35
+ end
36
+
37
+ def version_dir
38
+ "#{Bundler::RubyVersion.system.engine}/#{RbConfig::CONFIG["ruby_version"]}"
39
+ end
40
+
41
+ def bundler_path
42
+ Bundler.root.join(Bundler.settings[:path], "bundler")
43
+ end
44
+
45
+ def gem_path(path, spec)
46
+ full_path = Pathname.new(path).absolute? ? path : File.join(spec.full_gem_path, path)
47
+ Pathname.new(full_path).relative_path_from(Bundler.root.join(bundler_path)).to_s
48
+ rescue TypeError
49
+ error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
50
+ raise Gem::InvalidSpecificationException.new(error_message)
51
+ end
52
+ end
53
+ end
@@ -1,25 +1,42 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "uri"
2
- require "rubygems/spec_fetcher"
3
4
  require "bundler/match_platform"
4
5
 
5
6
  module Bundler
6
7
  class LazySpecification
8
+ Identifier = Struct.new(:name, :version, :source, :platform, :dependencies)
9
+ class Identifier
10
+ include Comparable
11
+ def <=>(other)
12
+ return unless other.is_a?(Identifier)
13
+ [name, version, platform_string] <=> [other.name, other.version, other.platform_string]
14
+ end
15
+
16
+ protected
17
+
18
+ def platform_string
19
+ platform_string = platform.to_s
20
+ platform_string == Index::RUBY ? Index::NULL : platform_string
21
+ end
22
+ end
23
+
7
24
  include MatchPlatform
8
25
 
9
26
  attr_reader :name, :version, :dependencies, :platform
10
- attr_accessor :source, :source_uri
27
+ attr_accessor :source, :remote
11
28
 
12
29
  def initialize(name, version, platform, source = nil)
13
30
  @name = name
14
31
  @version = version
15
32
  @dependencies = []
16
- @platform = platform
33
+ @platform = platform || Gem::Platform::RUBY
17
34
  @source = source
18
35
  @specification = nil
19
36
  end
20
37
 
21
38
  def full_name
22
- if platform == Gem::Platform::RUBY or platform.nil? then
39
+ if platform == Gem::Platform::RUBY || platform.nil?
23
40
  "#{@name}-#{@version}"
24
41
  else
25
42
  "#{@name}-#{@version}-#{platform}"
@@ -35,13 +52,15 @@ module Bundler
35
52
  end
36
53
 
37
54
  def to_lock
38
- if platform == Gem::Platform::RUBY or platform.nil?
39
- out = " #{name} (#{version})\n"
55
+ out = String.new
56
+
57
+ if platform == Gem::Platform::RUBY || platform.nil?
58
+ out << " #{name} (#{version})\n"
40
59
  else
41
- out = " #{name} (#{version}-#{platform})\n"
60
+ out << " #{name} (#{version}-#{platform})\n"
42
61
  end
43
62
 
44
- dependencies.sort_by {|d| d.to_s }.each do |dep|
63
+ dependencies.sort_by(&:to_s).uniq.each do |dep|
45
64
  next if dep.type == :development
46
65
  out << " #{dep.to_lock}\n"
47
66
  end
@@ -50,19 +69,41 @@ module Bundler
50
69
  end
51
70
 
52
71
  def __materialize__
53
- @specification = source.specs.search(Gem::Dependency.new(name, version)).last
72
+ search_object = Bundler.feature_flag.specific_platform? || Bundler.settings[:force_ruby_platform] ? self : Dependency.new(name, version)
73
+ @specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name
74
+ source.gemspec.tap {|s| s.source = source }
75
+ else
76
+ search = source.specs.search(search_object).last
77
+ if search && Gem::Platform.new(search.platform) != Gem::Platform.new(platform) && !search.runtime_dependencies.-(dependencies.reject {|d| d.type == :development }).empty?
78
+ Bundler.ui.warn "Unable to use the platform-specific (#{search.platform}) version of #{name} (#{version}) " \
79
+ "because it has different dependencies from the #{platform} version. " \
80
+ "To use the platform-specific version of the gem, run `bundle config specific_platform true` and install again."
81
+ search = source.specs.search(self).last
82
+ end
83
+ search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
84
+ search
85
+ end
54
86
  end
55
87
 
56
88
  def respond_to?(*args)
57
- super || @specification.respond_to?(*args)
89
+ super || @specification ? @specification.respond_to?(*args) : nil
58
90
  end
59
91
 
60
92
  def to_s
61
- @__to_s ||= "#{name} (#{version})"
93
+ @__to_s ||= if platform == Gem::Platform::RUBY || platform.nil?
94
+ "#{name} (#{version})"
95
+ else
96
+ "#{name} (#{version}-#{platform})"
97
+ end
62
98
  end
63
99
 
64
100
  def identifier
65
- @__identifier ||= [name, version, source, platform, dependencies].hash
101
+ @__identifier ||= Identifier.new(name, version, source, platform, dependencies)
102
+ end
103
+
104
+ def git_version
105
+ return unless source.is_a?(Bundler::Source::Git)
106
+ " #{source.revision[0..6]}"
66
107
  end
67
108
 
68
109
  private
@@ -78,6 +119,5 @@ module Bundler
78
119
 
79
120
  @specification.send(method, *args, &blk)
80
121
  end
81
-
82
122
  end
83
123
  end