bundler 2.0.2 → 2.1.0

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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +735 -574
  3. data/LICENSE.md +18 -19
  4. data/README.md +8 -7
  5. data/bundler.gemspec +5 -23
  6. data/exe/bundle +19 -3
  7. data/lib/bundler.rb +202 -87
  8. data/lib/bundler/build_metadata.rb +3 -3
  9. data/lib/bundler/capistrano.rb +5 -5
  10. data/lib/bundler/cli.rb +179 -143
  11. data/lib/bundler/cli/add.rb +28 -16
  12. data/lib/bundler/cli/cache.rb +25 -13
  13. data/lib/bundler/cli/common.rb +10 -11
  14. data/lib/bundler/cli/config.rb +161 -86
  15. data/lib/bundler/cli/console.rb +2 -2
  16. data/lib/bundler/cli/doctor.rb +4 -4
  17. data/lib/bundler/cli/exec.rb +15 -18
  18. data/lib/bundler/cli/gem.rb +5 -5
  19. data/lib/bundler/cli/info.rb +17 -5
  20. data/lib/bundler/cli/init.rb +1 -1
  21. data/lib/bundler/cli/install.rb +3 -3
  22. data/lib/bundler/cli/issue.rb +1 -1
  23. data/lib/bundler/cli/open.rb +10 -6
  24. data/lib/bundler/cli/outdated.rb +85 -81
  25. data/lib/bundler/cli/plugin.rb +9 -2
  26. data/lib/bundler/cli/pristine.rb +1 -1
  27. data/lib/bundler/cli/show.rb +1 -1
  28. data/lib/bundler/cli/update.rb +31 -11
  29. data/lib/bundler/compact_index_client.rb +25 -9
  30. data/lib/bundler/compact_index_client/updater.rb +2 -6
  31. data/lib/bundler/current_ruby.rb +8 -7
  32. data/lib/bundler/definition.rb +33 -26
  33. data/lib/bundler/dependency.rb +16 -4
  34. data/lib/bundler/deployment.rb +2 -2
  35. data/lib/bundler/dsl.rb +19 -43
  36. data/lib/bundler/env.rb +6 -5
  37. data/lib/bundler/environment_preserver.rb +0 -1
  38. data/lib/bundler/feature_flag.rb +1 -13
  39. data/lib/bundler/fetcher.rb +16 -13
  40. data/lib/bundler/fetcher/compact_index.rb +26 -12
  41. data/lib/bundler/fetcher/dependency.rb +1 -1
  42. data/lib/bundler/fetcher/downloader.rb +4 -1
  43. data/lib/bundler/fetcher/index.rb +5 -3
  44. data/lib/bundler/friendly_errors.rb +6 -7
  45. data/lib/bundler/gem_helper.rb +14 -14
  46. data/lib/bundler/gem_helpers.rb +2 -4
  47. data/lib/bundler/gem_tasks.rb +1 -1
  48. data/lib/bundler/gem_version_promoter.rb +3 -3
  49. data/lib/bundler/graph.rb +2 -2
  50. data/lib/bundler/injector.rb +3 -1
  51. data/lib/bundler/inline.rb +40 -30
  52. data/lib/bundler/installer.rb +7 -14
  53. data/lib/bundler/installer/gem_installer.rb +5 -1
  54. data/lib/bundler/installer/parallel_installer.rb +4 -4
  55. data/lib/bundler/installer/standalone.rb +1 -2
  56. data/lib/bundler/lazy_specification.rb +2 -3
  57. data/lib/bundler/lockfile_parser.rb +14 -21
  58. data/lib/bundler/match_platform.rb +1 -1
  59. data/lib/bundler/mirror.rb +3 -3
  60. data/lib/bundler/plugin.rb +29 -18
  61. data/lib/bundler/plugin/api.rb +1 -1
  62. data/lib/bundler/plugin/api/source.rb +4 -6
  63. data/lib/bundler/plugin/index.rb +10 -2
  64. data/lib/bundler/plugin/installer.rb +28 -15
  65. data/lib/bundler/psyched_yaml.rb +1 -1
  66. data/lib/bundler/remote_specification.rb +0 -2
  67. data/lib/bundler/resolver.rb +72 -24
  68. data/lib/bundler/resolver/spec_group.rb +3 -2
  69. data/lib/bundler/retry.rb +2 -2
  70. data/lib/bundler/ruby_version.rb +4 -19
  71. data/lib/bundler/rubygems_ext.rb +11 -66
  72. data/lib/bundler/rubygems_gem_installer.rb +1 -1
  73. data/lib/bundler/rubygems_integration.rb +133 -410
  74. data/lib/bundler/runtime.rb +2 -9
  75. data/lib/bundler/settings.rb +22 -52
  76. data/lib/bundler/setup.rb +7 -13
  77. data/lib/bundler/shared_helpers.rb +46 -74
  78. data/lib/bundler/similarity_detector.rb +2 -2
  79. data/lib/bundler/source.rb +5 -5
  80. data/lib/bundler/source/git.rb +24 -17
  81. data/lib/bundler/source/git/git_proxy.rb +38 -41
  82. data/lib/bundler/source/metadata.rb +7 -2
  83. data/lib/bundler/source/path.rb +13 -8
  84. data/lib/bundler/source/rubygems.rb +14 -8
  85. data/lib/bundler/source/rubygems/remote.rb +2 -3
  86. data/lib/bundler/source_list.rb +9 -12
  87. data/lib/bundler/spec_set.rb +1 -6
  88. data/lib/bundler/stub_specification.rb +18 -30
  89. data/lib/bundler/templates/Executable.bundler +22 -13
  90. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +3 -3
  91. data/lib/bundler/templates/newgem/Gemfile.tt +8 -0
  92. data/lib/bundler/templates/newgem/README.md.tt +4 -3
  93. data/lib/bundler/templates/newgem/newgem.gemspec.tt +2 -18
  94. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  95. data/lib/bundler/templates/newgem/travis.yml.tt +0 -1
  96. data/lib/bundler/ui.rb +3 -3
  97. data/lib/bundler/ui/rg_proxy.rb +1 -1
  98. data/lib/bundler/ui/shell.rb +4 -8
  99. data/lib/bundler/uri_credentials_filter.rb +7 -3
  100. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
  101. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
  102. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
  103. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  104. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +134 -111
  105. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +6 -6
  106. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  107. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  108. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  109. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  110. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  111. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +6 -6
  112. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  113. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  114. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +30 -8
  115. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  116. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  117. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -2
  118. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +273 -304
  119. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  120. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  121. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  122. data/lib/bundler/vendor/thor/lib/thor.rb +19 -4
  123. data/lib/bundler/vendor/thor/lib/thor/actions.rb +17 -12
  124. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  125. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -1
  126. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
  127. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +5 -5
  128. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +19 -8
  129. data/lib/bundler/vendor/thor/lib/thor/base.rb +51 -39
  130. data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
  131. data/lib/bundler/vendor/thor/lib/thor/error.rb +14 -18
  132. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  133. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
  134. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  135. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
  136. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  137. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  138. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  139. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +2 -2
  140. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +20 -7
  141. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -3
  142. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  143. data/lib/bundler/vendor/thor/lib/thor/runner.rb +13 -12
  144. data/lib/bundler/vendor/thor/lib/thor/shell.rb +3 -3
  145. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -1
  146. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +6 -2
  147. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -3
  148. data/lib/bundler/vendor/thor/lib/thor/util.rb +18 -2
  149. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  150. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  151. data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
  152. data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
  153. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  154. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
  155. data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
  156. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  157. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  158. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
  159. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
  160. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  161. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
  162. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  163. data/lib/bundler/vendored_fileutils.rb +1 -6
  164. data/lib/bundler/vendored_molinillo.rb +1 -1
  165. data/lib/bundler/vendored_persistent.rb +7 -5
  166. data/lib/bundler/vendored_thor.rb +2 -2
  167. data/lib/bundler/vendored_uri.rb +4 -0
  168. data/lib/bundler/version.rb +1 -20
  169. data/lib/bundler/version_ranges.rb +51 -5
  170. data/lib/bundler/vlad.rb +3 -3
  171. data/lib/bundler/worker.rb +1 -3
  172. data/lib/bundler/yaml_serializer.rb +2 -3
  173. data/man/bundle-add.1 +10 -2
  174. data/man/bundle-add.1.txt +11 -5
  175. data/man/bundle-add.ronn +7 -1
  176. data/man/bundle-binstubs.1 +2 -2
  177. data/man/bundle-binstubs.1.txt +2 -2
  178. data/man/bundle-binstubs.ronn +1 -1
  179. data/man/bundle-cache.1 +55 -0
  180. data/man/bundle-cache.1.txt +78 -0
  181. data/man/{bundle-package.ronn → bundle-cache.ronn} +15 -15
  182. data/man/bundle-check.1 +1 -1
  183. data/man/bundle-check.1.txt +6 -6
  184. data/man/bundle-clean.1 +1 -1
  185. data/man/bundle-clean.1.txt +1 -1
  186. data/man/bundle-config.1 +35 -35
  187. data/man/bundle-config.1.txt +65 -66
  188. data/man/bundle-config.ronn +41 -39
  189. data/man/bundle-doctor.1 +1 -1
  190. data/man/bundle-doctor.1.txt +1 -1
  191. data/man/bundle-exec.1 +2 -2
  192. data/man/bundle-exec.1.txt +2 -2
  193. data/man/bundle-exec.ronn +1 -1
  194. data/man/bundle-gem.1 +1 -1
  195. data/man/bundle-gem.1.txt +3 -3
  196. data/man/bundle-info.1 +1 -1
  197. data/man/bundle-info.1.txt +1 -1
  198. data/man/bundle-init.1 +1 -1
  199. data/man/bundle-init.1.txt +1 -1
  200. data/man/bundle-inject.1 +1 -1
  201. data/man/bundle-inject.1.txt +1 -1
  202. data/man/bundle-install.1 +8 -5
  203. data/man/bundle-install.1.txt +56 -51
  204. data/man/bundle-install.ronn +9 -4
  205. data/man/bundle-list.1 +1 -1
  206. data/man/bundle-list.1.txt +1 -1
  207. data/man/bundle-lock.1 +1 -1
  208. data/man/bundle-lock.1.txt +16 -16
  209. data/man/bundle-open.1 +1 -1
  210. data/man/bundle-open.1.txt +1 -1
  211. data/man/bundle-outdated.1 +1 -1
  212. data/man/bundle-outdated.1.txt +1 -1
  213. data/man/bundle-platform.1 +1 -1
  214. data/man/bundle-platform.1.txt +1 -1
  215. data/man/bundle-pristine.1 +1 -1
  216. data/man/bundle-pristine.1.txt +1 -1
  217. data/man/bundle-remove.1 +1 -1
  218. data/man/bundle-remove.1.txt +1 -1
  219. data/man/bundle-show.1 +1 -1
  220. data/man/bundle-show.1.txt +1 -1
  221. data/man/bundle-update.1 +4 -4
  222. data/man/bundle-update.1.txt +64 -65
  223. data/man/bundle-update.ronn +3 -3
  224. data/man/bundle-viz.1 +1 -1
  225. data/man/bundle-viz.1.txt +1 -1
  226. data/man/bundle.1 +2 -2
  227. data/man/bundle.1.txt +7 -7
  228. data/man/bundle.ronn +1 -1
  229. data/man/gemfile.5 +12 -15
  230. data/man/gemfile.5.ronn +9 -13
  231. data/man/gemfile.5.txt +103 -107
  232. data/man/index.txt +1 -1
  233. metadata +30 -120
  234. data/exe/bundle_ruby +0 -60
  235. data/lib/bundler/cli/package.rb +0 -49
  236. data/lib/bundler/compatibility_guard.rb +0 -13
  237. data/lib/bundler/gem_remote_fetcher.rb +0 -43
  238. data/lib/bundler/ssl_certs/.document +0 -1
  239. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  240. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  241. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  242. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  243. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +0 -5
  244. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  245. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
  246. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
  247. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
  248. data/man/bundle-package.1 +0 -55
  249. data/man/bundle-package.1.txt +0 -79
