bundler 2.0.0.pre.3 → 2.1.0.pre.1

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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +721 -572
  3. data/LICENSE.md +18 -19
  4. data/README.md +9 -8
  5. data/bundler.gemspec +8 -25
  6. data/exe/bundle +19 -3
  7. data/lib/bundler.rb +121 -68
  8. data/lib/bundler/build_metadata.rb +3 -3
  9. data/lib/bundler/capistrano.rb +5 -5
  10. data/lib/bundler/cli.rb +133 -125
  11. data/lib/bundler/cli/add.rb +27 -16
  12. data/lib/bundler/cli/common.rb +11 -12
  13. data/lib/bundler/cli/config.rb +161 -86
  14. data/lib/bundler/cli/console.rb +2 -2
  15. data/lib/bundler/cli/doctor.rb +4 -4
  16. data/lib/bundler/cli/exec.rb +4 -9
  17. data/lib/bundler/cli/gem.rb +5 -5
  18. data/lib/bundler/cli/info.rb +17 -5
  19. data/lib/bundler/cli/init.rb +1 -1
  20. data/lib/bundler/cli/install.rb +12 -11
  21. data/lib/bundler/cli/issue.rb +3 -3
  22. data/lib/bundler/cli/open.rb +10 -6
  23. data/lib/bundler/cli/outdated.rb +85 -81
  24. data/lib/bundler/cli/package.rb +8 -9
  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 +32 -12
  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 +36 -27
  33. data/lib/bundler/dependency.rb +16 -4
  34. data/lib/bundler/deployment.rb +2 -2
  35. data/lib/bundler/dsl.rb +18 -42
  36. data/lib/bundler/env.rb +8 -13
  37. data/lib/bundler/environment_preserver.rb +0 -1
  38. data/lib/bundler/feature_flag.rb +1 -13
  39. data/lib/bundler/fetcher.rb +14 -11
  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 +4 -2
  44. data/lib/bundler/friendly_errors.rb +4 -5
  45. data/lib/bundler/gem_helper.rb +39 -24
  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 +10 -8
  51. data/lib/bundler/inline.rb +19 -18
  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 -8
  55. data/lib/bundler/installer/standalone.rb +1 -2
  56. data/lib/bundler/lazy_specification.rb +2 -2
  57. data/lib/bundler/lockfile_parser.rb +13 -21
  58. data/lib/bundler/match_platform.rb +1 -1
  59. data/lib/bundler/plugin.rb +42 -29
  60. data/lib/bundler/plugin/api.rb +1 -1
  61. data/lib/bundler/plugin/api/source.rb +2 -2
  62. data/lib/bundler/plugin/index.rb +14 -3
  63. data/lib/bundler/plugin/installer.rb +28 -15
  64. data/lib/bundler/psyched_yaml.rb +1 -1
  65. data/lib/bundler/resolver.rb +72 -24
  66. data/lib/bundler/resolver/spec_group.rb +2 -2
  67. data/lib/bundler/retry.rb +2 -2
  68. data/lib/bundler/ruby_version.rb +4 -19
  69. data/lib/bundler/rubygems_ext.rb +10 -66
  70. data/lib/bundler/rubygems_gem_installer.rb +1 -1
  71. data/lib/bundler/rubygems_integration.rb +144 -395
  72. data/lib/bundler/runtime.rb +2 -9
  73. data/lib/bundler/settings.rb +15 -48
  74. data/lib/bundler/setup.rb +6 -5
  75. data/lib/bundler/shared_helpers.rb +58 -71
  76. data/lib/bundler/similarity_detector.rb +2 -2
  77. data/lib/bundler/source.rb +5 -5
  78. data/lib/bundler/source/git.rb +19 -12
  79. data/lib/bundler/source/git/git_proxy.rb +35 -39
  80. data/lib/bundler/source/metadata.rb +7 -2
  81. data/lib/bundler/source/path.rb +13 -8
  82. data/lib/bundler/source/rubygems.rb +11 -5
  83. data/lib/bundler/source/rubygems/remote.rb +1 -2
  84. data/lib/bundler/source_list.rb +9 -12
  85. data/lib/bundler/spec_set.rb +1 -6
  86. data/lib/bundler/stub_specification.rb +18 -30
  87. data/lib/bundler/templates/Executable.bundler +23 -14
  88. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +3 -3
  89. data/lib/bundler/templates/newgem/Gemfile.tt +8 -0
  90. data/lib/bundler/templates/newgem/README.md.tt +4 -3
  91. data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -27
  92. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +1 -1
  93. data/lib/bundler/templates/newgem/travis.yml.tt +0 -1
  94. data/lib/bundler/ui.rb +3 -3
  95. data/lib/bundler/ui/rg_proxy.rb +1 -1
  96. data/lib/bundler/ui/shell.rb +4 -8
  97. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
  98. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
  99. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
  100. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  101. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +151 -48
  102. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
  103. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +6 -6
  104. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  105. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  106. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  107. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  108. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  109. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +6 -6
  110. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  111. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  112. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +30 -8
  113. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  114. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  115. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -2
  116. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +248 -279
  117. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  118. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  119. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  120. data/lib/bundler/vendor/thor/lib/thor.rb +1 -1
  121. data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -11
  122. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  123. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -1
  124. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  125. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -2
  126. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -1
  127. data/lib/bundler/vendor/thor/lib/thor/base.rb +16 -17
  128. data/lib/bundler/vendor/thor/lib/thor/error.rb +82 -0
  129. data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
  130. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  131. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  132. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +7 -2
  133. data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -6
  134. data/lib/bundler/vendor/thor/lib/thor/shell.rb +4 -4
  135. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +52 -7
  136. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  137. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
  138. data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  139. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  140. data/lib/bundler/vendored_fileutils.rb +1 -6
  141. data/lib/bundler/vendored_molinillo.rb +1 -1
  142. data/lib/bundler/vendored_persistent.rb +7 -5
  143. data/lib/bundler/vendored_thor.rb +2 -2
  144. data/lib/bundler/version.rb +1 -20
  145. data/lib/bundler/version_ranges.rb +51 -5
  146. data/lib/bundler/vlad.rb +3 -3
  147. data/lib/bundler/worker.rb +1 -3
  148. data/lib/bundler/yaml_serializer.rb +2 -3
  149. data/man/bundle-add.1 +10 -2
  150. data/man/bundle-add.1.txt +11 -5
  151. data/man/bundle-add.ronn +7 -1
  152. data/man/bundle-binstubs.1 +2 -2
  153. data/man/bundle-binstubs.1.txt +2 -2
  154. data/man/bundle-binstubs.ronn +1 -1
  155. data/man/bundle-check.1 +1 -1
  156. data/man/bundle-check.1.txt +6 -6
  157. data/man/bundle-clean.1 +1 -1
  158. data/man/bundle-clean.1.txt +1 -1
  159. data/man/bundle-config.1 +36 -36
  160. data/man/bundle-config.1.txt +66 -67
  161. data/man/bundle-config.ronn +42 -40
  162. data/man/bundle-doctor.1 +1 -1
  163. data/man/bundle-doctor.1.txt +1 -1
  164. data/man/bundle-exec.1 +1 -1
  165. data/man/bundle-exec.1.txt +1 -1
  166. data/man/bundle-gem.1 +1 -1
  167. data/man/bundle-gem.1.txt +3 -3
  168. data/man/bundle-info.1 +1 -1
  169. data/man/bundle-info.1.txt +1 -1
  170. data/man/bundle-init.1 +2 -2
  171. data/man/bundle-init.1.txt +2 -2
  172. data/man/bundle-init.ronn +1 -1
  173. data/man/bundle-inject.1 +1 -1
  174. data/man/bundle-inject.1.txt +1 -1
  175. data/man/bundle-install.1 +8 -5
  176. data/man/bundle-install.1.txt +56 -51
  177. data/man/bundle-install.ronn +9 -4
  178. data/man/bundle-list.1 +1 -1
  179. data/man/bundle-list.1.txt +1 -1
  180. data/man/bundle-lock.1 +1 -1
  181. data/man/bundle-lock.1.txt +16 -16
  182. data/man/bundle-open.1 +1 -1
  183. data/man/bundle-open.1.txt +1 -1
  184. data/man/bundle-outdated.1 +1 -1
  185. data/man/bundle-outdated.1.txt +1 -1
  186. data/man/bundle-package.1 +1 -1
  187. data/man/bundle-package.1.txt +1 -1
  188. data/man/bundle-platform.1 +1 -1
  189. data/man/bundle-platform.1.txt +1 -1
  190. data/man/bundle-pristine.1 +1 -1
  191. data/man/bundle-pristine.1.txt +1 -1
  192. data/man/bundle-remove.1 +1 -1
  193. data/man/bundle-remove.1.txt +1 -1
  194. data/man/bundle-show.1 +1 -1
  195. data/man/bundle-show.1.txt +1 -1
  196. data/man/bundle-update.1 +4 -4
  197. data/man/bundle-update.1.txt +64 -65
  198. data/man/bundle-update.ronn +3 -3
  199. data/man/bundle-viz.1 +1 -1
  200. data/man/bundle-viz.1.txt +1 -1
  201. data/man/bundle.1 +3 -3
  202. data/man/bundle.1.txt +8 -8
  203. data/man/bundle.ronn +2 -2
  204. data/man/gemfile.5 +13 -16
  205. data/man/gemfile.5.ronn +10 -14
  206. data/man/gemfile.5.txt +104 -108
  207. metadata +16 -102
  208. data/exe/bundle_ruby +0 -60
  209. data/lib/bundler/cli/cache.rb +0 -36
  210. data/lib/bundler/compatibility_guard.rb +0 -14
  211. data/lib/bundler/ssl_certs/.document +0 -1
  212. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  213. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  214. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  215. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  216. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  217. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "shellwords"
