bundler 1.17.0.pre.2 → 2.1.0.pre.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +769 -570
- data/LICENSE.md +18 -19
- data/README.md +9 -8
- data/bundler.gemspec +12 -23
- data/exe/bundle +19 -3
- data/lib/bundler.rb +121 -68
- data/lib/bundler/build_metadata.rb +14 -7
- data/lib/bundler/capistrano.rb +4 -4
- data/lib/bundler/cli.rb +129 -121
- data/lib/bundler/cli/add.rb +27 -16
- data/lib/bundler/cli/common.rb +11 -12
- data/lib/bundler/cli/config.rb +161 -86
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +4 -4
- data/lib/bundler/cli/exec.rb +4 -9
- 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 +11 -10
- data/lib/bundler/cli/issue.rb +3 -3
- data/lib/bundler/cli/open.rb +10 -6
- data/lib/bundler/cli/outdated.rb +85 -81
- data/lib/bundler/cli/package.rb +8 -9
- 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 +9 -7
- data/lib/bundler/definition.rb +35 -26
- data/lib/bundler/dependency.rb +16 -4
- data/lib/bundler/deployment.rb +1 -1
- data/lib/bundler/dsl.rb +15 -39
- data/lib/bundler/env.rb +8 -13
- data/lib/bundler/environment_preserver.rb +0 -1
- data/lib/bundler/feature_flag.rb +23 -32
- data/lib/bundler/fetcher.rb +14 -11
- 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 +4 -2
- data/lib/bundler/friendly_errors.rb +4 -5
- data/lib/bundler/gem_helper.rb +39 -24
- 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 +10 -8
- data/lib/bundler/inline.rb +19 -18
- data/lib/bundler/installer.rb +7 -14
- data/lib/bundler/installer/gem_installer.rb +5 -1
- data/lib/bundler/installer/parallel_installer.rb +4 -8
- data/lib/bundler/installer/standalone.rb +1 -2
- data/lib/bundler/lazy_specification.rb +2 -2
- data/lib/bundler/lockfile_parser.rb +13 -21
- data/lib/bundler/match_platform.rb +1 -1
- data/lib/bundler/plugin.rb +42 -29
- data/lib/bundler/plugin/api.rb +1 -1
- data/lib/bundler/plugin/api/source.rb +2 -2
- data/lib/bundler/plugin/index.rb +14 -3
- data/lib/bundler/plugin/installer.rb +28 -15
- data/lib/bundler/psyched_yaml.rb +1 -1
- 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 +10 -66
- data/lib/bundler/rubygems_gem_installer.rb +1 -1
- data/lib/bundler/rubygems_integration.rb +144 -395
- data/lib/bundler/runtime.rb +2 -9
- data/lib/bundler/settings.rb +15 -47
- data/lib/bundler/setup.rb +6 -5
- data/lib/bundler/shared_helpers.rb +64 -67
- data/lib/bundler/similarity_detector.rb +2 -2
- data/lib/bundler/source.rb +5 -5
- data/lib/bundler/source/git.rb +19 -12
- data/lib/bundler/source/git/git_proxy.rb +35 -39
- data/lib/bundler/source/metadata.rb +9 -5
- data/lib/bundler/source/path.rb +13 -8
- data/lib/bundler/source/rubygems.rb +11 -5
- data/lib/bundler/source/rubygems/remote.rb +1 -2
- data/lib/bundler/source_list.rb +9 -12
- data/lib/bundler/spec_set.rb +23 -12
- data/lib/bundler/stub_specification.rb +18 -30
- data/lib/bundler/templates/Executable.bundler +23 -14
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +3 -3
- data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
- data/lib/bundler/templates/newgem/README.md.tt +4 -3
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -27
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +1 -1
- 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/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 +151 -48
- data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
- 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 +248 -279
- 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 +7 -2
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -11
- 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 +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +16 -17
- data/lib/bundler/vendor/thor/lib/thor/error.rb +82 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +7 -2
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -6
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +4 -4
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +52 -7
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- 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/version.rb +1 -20
- data/lib/bundler/version_ranges.rb +51 -5
- data/lib/bundler/vlad.rb +2 -2
- 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-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 +52 -36
- data/man/bundle-config.1.txt +82 -67
- data/man/bundle-config.ronn +56 -40
- 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 +2 -2
- data/man/bundle-init.1.txt +2 -2
- data/man/bundle-init.ronn +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-package.1 +1 -1
- data/man/bundle-package.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 +7 -3
- data/man/bundle.1.txt +11 -8
- data/man/bundle.ronn +5 -2
- data/man/gemfile.5 +17 -20
- data/man/gemfile.5.ronn +14 -18
- data/man/gemfile.5.txt +108 -112
- metadata +17 -104
- data/exe/bundle_ruby +0 -60
- data/lib/bundler/cli/cache.rb +0 -36
- data/lib/bundler/compatibility_guard.rb +0 -14
- 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/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
@@ -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
|
-
|
4
|
-
|
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 {
|
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 {
|
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 "
|
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
|
-
|
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
|
-
|
31
|
-
|
32
|
-
Gem::Version.create("1.
|
33
|
-
Gem::Version.create("1.
|
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.
|
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
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
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.
|
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
|
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,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
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
85
|
+
return if definition.dependencies.empty?
|
65
86
|
|
66
|
-
|
67
|
-
|
87
|
+
plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
|
88
|
+
installed_specs = Installer.new.install_definition(definition)
|
68
89
|
|
69
|
-
|
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
|
data/lib/bundler/plugin/api.rb
CHANGED
@@ -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
|
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
|
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
|
#
|
data/lib/bundler/plugin/index.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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, "
|
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
|