@@ -47,7 +47,7 @@ module Bundler
47
47
 
48
48
  def fetch_valid_mirror_for(uri)
49
49
  downcased = uri.to_s.downcase
50
- mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri)
50
+ mirror = @mirrors[downcased] || @mirrors[Bundler::URI(downcased).host] || Mirror.new(uri)
51
51
  mirror.validate!(@prober)
52
52
  mirror = Mirror.new(uri) unless mirror.valid?
53
53
  mirror
@@ -74,7 +74,7 @@ module Bundler
74
74
  @uri = if uri.nil?
75
75
  nil
76
76
  else
77
- URI(uri.to_s)
77
+ Bundler::URI(uri.to_s)
78
78
  end
79
79
  @valid = nil
80
80
  end
@@ -126,7 +126,7 @@ module Bundler
126
126
  if uri == "all"
127
127
  @all = true
128
128
  else
129
- @uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
129
+ @uri = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
130
130
  end
131
131
  @value = value
132
132
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/plugin/api"
3
+ require_relative "plugin/api"
4
4
 
5
5
  module Bundler
6
6
  module Plugin
7
- autoload :DSL, "bundler/plugin/dsl"
8
- autoload :Events, "bundler/plugin/events"
9
- autoload :Index, "bundler/plugin/index"
10
- autoload :Installer, "bundler/plugin/installer"
11
- autoload :SourceList, "bundler/plugin/source_list"
7
+ autoload :DSL, File.expand_path("plugin/dsl", __dir__)
8
+ autoload :Events, File.expand_path("plugin/events", __dir__)
9
+ autoload :Index, File.expand_path("plugin/index", __dir__)
10
+ autoload :Installer, File.expand_path("plugin/installer", __dir__)
11
+ autoload :SourceList, File.expand_path("plugin/source_list", __dir__)
12
12
 