4
+
3
5
  module Bundler
4
6
  class GemInstaller
5
7
  attr_reader :spec, :standalone, :worker, :force, :installer
@@ -56,7 +58,9 @@ module Bundler
56
58
 
57
59
  def spec_settings
58
60
  # Fetch the build settings, if there are any
59
- Bundler.settings["build.#{spec.name}"]
61
+ if settings = Bundler.settings["build.#{spec.name}"]
62
+ Shellwords.shellsplit(settings)
63
+ end
60
64
  end
61
65
 
62
66
  def install
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/worker"
4
- require "bundler/installer/gem_installer"
3
+ require_relative "../worker"
4
+ require_relative "gem_installer"
5
5
 
6
6
  module Bundler
7
7
  class ParallelInstaller
@@ -91,10 +91,6 @@ module Bundler
91
91
  end
92
92
 
93
93
  def call
94
- # Since `autoload` has the potential for threading issues on 1.8.7
95
- # TODO: remove in bundler 2.0
96
- require "bundler/gem_remote_fetcher" if RUBY_VERSION < "1.9"
97
-
98
94
  check_for_corrupt_lockfile
99
95
 
100
96
  if @size > 1
@@ -115,7 +111,7 @@ module Bundler
115
111
  s,
116
112
  s.missing_lockfile_dependencies(@specs.map(&:name)),
