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,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/compatibility_guard"
4
+
5
+ # Allows for declaring a Gemfile inline in a ruby script, optionally installing
6
+ # any gems that aren't already installed on the user's system.
7
+ #
8
+ # @note Every gem that is specified in this 'Gemfile' will be `require`d, as if
9
+ # the user had manually called `Bundler.require`. To avoid a requested gem
10
+ # being automatically required, add the `:require => false` option to the
11
+ # `gem` dependency declaration.
12
+ #
13
+ # @param install [Boolean] whether gems that aren't already installed on the
14
+ # user's system should be installed.
15
+ # Defaults to `false`.
16
+ #
17
+ # @param gemfile [Proc] a block that is evaluated as a `Gemfile`.
18
+ #
19
+ # @example Using an inline Gemfile
20
+ #
21
+ # #!/usr/bin/env ruby
22
+ #
23
+ # require 'bundler/inline'
24
+ #
25
+ # gemfile do
26
+ # source 'https://rubygems.org'
27
+ # gem 'json', require: false
28
+ # gem 'nap', require: 'rest'
29
+ # gem 'cocoapods', '~> 0.34.1'
30
+ # end
31
+ #
32
+ # puts Pod::VERSION # => "0.34.4"
33
+ #
34
+ def gemfile(install = false, options = {}, &gemfile)
35
+ require "bundler"
36
+
37
+ opts = options.dup
38
+ ui = opts.delete(:ui) { Bundler::UI::Shell.new }
39
+ raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
40
+
41
+ old_root = Bundler.method(:root)
42
+ def Bundler.root
43
+ Bundler::SharedHelpers.pwd.expand_path
44
+ end
45
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
46
+
47
+ Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
48
+ builder = Bundler::Dsl.new
49
+ builder.instance_eval(&gemfile)
50
+
51
+ definition = builder.to_definition(nil, true)
52
+ def definition.lock(*); end
53
+ definition.validate_runtime!
54
+
55
+ missing_specs = proc do
56
+ definition.missing_specs?
57
+ end
58
+
59
+ Bundler.ui = ui if install
60
+ if install || missing_specs.call
61
+ Bundler.settings.temporary(:inline => true) do
62
+ installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
63
+ installer.post_install_messages.each do |name, message|
64
+ Bundler.ui.info "Post-install message from #{name}:\n#{message}"
65
+ end
66
+ end
67
+ end
68
+
69
+ runtime = Bundler::Runtime.new(nil, definition)
70
+ runtime.setup.require
71
+ ensure
72
+ bundler_module = class << Bundler; self; end
73
+ bundler_module.send(:define_method, :root, old_root) if old_root
74
+ end
@@ -0,0 +1,318 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "erb"
4
+ require "rubygems/dependency_installer"
5
+ require "bundler/worker"
6
+ require "bundler/installer/parallel_installer"
7
+ require "bundler/installer/standalone"
8
+ require "bundler/installer/gem_installer"
9
+
10
+ module Bundler
11
+ class Installer
12
+ class << self
13
+ attr_accessor :ambiguous_gems
14
+
15
+ Installer.ambiguous_gems = []
16
+ end
17
+
18
+ attr_reader :post_install_messages
19
+
20
+ # Begins the installation process for Bundler.
21
+ # For more information see the #run method on this class.
22
+ def self.install(root, definition, options = {})
23
+ installer = new(root, definition)
24
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL_ALL, definition.dependencies)
25
+ installer.run(options)
26
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL_ALL, definition.dependencies)
27
+ installer
28
+ end
29
+
30
+ def initialize(root, definition)
31
+ @root = root
32
+ @definition = definition
33
+ @post_install_messages = {}
34
+ end
35
+
36
+ # Runs the install procedures for a specific Gemfile.
37
+ #
38
+ # Firstly, this method will check to see if `Bundler.bundle_path` exists
39
+ # and if not then Bundler will create the directory. This is usually the same
40
+ # location as RubyGems which typically is the `~/.gem` directory
41
+ # unless other specified.
42
+ #
43
+ # Secondly, it checks if Bundler has been configured to be "frozen".
44
+ # Frozen ensures that the Gemfile and the Gemfile.lock file are matching.
45
+ # This stops a situation where a developer may update the Gemfile but may not run
46
+ # `bundle install`, which leads to the Gemfile.lock file not being correctly updated.
47
+ # If this file is not correctly updated then any other developer running
48
+ # `bundle install` will potentially not install the correct gems.
49
+ #
50
+ # Thirdly, Bundler checks if there are any dependencies specified in the Gemfile.
51
+ # If there are no dependencies specified then Bundler returns a warning message stating
52
+ # so and this method returns.
53
+ #
54
+ # Fourthly, Bundler checks if the Gemfile.lock exists, and if so
55
+ # then proceeds to set up a definition based on the Gemfile and the Gemfile.lock.
56
+ # During this step Bundler will also download information about any new gems
57
+ # that are not in the Gemfile.lock and resolve any dependencies if needed.
58
+ #
59
+ # Fifthly, Bundler resolves the dependencies either through a cache of gems or by remote.
60
+ # This then leads into the gems being installed, along with stubs for their executables,
61
+ # but only if the --binstubs option has been passed or Bundler.options[:bin] has been set
62
+ # earlier.
63
+ #
64
+ # Sixthly, a new Gemfile.lock is created from the installed gems to ensure that the next time
65
+ # that a user runs `bundle install` they will receive any updates from this process.
66
+ #
67
+ # Finally, if the user has specified the standalone flag, Bundler will generate the needed
68
+ # require paths and save them in a `setup.rb` file. See `bundle standalone --help` for more
69
+ # information.
70
+ def run(options)
71
+ create_bundle_path
72
+
73
+ ProcessLock.lock do
74
+ if Bundler.frozen_bundle?
75
+ @definition.ensure_equivalent_gemfile_and_lockfile(options[:deployment])
76
+ end
77
+
78
+ if @definition.dependencies.empty?
79
+ Bundler.ui.warn "The Gemfile specifies no dependencies"
80
+ lock
81
+ return
82
+ end
83
+
84
+ if resolve_if_needed(options)
85
+ ensure_specs_are_compatible!
86
+ warn_on_incompatible_bundler_deps
87
+ load_plugins
88
+ options.delete(:jobs)
89
+ else
90
+ options[:jobs] = 1 # to avoid the overhead of Bundler::Worker
91
+ end
92
+ install(options)
93
+
94
+ lock unless Bundler.frozen_bundle?
95
+ Standalone.new(options[:standalone], @definition).generate if options[:standalone]
96
+ end
97
+ end
98
+
99
+ def generate_bundler_executable_stubs(spec, options = {})
100
+ if options[:binstubs_cmd] && spec.executables.empty?
101
+ options = {}
102
+ spec.runtime_dependencies.each do |dep|
103
+ bins = @definition.specs[dep].first.executables
104
+ options[dep.name] = bins unless bins.empty?
105
+ end
106
+ if options.any?
107
+ Bundler.ui.warn "#{spec.name} has no executables, but you may want " \
108
+ "one from a gem it depends on."
109
+ options.each {|name, bins| Bundler.ui.warn " #{name} has: #{bins.join(", ")}" }
110
+ else
111
+ Bundler.ui.warn "There are no executables for the gem #{spec.name}."
112
+ end
113
+ return
114
+ end
115
+
116
+ # double-assignment to avoid warnings about variables that will be used by ERB
117
+ bin_path = Bundler.bin_path
118
+ bin_path = bin_path
119
+ relative_gemfile_path = Bundler.default_gemfile.relative_path_from(bin_path)
120
+ relative_gemfile_path = relative_gemfile_path
121
+ ruby_command = Thor::Util.ruby_command
122
+ ruby_command = ruby_command
123
+ template_path = File.expand_path("../templates/Executable", __FILE__)
124
+ if spec.name == "bundler"
125
+ template_path += ".bundler"
126
+ spec.executables = %(bundle)
127
+ end
128
+ template = File.read(template_path)
129
+
130
+ exists = []
131
+ spec.executables.each do |executable|
132
+ binstub_path = "#{bin_path}/#{executable}"
133
+ if File.exist?(binstub_path) && !options[:force]
134
+ exists << executable
135
+ next
136
+ end
137
+
138
+ File.open(binstub_path, "w", 0o777 & ~File.umask) do |f|
139
+ if RUBY_VERSION >= "2.6"
140
+ f.puts ERB.new(template, :trim_mode => "-").result(binding)
141
+ else
142
+ f.puts ERB.new(template, nil, "-").result(binding)
143
+ end
144
+ end
145
+ end
146
+
147
+ if options[:binstubs_cmd] && exists.any?
148
+ case exists.size
149
+ when 1
150
+ Bundler.ui.warn "Skipped #{exists[0]} since it already exists."
151
+ when 2
152
+ Bundler.ui.warn "Skipped #{exists.join(" and ")} since they already exist."
153
+ else
154
+ items = exists[0...-1].empty? ? nil : exists[0...-1].join(", ")
155
+ skipped = [items, exists[-1]].compact.join(" and ")
156
+ Bundler.ui.warn "Skipped #{skipped} since they already exist."
157
+ end
158
+ Bundler.ui.warn "If you want to overwrite skipped stubs, use --force."
159
+ end
160
+ end
161
+
162
+ def generate_standalone_bundler_executable_stubs(spec)
163
+ # double-assignment to avoid warnings about variables that will be used by ERB
164
+ bin_path = Bundler.bin_path
165
+ unless path = Bundler.settings[:path]
166
+ raise "Can't standalone without an explicit path set"
167
+ end
168
+ standalone_path = Bundler.root.join(path).relative_path_from(bin_path)
169
+ standalone_path = standalone_path
170
+ template = File.read(File.expand_path("../templates/Executable.standalone", __FILE__))
171
+ ruby_command = Thor::Util.ruby_command
172
+ ruby_command = ruby_command
173
+
174
+ spec.executables.each do |executable|
175
+ next if executable == "bundle"
176
+ executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
177
+ executable_path = executable_path
178
+ File.open "#{bin_path}/#{executable}", "w", 0o755 do |f|
179
+ if RUBY_VERSION >= "2.6"
180
+ f.puts ERB.new(template, :trim_mode => "-").result(binding)
181
+ else
182
+ f.puts ERB.new(template, nil, "-").result(binding)
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ private
189
+
190
+ # the order that the resolver provides is significant, since
191
+ # dependencies might affect the installation of a gem.
192
+ # that said, it's a rare situation (other than rake), and parallel
193
+ # installation is SO MUCH FASTER. so we let people opt in.
194
+ def install(options)
195
+ force = options["force"]
196
+ jobs = installation_parallelization(options)
197
+ install_in_parallel jobs, options[:standalone], force
198
+ end
199
+
200
+ def installation_parallelization(options)
201
+ if jobs = options.delete(:jobs)
202
+ return jobs
203
+ end
204
+
205
+ return 1 unless can_install_in_parallel?
206
+
207
+ auto_config_jobs = Bundler.feature_flag.auto_config_jobs?
208
+ if jobs = Bundler.settings[:jobs]
209
+ if auto_config_jobs
210
+ jobs
211
+ else
212
+ [jobs.pred, 1].max
213
+ end
214
+ elsif auto_config_jobs
215
+ processor_count
216
+ else
217
+ 1
218
+ end
219
+ end
220
+
221
+ def processor_count
222
+ require "etc"
223
+ Etc.nprocessors
224
+ rescue
225
+ 1
226
+ end
227
+
228
+ def load_plugins
229
+ Bundler.rubygems.load_plugins
230
+
231
+ requested_path_gems = @definition.requested_specs.select {|s| s.source.is_a?(Source::Path) }
232
+ path_plugin_files = requested_path_gems.map do |spec|
233
+ begin
234
+ Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}")
235
+ rescue TypeError
236
+ error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
237
+ raise Gem::InvalidSpecificationException, error_message
238
+ end
239
+ end.flatten
240
+ Bundler.rubygems.load_plugin_files(path_plugin_files)
241
+ end
242
+
243
+ def ensure_specs_are_compatible!
244
+ system_ruby = Bundler::RubyVersion.system
245
+ rubygems_version = Gem::Version.create(Gem::VERSION)
246
+ @definition.specs.each do |spec|
247
+ if required_ruby_version = spec.required_ruby_version
248
+ unless required_ruby_version.satisfied_by?(system_ruby.gem_version)
249
+ raise InstallError, "#{spec.full_name} requires ruby version #{required_ruby_version}, " \
250
+ "which is incompatible with the current version, #{system_ruby}"
251
+ end
252
+ end
253
+ next unless required_rubygems_version = spec.required_rubygems_version
254
+ unless required_rubygems_version.satisfied_by?(rubygems_version)
255
+ raise InstallError, "#{spec.full_name} requires rubygems version #{required_rubygems_version}, " \
256
+ "which is incompatible with the current version, #{rubygems_version}"
257
+ end
258
+ end
259
+ end
260
+
261
+ def warn_on_incompatible_bundler_deps
262
+ bundler_version = Gem::Version.create(Bundler::VERSION)
263
+ @definition.specs.each do |spec|
264
+ spec.dependencies.each do |dep|
265
+ next if dep.type == :development
266
+ next unless dep.name == "bundler".freeze
267
+ next if dep.requirement.satisfied_by?(bundler_version)
268
+
269
+ Bundler.ui.warn "#{spec.name} (#{spec.version}) has dependency" \
270
+ " #{SharedHelpers.pretty_dependency(dep)}" \
271
+ ", which is unsatisfied by the current bundler version #{VERSION}" \
272
+ ", so the dependency is being ignored"
273
+ end
274
+ end
275
+ end
276
+
277
+ def can_install_in_parallel?
278
+ if Bundler.rubygems.provides?(">= 2.1.0")
279
+ true
280
+ else
281
+ Bundler.ui.warn "RubyGems #{Gem::VERSION} is not threadsafe, so your "\
282
+ "gems will be installed one at a time. Upgrade to RubyGems 2.1.0 " \
283
+ "or higher to enable parallel gem installation."
284
+ false
285
+ end
286
+ end
287
+
288
+ def install_in_parallel(size, standalone, force = false)
289
+ spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
290
+ spec_installations.each do |installation|
291
+ post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message?
292
+ end
293
+ end
294
+
295
+ def create_bundle_path
296
+ SharedHelpers.filesystem_access(Bundler.bundle_path.to_s) do |p|
297
+ Bundler.mkdir_p(p)
298
+ end unless Bundler.bundle_path.exist?
299
+ rescue Errno::EEXIST
300
+ raise PathError, "Could not install to path `#{Bundler.bundle_path}` " \
301
+ "because a file already exists at that path. Either remove or rename the file so the directory can be created."
302
+ end
303
+
304
+ # returns whether or not a re-resolve was needed
305
+ def resolve_if_needed(options)
306
+ if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
307
+ return false if @definition.nothing_changed? && !@definition.missing_specs?
308
+ end
309
+
310
+ options["local"] ? @definition.resolve_with_cache! : @definition.resolve_remotely!
311
+ true
312
+ end
313
+
314
+ def lock(opts = {})
315
+ @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections])
316
+ end
317
+ end
318
+ end
@@ -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