13
13
  class MalformattedPlugin < PluginError; end
14
14
  class UndefinedCommandError < PluginError; end
@@ -47,6 +47,26 @@ module Bundler
47
47
  Bundler.ui.error "Failed to install plugin #{name}: #{e.message}\n #{e.backtrace.join("\n ")}"
48
48
  end
49
49
 
50
+ # List installed plugins and commands
51
+ #
52
+ def list
53
+ installed_plugins = index.installed_plugins
54
+ if installed_plugins.any?
55
+ output = String.new
56
+ installed_plugins.each do |plugin|
57
+ output << "#{plugin}\n"
58
+ output << "-----\n"
59
+ index.plugin_commands(plugin).each do |command|
60
+ output << " #{command}\n"
61
+ end
62
+ output << "\n"
63
+ end
64
+ else
65
+ output = "No plugins installed"
66
+ end
67
+ Bundler.ui.info output
68
+ end
69
+
50
70
  # Evaluates the Gemfile with a limited DSL and installs the plugins
51
71
  # specified by plugin method
52
72
  #
@@ -236,7 +256,7 @@ module Bundler
236
256
  @hooks_by_event = Hash.new {|h, k| h[k] = [] }
237
257
 
238
258
  load_paths = spec.load_paths
239
- add_to_load_path(load_paths)
259
+ Bundler.rubygems.add_to_load_path(load_paths)
240
260
  path = Pathname.new spec.full_gem_path
