bundler 2.1.4 → 2.2.18
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 +1790 -1430
- data/README.md +6 -8
- data/bundler.gemspec +5 -6
- data/exe/bundle +3 -0
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +2 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +29 -2
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +1 -1
- data/lib/bundler/cli/exec.rb +4 -4
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +129 -28
- data/lib/bundler/cli/info.rb +15 -4
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/inject.rb +1 -1
- data/lib/bundler/cli/install.rb +13 -11
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +94 -76
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +3 -1
- data/lib/bundler/cli.rb +72 -56
- data/lib/bundler/compact_index_client/cache.rb +6 -14
- data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/lib/bundler/compact_index_client/updater.rb +13 -17
- data/lib/bundler/compact_index_client.rb +1 -1
- data/lib/bundler/current_ruby.rb +1 -0
- data/lib/bundler/definition.rb +117 -188
- data/lib/bundler/dep_proxy.rb +16 -9
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +40 -33
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -6
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +9 -5
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/fetcher.rb +5 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +51 -18
- data/lib/bundler/gem_helpers.rb +36 -25
- data/lib/bundler/gem_version_promoter.rb +4 -4
- data/lib/bundler/graph.rb +1 -1
- data/lib/bundler/index.rb +13 -9
- data/lib/bundler/injector.rb +23 -5
- data/lib/bundler/inline.rb +3 -2
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +46 -25
- data/lib/bundler/installer/standalone.rb +17 -2
- data/lib/bundler/installer.rb +37 -49
- data/lib/bundler/lazy_specification.rb +45 -25
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +4 -14
- data/lib/bundler/man/.document +1 -0
- data/{man → lib/bundler/man}/bundle-add.1 +1 -1
- data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
- data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
- data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
- data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-check.1 +1 -1
- data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
- data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-config.1 +40 -38
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +50 -50
- data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
- data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
- data/{man → lib/bundler/man}/bundle-info.1 +1 -1
- data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-init.1 +1 -1
- data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
- data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-install.1 +30 -3
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
- data/{man → lib/bundler/man}/bundle-list.1 +7 -7
- data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
- data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-open.1 +1 -1
- data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
- data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
- data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
- data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-show.1 +1 -1
- data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-update.1 +1 -1
- data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
- data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle.1 +1 -1
- data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
- data/{man → lib/bundler/man}/gemfile.5 +4 -4
- data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
- data/{man → lib/bundler/man}/index.txt +0 -0
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin/api/source.rb +22 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/installer.rb +9 -11
- data/lib/bundler/plugin/source_list.rb +5 -1
- data/lib/bundler/plugin.rb +33 -7
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver/spec_group.rb +56 -53
- data/lib/bundler/resolver.rb +88 -115
- data/lib/bundler/retry.rb +2 -2
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +71 -11
- data/lib/bundler/rubygems_gem_installer.rb +50 -9
- data/lib/bundler/rubygems_integration.rb +25 -60
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +107 -55
- data/lib/bundler/shared_helpers.rb +3 -3
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source/git/git_proxy.rb +82 -80
- data/lib/bundler/source/git.rb +24 -22
- data/lib/bundler/source/metadata.rb +0 -4
- data/lib/bundler/source/path/installer.rb +10 -10
- data/lib/bundler/source/path.rb +10 -4
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +60 -28
- data/lib/bundler/source/rubygems_aggregate.rb +64 -0
- data/lib/bundler/source.rb +16 -1
- data/lib/bundler/source_list.rb +52 -28
- data/lib/bundler/source_map.rb +58 -0
- data/lib/bundler/spec_set.rb +29 -17
- data/lib/bundler/stub_specification.rb +25 -7
- data/lib/bundler/templates/Gemfile +1 -1
- data/lib/bundler/templates/gems.rb +1 -1
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/README.md.tt +6 -5
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
- data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/shell.rb +5 -5
- data/lib/bundler/uri_credentials_filter.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +3 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendored_persistent.rb +0 -7
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +1 -1
- data/lib/bundler.rb +34 -9
- metadata +77 -86
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/man/bundle-add.1.txt +0 -58
- data/man/bundle-binstubs.1.txt +0 -48
- data/man/bundle-cache.1.txt +0 -78
- data/man/bundle-check.1.txt +0 -33
- data/man/bundle-clean.1.txt +0 -26
- data/man/bundle-config.1.txt +0 -528
- data/man/bundle-doctor.1.txt +0 -44
- data/man/bundle-exec.1.txt +0 -178
- data/man/bundle-gem.1.txt +0 -91
- data/man/bundle-info.1.txt +0 -21
- data/man/bundle-init.1.txt +0 -34
- data/man/bundle-inject.1.txt +0 -32
- data/man/bundle-install.1.txt +0 -401
- data/man/bundle-list.1.txt +0 -43
- data/man/bundle-lock.1.txt +0 -93
- data/man/bundle-open.1.txt +0 -29
- data/man/bundle-outdated.1.txt +0 -131
- data/man/bundle-platform.1.txt +0 -57
- data/man/bundle-pristine.1.txt +0 -44
- data/man/bundle-remove.1.txt +0 -34
- data/man/bundle-show.1.txt +0 -27
- data/man/bundle-update.1.txt +0 -390
- data/man/bundle-viz.1.txt +0 -39
- data/man/bundle.1.txt +0 -116
- data/man/gemfile.5.txt +0 -649
data/lib/bundler/gem_helpers.rb
CHANGED
@@ -24,47 +24,44 @@ module Bundler
|
|
24
24
|
module_function :generic
|
25
25
|
|
26
26
|
def generic_local_platform
|
27
|
-
generic(
|
27
|
+
generic(local_platform)
|
28
28
|
end
|
29
29
|
module_function :generic_local_platform
|
30
30
|
|
31
|
+
def local_platform
|
32
|
+
Bundler.local_platform
|
33
|
+
end
|
34
|
+
module_function :local_platform
|
35
|
+
|
31
36
|
def platform_specificity_match(spec_platform, user_platform)
|
32
37
|
spec_platform = Gem::Platform.new(spec_platform)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
PlatformMatch.new(
|
37
|
-
PlatformMatch.os_match(spec_platform, user_platform),
|
38
|
-
PlatformMatch.cpu_match(spec_platform, user_platform),
|
39
|
-
PlatformMatch.platform_version_match(spec_platform, user_platform)
|
40
|
-
)
|
38
|
+
|
39
|
+
PlatformMatch.specificity_score(spec_platform, user_platform)
|
41
40
|
end
|
42
41
|
module_function :platform_specificity_match
|
43
42
|
|
44
43
|
def select_best_platform_match(specs, platform)
|
45
|
-
specs.select {|spec| spec.match_platform(platform) }
|
46
|
-
|
44
|
+
matching = specs.select {|spec| spec.match_platform(platform) }
|
45
|
+
exact = matching.select {|spec| spec.platform == platform }
|
46
|
+
return exact if exact.any?
|
47
|
+
|
48
|
+
sorted_matching = matching.sort_by {|spec| platform_specificity_match(spec.platform, platform) }
|
49
|
+
exemplary_spec = sorted_matching.first
|
50
|
+
|
51
|
+
sorted_matching.take_while{|spec| same_specificity(platform, spec, exemplary_spec) && same_deps(spec, exemplary_spec) }
|
47
52
|
end
|
48
53
|
module_function :select_best_platform_match
|
49
54
|
|
50
|
-
PlatformMatch = Struct.new(:os_match, :cpu_match, :platform_version_match)
|
51
55
|
class PlatformMatch
|
52
|
-
def
|
53
|
-
return
|
54
|
-
|
55
|
-
m = os_match <=> other.os_match
|
56
|
-
return m unless m.zero?
|
57
|
-
|
58
|
-
m = cpu_match <=> other.cpu_match
|
59
|
-
return m unless m.zero?
|
56
|
+
def self.specificity_score(spec_platform, user_platform)
|
57
|
+
return -1 if spec_platform == user_platform
|
58
|
+
return 1_000_000 if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
|
60
59
|
|
61
|
-
|
62
|
-
|
60
|
+
os_match(spec_platform, user_platform) +
|
61
|
+
cpu_match(spec_platform, user_platform) * 10 +
|
62
|
+
platform_version_match(spec_platform, user_platform) * 100
|
63
63
|
end
|
64
64
|
|
65
|
-
EXACT_MATCH = new(-1, -1, -1).freeze
|
66
|
-
WORST_MATCH = new(1_000_000, 1_000_000, 1_000_000).freeze
|
67
|
-
|
68
65
|
def self.os_match(spec_platform, user_platform)
|
69
66
|
if spec_platform.os == user_platform.os
|
70
67
|
0
|
@@ -95,5 +92,19 @@ module Bundler
|
|
95
92
|
end
|
96
93
|
end
|
97
94
|
end
|
95
|
+
|
96
|
+
def same_specificity(platform, spec, exemplary_spec)
|
97
|
+
platform_specificity_match(spec.platform, platform) == platform_specificity_match(exemplary_spec.platform, platform)
|
98
|
+
end
|
99
|
+
module_function :same_specificity
|
100
|
+
|
101
|
+
def same_deps(spec, exemplary_spec)
|
102
|
+
same_runtime_deps = spec.dependencies.sort == exemplary_spec.dependencies.sort
|
103
|
+
return same_runtime_deps unless spec.is_a?(Gem::Specification) && exemplary_spec.is_a?(Gem::Specification)
|
104
|
+
|
105
|
+
same_metadata_deps = spec.required_ruby_version == exemplary_spec.required_ruby_version && spec.required_rubygems_version == exemplary_spec.required_rubygems_version
|
106
|
+
same_runtime_deps && same_metadata_deps
|
107
|
+
end
|
108
|
+
module_function :same_deps
|
98
109
|
end
|
99
110
|
end
|
@@ -7,7 +7,7 @@ module Bundler
|
|
7
7
|
# available dependency versions as found in its index, before returning it to
|
8
8
|
# to the resolution engine to select the best version.
|
9
9
|
class GemVersionPromoter
|
10
|
-
DEBUG = ENV["DEBUG_RESOLVER"]
|
10
|
+
DEBUG = ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]
|
11
11
|
|
12
12
|
attr_reader :level, :locked_specs, :unlock_gems
|
13
13
|
|
@@ -81,8 +81,8 @@ module Bundler
|
|
81
81
|
sort_dep_specs(spec_groups, locked_spec)
|
82
82
|
end.tap do |specs|
|
83
83
|
if DEBUG
|
84
|
-
|
85
|
-
|
84
|
+
puts before_result
|
85
|
+
puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
@@ -98,7 +98,7 @@ module Bundler
|
|
98
98
|
level == :minor
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
private
|
102
102
|
|
103
103
|
def filter_dep_specs(spec_groups, locked_spec)
|
104
104
|
res = spec_groups.select do |spec_group|
|
data/lib/bundler/graph.rb
CHANGED
data/lib/bundler/index.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "set"
|
4
|
-
|
5
3
|
module Bundler
|
6
4
|
class Index
|
7
5
|
include Enumerable
|
@@ -65,11 +63,14 @@ module Bundler
|
|
65
63
|
def unsorted_search(query, base)
|
66
64
|
results = local_search(query, base)
|
67
65
|
|
68
|
-
seen = results.map(&:full_name).
|
66
|
+
seen = results.map(&:full_name).uniq unless @sources.empty?
|
69
67
|
|
70
68
|
@sources.each do |source|
|
71
69
|
source.unsorted_search(query, base).each do |spec|
|
72
|
-
|
70
|
+
next if seen.include?(spec.full_name)
|
71
|
+
|
72
|
+
seen << spec.full_name
|
73
|
+
results << spec
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -121,10 +122,9 @@ module Bundler
|
|
121
122
|
names
|
122
123
|
end
|
123
124
|
|
124
|
-
# returns a list of the dependencies
|
125
125
|
def unmet_dependency_names
|
126
126
|
dependency_names.select do |name|
|
127
|
-
|
127
|
+
search(name).empty?
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
@@ -170,7 +170,7 @@ module Bundler
|
|
170
170
|
def dependencies_eql?(spec, other_spec)
|
171
171
|
deps = spec.dependencies.select {|d| d.type != :development }
|
172
172
|
other_deps = other_spec.dependencies.select {|d| d.type != :development }
|
173
|
-
|
173
|
+
deps.sort == other_deps.sort
|
174
174
|
end
|
175
175
|
|
176
176
|
def add_source(index)
|
@@ -179,7 +179,7 @@ module Bundler
|
|
179
179
|
@sources.uniq! # need to use uniq! here instead of checking for the item before adding
|
180
180
|
end
|
181
181
|
|
182
|
-
|
182
|
+
private
|
183
183
|
|
184
184
|
def specs_by_name(name)
|
185
185
|
@specs[name].values
|
@@ -195,7 +195,11 @@ module Bundler
|
|
195
195
|
if base # allow all platforms when searching from a lockfile
|
196
196
|
dependency.matches_spec?(spec)
|
197
197
|
else
|
198
|
-
|
198
|
+
if Gem::Platform.respond_to? :match_spec?
|
199
|
+
dependency.matches_spec?(spec) && Gem::Platform.match_spec?(spec)
|
200
|
+
else
|
201
|
+
dependency.matches_spec?(spec) && Gem::Platform.match(spec.platform)
|
202
|
+
end
|
199
203
|
end
|
200
204
|
end
|
201
205
|
|
data/lib/bundler/injector.rb
CHANGED
@@ -74,7 +74,7 @@ module Bundler
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
|
77
|
+
private
|
78
78
|
|
79
79
|
def conservative_version(spec)
|
80
80
|
version = spec.version
|
@@ -128,7 +128,7 @@ module Bundler
|
|
128
128
|
# evaluates a gemfile to remove the specified gem
|
129
129
|
# from it.
|
130
130
|
def remove_deps(gemfile_path)
|
131
|
-
initial_gemfile =
|
131
|
+
initial_gemfile = File.readlines(gemfile_path)
|
132
132
|
|
133
133
|
Bundler.ui.info "Removing gems from #{gemfile_path}"
|
134
134
|
|
@@ -179,11 +179,22 @@ module Bundler
|
|
179
179
|
# @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
|
180
180
|
def remove_gems_from_gemfile(gems, gemfile_path)
|
181
181
|
patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
|
182
|
+
new_gemfile = []
|
183
|
+
multiline_removal = false
|
184
|
+
File.readlines(gemfile_path).each do |line|
|
185
|
+
match_data = line.match(patterns)
|
186
|
+
if match_data && is_not_within_comment?(line, match_data)
|
187
|
+
multiline_removal = line.rstrip.end_with?(",")
|
188
|
+
# skip lines which match the regex
|
189
|
+
next
|
190
|
+
end
|
182
191
|
|
183
|
-
|
184
|
-
|
192
|
+
# skip followup lines until line does not end with ','
|
193
|
+
new_gemfile << line unless multiline_removal
|
194
|
+
multiline_removal = line.rstrip.end_with?(",") if multiline_removal
|
195
|
+
end
|
185
196
|
|
186
|
-
# remove
|
197
|
+
# remove line \n and append them with other strings
|
187
198
|
new_gemfile.each_with_index do |_line, index|
|
188
199
|
if new_gemfile[index + 1] == "\n"
|
189
200
|
new_gemfile[index] += new_gemfile[index + 1]
|
@@ -196,6 +207,13 @@ module Bundler
|
|
196
207
|
new_gemfile.join.chomp
|
197
208
|
end
|
198
209
|
|
210
|
+
# @param [String] line Individual line of gemfile content.
|
211
|
+
# @param [MatchData] match_data Data about Regex match.
|
212
|
+
def is_not_within_comment?(line, match_data)
|
213
|
+
match_start_index = match_data.offset(0).first
|
214
|
+
!line[0..match_start_index].include?("#")
|
215
|
+
end
|
216
|
+
|
199
217
|
# @param [Array] gemfile Array of gemfile contents.
|
200
218
|
# @param [String] block_name Name of block name to look for.
|
201
219
|
def remove_nested_blocks(gemfile, block_name)
|
data/lib/bundler/inline.rb
CHANGED
@@ -50,15 +50,16 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
50
50
|
Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
|
51
51
|
builder = Bundler::Dsl.new
|
52
52
|
builder.instance_eval(&gemfile)
|
53
|
+
builder.check_primary_source_safety
|
53
54
|
|
54
|
-
Bundler.settings.temporary(:frozen => false) do
|
55
|
+
Bundler.settings.temporary(:deployment => false, :frozen => false) do
|
55
56
|
definition = builder.to_definition(nil, true)
|
56
57
|
def definition.lock(*); end
|
57
58
|
definition.validate_runtime!
|
58
59
|
|
59
60
|
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
60
61
|
if install || definition.missing_specs?
|
61
|
-
Bundler.settings.temporary(:inline => true
|
62
|
+
Bundler.settings.temporary(:inline => true) do
|
62
63
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
63
64
|
installer.post_install_messages.each do |name, message|
|
64
65
|
Bundler.ui.info "Post-install message from #{name}:\n#{message}"
|
@@ -19,15 +19,15 @@ module Bundler
|
|
19
19
|
Bundler.ui.debug "#{worker}: #{spec.name} (#{spec.version}) from #{spec.loaded_from}"
|
20
20
|
generate_executable_stubs
|
21
21
|
return true, post_install_message
|
22
|
-
rescue Bundler::InstallHookError, Bundler::SecurityError, APIResponseMismatchError
|
22
|
+
rescue Bundler::InstallHookError, Bundler::SecurityError, Bundler::APIResponseMismatchError
|
23
23
|
raise
|
24
24
|
rescue Errno::ENOSPC
|
25
25
|
return false, out_of_space_message
|
26
|
-
rescue
|
26
|
+
rescue Bundler::BundlerError, Gem::InstallError, Bundler::APIResponseInvalidDependenciesError => e
|
27
27
|
return false, specific_failure_message(e)
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
private
|
31
31
|
|
32
32
|
def specific_failure_message(e)
|
33
33
|
message = "#{e.class}: #{e.message}\n"
|
@@ -6,10 +6,11 @@ require_relative "gem_installer"
|
|
6
6
|
module Bundler
|
7
7
|
class ParallelInstaller
|
8
8
|
class SpecInstallation
|
9
|
-
attr_accessor :spec, :name, :post_install_message, :state, :error
|
9
|
+
attr_accessor :spec, :name, :full_name, :post_install_message, :state, :error
|
10
10
|
def initialize(spec)
|
11
11
|
@spec = spec
|
12
12
|
@name = spec.name
|
13
|
+
@full_name = spec.full_name
|
13
14
|
@state = :none
|
14
15
|
@post_install_message = ""
|
15
16
|
@error = nil
|
@@ -27,13 +28,8 @@ module Bundler
|
|
27
28
|
state == :failed
|
28
29
|
end
|
29
30
|
|
30
|
-
def installation_attempted?
|
31
|
-
installed? || failed?
|
32
|
-
end
|
33
|
-
|
34
|
-
# Only true when spec in neither installed nor already enqueued
|
35
31
|
def ready_to_enqueue?
|
36
|
-
|
32
|
+
state == :none
|
37
33
|
end
|
38
34
|
|
39
35
|
def has_post_install_message?
|
@@ -54,14 +50,11 @@ module Bundler
|
|
54
50
|
# Represents only the non-development dependencies, the ones that are
|
55
51
|
# itself and are in the total list.
|
56
52
|
def dependencies
|
57
|
-
@dependencies ||=
|
58
|
-
all_dependencies.reject {|dep| ignorable_dependency? dep }
|
59
|
-
end
|
53
|
+
@dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep }
|
60
54
|
end
|
61
55
|
|
62
56
|
def missing_lockfile_dependencies(all_spec_names)
|
63
|
-
|
64
|
-
deps.reject {|dep| all_spec_names.include? dep.name }
|
57
|
+
dependencies.reject {|dep| all_spec_names.include? dep.name }
|
65
58
|
end
|
66
59
|
|
67
60
|
# Represents all dependencies
|
@@ -70,7 +63,7 @@ module Bundler
|
|
70
63
|
end
|
71
64
|
|
72
65
|
def to_s
|
73
|
-
"#<#{self.class} #{
|
66
|
+
"#<#{self.class} #{full_name} (#{state})>"
|
74
67
|
end
|
75
68
|
end
|
76
69
|
|
@@ -93,18 +86,48 @@ module Bundler
|
|
93
86
|
def call
|
94
87
|
check_for_corrupt_lockfile
|
95
88
|
|
89
|
+
if @rake
|
90
|
+
do_install(@rake, 0)
|
91
|
+
Gem::Specification.reset
|
92
|
+
end
|
93
|
+
|
96
94
|
if @size > 1
|
97
95
|
install_with_worker
|
98
96
|
else
|
99
97
|
install_serially
|
100
98
|
end
|
101
99
|
|
102
|
-
|
100
|
+
check_for_unmet_dependencies
|
101
|
+
|
102
|
+
handle_error if failed_specs.any?
|
103
103
|
@specs
|
104
104
|
ensure
|
105
105
|
worker_pool && worker_pool.stop
|
106
106
|
end
|
107
107
|
|
108
|
+
def check_for_unmet_dependencies
|
109
|
+
unmet_dependencies = @specs.map do |s|
|
110
|
+
[
|
111
|
+
s,
|
112
|
+
s.dependencies.reject {|dep| @specs.any? {|spec| dep.matches_spec?(spec.spec) } },
|
113
|
+
]
|
114
|
+
end.reject {|a| a.last.empty? }
|
115
|
+
return if unmet_dependencies.empty?
|
116
|
+
|
117
|
+
warning = []
|
118
|
+
warning << "Your lockfile doesn't include a valid resolution."
|
119
|
+
warning << "You can fix this by regenerating your lockfile or trying to manually editing the bad locked gems to a version that satisfies all dependencies."
|
120
|
+
warning << "The unmet dependencies are:"
|
121
|
+
|
122
|
+
unmet_dependencies.each do |spec, unmet_spec_dependencies|
|
123
|
+
unmet_spec_dependencies.each do |unmet_spec_dependency|
|
124
|
+
warning << "* #{unmet_spec_dependency}, depended upon #{spec.full_name}, unsatisfied by #{@specs.find {|s| s.name == unmet_spec_dependency.name && !unmet_spec_dependency.matches_spec?(s.spec) }.full_name}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
Bundler.ui.warn(warning.join("\n"))
|
129
|
+
end
|
130
|
+
|
108
131
|
def check_for_corrupt_lockfile
|
109
132
|
missing_dependencies = @specs.map do |s|
|
110
133
|
[
|
@@ -130,7 +153,11 @@ module Bundler
|
|
130
153
|
Bundler.ui.warn(warning.join("\n"))
|
131
154
|
end
|
132
155
|
|
133
|
-
|
156
|
+
private
|
157
|
+
|
158
|
+
def failed_specs
|
159
|
+
@specs.select(&:failed?)
|
160
|
+
end
|
134
161
|
|
135
162
|
def install_with_worker
|
136
163
|
enqueue_specs
|
@@ -156,17 +183,13 @@ module Bundler
|
|
156
183
|
gem_installer = Bundler::GemInstaller.new(
|
157
184
|
spec_install.spec, @installer, @standalone, worker_num, @force
|
158
185
|
)
|
159
|
-
success, message =
|
160
|
-
gem_installer.install_from_spec
|
161
|
-
rescue RuntimeError => e
|
162
|
-
raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
163
|
-
end
|
186
|
+
success, message = gem_installer.install_from_spec
|
164
187
|
if success
|
165
188
|
spec_install.state = :installed
|
166
189
|
spec_install.post_install_message = message unless message.nil?
|
167
190
|
else
|
168
|
-
spec_install.state = :failed
|
169
191
|
spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
192
|
+
spec_install.state = :failed
|
170
193
|
end
|
171
194
|
Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
|
172
195
|
spec_install
|
@@ -190,11 +213,11 @@ module Bundler
|
|
190
213
|
end
|
191
214
|
|
192
215
|
def handle_error
|
193
|
-
errors =
|
216
|
+
errors = failed_specs.map(&:error)
|
194
217
|
if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
|
195
218
|
raise exception
|
196
219
|
end
|
197
|
-
raise Bundler::InstallError, errors.
|
220
|
+
raise Bundler::InstallError, errors.join("\n\n")
|
198
221
|
end
|
199
222
|
|
200
223
|
def require_tree_for_spec(spec)
|
@@ -217,8 +240,6 @@ module Bundler
|
|
217
240
|
# are installed.
|
218
241
|
def enqueue_specs
|
219
242
|
@specs.select(&:ready_to_enqueue?).each do |spec|
|
220
|
-
next if @rake && !@rake.installed? && spec.name != @rake.name
|
221
|
-
|
222
243
|
if spec.dependencies_installed? @specs
|
223
244
|
spec.state = :enqueued
|
224
245
|
worker_pool.enq spec
|
@@ -15,13 +15,14 @@ module Bundler
|
|
15
15
|
file.puts "ruby_engine = RUBY_ENGINE"
|
16
16
|
file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
|
17
17
|
file.puts "path = File.expand_path('..', __FILE__)"
|
18
|
+
file.puts reverse_rubygems_kernel_mixin
|
18
19
|
paths.each do |path|
|
19
|
-
file.puts %($:.unshift "\#{path}/#{path}")
|
20
|
+
file.puts %($:.unshift File.expand_path("\#{path}/#{path}"))
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
+
private
|
25
26
|
|
26
27
|
def paths
|
27
28
|
@specs.map do |spec|
|
@@ -48,5 +49,19 @@ module Bundler
|
|
48
49
|
error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
|
49
50
|
raise Gem::InvalidSpecificationException.new(error_message)
|
50
51
|
end
|
52
|
+
|
53
|
+
def reverse_rubygems_kernel_mixin
|
54
|
+
<<~END
|
55
|
+
kernel = (class << ::Kernel; self; end)
|
56
|
+
[kernel, ::Kernel].each do |k|
|
57
|
+
if k.private_method_defined?(:gem_original_require)
|
58
|
+
private_require = k.private_method_defined?(:require)
|
59
|
+
k.send(:remove_method, :require)
|
60
|
+
k.send(:define_method, :require, k.instance_method(:gem_original_require))
|
61
|
+
k.send(:private, :require) if private_require
|
62
|
+
end
|
63
|
+
end
|
64
|
+
END
|
65
|
+
end
|
51
66
|
end
|
52
67
|
end
|
data/lib/bundler/installer.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "erb"
|
4
3
|
require "rubygems/dependency_installer"
|
5
4
|
require_relative "worker"
|
6
5
|
require_relative "installer/parallel_installer"
|
@@ -83,7 +82,6 @@ module Bundler
|
|
83
82
|
|
84
83
|
if resolve_if_needed(options)
|
85
84
|
ensure_specs_are_compatible!
|
86
|
-
warn_on_incompatible_bundler_deps
|
87
85
|
load_plugins
|
88
86
|
options.delete(:jobs)
|
89
87
|
else
|
@@ -91,6 +89,8 @@ module Bundler
|
|
91
89
|
end
|
92
90
|
install(options)
|
93
91
|
|
92
|
+
Gem::Specification.reset # invalidate gem specification cache so that installed gems are immediately available
|
93
|
+
|
94
94
|
lock unless Bundler.frozen_bundle?
|
95
95
|
Standalone.new(options[:standalone], @definition).generate if options[:standalone]
|
96
96
|
end
|
@@ -135,12 +135,18 @@ module Bundler
|
|
135
135
|
next
|
136
136
|
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
138
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
139
|
+
require "erb"
|
140
|
+
content = if RUBY_VERSION >= "2.6"
|
141
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
142
|
+
else
|
143
|
+
ERB.new(template, nil, "-").result(binding)
|
144
|
+
end
|
145
|
+
|
146
|
+
File.write(binstub_path, content, :mode => mode, :perm => 0o777 & ~File.umask)
|
147
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
148
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
149
|
+
File.write("#{binstub_path}.cmd", prefix + content, :mode => mode)
|
144
150
|
end
|
145
151
|
end
|
146
152
|
|
@@ -159,7 +165,7 @@ module Bundler
|
|
159
165
|
end
|
160
166
|
end
|
161
167
|
|
162
|
-
def generate_standalone_bundler_executable_stubs(spec)
|
168
|
+
def generate_standalone_bundler_executable_stubs(spec, options = {})
|
163
169
|
# double-assignment to avoid warnings about variables that will be used by ERB
|
164
170
|
bin_path = Bundler.bin_path
|
165
171
|
unless path = Bundler.settings[:path]
|
@@ -175,17 +181,24 @@ module Bundler
|
|
175
181
|
next if executable == "bundle"
|
176
182
|
executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
|
177
183
|
executable_path = executable_path
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
+
|
185
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
186
|
+
require "erb"
|
187
|
+
content = if RUBY_VERSION >= "2.6"
|
188
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
189
|
+
else
|
190
|
+
ERB.new(template, nil, "-").result(binding)
|
191
|
+
end
|
192
|
+
|
193
|
+
File.write("#{bin_path}/#{executable}", content, :mode => mode, :perm => 0o755)
|
194
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
195
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
196
|
+
File.write("#{bin_path}/#{executable}.cmd", prefix + content, :mode => mode)
|
184
197
|
end
|
185
198
|
end
|
186
199
|
end
|
187
200
|
|
188
|
-
|
201
|
+
private
|
189
202
|
|
190
203
|
# the order that the resolver provides is significant, since
|
191
204
|
# dependencies might affect the installation of a gem.
|
@@ -202,20 +215,14 @@ module Bundler
|
|
202
215
|
return jobs
|
203
216
|
end
|
204
217
|
|
205
|
-
return 1 unless can_install_in_parallel?
|
206
|
-
|
207
|
-
auto_config_jobs = Bundler.feature_flag.auto_config_jobs?
|
208
218
|
if jobs = Bundler.settings[:jobs]
|
209
|
-
|
210
|
-
jobs
|
211
|
-
else
|
212
|
-
[jobs.pred, 1].max
|
213
|
-
end
|
214
|
-
elsif auto_config_jobs
|
215
|
-
processor_count
|
216
|
-
else
|
217
|
-
1
|
219
|
+
return jobs
|
218
220
|
end
|
221
|
+
|
222
|
+
# Parallelization has some issues on Windows, so it's not yet the default
|
223
|
+
return 1 if Gem.win_platform?
|
224
|
+
|
225
|
+
processor_count
|
219
226
|
end
|
220
227
|
|
221
228
|
def processor_count
|
@@ -238,6 +245,7 @@ module Bundler
|
|
238
245
|
end
|
239
246
|
end.flatten
|
240
247
|
Bundler.rubygems.load_plugin_files(path_plugin_files)
|
248
|
+
Bundler.rubygems.load_env_plugins
|
241
249
|
end
|
242
250
|
|
243
251
|
def ensure_specs_are_compatible!
|
@@ -258,26 +266,6 @@ module Bundler
|
|
258
266
|
end
|
259
267
|
end
|
260
268
|
|
261
|
-
def warn_on_incompatible_bundler_deps
|
262
|
-
bundler_version = Gem::Version.create(Bundler::VERSION)
|
263
|
-
@definition.specs.each do |spec|
|
264
|
-
spec.dependencies.each do |dep|
|
265
|
-
next if dep.type == :development
|
266
|
-
next unless dep.name == "bundler".freeze
|
267
|
-
next if dep.requirement.satisfied_by?(bundler_version)
|
268
|
-
|
269
|
-
Bundler.ui.warn "#{spec.name} (#{spec.version}) has dependency" \
|
270
|
-
" #{SharedHelpers.pretty_dependency(dep)}" \
|
271
|
-
", which is unsatisfied by the current bundler version #{VERSION}" \
|
272
|
-
", so the dependency is being ignored"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def can_install_in_parallel?
|
278
|
-
true
|
279
|
-
end
|
280
|
-
|
281
269
|
def install_in_parallel(size, standalone, force = false)
|
282
270
|
spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
|
283
271
|
spec_installations.each do |installation|
|
@@ -296,7 +284,7 @@ module Bundler
|
|
296
284
|
|
297
285
|
# returns whether or not a re-resolve was needed
|
298
286
|
def resolve_if_needed(options)
|
299
|
-
if !@definition.unlocking? && !options["force"] && !
|
287
|
+
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
300
288
|
return false if @definition.nothing_changed? && !@definition.missing_specs?
|
301
289
|
end
|
302
290
|
|