bundler 2.0.2

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 (303) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3111 -0
  3. data/LICENSE.md +23 -0
  4. data/README.md +63 -0
  5. data/bundler.gemspec +65 -0
  6. data/exe/bundle +31 -0
  7. data/exe/bundle_ruby +60 -0
  8. data/exe/bundler +4 -0
  9. data/lib/bundler.rb +567 -0
  10. data/lib/bundler/build_metadata.rb +53 -0
  11. data/lib/bundler/capistrano.rb +22 -0
  12. data/lib/bundler/cli.rb +792 -0
  13. data/lib/bundler/cli/add.rb +35 -0
  14. data/lib/bundler/cli/binstubs.rb +49 -0
  15. data/lib/bundler/cli/cache.rb +36 -0
  16. data/lib/bundler/cli/check.rb +38 -0
  17. data/lib/bundler/cli/clean.rb +25 -0
  18. data/lib/bundler/cli/common.rb +102 -0
  19. data/lib/bundler/cli/config.rb +119 -0
  20. data/lib/bundler/cli/console.rb +43 -0
  21. data/lib/bundler/cli/doctor.rb +140 -0
  22. data/lib/bundler/cli/exec.rb +105 -0
  23. data/lib/bundler/cli/gem.rb +252 -0
  24. data/lib/bundler/cli/info.rb +50 -0
  25. data/lib/bundler/cli/init.rb +47 -0
  26. data/lib/bundler/cli/inject.rb +60 -0
  27. data/lib/bundler/cli/install.rb +218 -0
  28. data/lib/bundler/cli/issue.rb +40 -0
  29. data/lib/bundler/cli/list.rb +58 -0
  30. data/lib/bundler/cli/lock.rb +63 -0
  31. data/lib/bundler/cli/open.rb +26 -0
  32. data/lib/bundler/cli/outdated.rb +266 -0
  33. data/lib/bundler/cli/package.rb +49 -0
  34. data/lib/bundler/cli/platform.rb +46 -0
  35. data/lib/bundler/cli/plugin.rb +24 -0
  36. data/lib/bundler/cli/pristine.rb +47 -0
  37. data/lib/bundler/cli/remove.rb +18 -0
  38. data/lib/bundler/cli/show.rb +75 -0
  39. data/lib/bundler/cli/update.rb +91 -0
  40. data/lib/bundler/cli/viz.rb +31 -0
  41. data/lib/bundler/compact_index_client.rb +109 -0
  42. data/lib/bundler/compact_index_client/cache.rb +118 -0
  43. data/lib/bundler/compact_index_client/updater.rb +116 -0
  44. data/lib/bundler/compatibility_guard.rb +13 -0
  45. data/lib/bundler/constants.rb +7 -0
  46. data/lib/bundler/current_ruby.rb +94 -0
  47. data/lib/bundler/definition.rb +995 -0
  48. data/lib/bundler/dep_proxy.rb +48 -0
  49. data/lib/bundler/dependency.rb +139 -0
  50. data/lib/bundler/deployment.rb +69 -0
  51. data/lib/bundler/deprecate.rb +44 -0
  52. data/lib/bundler/dsl.rb +615 -0
  53. data/lib/bundler/endpoint_specification.rb +141 -0
  54. data/lib/bundler/env.rb +149 -0
  55. data/lib/bundler/environment_preserver.rb +59 -0
  56. data/lib/bundler/errors.rb +158 -0
  57. data/lib/bundler/feature_flag.rb +75 -0
  58. data/lib/bundler/fetcher.rb +312 -0
  59. data/lib/bundler/fetcher/base.rb +52 -0
  60. data/lib/bundler/fetcher/compact_index.rb +126 -0
  61. data/lib/bundler/fetcher/dependency.rb +82 -0
  62. data/lib/bundler/fetcher/downloader.rb +84 -0
  63. data/lib/bundler/fetcher/index.rb +52 -0
  64. data/lib/bundler/friendly_errors.rb +131 -0
  65. data/lib/bundler/gem_helper.rb +217 -0
  66. data/lib/bundler/gem_helpers.rb +101 -0
  67. data/lib/bundler/gem_remote_fetcher.rb +43 -0
  68. data/lib/bundler/gem_tasks.rb +7 -0
  69. data/lib/bundler/gem_version_promoter.rb +190 -0
  70. data/lib/bundler/gemdeps.rb +29 -0
  71. data/lib/bundler/graph.rb +152 -0
  72. data/lib/bundler/index.rb +213 -0
  73. data/lib/bundler/injector.rb +253 -0
  74. data/lib/bundler/inline.rb +74 -0
  75. data/lib/bundler/installer.rb +318 -0
  76. data/lib/bundler/installer/gem_installer.rb +85 -0
  77. data/lib/bundler/installer/parallel_installer.rb +229 -0
  78. data/lib/bundler/installer/standalone.rb +53 -0
  79. data/lib/bundler/lazy_specification.rb +123 -0
  80. data/lib/bundler/lockfile_generator.rb +95 -0
  81. data/lib/bundler/lockfile_parser.rb +256 -0
  82. data/lib/bundler/match_platform.rb +24 -0
  83. data/lib/bundler/mirror.rb +223 -0
  84. data/lib/bundler/plugin.rb +294 -0
  85. data/lib/bundler/plugin/api.rb +81 -0
  86. data/lib/bundler/plugin/api/source.rb +306 -0
  87. data/lib/bundler/plugin/dsl.rb +53 -0
  88. data/lib/bundler/plugin/events.rb +61 -0
  89. data/lib/bundler/plugin/index.rb +165 -0
  90. data/lib/bundler/plugin/installer.rb +96 -0
  91. data/lib/bundler/plugin/installer/git.rb +38 -0
  92. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  93. data/lib/bundler/plugin/source_list.rb +27 -0
  94. data/lib/bundler/process_lock.rb +24 -0
  95. data/lib/bundler/psyched_yaml.rb +37 -0
  96. data/lib/bundler/remote_specification.rb +114 -0
  97. data/lib/bundler/resolver.rb +373 -0
  98. data/lib/bundler/resolver/spec_group.rb +106 -0
  99. data/lib/bundler/retry.rb +66 -0
  100. data/lib/bundler/ruby_dsl.rb +18 -0
  101. data/lib/bundler/ruby_version.rb +152 -0
  102. data/lib/bundler/rubygems_ext.rb +209 -0
  103. data/lib/bundler/rubygems_gem_installer.rb +99 -0
  104. data/lib/bundler/rubygems_integration.rb +915 -0
  105. data/lib/bundler/runtime.rb +322 -0
  106. data/lib/bundler/settings.rb +464 -0
  107. data/lib/bundler/settings/validator.rb +102 -0
  108. data/lib/bundler/setup.rb +28 -0
  109. data/lib/bundler/shared_helpers.rb +386 -0
  110. data/lib/bundler/similarity_detector.rb +63 -0
  111. data/lib/bundler/source.rb +94 -0
  112. data/lib/bundler/source/gemspec.rb +18 -0
  113. data/lib/bundler/source/git.rb +329 -0
  114. data/lib/bundler/source/git/git_proxy.rb +262 -0
  115. data/lib/bundler/source/metadata.rb +62 -0
  116. data/lib/bundler/source/path.rb +249 -0
  117. data/lib/bundler/source/path/installer.rb +74 -0
  118. data/lib/bundler/source/rubygems.rb +539 -0
  119. data/lib/bundler/source/rubygems/remote.rb +69 -0
  120. data/lib/bundler/source_list.rb +186 -0
  121. data/lib/bundler/spec_set.rb +208 -0
  122. data/lib/bundler/ssl_certs/.document +1 -0
  123. data/lib/bundler/ssl_certs/certificate_manager.rb +66 -0
  124. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
  125. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
  126. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
  127. data/lib/bundler/stub_specification.rb +108 -0
  128. data/lib/bundler/templates/.document +1 -0
  129. data/lib/bundler/templates/Executable +29 -0
  130. data/lib/bundler/templates/Executable.bundler +105 -0
  131. data/lib/bundler/templates/Executable.standalone +14 -0
  132. data/lib/bundler/templates/Gemfile +7 -0
  133. data/lib/bundler/templates/gems.rb +8 -0
  134. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +74 -0
  135. data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
  136. data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  137. data/lib/bundler/templates/newgem/README.md.tt +47 -0
  138. data/lib/bundler/templates/newgem/Rakefile.tt +29 -0
  139. data/lib/bundler/templates/newgem/bin/console.tt +14 -0
  140. data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  141. data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  142. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
  143. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  144. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  145. data/lib/bundler/templates/newgem/gitignore.tt +20 -0
  146. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +13 -0
  147. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
  148. data/lib/bundler/templates/newgem/newgem.gemspec.tt +50 -0
  149. data/lib/bundler/templates/newgem/rspec.tt +3 -0
  150. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +9 -0
  151. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -0
  152. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +11 -0
  153. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +8 -0
  154. data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
  155. data/lib/bundler/ui.rb +9 -0
  156. data/lib/bundler/ui/rg_proxy.rb +19 -0
  157. data/lib/bundler/ui/shell.rb +146 -0
  158. data/lib/bundler/ui/silent.rb +69 -0
  159. data/lib/bundler/uri_credentials_filter.rb +37 -0
  160. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1741 -0
  161. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
  162. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +101 -0
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +67 -0
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
  181. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +46 -0
  182. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
  183. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +27 -0
  184. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1233 -0
  185. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +129 -0
  186. data/lib/bundler/vendor/thor/lib/thor.rb +509 -0
  187. data/lib/bundler/vendor/thor/lib/thor/actions.rb +331 -0
  188. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +104 -0
  189. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +60 -0
  190. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +118 -0
  191. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  192. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
  193. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
  194. data/lib/bundler/vendor/thor/lib/thor/base.rb +678 -0
  195. data/lib/bundler/vendor/thor/lib/thor/command.rb +135 -0
  196. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
  197. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
  198. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
  199. data/lib/bundler/vendor/thor/lib/thor/error.rb +114 -0
  200. data/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
  201. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +177 -0
  202. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  203. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  204. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  205. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  206. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +70 -0
  207. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +175 -0
  208. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +146 -0
  209. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +226 -0
  210. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +71 -0
  211. data/lib/bundler/vendor/thor/lib/thor/runner.rb +324 -0
  212. data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  213. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +482 -0
  214. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +149 -0
  215. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +126 -0
  216. data/lib/bundler/vendor/thor/lib/thor/util.rb +268 -0
  217. data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  218. data/lib/bundler/vendored_fileutils.rb +9 -0
  219. data/lib/bundler/vendored_molinillo.rb +4 -0
  220. data/lib/bundler/vendored_persistent.rb +52 -0
  221. data/lib/bundler/vendored_thor.rb +8 -0
  222. data/lib/bundler/version.rb +28 -0
  223. data/lib/bundler/version_ranges.rb +76 -0
  224. data/lib/bundler/vlad.rb +17 -0
  225. data/lib/bundler/worker.rb +106 -0
  226. data/lib/bundler/yaml_serializer.rb +90 -0
  227. data/man/bundle-add.1 +58 -0
  228. data/man/bundle-add.1.txt +52 -0
  229. data/man/bundle-add.ronn +40 -0
  230. data/man/bundle-binstubs.1 +40 -0
  231. data/man/bundle-binstubs.1.txt +48 -0
  232. data/man/bundle-binstubs.ronn +43 -0
  233. data/man/bundle-check.1 +31 -0
  234. data/man/bundle-check.1.txt +33 -0
  235. data/man/bundle-check.ronn +26 -0
  236. data/man/bundle-clean.1 +24 -0
  237. data/man/bundle-clean.1.txt +26 -0
  238. data/man/bundle-clean.ronn +18 -0
  239. data/man/bundle-config.1 +497 -0
  240. data/man/bundle-config.1.txt +529 -0
  241. data/man/bundle-config.ronn +397 -0
  242. data/man/bundle-doctor.1 +44 -0
  243. data/man/bundle-doctor.1.txt +44 -0
  244. data/man/bundle-doctor.ronn +33 -0
  245. data/man/bundle-exec.1 +165 -0
  246. data/man/bundle-exec.1.txt +178 -0
  247. data/man/bundle-exec.ronn +152 -0
  248. data/man/bundle-gem.1 +80 -0
  249. data/man/bundle-gem.1.txt +91 -0
  250. data/man/bundle-gem.ronn +78 -0
  251. data/man/bundle-info.1 +20 -0
  252. data/man/bundle-info.1.txt +21 -0
  253. data/man/bundle-info.ronn +17 -0
  254. data/man/bundle-init.1 +25 -0
  255. data/man/bundle-init.1.txt +34 -0
  256. data/man/bundle-init.ronn +29 -0
  257. data/man/bundle-inject.1 +33 -0
  258. data/man/bundle-inject.1.txt +32 -0
  259. data/man/bundle-inject.ronn +22 -0
  260. data/man/bundle-install.1 +308 -0
  261. data/man/bundle-install.1.txt +396 -0
  262. data/man/bundle-install.ronn +378 -0
  263. data/man/bundle-list.1 +50 -0
  264. data/man/bundle-list.1.txt +43 -0
  265. data/man/bundle-list.ronn +33 -0
  266. data/man/bundle-lock.1 +84 -0
  267. data/man/bundle-lock.1.txt +93 -0
  268. data/man/bundle-lock.ronn +94 -0
  269. data/man/bundle-open.1 +32 -0
  270. data/man/bundle-open.1.txt +29 -0
  271. data/man/bundle-open.ronn +19 -0
  272. data/man/bundle-outdated.1 +155 -0
  273. data/man/bundle-outdated.1.txt +131 -0
  274. data/man/bundle-outdated.ronn +111 -0
  275. data/man/bundle-package.1 +55 -0
  276. data/man/bundle-package.1.txt +79 -0
  277. data/man/bundle-package.ronn +72 -0
  278. data/man/bundle-platform.1 +61 -0
  279. data/man/bundle-platform.1.txt +57 -0
  280. data/man/bundle-platform.ronn +42 -0
  281. data/man/bundle-pristine.1 +34 -0
  282. data/man/bundle-pristine.1.txt +44 -0
  283. data/man/bundle-pristine.ronn +34 -0
  284. data/man/bundle-remove.1 +31 -0
  285. data/man/bundle-remove.1.txt +34 -0
  286. data/man/bundle-remove.ronn +23 -0
  287. data/man/bundle-show.1 +23 -0
  288. data/man/bundle-show.1.txt +27 -0
  289. data/man/bundle-show.ronn +21 -0
  290. data/man/bundle-update.1 +394 -0
  291. data/man/bundle-update.1.txt +391 -0
  292. data/man/bundle-update.ronn +350 -0
  293. data/man/bundle-viz.1 +39 -0
  294. data/man/bundle-viz.1.txt +39 -0
  295. data/man/bundle-viz.ronn +30 -0
  296. data/man/bundle.1 +136 -0
  297. data/man/bundle.1.txt +116 -0
  298. data/man/bundle.ronn +111 -0
  299. data/man/gemfile.5 +689 -0
  300. data/man/gemfile.5.ronn +521 -0
  301. data/man/gemfile.5.txt +653 -0
  302. data/man/index.txt +25 -0
  303. metadata +463 -0