241
261
 
242
262
  begin
@@ -268,7 +288,7 @@ module Bundler
268
288
  # done to avoid conflicts
269
289
  path = index.plugin_path(name)
270
290
 
271
- add_to_load_path(index.load_paths(name))
291
+ Bundler.rubygems.add_to_load_path(index.load_paths(name))
272
292
 
273
293
  load path.join(PLUGIN_FILE_NAME)
274
294
 
@@ -278,17 +298,8 @@ module Bundler
278
298
  raise
279
299
  end
280
300
 
281
- def add_to_load_path(load_paths)
282
- if insert_index = Bundler.rubygems.load_path_insert_index
283
- $LOAD_PATH.insert(insert_index, *load_paths)
284
- else
285
- $LOAD_PATH.unshift(*load_paths)
286
- end
287
- end
288
-
289
301
  class << self
290
- private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!,
291
- :add_to_load_path
302
+ private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!
292
303
  end
293
304
  end
294
305
  end
@@ -23,7 +23,7 @@ module Bundler
23
23
  # and hooks).
24
24
  module Plugin
25
25
  class API
26
- autoload :Source, "bundler/plugin/api/source"
26
+ autoload :Source, File.expand_path("api/source", __dir__)
27
27
 
28
28
  # The plugins should declare that they handle a command through this helper.