117
113
  ]
118
- end.reject { |a| a.last.empty? }
114
+ end.reject {|a| a.last.empty? }
119
115
  return if missing_dependencies.empty?
120
116
 
121
117
  warning = []
@@ -150,7 +146,7 @@ module Bundler
150
146
  end
151
147
 
152
148
  def worker_pool
153
- @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda { |spec_install, worker_num|
149
+ @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda {|spec_install, worker_num|
154
150
  do_install(spec_install, worker_num)
155
151
  }
156
152
  end
@@ -12,8 +12,7 @@ module Bundler
12
12
  end
13
13
  File.open File.join(bundler_path, "setup.rb"), "w" do |file|
14
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'"
15
+ file.puts "ruby_engine = RUBY_ENGINE"
17
16
  file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
18
17
  file.puts "path = File.expand_path('..', __FILE__)"
19
18
  paths.each do |path|
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "uri"
4
- require "bundler/match_platform"
4
+ require_relative "match_platform"
5
5
 
6
6
  module Bundler
7
7
  class LazySpecification
@@ -77,7 +77,7 @@ module Bundler
77
77
  if search && Gem::Platform.new(search.platform) != Gem::Platform.new(platform) && !search.runtime_dependencies.-(dependencies.reject {|d| d.type == :development }).empty?
78
78
  Bundler.ui.warn "Unable to use the platform-specific (#{search.platform}) version of #{name} (#{version}) " \
79
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."
80
+ "To use the platform-specific version of the gem, run `bundle config set specific_platform true` and install again."
81
81
  search = source.specs.search(self).last
82
82
  end
83
83
  search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
@@ -23,16 +23,14 @@ module Bundler
23
23
  PATH = "PATH".freeze
24
24
  PLUGIN = "PLUGIN SOURCE".freeze
25
25
  SPECS = " specs:".freeze
26
- OPTIONS = /^ ([a-z]+): (.*)$/i
26
+ OPTIONS = /^ ([a-z]+): (.*)$/i.freeze
27
27
  SOURCE = [GIT, GEM, PATH, PLUGIN].freeze
28
28
 
29
29
  SECTIONS_BY_VERSION_INTRODUCED = {
30
- # The strings have to be dup'ed for old RG on Ruby 2.3+
31
- # TODO: remove dup in Bundler 2.0
32
- Gem::Version.create("1.0".dup) => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze,
33
- Gem::Version.create("1.10".dup) => [BUNDLED].freeze,
34
- Gem::Version.create("1.12".dup) => [RUBY].freeze,
35
- Gem::Version.create("1.13".dup) => [PLUGIN].freeze,
30
+ Gem::Version.create("1.0") => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze,
31
+ Gem::Version.create("1.10") => [BUNDLED].freeze,
32
+ Gem::Version.create("1.12") => [RUBY].freeze,
33
+ Gem::Version.create("1.13") => [PLUGIN].freeze,
36
34
  }.freeze
37
35
 
38
36
  KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze
@@ -90,7 +88,7 @@ module Bundler
90
88
  send("parse_#{@state}", line)
91
89
  end
92
90
  end
93
- @sources << @rubygems_aggregate unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
91
+ @sources << @rubygems_aggregate unless Bundler.feature_flag.disable_multisource?
94
92
  @specs = @specs.values.sort_by(&:identifier)
95
93
  warn_for_outdated_bundler_version
96
94
  rescue ArgumentError => e
@@ -103,17 +101,11 @@ module Bundler
103
101
  return unless bundler_version
104
102
  prerelease_text = bundler_version.prerelease? ? " --pre" : ""
105
103
  current_version = Gem::Version.create(Bundler::VERSION)
106
- case current_version.segments.first <=> bundler_version.segments.first
107
- when -1
108
- raise LockfileError, "You must use Bundler #{bundler_version.segments.first} or greater with this lockfile."
109
- when 0
110
- if current_version < bundler_version
111
- Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \
112
- "than the version that created the lockfile (#{bundler_version}). We suggest you " \
113
- "upgrade to the latest version of Bundler by running `gem " \
114
- "install bundler#{prerelease_text}`.\n"
115
- end
116
- end
104
+ return unless current_version < bundler_version
105
+ Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \
106
+ "than the version that created the lockfile (#{bundler_version}). We suggest you to " \
107
+ "upgrade to the version that created the lockfile by running `gem install " \
108
+ "bundler:#{bundler_version}#{prerelease_text}`.\n"
117
109
  end
118
110
 
119
111
  private
@@ -141,7 +133,7 @@ module Bundler
141
133
  @sources << @current_source
142
134
  end
143
135
  when GEM
144
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
136
+ if Bundler.feature_flag.disable_multisource?
145
137
  @opts["remotes"] = @opts.delete("remote")
146
138
  @current_source = TYPES[@type].from_lock(@opts)
147
139
  @sources << @current_source
@@ -185,7 +177,7 @@ module Bundler
185
177
  (?:-(.*))?\))? # Optional platform