@@ -0,0 +1,229 @@
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
+ check_for_corrupt_lockfile
95
+
96
+ if @size > 1
97
+ install_with_worker
98
+ else
99
+ install_serially
100
+ end
101
+
102
+ handle_error if @specs.any?(&:failed?)
103
+ @specs
104
+ ensure
105
+ worker_pool && worker_pool.stop
106
+ end
107
+
108
+ def check_for_corrupt_lockfile
109
+ missing_dependencies = @specs.map do |s|
110
+ [
111
+ s,
112
+ s.missing_lockfile_dependencies(@specs.map(&:name)),
113
+ ]
114
+ end.reject { |a| a.last.empty? }
115
+ return if missing_dependencies.empty?
116
+
117
+ warning = []
118
+ warning << "Your lockfile was created by an old Bundler that left some things out."
119
+ if @size != 1
120
+ warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time."
121
+ @size = 1
122
+ end
123
+ warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile."
124
+ warning << "The missing gems are:"
125
+
126
+ missing_dependencies.each do |spec, missing|
127
+ warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}"
128
+ end
129
+
130
+ Bundler.ui.warn(warning.join("\n"))
131
+ end
132
+
133
+ private
134
+
135
+ def install_with_worker
136
+ enqueue_specs
137
+ process_specs until finished_installing?
138
+ end
139
+
140
+ def install_serially
141
+ until finished_installing?
142
+ raise "failed to find a spec to enqueue while installing serially" unless spec_install = @specs.find(&:ready_to_enqueue?)
143
+ spec_install.state = :enqueued
144
+ do_install(spec_install, 0)
145
+ end
146
+ end
147
+
148
+ def worker_pool
149
+ @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda { |spec_install, worker_num|
150
+ do_install(spec_install, worker_num)
151
+ }
152
+ end
153
+
154
+ def do_install(spec_install, worker_num)
155
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
156
+ gem_installer = Bundler::GemInstaller.new(
157
+ spec_install.spec, @installer, @standalone, worker_num, @force
158
+ )
159
+ success, message = begin
160
+ gem_installer.install_from_spec
161
+ rescue RuntimeError => e
162
+ raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
163
+ end
164
+ if success
165
+ spec_install.state = :installed
166
+ spec_install.post_install_message = message unless message.nil?
167
+ else
168
+ spec_install.state = :failed
169
+ spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
170
+ end
171
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
172
+ spec_install
173
+ end
174
+
175
+ # Dequeue a spec and save its post-install message and then enqueue the
176
+ # remaining specs.
177
+ # Some specs might've had to wait til this spec was installed to be
178
+ # processed so the call to `enqueue_specs` is important after every
179
+ # dequeue.
180
+ def process_specs
181
+ worker_pool.deq
182
+ enqueue_specs
183
+ end
184
+
185
+ def finished_installing?
186
+ @specs.all? do |spec|
187
+ return true if spec.failed?
188
+ spec.installed?
189
+ end
190
+ end
191
+
192
+ def handle_error
193
+ errors = @specs.select(&:failed?).map(&:error)
194
+ if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
195
+ raise exception
196
+ end
197
+ raise Bundler::InstallError, errors.map(&:to_s).join("\n\n")
198
+ end
199
+
200
+ def require_tree_for_spec(spec)
201
+ tree = @spec_set.what_required(spec)
202
+ t = String.new("In #{File.basename(SharedHelpers.default_gemfile)}:\n")
203
+ tree.each_with_index do |s, depth|
204
+ t << " " * depth.succ << s.name
205
+ unless tree.last == s
206
+ t << %( was resolved to #{s.version}, which depends on)
207
+ end
208
+ t << %(\n)
209
+ end
210
+ t
211
+ end
212
+
213
+ # Keys in the remains hash represent uninstalled gems specs.
214
+ # We enqueue all gem specs that do not have any dependencies.
215
+ # Later we call this lambda again to install specs that depended on
216
+ # previously installed specifications. We continue until all specs
217
+ # are installed.
218
+ def enqueue_specs
219
+ @specs.select(&:ready_to_enqueue?).each do |spec|
220
+ next if @rake && !@rake.installed? && spec.name != @rake.name
221
+
222
+ if spec.dependencies_installed? @specs
223
+ spec.state = :enqueued
224
+ worker_pool.enq spec
225
+ end
226
+ end
227
+ end
228
+ end
229
+ 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
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require "bundler/match_platform"
5
+
6
+ module Bundler
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
+
24
+ include MatchPlatform
25
+
26
+ attr_reader :name, :version, :dependencies, :platform
27
+ attr_accessor :source, :remote
28
+
29
+ def initialize(name, version, platform, source = nil)
30
+ @name = name
31
+ @version = version
32
+ @dependencies = []
33
+ @platform = platform || Gem::Platform::RUBY
34
+ @source = source
35
+ @specification = nil
36
+ end
37
+
38
+ def full_name
39
+ if platform == Gem::Platform::RUBY || platform.nil?
40
+ "#{@name}-#{@version}"
41
+ else
42
+ "#{@name}-#{@version}-#{platform}"
43
+ end
44
+ end
45
+
46
+ def ==(other)
47
+ identifier == other.identifier
48
+ end
49
+
50
+ def satisfies?(dependency)
51
+ @name == dependency.name && dependency.requirement.satisfied_by?(Gem::Version.new(@version))
52
+ end
53
+
54
+ def to_lock
55
+ out = String.new
56
+
57
+ if platform == Gem::Platform::RUBY || platform.nil?
58
+ out << " #{name} (#{version})\n"
59
+ else
60
+ out << " #{name} (#{version}-#{platform})\n"
61
+ end
62
+
63
+ dependencies.sort_by(&:to_s).uniq.each do |dep|
64
+ next if dep.type == :development
65
+ out << " #{dep.to_lock}\n"
66
+ end
67
+
68
+ out
69
+ end
70
+
71
+ def __materialize__
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
86
+ end
87
+
88
+ def respond_to?(*args)
89
+ super || @specification ? @specification.respond_to?(*args) : nil
90
+ end
91
+
92
+ def to_s
93
+ @__to_s ||= if platform == Gem::Platform::RUBY || platform.nil?
94
+ "#{name} (#{version})"
95
+ else
96
+ "#{name} (#{version}-#{platform})"
97
+ end
98
+ end
99
+
100
+ def identifier
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]}"
107
+ end
108
+
109
+ private
110
+
111
+ def to_ary
112
+ nil
113
+ end
114
+
115
+ def method_missing(method, *args, &blk)
116
+ raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification
117
+
118
+ return super unless respond_to?(method)
119
+
120
+ @specification.send(method, *args, &blk)
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class LockfileGenerator
5
+ attr_reader :definition
6
+ attr_reader :out
7
+
8
+ # @private
9
+ def initialize(definition)
10
+ @definition = definition
11
+ @out = String.new
12
+ end
13
+
14
+ def self.generate(definition)
15
+ new(definition).generate!
16
+ end
17
+
18
+ def generate!
19
+ add_sources
20
+ add_platforms
21
+ add_dependencies
22
+ add_locked_ruby_version
23
+ add_bundled_with
24
+
25
+ out
26
+ end
27
+
28
+ private
29
+
30
+ def add_sources
31
+ definition.send(:sources).lock_sources.each_with_index do |source, idx|
32
+ out << "\n" unless idx.zero?
33
+
34
+ # Add the source header
35
+ out << source.to_lock
36
+
37
+ # Find all specs for this source
38
+ specs = definition.resolve.select {|s| source.can_lock?(s) }
39
+ add_specs(specs)
40
+ end
41
+ end
42
+
43
+ def add_specs(specs)
44
+ # This needs to be sorted by full name so that
45
+ # gems with the same name, but different platform
46
+ # are ordered consistently
47
+ specs.sort_by(&:full_name).each do |spec|
48
+ next if spec.name == "bundler".freeze
49
+ out << spec.to_lock
50
+ end
51
+ end
52
+
53
+ def add_platforms
54
+ add_section("PLATFORMS", definition.platforms)
55
+ end
56
+
57
+ def add_dependencies
58
+ out << "\nDEPENDENCIES\n"
59
+
60
+ handled = []
61
+ definition.dependencies.sort_by(&:to_s).each do |dep|
62
+ next if handled.include?(dep.name)
63
+ out << dep.to_lock
64
+ handled << dep.name
65
+ end
66
+ end
67
+
68
+ def add_locked_ruby_version
69
+ return unless locked_ruby_version = definition.locked_ruby_version
70
+ add_section("RUBY VERSION", locked_ruby_version.to_s)
71
+ end
72
+
73
+ def add_bundled_with
74
+ add_section("BUNDLED WITH", definition.locked_bundler_version.to_s)
75
+ end
76
+
77
+ def add_section(name, value)
78
+ out << "\n#{name}\n"
79
+ case value
80
+ when Array
81
+ value.map(&:to_s).sort.each do |val|
82
+ out << " #{val}\n"
83
+ end
84
+ when Hash
85
+ value.to_a.sort_by {|k, _| k.to_s }.each do |key, val|
86
+ out << " #{key}: #{val}\n"
87
+ end
88
+ when String
89
+ out << " #{value}\n"
90
+ else
91
+ raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile"
92
+ end
93
+ end
94
+ end
95
+ end