29
29
  #
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
3
  module Bundler
6
4
  module Plugin
7
5
  class API
@@ -37,7 +35,7 @@ module Bundler
37
35
  #
38
36
  # @!attribute [rw] dependency_names
39
37
  # @return [Array<String>] Names of dependencies that the source should
40
- # try to resolve. It is not necessary to use this list intenally. This
38
+ # try to resolve. It is not necessary to use this list internally. This
41
39
  # is present to be compatible with `Definition` and is used by
42
40
  # rubygems source.
43
41
  module Source
@@ -108,7 +106,7 @@ module Bundler
108
106
  def install_path
109
107
  @install_path ||=
110
108
  begin
111
- base_name = File.basename(URI.parse(uri).normalize.path)
109
+ base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
112
110
 
113
111
  gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
114
112
  end
@@ -170,7 +168,7 @@ module Bundler
170
168
  #
171
169
  # This is used by `app_cache_path`
172
170
  def app_cache_dirname
173
- base_name = File.basename(URI.parse(uri).normalize.path)
171
+ base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
174
172
  "#{base_name}-#{uri_hash}"
175
173
  end
176
174
 
@@ -196,7 +194,7 @@ module Bundler
196
194
  # This shall check if two source object represent the same source.
197
195
  #
198
196
  # The comparison shall take place only on the attribute that can be
199
- # inferred from the options passed from Gemfile and not on attibutes
197
+ # inferred from the options passed from Gemfile and not on attributes
200
198
  # that are used to pin down the gem to specific version (e.g. Git
201
199
  # sources should compare on branch and tag but not on commit hash)
202
200
  #
@@ -103,6 +103,14 @@ module Bundler
103
103
  @plugin_paths[name]
104
104
  end
105
105
 
106
+ def installed_plugins
107
+ @plugin_paths.keys
108
+ end
109
+
110
+ def plugin_commands(plugin)
111
+ @commands.find_all {|_, n| n == plugin }.map(&:first)
112
+ end
113
+
106
114
  def source?(source)
107
115
  @sources.key? source
108
116
  end
@@ -131,7 +139,7 @@ module Bundler
131
139
 
132
140
  data = index_f.read
133
141
 
134
- require "bundler/yaml_serializer"
142
+ require_relative "../yaml_serializer"
135
143
  index = YAMLSerializer.load(data)
136
144
 
137
145
  @commands.merge!(index["commands"])
@@ -154,7 +162,7 @@ module Bundler
154
162
  "sources" => @sources,
155
163
  }
156
164
 
157
- require "bundler/yaml_serializer"
165
+ require_relative "../yaml_serializer"
158
166
  SharedHelpers.filesystem_access(index_file) do |index_f|
