bundler 2.1.4 → 2.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1624 -1426
- data/README.md +6 -8
- data/bundler.gemspec +4 -4
- data/exe/bundle +3 -0
- data/lib/bundler.rb +32 -8
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli.rb +55 -21
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +1 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +14 -0
- 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 +86 -11
- 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 +87 -66
- 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/compact_index_client.rb +1 -1
- 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 +5 -13
- data/lib/bundler/definition.rb +66 -82
- data/lib/bundler/dep_proxy.rb +16 -9
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +5 -9
- 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 -3
- data/lib/bundler/fetcher.rb +4 -3
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +1 -1
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +32 -17
- 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 +6 -2
- data/lib/bundler/injector.rb +22 -4
- data/lib/bundler/inline.rb +1 -1
- data/lib/bundler/installer.rb +35 -32
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +10 -10
- data/lib/bundler/installer/standalone.rb +2 -2
- data/lib/bundler/lazy_specification.rb +35 -11
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +1 -1
- 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 +16 -25
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
- 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.rb +30 -5
- data/lib/bundler/plugin/api/source.rb +1 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer.rb +1 -1
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/source_list.rb +1 -1
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver.rb +43 -19
- data/lib/bundler/resolver/spec_group.rb +39 -24
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +69 -9
- data/lib/bundler/rubygems_gem_installer.rb +3 -9
- data/lib/bundler/rubygems_integration.rb +25 -60
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +49 -46
- data/lib/bundler/shared_helpers.rb +2 -2
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source.rb +1 -1
- data/lib/bundler/source/git.rb +23 -21
- data/lib/bundler/source/git/git_proxy.rb +82 -80
- data/lib/bundler/source/path.rb +7 -3
- data/lib/bundler/source/path/installer.rb +10 -10
- data/lib/bundler/source/rubygems.rb +23 -17
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source_list.rb +2 -2
- data/lib/bundler/spec_set.rb +8 -10
- data/lib/bundler/stub_specification.rb +17 -7
- 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 +1 -2
- 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 +18 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- 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.rb +0 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +48 -46
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
- data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- 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
- metadata +70 -85
- 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
|
@@ -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
|
|
@@ -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
|
+
IO.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
|
@@ -58,7 +58,7 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
|
58
58
|
|
|
59
59
|
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
|
60
60
|
if install || definition.missing_specs?
|
|
61
|
-
Bundler.settings.temporary(:inline => true
|
|
61
|
+
Bundler.settings.temporary(:inline => true) do
|
|
62
62
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
|
63
63
|
installer.post_install_messages.each do |name, message|
|
|
64
64
|
Bundler.ui.info "Post-install message from #{name}:\n#{message}"
|
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"
|
|
@@ -135,12 +134,18 @@ module Bundler
|
|
|
135
134
|
next
|
|
136
135
|
end
|
|
137
136
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
137
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
|
138
|
+
require "erb"
|
|
139
|
+
content = if RUBY_VERSION >= "2.6"
|
|
140
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
|
141
|
+
else
|
|
142
|
+
ERB.new(template, nil, "-").result(binding)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
File.write(binstub_path, content, :mode => mode, :perm => 0o777 & ~File.umask)
|
|
146
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
|
147
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
|
148
|
+
File.write("#{binstub_path}.cmd", prefix + content, :mode => mode)
|
|
144
149
|
end
|
|
145
150
|
end
|
|
146
151
|
|
|
@@ -159,7 +164,7 @@ module Bundler
|
|
|
159
164
|
end
|
|
160
165
|
end
|
|
161
166
|
|
|
162
|
-
def generate_standalone_bundler_executable_stubs(spec)
|
|
167
|
+
def generate_standalone_bundler_executable_stubs(spec, options = {})
|
|
163
168
|
# double-assignment to avoid warnings about variables that will be used by ERB
|
|
164
169
|
bin_path = Bundler.bin_path
|
|
165
170
|
unless path = Bundler.settings[:path]
|
|
@@ -175,17 +180,24 @@ module Bundler
|
|
|
175
180
|
next if executable == "bundle"
|
|
176
181
|
executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
|
|
177
182
|
executable_path = executable_path
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
183
|
+
|
|
184
|
+
mode = Bundler::WINDOWS ? "wb:UTF-8" : "w"
|
|
185
|
+
require "erb"
|
|
186
|
+
content = if RUBY_VERSION >= "2.6"
|
|
187
|
+
ERB.new(template, :trim_mode => "-").result(binding)
|
|
188
|
+
else
|
|
189
|
+
ERB.new(template, nil, "-").result(binding)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
File.write("#{bin_path}/#{executable}", content, :mode => mode, :perm => 0o755)
|
|
193
|
+
if Bundler::WINDOWS || options[:all_platforms]
|
|
194
|
+
prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
|
|
195
|
+
File.write("#{bin_path}/#{executable}.cmd", prefix + content, :mode => mode)
|
|
184
196
|
end
|
|
185
197
|
end
|
|
186
198
|
end
|
|
187
199
|
|
|
188
|
-
|
|
200
|
+
private
|
|
189
201
|
|
|
190
202
|
# the order that the resolver provides is significant, since
|
|
191
203
|
# dependencies might affect the installation of a gem.
|
|
@@ -202,20 +214,14 @@ module Bundler
|
|
|
202
214
|
return jobs
|
|
203
215
|
end
|
|
204
216
|
|
|
205
|
-
return 1 unless can_install_in_parallel?
|
|
206
|
-
|
|
207
|
-
auto_config_jobs = Bundler.feature_flag.auto_config_jobs?
|
|
208
217
|
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
|
|
218
|
+
return jobs
|
|
218
219
|
end
|
|
220
|
+
|
|
221
|
+
# Parallelization has some issues on Windows, so it's not yet the default
|
|
222
|
+
return 1 if Gem.win_platform?
|
|
223
|
+
|
|
224
|
+
processor_count
|
|
219
225
|
end
|
|
220
226
|
|
|
221
227
|
def processor_count
|
|
@@ -238,6 +244,7 @@ module Bundler
|
|
|
238
244
|
end
|
|
239
245
|
end.flatten
|
|
240
246
|
Bundler.rubygems.load_plugin_files(path_plugin_files)
|
|
247
|
+
Bundler.rubygems.load_env_plugins
|
|
241
248
|
end
|
|
242
249
|
|
|
243
250
|
def ensure_specs_are_compatible!
|
|
@@ -274,10 +281,6 @@ module Bundler
|
|
|
274
281
|
end
|
|
275
282
|
end
|
|
276
283
|
|
|
277
|
-
def can_install_in_parallel?
|
|
278
|
-
true
|
|
279
|
-
end
|
|
280
|
-
|
|
281
284
|
def install_in_parallel(size, standalone, force = false)
|
|
282
285
|
spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
|
|
283
286
|
spec_installations.each do |installation|
|
|
@@ -296,7 +299,7 @@ module Bundler
|
|
|
296
299
|
|
|
297
300
|
# returns whether or not a re-resolve was needed
|
|
298
301
|
def resolve_if_needed(options)
|
|
299
|
-
if !@definition.unlocking? && !options["force"] && !
|
|
302
|
+
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
|
300
303
|
return false if @definition.nothing_changed? && !@definition.missing_specs?
|
|
301
304
|
end
|
|
302
305
|
|
|
@@ -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"
|
|
@@ -99,7 +99,7 @@ module Bundler
|
|
|
99
99
|
install_serially
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
handle_error if
|
|
102
|
+
handle_error if failed_specs.any?
|
|
103
103
|
@specs
|
|
104
104
|
ensure
|
|
105
105
|
worker_pool && worker_pool.stop
|
|
@@ -130,7 +130,11 @@ module Bundler
|
|
|
130
130
|
Bundler.ui.warn(warning.join("\n"))
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
private
|
|
134
|
+
|
|
135
|
+
def failed_specs
|
|
136
|
+
@specs.select(&:failed?)
|
|
137
|
+
end
|
|
134
138
|
|
|
135
139
|
def install_with_worker
|
|
136
140
|
enqueue_specs
|
|
@@ -156,17 +160,13 @@ module Bundler
|
|
|
156
160
|
gem_installer = Bundler::GemInstaller.new(
|
|
157
161
|
spec_install.spec, @installer, @standalone, worker_num, @force
|
|
158
162
|
)
|
|
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
|
|
163
|
+
success, message = gem_installer.install_from_spec
|
|
164
164
|
if success
|
|
165
165
|
spec_install.state = :installed
|
|
166
166
|
spec_install.post_install_message = message unless message.nil?
|
|
167
167
|
else
|
|
168
|
-
spec_install.state = :failed
|
|
169
168
|
spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
|
169
|
+
spec_install.state = :failed
|
|
170
170
|
end
|
|
171
171
|
Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
|
|
172
172
|
spec_install
|
|
@@ -190,11 +190,11 @@ module Bundler
|
|
|
190
190
|
end
|
|
191
191
|
|
|
192
192
|
def handle_error
|
|
193
|
-
errors =
|
|
193
|
+
errors = failed_specs.map(&:error)
|
|
194
194
|
if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
|
|
195
195
|
raise exception
|
|
196
196
|
end
|
|
197
|
-
raise Bundler::InstallError, errors.
|
|
197
|
+
raise Bundler::InstallError, errors.join("\n\n")
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
def require_tree_for_spec(spec)
|
|
@@ -16,12 +16,12 @@ module Bundler
|
|
|
16
16
|
file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
|
|
17
17
|
file.puts "path = File.expand_path('..', __FILE__)"
|
|
18
18
|
paths.each do |path|
|
|
19
|
-
file.puts %($:.unshift "\#{path}/#{path}")
|
|
19
|
+
file.puts %($:.unshift File.expand_path("\#{path}/#{path}"))
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
private
|
|
25
25
|
|
|
26
26
|
def paths
|
|
27
27
|
@specs.map do |spec|
|
|
@@ -4,7 +4,7 @@ require_relative "match_platform"
|
|
|
4
4
|
|
|
5
5
|
module Bundler
|
|
6
6
|
class LazySpecification
|
|
7
|
-
Identifier = Struct.new(:name, :version, :
|
|
7
|
+
Identifier = Struct.new(:name, :version, :platform)
|
|
8
8
|
class Identifier
|
|
9
9
|
include Comparable
|
|
10
10
|
def <=>(other)
|
|
@@ -12,7 +12,7 @@ module Bundler
|
|
|
12
12
|
[name, version, platform_string] <=> [other.name, other.version, other.platform_string]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
protected
|
|
16
16
|
|
|
17
17
|
def platform_string
|
|
18
18
|
platform_string = platform.to_s
|
|
@@ -46,6 +46,14 @@ module Bundler
|
|
|
46
46
|
identifier == other.identifier
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
def eql?(other)
|
|
50
|
+
identifier.eql?(other.identifier)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def hash
|
|
54
|
+
identifier.hash
|
|
55
|
+
end
|
|
56
|
+
|
|
49
57
|
def satisfies?(dependency)
|
|
50
58
|
@name == dependency.name && dependency.requirement.satisfied_by?(Gem::Version.new(@version))
|
|
51
59
|
end
|
|
@@ -68,17 +76,20 @@ module Bundler
|
|
|
68
76
|
end
|
|
69
77
|
|
|
70
78
|
def __materialize__
|
|
71
|
-
search_object = Bundler.feature_flag.specific_platform? || Bundler.settings[:force_ruby_platform] ? self : Dependency.new(name, version)
|
|
72
79
|
@specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name
|
|
73
80
|
source.gemspec.tap {|s| s.source = source }
|
|
74
81
|
else
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"To use the platform-specific version of the gem, run `bundle config set specific_platform true` and install again."
|
|
80
|
-
search = source.specs.search(self).last
|
|
82
|
+
search_object = if source.is_a?(Source::Path)
|
|
83
|
+
Dependency.new(name, version)
|
|
84
|
+
else
|
|
85
|
+
ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version)
|
|
81
86
|
end
|
|
87
|
+
platform_object = Gem::Platform.new(platform)
|
|
88
|
+
candidates = source.specs.search(search_object)
|
|
89
|
+
same_platform_candidates = candidates.select do |spec|
|
|
90
|
+
MatchPlatform.platforms_match?(spec.platform, platform_object)
|
|
91
|
+
end
|
|
92
|
+
search = same_platform_candidates.last || candidates.last
|
|
82
93
|
search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
|
83
94
|
search
|
|
84
95
|
end
|
|
@@ -97,7 +108,7 @@ module Bundler
|
|
|
97
108
|
end
|
|
98
109
|
|
|
99
110
|
def identifier
|
|
100
|
-
@__identifier ||= Identifier.new(name, version,
|
|
111
|
+
@__identifier ||= Identifier.new(name, version, platform)
|
|
101
112
|
end
|
|
102
113
|
|
|
103
114
|
def git_version
|
|
@@ -105,7 +116,7 @@ module Bundler
|
|
|
105
116
|
" #{source.revision[0..6]}"
|
|
106
117
|
end
|
|
107
118
|
|
|
108
|
-
|
|
119
|
+
private
|
|
109
120
|
|
|
110
121
|
def to_ary
|
|
111
122
|
nil
|
|
@@ -118,5 +129,18 @@ module Bundler
|
|
|
118
129
|
|
|
119
130
|
@specification.send(method, *args, &blk)
|
|
120
131
|
end
|
|
132
|
+
|
|
133
|
+
#
|
|
134
|
+
# For backwards compatibility with existing lockfiles, if the most specific
|
|
135
|
+
# locked platform is RUBY, we keep the previous behaviour of resolving the
|
|
136
|
+
# best platform variant at materiliazation time. For previous bundler
|
|
137
|
+
# versions (before 2.2.0) this was always the case (except when the lockfile
|
|
138
|
+
# only included non-ruby platforms), but we're also keeping this behaviour
|
|
139
|
+
# on newer bundlers unless users generate the lockfile from scratch or
|
|
140
|
+
# explicitly add a more specific platform.
|
|
141
|
+
#
|
|
142
|
+
def ruby_platform_materializes_to_ruby_platform?
|
|
143
|
+
!Bundler.most_specific_locked_platform?(Gem::Platform::RUBY)
|
|
144
|
+
end
|
|
121
145
|
end
|
|
122
146
|
end
|