186
178
  (!)? # Optional pinned marker
187
179
  $ # Line end
188
- /xo
180
+ /xo.freeze
189
181
 
190
182
  def parse_dependency(line)
191
183
  return unless line =~ NAME_VERSION
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_helpers"
3
+ require_relative "gem_helpers"
4
4
 
5
5
  module Bundler
6
6
  module MatchPlatform
@@ -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,26 +47,48 @@ 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
  #
53
73
  # @param [Pathname] gemfile path
54
74
  # @param [Proc] block that can be evaluated for (inline) Gemfile
55
75
  def gemfile_install(gemfile = nil, &inline)
56
- builder = DSL.new
57
- if block_given?
58
- builder.instance_eval(&inline)
59
- else
60
- builder.eval_gemfile(gemfile)
61
- end
62
- definition = builder.to_definition(nil, true)
76
+ Bundler.settings.temporary(:frozen => false, :deployment => false) do
77
+ builder = DSL.new
78
+ if block_given?
79
+ builder.instance_eval(&inline)
80
+ else
81
+ builder.eval_gemfile(gemfile)
82
+ end
83
+ definition = builder.to_definition(nil, true)
63
84
 
64
- return if definition.dependencies.empty?
85
+ return if definition.dependencies.empty?
65
86
 
66
- plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
67
- installed_specs = Installer.new.install_definition(definition)
87
+ plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
88
+ installed_specs = Installer.new.install_definition(definition)
68
89
 