159
167
  FileUtils.mkdir_p(index_f.dirname)
160
168
  File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) }
@@ -8,14 +8,19 @@ module Bundler
8
8
  # are heavily dependent on the Gemfile.
9
9
  module Plugin
10
10
  class Installer
11
- autoload :Rubygems, "bundler/plugin/installer/rubygems"
12
- autoload :Git, "bundler/plugin/installer/git"
11
+ autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
12
+ autoload :Git, File.expand_path("installer/git", __dir__)
13
13
 
14
14
  def install(names, options)
15
+ check_sources_consistency!(options)
16
+
15
17
  version = options[:version] || [">= 0"]
16
- Bundler.settings.temporary(:lockfile_uses_separate_rubygems_sources => false, :disable_multisource => false) do
18
+
19
+ Bundler.settings.temporary(:disable_multisource => false) do
17
20
  if options[:git]
18
21
  install_git(names, version, options)
22
+ elsif options[:local_git]
23
+ install_local_git(names, version, options)
19
24
  else
20
25
  sources = options[:source] || Bundler.rubygems.sources
21
26
  install_rubygems(names, version, sources)
@@ -38,22 +43,24 @@ module Bundler
38
43
 
39
44
  private
40
45
 
46
+ def check_sources_consistency!(options)
47
+ if options.key?(:git) && options.key?(:local_git)
48
+ raise InvalidOption, "Remote and local plugin git sources can't be both specified"
49
+ end
50
+ end
51
+
41
52
  def install_git(names, version, options)
42
53
  uri = options.delete(:git)
43
54
  options["uri"] = uri
44
55
 
45
- source_list = SourceList.new
46
- source_list.add_git_source(options)
47
-
48
- # To support both sources
49
- if options[:source]
50
- source_list.add_rubygems_source("remotes" => options[:source])
51
- end
56
+ install_all_sources(names, version, options, options[:source])
57
+ end
52
58
 
53
- deps = names.map {|name| Dependency.new name, version }
59
+ def install_local_git(names, version, options)
60
+ uri = options.delete(:local_git)
61
+ options["uri"] = uri
54
62
 
55
- definition = Definition.new(nil, deps, source_list, true)
56
- install_definition(definition)
63
+ install_all_sources(names, version, options, options[:source])
57
64
  end
58
65
 
59
66
  # Installs the plugin from rubygems source and returns the path where the
@@ -65,10 +72,16 @@ module Bundler
65
72
  #
66
73
  # @return [Hash] map of names to the specs of plugins installed
67
74
  def install_rubygems(names, version, sources)
68
- deps = names.map {|name| Dependency.new name, version }
75
+ install_all_sources(names, version, nil, sources)
76
+ end
69
77
 
78
+ def install_all_sources(names, version, git_source_options, rubygems_source)
70
79
  source_list = SourceList.new
71
- source_list.add_rubygems_source("remotes" => sources)
80
+
81
+ source_list.add_git_source(git_source_options) if git_source_options
82
+ source_list.add_rubygems_source("remotes" => rubygems_source) if rubygems_source
83
+
84
+ deps = names.map {|name| Dependency.new name, version }
72
85
 
73
86
  definition = Definition.new(nil, deps, source_list, true)
74
87
  install_definition(definition)
@@ -27,7 +27,7 @@ module Bundler
27
27
  end
28
28
  end
29
29
 
30
- require "bundler/deprecate"
30
+ require_relative "deprecate"
31
31
  begin
32
32
  Bundler::Deprecate.skip_during do
33
33
  require "rubygems/safe_yaml"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
3
  module Bundler
6
4
  # Represents a lazily loaded gem specification, where the full specification
7
5
  # is on the source server in rubygems' "quick" index. The proxy object is to
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Bundler
4
4
  class Resolver
