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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +735 -574
- data/LICENSE.md +18 -19
- data/README.md +8 -7
- data/bundler.gemspec +5 -23
- data/exe/bundle +19 -3
- data/lib/bundler.rb +202 -87
- data/lib/bundler/build_metadata.rb +3 -3
- data/lib/bundler/capistrano.rb +5 -5
- data/lib/bundler/cli.rb +179 -143
- data/lib/bundler/cli/add.rb +28 -16
- data/lib/bundler/cli/cache.rb +25 -13
- data/lib/bundler/cli/common.rb +10 -11
- data/lib/bundler/cli/config.rb +161 -86
- data/lib/bundler/cli/console.rb +2 -2
- data/lib/bundler/cli/doctor.rb +4 -4
- data/lib/bundler/cli/exec.rb +15 -18
- data/lib/bundler/cli/gem.rb +5 -5
- data/lib/bundler/cli/info.rb +17 -5
- data/lib/bundler/cli/init.rb +1 -1
- data/lib/bundler/cli/install.rb +3 -3
- data/lib/bundler/cli/issue.rb +1 -1
- data/lib/bundler/cli/open.rb +10 -6
- data/lib/bundler/cli/outdated.rb +85 -81
- data/lib/bundler/cli/plugin.rb +9 -2
- data/lib/bundler/cli/pristine.rb +1 -1
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +31 -11
- data/lib/bundler/compact_index_client.rb +25 -9
- data/lib/bundler/compact_index_client/updater.rb +2 -6
- data/lib/bundler/current_ruby.rb +8 -7
- data/lib/bundler/definition.rb +33 -26
- data/lib/bundler/dependency.rb +16 -4
- data/lib/bundler/deployment.rb +2 -2
- data/lib/bundler/dsl.rb +19 -43
- data/lib/bundler/env.rb +6 -5
- data/lib/bundler/environment_preserver.rb +0 -1
- data/lib/bundler/feature_flag.rb +1 -13
- data/lib/bundler/fetcher.rb +16 -13
- data/lib/bundler/fetcher/compact_index.rb +26 -12
- data/lib/bundler/fetcher/dependency.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +4 -1
- data/lib/bundler/fetcher/index.rb +5 -3
- data/lib/bundler/friendly_errors.rb +6 -7
- data/lib/bundler/gem_helper.rb +14 -14
- data/lib/bundler/gem_helpers.rb +2 -4
- data/lib/bundler/gem_tasks.rb +1 -1
- data/lib/bundler/gem_version_promoter.rb +3 -3
- data/lib/bundler/graph.rb +2 -2
- data/lib/bundler/injector.rb +3 -1
- data/lib/bundler/inline.rb +40 -30
- data/lib/bundler/installer.rb +7 -14
- data/lib/bundler/installer/gem_installer.rb +5 -1
- data/lib/bundler/installer/parallel_installer.rb +4 -4
- data/lib/bundler/installer/standalone.rb +1 -2
- data/lib/bundler/lazy_specification.rb +2 -3
- data/lib/bundler/lockfile_parser.rb +14 -21
- data/lib/bundler/match_platform.rb +1 -1
- data/lib/bundler/mirror.rb +3 -3
- data/lib/bundler/plugin.rb +29 -18
- data/lib/bundler/plugin/api.rb +1 -1
- data/lib/bundler/plugin/api/source.rb +4 -6
- data/lib/bundler/plugin/index.rb +10 -2
- data/lib/bundler/plugin/installer.rb +28 -15
- data/lib/bundler/psyched_yaml.rb +1 -1
- data/lib/bundler/remote_specification.rb +0 -2
- data/lib/bundler/resolver.rb +72 -24
- data/lib/bundler/resolver/spec_group.rb +3 -2
- data/lib/bundler/retry.rb +2 -2
- data/lib/bundler/ruby_version.rb +4 -19
- data/lib/bundler/rubygems_ext.rb +11 -66
- data/lib/bundler/rubygems_gem_installer.rb +1 -1
- data/lib/bundler/rubygems_integration.rb +133 -410
- data/lib/bundler/runtime.rb +2 -9
- data/lib/bundler/settings.rb +22 -52
- data/lib/bundler/setup.rb +7 -13
- data/lib/bundler/shared_helpers.rb +46 -74
- data/lib/bundler/similarity_detector.rb +2 -2
- data/lib/bundler/source.rb +5 -5
- data/lib/bundler/source/git.rb +24 -17
- data/lib/bundler/source/git/git_proxy.rb +38 -41
- data/lib/bundler/source/metadata.rb +7 -2
- data/lib/bundler/source/path.rb +13 -8
- data/lib/bundler/source/rubygems.rb +14 -8
- data/lib/bundler/source/rubygems/remote.rb +2 -3
- data/lib/bundler/source_list.rb +9 -12
- data/lib/bundler/spec_set.rb +1 -6
- data/lib/bundler/stub_specification.rb +18 -30
- data/lib/bundler/templates/Executable.bundler +22 -13
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +3 -3
- data/lib/bundler/templates/newgem/Gemfile.tt +8 -0
- data/lib/bundler/templates/newgem/README.md.tt +4 -3
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +2 -18
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -1
- data/lib/bundler/ui.rb +3 -3
- data/lib/bundler/ui/rg_proxy.rb +1 -1
- data/lib/bundler/ui/shell.rb +4 -8
- data/lib/bundler/uri_credentials_filter.rb +7 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +134 -111
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +6 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +6 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +30 -8
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -2
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +273 -304
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +19 -4
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +17 -12
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +19 -8
- data/lib/bundler/vendor/thor/lib/thor/base.rb +51 -39
- data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
- data/lib/bundler/vendor/thor/lib/thor/error.rb +14 -18
- data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +20 -7
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -3
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +13 -12
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +3 -3
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +6 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -3
- data/lib/bundler/vendor/thor/lib/thor/util.rb +18 -2
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
- data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
- data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
- data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
- data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/bundler/vendored_fileutils.rb +1 -6
- data/lib/bundler/vendored_molinillo.rb +1 -1
- data/lib/bundler/vendored_persistent.rb +7 -5
- data/lib/bundler/vendored_thor.rb +2 -2
- data/lib/bundler/vendored_uri.rb +4 -0
- data/lib/bundler/version.rb +1 -20
- data/lib/bundler/version_ranges.rb +51 -5
- data/lib/bundler/vlad.rb +3 -3
- data/lib/bundler/worker.rb +1 -3
- data/lib/bundler/yaml_serializer.rb +2 -3
- data/man/bundle-add.1 +10 -2
- data/man/bundle-add.1.txt +11 -5
- data/man/bundle-add.ronn +7 -1
- data/man/bundle-binstubs.1 +2 -2
- data/man/bundle-binstubs.1.txt +2 -2
- data/man/bundle-binstubs.ronn +1 -1
- data/man/bundle-cache.1 +55 -0
- data/man/bundle-cache.1.txt +78 -0
- data/man/{bundle-package.ronn → bundle-cache.ronn} +15 -15
- data/man/bundle-check.1 +1 -1
- data/man/bundle-check.1.txt +6 -6
- data/man/bundle-clean.1 +1 -1
- data/man/bundle-clean.1.txt +1 -1
- data/man/bundle-config.1 +35 -35
- data/man/bundle-config.1.txt +65 -66
- data/man/bundle-config.ronn +41 -39
- data/man/bundle-doctor.1 +1 -1
- data/man/bundle-doctor.1.txt +1 -1
- data/man/bundle-exec.1 +2 -2
- data/man/bundle-exec.1.txt +2 -2
- data/man/bundle-exec.ronn +1 -1
- data/man/bundle-gem.1 +1 -1
- data/man/bundle-gem.1.txt +3 -3
- data/man/bundle-info.1 +1 -1
- data/man/bundle-info.1.txt +1 -1
- data/man/bundle-init.1 +1 -1
- data/man/bundle-init.1.txt +1 -1
- data/man/bundle-inject.1 +1 -1
- data/man/bundle-inject.1.txt +1 -1
- data/man/bundle-install.1 +8 -5
- data/man/bundle-install.1.txt +56 -51
- data/man/bundle-install.ronn +9 -4
- data/man/bundle-list.1 +1 -1
- data/man/bundle-list.1.txt +1 -1
- data/man/bundle-lock.1 +1 -1
- data/man/bundle-lock.1.txt +16 -16
- data/man/bundle-open.1 +1 -1
- data/man/bundle-open.1.txt +1 -1
- data/man/bundle-outdated.1 +1 -1
- data/man/bundle-outdated.1.txt +1 -1
- data/man/bundle-platform.1 +1 -1
- data/man/bundle-platform.1.txt +1 -1
- data/man/bundle-pristine.1 +1 -1
- data/man/bundle-pristine.1.txt +1 -1
- data/man/bundle-remove.1 +1 -1
- data/man/bundle-remove.1.txt +1 -1
- data/man/bundle-show.1 +1 -1
- data/man/bundle-show.1.txt +1 -1
- data/man/bundle-update.1 +4 -4
- data/man/bundle-update.1.txt +64 -65
- data/man/bundle-update.ronn +3 -3
- data/man/bundle-viz.1 +1 -1
- data/man/bundle-viz.1.txt +1 -1
- data/man/bundle.1 +2 -2
- data/man/bundle.1.txt +7 -7
- data/man/bundle.ronn +1 -1
- data/man/gemfile.5 +12 -15
- data/man/gemfile.5.ronn +9 -13
- data/man/gemfile.5.txt +103 -107
- data/man/index.txt +1 -1
- metadata +30 -120
- data/exe/bundle_ruby +0 -60
- data/lib/bundler/cli/package.rb +0 -49
- data/lib/bundler/compatibility_guard.rb +0 -13
- data/lib/bundler/gem_remote_fetcher.rb +0 -43
- data/lib/bundler/ssl_certs/.document +0 -1
- data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
- data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
- data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
- data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +0 -5
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
- data/man/bundle-package.1 +0 -55
- data/man/bundle-package.1.txt +0 -79
data/lib/bundler/mirror.rb
CHANGED
@@ -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
|
data/lib/bundler/plugin.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "plugin/api"
|
4
4
|
|
5
5
|
module Bundler
|
6
6
|
module Plugin
|
7
|
-
autoload :DSL, "
|
8
|
-
autoload :Events, "
|
9
|
-
autoload :Index, "
|
10
|
-
autoload :Installer, "
|
11
|
-
autoload :SourceList, "
|
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
|
data/lib/bundler/plugin/api.rb
CHANGED
@@ -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
|
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
|
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
|
#
|
data/lib/bundler/plugin/index.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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, "
|
12
|
-
autoload :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
|
-
|
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
|
-
|
46
|
-
|
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
|
-
|
59
|
+
def install_local_git(names, version, options)
|
60
|
+
uri = options.delete(:local_git)
|
61
|
+
options["uri"] = uri
|
54
62
|
|
55
|
-
|
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
|
-
|
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
|
-
|
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)
|
data/lib/bundler/psyched_yaml.rb
CHANGED
data/lib/bundler/resolver.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module Bundler
|
4
4
|
class Resolver
|
5
|
-
|
6
|
-
|
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.
|
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).
|
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
|
-
|
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
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
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 =>
|
305
|
-
:possibility_type =>
|
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
|
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
|
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
|
-
|
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
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
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
|