69
- save_plugins plugins, installed_specs, builder.inferred_plugins
90
+ save_plugins plugins, installed_specs, builder.inferred_plugins
91
+ end
70
92
  rescue RuntimeError => e
71
93
  unless e.is_a?(GemfileError)
72
94
  Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
@@ -234,7 +256,7 @@ module Bundler
234
256
  @hooks_by_event = Hash.new {|h, k| h[k] = [] }
235
257
 
236
258
  load_paths = spec.load_paths
237
- add_to_load_path(load_paths)
259
+ Bundler.rubygems.add_to_load_path(load_paths)
238
260
  path = Pathname.new spec.full_gem_path
239
261
 
240
262
  begin
@@ -266,7 +288,7 @@ module Bundler
266
288
  # done to avoid conflicts
267
289
  path = index.plugin_path(name)
268
290
 
269
- add_to_load_path(index.load_paths(name))
291
+ Bundler.rubygems.add_to_load_path(index.load_paths(name))
270
292
 
271
293
  load path.join(PLUGIN_FILE_NAME)
272
294
 
@@ -276,17 +298,8 @@ module Bundler
276
298
  raise
277
299
  end
278
300
 
279
- def add_to_load_path(load_paths)
280
- if insert_index = Bundler.rubygems.load_path_insert_index
281
- $LOAD_PATH.insert(insert_index, *load_paths)
282
- else
283
- $LOAD_PATH.unshift(*load_paths)
284
- end
285
- end
286
-
287
301
  class << self
288
- private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!,
289
- :add_to_load_path
302
+ private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!
290
303
  end
291
304
  end
292
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
  #
@@ -37,7 +37,7 @@ module Bundler
37
37
  #
38
38
  # @!attribute [rw] dependency_names
39
39
  # @return [Array<String>] Names of dependencies that the source should
40
- # try to resolve. It is not necessary to use this list intenally. This
40
+ # try to resolve. It is not necessary to use this list internally. This
41
41
  # is present to be compatible with `Definition` and is used by
42
42
  # rubygems source.
43
43
  module Source
@@ -196,7 +196,7 @@ module Bundler
196
196
  # This shall check if two source object represent the same source.
197
197
  #
198
198
  # The comparison shall take place only on the attribute that can be
199
- # inferred from the options passed from Gemfile and not on attibutes
199
+ # inferred from the options passed from Gemfile and not on attributes
200
200
  # that are used to pin down the gem to specific version (e.g. Git
201
201
  # sources should compare on branch and tag but not on commit hash)
202
202
  #
@@ -58,7 +58,10 @@ module Bundler
58
58
  raise SourceConflict.new(name, common) unless common.empty?
59
59
  sources.each {|k| @sources[k] = name }
60
60
 
61
- hooks.each {|e| (@hooks[e] ||= []) << name }
61
+ hooks.each do |event|
62
+ event_hooks = (@hooks[event] ||= []) << name
63
+ event_hooks.uniq!
64
+ end
62
65
 
63
66
  @plugin_paths[name] = path
64
67
  @load_paths[name] = load_paths
@@ -100,6 +103,14 @@ module Bundler
100
103
  @plugin_paths[name]
101
104
  end
102
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
+
103
114
  def source?(source)
104
115
  @sources.key? source
105
116
  end
@@ -128,7 +139,7 @@ module Bundler
128
139
 
129
140
  data = index_f.read
130
141
 
131
- require "bundler/yaml_serializer"
142
+ require_relative "../yaml_serializer"
132
143
  index = YAMLSerializer.load(data)
133
144
 
134
145
  @commands.merge!(index["commands"])
@@ -151,7 +162,7 @@ module Bundler
151
162
  "sources" => @sources,
152
163
  }
153
164
 
154
- require "bundler/yaml_serializer"
165
+ require_relative "../yaml_serializer"
155
166
  SharedHelpers.filesystem_access(index_file) do |index_f|
156
167
  FileUtils.mkdir_p(index_f.dirname)
157
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"
@@ -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