5
- require "bundler/vendored_molinillo"
6
- require "bundler/resolver/spec_group"
5
+ require_relative "vendored_molinillo"
6
+ require_relative "resolver/spec_group"
7
7
 
8
8
  # Figures out the best possible configuration of gems that satisfies
9
9
  # the list of passed dependencies and any child dependencies without
@@ -38,8 +38,8 @@ module Bundler
38
38
  @platforms = platforms
39
39
  @gem_version_promoter = gem_version_promoter
40
40
  @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
41
- @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
42
41
  @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
42
+ @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.disable_multisource?
43
43
  end
44
44
 
45
45
  def start(requirements)
@@ -48,9 +48,12 @@ module Bundler
48
48
 
49
49
  verify_gemfile_dependencies_are_found!(requirements)
50
50
  dg = @resolver.resolve(requirements, @base_dg)
51
- dg.map(&:payload).
51
+ dg.
52
+ tap {|resolved| validate_resolved_specs!(resolved) }.
53
+ map(&:payload).
52
54
  reject {|sg| sg.name.end_with?("\0") }.
53
- map(&:to_specs).flatten
55
+ map(&:to_specs).
56
+ flatten
54
57
  rescue Molinillo::VersionConflict => e
55
58
  message = version_conflict_message(e)
56
59
  raise VersionConflict.new(e.conflicts.keys.uniq, message)
@@ -72,7 +75,7 @@ module Bundler
72
75
  return unless debug?
73
76
  debug_info = yield
74
77
  debug_info = debug_info.inspect unless debug_info.is_a?(String)
75
- STDERR.puts debug_info.split("\n").map {|s| " " * depth + s }
78
+ warn debug_info.split("\n").map {|s| " " * depth + s }
76
79
  end
77
80
 
78
81
  def debug?
@@ -169,13 +172,13 @@ module Bundler
169
172
 
170
173
  def name_for_explicit_dependency_source
171
174
  Bundler.default_gemfile.basename.to_s
172
- rescue
175
+ rescue StandardError
173
176
  "Gemfile"
174
177
  end
175
178
 
176
179
  def name_for_locking_dependency_source
177
180
  Bundler.default_lockfile.basename.to_s
178
- rescue
181
+ rescue StandardError
179
182
  "Gemfile.lock"
180
183
  end
181
184
 
@@ -276,10 +279,10 @@ module Bundler
276
279
  versions_with_platforms = specs.map {|s| [s.version, s.platform] }
277
280
  message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n")
278
281
  message << if versions_with_platforms.any?
279
- "The source contains '#{name}' at: #{formatted_versions_with_platforms(versions_with_platforms)}"
280
- else
281
- "The source does not contain any versions of '#{name}'"
282
- end
282
+ "The source contains '#{name}' at: #{formatted_versions_with_platforms(versions_with_platforms)}"
283
+ else
284
+ "The source does not contain any versions of '#{name}'"
285
+ end
283
286
  else
284
287
  message = "Could not find gem '#{requirement}' in any of the gem sources " \
285
288
  "listed in your Gemfile#{cache_message}."
@@ -300,9 +303,19 @@ module Bundler
300
303
  end
301
304
 
302
305
  def version_conflict_message(e)
306
+ # only show essential conflicts, if possible
307
+ conflicts = e.conflicts.dup
308
+ conflicts.delete_if do |_name, conflict|
309
+ deps = conflict.requirement_trees.map(&:last).flatten(1)
310
+ !Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
311
+ end
312
+ e = Molinillo::VersionConflict.new(conflicts, e.specification_provider) unless conflicts.empty?
313
+
314
+ solver_name = "Bundler"
315
+ possibility_type = "gem"
303
316
  e.message_with_trees(
304
- :solver_name => "Bundler",
305
- :possibility_type => "gem",
317
+ :solver_name => solver_name,
318
+ :possibility_type => possibility_type,
306
319
  :reduce_trees => lambda do |trees|
307
320
  # called first, because we want to reduce the amount of work required to find maximal empty sets
308
321
  trees = trees.uniq {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }
@@ -314,10 +327,8 @@ module Bundler
314
327
  end.flatten(1).select do |deps|
315
328
  Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
316
329
  end.min_by(&:size)
317
- trees.reject! {|t| !maximal.include?(t.last) } if maximal
318
330
 
319
- trees = trees.sort_by {|t| t.flatten.map(&:to_s) }
320
- trees.uniq! {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }
331
+ trees.reject! {|t| !maximal.include?(t.last) } if maximal
321
332
 
322
333
  trees.sort_by {|t| t.reverse.map(&:name) }
323
334
  end,
@@ -325,7 +336,7 @@ module Bundler
325
336
  :additional_message_for_conflict => lambda do |o, name, conflict|
326
337
  if name == "bundler"
327
338
  o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
328
- other_bundler_required = !conflict.requirement.requirement.satisfied_by?(Gem::Version.new Bundler::VERSION)
339
+ other_bundler_required = !conflict.requirement.requirement.satisfied_by?(Gem::Version.new(Bundler::VERSION))
329
340
  end
330
341
 
331
342
  if name == "bundler" && other_bundler_required
@@ -352,7 +363,11 @@ module Bundler
352
363
  []
353
364
  end.compact.map(&:to_s).uniq.sort
354
365
 
355
- o << "Could not find gem '#{SharedHelpers.pretty_dependency(conflict.requirement)}'"
366
+ metadata_requirement = name.end_with?("\0")
367
+
368
+ o << "Could not find gem '" unless metadata_requirement
369
+ o << SharedHelpers.pretty_dependency(conflict.requirement)
370
+ o << "'" unless metadata_requirement
356
371
  if conflict.requirement_trees.first.size > 1
357
372
  o << ", which is required by "
358
373
  o << "gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
@@ -360,14 +375,47 @@ module Bundler
360
375
  o << " "
361
376
 
362
377
  o << if relevant_sources.empty?
363
- "in any of the sources.\n"
364
- else
365
- "in any of the relevant sources:\n #{relevant_sources * "\n "}\n"
366
- end
378
+ "in any of the sources.\n"
379
+ elsif metadata_requirement
380
+ "is not available in #{relevant_sources.join(" or ")}"
381
+ else
382
+ "in any of the relevant sources:\n #{relevant_sources * "\n "}\n"
383
+ end
367
384
  end
368
385
  end,
369
- :version_for_spec => lambda {|spec| spec.version }
386
+ :version_for_spec => lambda {|spec| spec.version },
387
+ :incompatible_version_message_for_conflict => lambda do |name, _conflict|
388
+ if name.end_with?("\0")
389
+ %(#{solver_name} found conflicting requirements for the #{name} version:)
390
+ else
391
+ %(#{solver_name} could not find compatible versions for #{possibility_type} "#{name}":)
392
+ end
393
+ end
370
394
  )
371
395
  end
396
+
397
+ def validate_resolved_specs!(resolved_specs)
398
+ resolved_specs.each do |v|
399
+ name = v.name
400
+ next unless sources = relevant_sources_for_vertex(v)
401
+ sources.compact!
402
+ if default_index = sources.index(@source_requirements[:default])
403
+ sources.delete_at(default_index)
404
+ end
405
+ sources.reject! {|s| s.specs[name].empty? }
406
+ sources.uniq!
407
+ next if sources.size <= 1
408
+
409
+ multisource_disabled = Bundler.feature_flag.disable_multisource?
410
+
411
+ msg = ["The gem '#{name}' was found in multiple relevant sources."]
412
+ msg.concat sources.map {|s| " * #{s}" }.sort
413
+ msg << "You #{multisource_disabled ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
414
+ msg = msg.join("\n")
415
+
416
+ raise SecurityError, msg if multisource_disabled
417
+ Bundler.ui.warn "Warning: #{msg}"
418
+ end
419
+ end
372
420
  end
373
421
  end