bundler 2.3.26 → 2.4.5
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 +110 -1
- data/README.md +2 -2
- data/bundler.gemspec +2 -2
- data/exe/bundle +1 -4
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/check.rb +1 -1
- data/lib/bundler/cli/common.rb +1 -0
- data/lib/bundler/cli/console.rb +2 -2
- data/lib/bundler/cli/doctor.rb +4 -6
- data/lib/bundler/cli/gem.rb +62 -40
- data/lib/bundler/cli/install.rb +2 -3
- data/lib/bundler/cli/lock.rb +8 -5
- data/lib/bundler/cli/open.rb +6 -4
- data/lib/bundler/cli/outdated.rb +1 -3
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +44 -2
- data/lib/bundler/compact_index_client/cache.rb +1 -1
- data/lib/bundler/compact_index_client/updater.rb +40 -39
- data/lib/bundler/constants.rb +1 -1
- data/lib/bundler/definition.rb +87 -51
- data/lib/bundler/dependency.rb +12 -11
- data/lib/bundler/digest.rb +1 -1
- data/lib/bundler/dsl.rb +3 -3
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +1 -0
- data/lib/bundler/errors.rb +1 -11
- data/lib/bundler/fetcher/compact_index.rb +9 -11
- data/lib/bundler/fetcher/dependency.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +2 -5
- data/lib/bundler/fetcher.rb +2 -6
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +0 -3
- data/lib/bundler/gem_version_promoter.rb +52 -86
- data/lib/bundler/graph.rb +3 -3
- data/lib/bundler/index.rb +5 -13
- data/lib/bundler/injector.rb +1 -1
- data/lib/bundler/inline.rb +2 -2
- data/lib/bundler/installer/parallel_installer.rb +0 -31
- data/lib/bundler/installer.rb +9 -23
- data/lib/bundler/lazy_specification.rb +37 -33
- data/lib/bundler/lockfile_parser.rb +5 -5
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +1 -1
- data/lib/bundler/man/bundle-check.1 +1 -1
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +2 -2
- data/lib/bundler/man/bundle-config.1.ronn +1 -1
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +5 -5
- data/lib/bundler/man/bundle-exec.1.ronn +5 -5
- data/lib/bundler/man/bundle-gem.1 +27 -37
- data/lib/bundler/man/bundle-gem.1.ronn +5 -5
- data/lib/bundler/man/bundle-help.1 +1 -1
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +1 -1
- data/lib/bundler/man/bundle-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +1 -30
- data/lib/bundler/man/bundle-install.1.ronn +0 -29
- data/lib/bundler/man/bundle-list.1 +1 -1
- data/lib/bundler/man/bundle-lock.1 +1 -1
- data/lib/bundler/man/bundle-open.1 +22 -2
- data/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.1 +2 -2
- data/lib/bundler/man/bundle-platform.1.ronn +1 -1
- data/lib/bundler/man/bundle-plugin.1 +1 -1
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +1 -1
- data/lib/bundler/man/bundle-show.1 +1 -1
- data/lib/bundler/man/bundle-update.1 +1 -1
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +1 -1
- data/lib/bundler/mirror.rb +5 -7
- data/lib/bundler/plugin/index.rb +4 -4
- data/lib/bundler/plugin/installer/rubygems.rb +0 -4
- data/lib/bundler/resolver/base.rb +42 -15
- data/lib/bundler/resolver/candidate.rb +94 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +72 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +26 -36
- data/lib/bundler/resolver.rb +314 -278
- data/lib/bundler/rubygems_ext.rb +11 -6
- data/lib/bundler/rubygems_gem_installer.rb +4 -2
- data/lib/bundler/rubygems_integration.rb +1 -9
- data/lib/bundler/runtime.rb +1 -5
- data/lib/bundler/settings.rb +0 -6
- data/lib/bundler/shared_helpers.rb +1 -0
- data/lib/bundler/source/git/git_proxy.rb +193 -67
- data/lib/bundler/source/git.rb +15 -17
- data/lib/bundler/source/metadata.rb +0 -1
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +5 -5
- data/lib/bundler/source/rubygems.rb +14 -68
- data/lib/bundler/source_list.rb +8 -2
- data/lib/bundler/spec_set.rb +7 -9
- data/lib/bundler/templates/Executable +1 -1
- data/lib/bundler/templates/Executable.bundler +4 -9
- data/lib/bundler/templates/Executable.standalone +2 -0
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/lib/bundler/templates/newgem/README.md.tt +6 -4
- data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
- data/lib/bundler/ui/shell.rb +35 -12
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +128 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
- data/lib/bundler/vendored_persistent.rb +1 -33
- data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/worker.rb +5 -7
- data/lib/bundler.rb +20 -64
- metadata +33 -32
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/molinillo/LICENSE +0 -9
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/lib/bundler/vendored_molinillo.rb +0 -4
- data/lib/bundler/version_ranges.rb +0 -122
|
@@ -7,14 +7,13 @@ 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
|
-
|
|
11
|
-
|
|
12
|
-
attr_reader :level, :locked_specs, :unlock_gems
|
|
10
|
+
attr_reader :level
|
|
11
|
+
attr_accessor :pre
|
|
13
12
|
|
|
14
13
|
# By default, strict is false, meaning every available version of a gem
|
|
15
14
|
# is returned from sort_versions. The order gives preference to the
|
|
16
15
|
# requested level (:patch, :minor, :major) but in complicated requirement
|
|
17
|
-
# cases some gems will by necessity
|
|
16
|
+
# cases some gems will by necessity be promoted past the requested level,
|
|
18
17
|
# or even reverted to older versions.
|
|
19
18
|
#
|
|
20
19
|
# If strict is set to true, the results from sort_versions will be
|
|
@@ -24,24 +23,13 @@ module Bundler
|
|
|
24
23
|
# existing in the referenced source.
|
|
25
24
|
attr_accessor :strict
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Given a list of locked_specs and a list of gems to unlock creates a
|
|
30
|
-
# GemVersionPromoter instance.
|
|
26
|
+
# Creates a GemVersionPromoter instance.
|
|
31
27
|
#
|
|
32
|
-
# @param locked_specs [SpecSet] All current locked specs. Unlike Definition
|
|
33
|
-
# where this list is empty if all gems are being updated, this should
|
|
34
|
-
# always be populated for all gems so this class can properly function.
|
|
35
|
-
# @param unlock_gems [String] List of gem names being unlocked. If empty,
|
|
36
|
-
# all gems will be considered unlocked.
|
|
37
28
|
# @return [GemVersionPromoter]
|
|
38
|
-
def initialize
|
|
29
|
+
def initialize
|
|
39
30
|
@level = :major
|
|
40
31
|
@strict = false
|
|
41
|
-
@
|
|
42
|
-
@unlock_gems = unlock_gems
|
|
43
|
-
@sort_versions = {}
|
|
44
|
-
@prerelease_specified = {}
|
|
32
|
+
@pre = false
|
|
45
33
|
end
|
|
46
34
|
|
|
47
35
|
# @param value [Symbol] One of three Symbols: :major, :minor or :patch.
|
|
@@ -55,34 +43,19 @@ module Bundler
|
|
|
55
43
|
@level = v
|
|
56
44
|
end
|
|
57
45
|
|
|
58
|
-
# Given a
|
|
59
|
-
# gem, this method will return the Array of Specifications
|
|
60
|
-
# truncated if strict is true) in an order to give
|
|
61
|
-
# level (:major, :minor or :patch) when resolution
|
|
62
|
-
# best resolve all dependencies in the bundle.
|
|
63
|
-
# @param
|
|
64
|
-
# @param
|
|
65
|
-
# named in the @dep param.
|
|
46
|
+
# Given a Resolver::Package and an Array of Specifications of available
|
|
47
|
+
# versions for a gem, this method will return the Array of Specifications
|
|
48
|
+
# sorted (and possibly truncated if strict is true) in an order to give
|
|
49
|
+
# preference to the current level (:major, :minor or :patch) when resolution
|
|
50
|
+
# is deciding what versions best resolve all dependencies in the bundle.
|
|
51
|
+
# @param package [Resolver::Package] The package being resolved.
|
|
52
|
+
# @param specs [Specification] An array of Specifications for the package.
|
|
66
53
|
# @return [Specification] A new instance of the Specification Array sorted and
|
|
67
54
|
# possibly filtered.
|
|
68
|
-
def sort_versions(
|
|
69
|
-
|
|
70
|
-
gem_name = dep.name
|
|
71
|
-
|
|
72
|
-
# An Array per version returned, different entries for different platforms.
|
|
73
|
-
# We only need the version here so it's ok to hard code this to the first instance.
|
|
74
|
-
locked_spec = locked_specs[gem_name].first
|
|
55
|
+
def sort_versions(package, specs)
|
|
56
|
+
specs = filter_dep_specs(specs, package) if strict
|
|
75
57
|
|
|
76
|
-
|
|
77
|
-
filter_dep_specs(spec_groups, locked_spec)
|
|
78
|
-
else
|
|
79
|
-
sort_dep_specs(spec_groups, locked_spec)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def reset
|
|
85
|
-
@sort_versions = {}
|
|
58
|
+
sort_dep_specs(specs, package)
|
|
86
59
|
end
|
|
87
60
|
|
|
88
61
|
# @return [bool] Convenience method for testing value of level variable.
|
|
@@ -95,79 +68,72 @@ module Bundler
|
|
|
95
68
|
level == :minor
|
|
96
69
|
end
|
|
97
70
|
|
|
71
|
+
# @return [bool] Convenience method for testing value of pre variable.
|
|
72
|
+
def pre?
|
|
73
|
+
pre == true
|
|
74
|
+
end
|
|
75
|
+
|
|
98
76
|
private
|
|
99
77
|
|
|
100
|
-
def filter_dep_specs(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
gsv = spec_group.version
|
|
104
|
-
lsv = locked_spec.version
|
|
78
|
+
def filter_dep_specs(specs, package)
|
|
79
|
+
locked_version = package.locked_version
|
|
80
|
+
return specs if locked_version.nil? || major?
|
|
105
81
|
|
|
106
|
-
|
|
82
|
+
specs.select do |spec|
|
|
83
|
+
gsv = spec.version
|
|
107
84
|
|
|
108
|
-
|
|
109
|
-
matches.uniq == [true] ? (gsv >= lsv) : false
|
|
110
|
-
else
|
|
111
|
-
true
|
|
112
|
-
end
|
|
113
|
-
end
|
|
85
|
+
must_match = minor? ? [0] : [0, 1]
|
|
114
86
|
|
|
115
|
-
|
|
87
|
+
all_match = must_match.all? {|idx| gsv.segments[idx] == locked_version.segments[idx] }
|
|
88
|
+
all_match && gsv >= locked_version
|
|
89
|
+
end
|
|
116
90
|
end
|
|
117
91
|
|
|
118
|
-
def sort_dep_specs(
|
|
119
|
-
|
|
120
|
-
@gem_name = locked_spec&.name
|
|
121
|
-
|
|
122
|
-
result = spec_groups.sort do |a, b|
|
|
123
|
-
@a_ver = a.version
|
|
124
|
-
@b_ver = b.version
|
|
92
|
+
def sort_dep_specs(specs, package)
|
|
93
|
+
locked_version = package.locked_version
|
|
125
94
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
95
|
+
result = specs.sort do |a, b|
|
|
96
|
+
unless locked_version && (package.prerelease_specified? || pre?)
|
|
97
|
+
a_pre = a.prerelease?
|
|
98
|
+
b_pre = b.prerelease?
|
|
129
99
|
|
|
130
100
|
next -1 if a_pre && !b_pre
|
|
131
101
|
next 1 if b_pre && !a_pre
|
|
132
102
|
end
|
|
133
103
|
|
|
134
104
|
if major?
|
|
135
|
-
|
|
136
|
-
elsif either_version_older_than_locked
|
|
137
|
-
|
|
138
|
-
elsif segments_do_not_match(:major)
|
|
139
|
-
|
|
140
|
-
elsif !minor? && segments_do_not_match(:minor)
|
|
141
|
-
|
|
105
|
+
a <=> b
|
|
106
|
+
elsif either_version_older_than_locked?(a, b, locked_version)
|
|
107
|
+
a <=> b
|
|
108
|
+
elsif segments_do_not_match?(a, b, :major)
|
|
109
|
+
b <=> a
|
|
110
|
+
elsif !minor? && segments_do_not_match?(a, b, :minor)
|
|
111
|
+
b <=> a
|
|
142
112
|
else
|
|
143
|
-
|
|
113
|
+
a <=> b
|
|
144
114
|
end
|
|
145
115
|
end
|
|
146
|
-
post_sort(result)
|
|
116
|
+
post_sort(result, package.unlock?, locked_version)
|
|
147
117
|
end
|
|
148
118
|
|
|
149
|
-
def either_version_older_than_locked
|
|
150
|
-
|
|
119
|
+
def either_version_older_than_locked?(a, b, locked_version)
|
|
120
|
+
locked_version && (a.version < locked_version || b.version < locked_version)
|
|
151
121
|
end
|
|
152
122
|
|
|
153
|
-
def segments_do_not_match(level)
|
|
123
|
+
def segments_do_not_match?(a, b, level)
|
|
154
124
|
index = [:major, :minor].index(level)
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def unlocking_gem?
|
|
159
|
-
unlock_gems.empty? || (@gem_name && unlock_gems.include?(@gem_name))
|
|
125
|
+
a.segments[index] != b.segments[index]
|
|
160
126
|
end
|
|
161
127
|
|
|
162
128
|
# Specific version moves can't always reliably be done during sorting
|
|
163
129
|
# as not all elements are compared against each other.
|
|
164
|
-
def post_sort(result)
|
|
130
|
+
def post_sort(result, unlock, locked_version)
|
|
165
131
|
# default :major behavior in Bundler does not do this
|
|
166
132
|
return result if major?
|
|
167
|
-
if
|
|
133
|
+
if unlock || locked_version.nil?
|
|
168
134
|
result
|
|
169
135
|
else
|
|
170
|
-
move_version_to_end(result,
|
|
136
|
+
move_version_to_end(result, locked_version)
|
|
171
137
|
end
|
|
172
138
|
end
|
|
173
139
|
|
data/lib/bundler/graph.rb
CHANGED
|
@@ -114,10 +114,10 @@ module Bundler
|
|
|
114
114
|
@groups.each do |group|
|
|
115
115
|
g.add_nodes(
|
|
116
116
|
group, {
|
|
117
|
-
:style
|
|
117
|
+
:style => "filled",
|
|
118
118
|
:fillcolor => "#B9B9D5",
|
|
119
|
-
:shape
|
|
120
|
-
:fontsize
|
|
119
|
+
:shape => "box3d",
|
|
120
|
+
:fontsize => 16,
|
|
121
121
|
}.merge(@node_options[group])
|
|
122
122
|
)
|
|
123
123
|
end
|
data/lib/bundler/index.rb
CHANGED
|
@@ -70,7 +70,7 @@ module Bundler
|
|
|
70
70
|
case query
|
|
71
71
|
when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
|
|
72
72
|
when String then specs_by_name(query)
|
|
73
|
-
when
|
|
73
|
+
when Array then specs_by_name_and_version(*query)
|
|
74
74
|
else
|
|
75
75
|
raise "You can't search for a #{query.inspect}."
|
|
76
76
|
end
|
|
@@ -157,20 +157,12 @@ module Bundler
|
|
|
157
157
|
|
|
158
158
|
private
|
|
159
159
|
|
|
160
|
-
def
|
|
161
|
-
|
|
160
|
+
def specs_by_name_and_version(name, version)
|
|
161
|
+
specs_by_name(name).select {|spec| spec.version == version }
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
-
def
|
|
165
|
-
@
|
|
166
|
-
specs = specs_by_name(dependency.name)
|
|
167
|
-
found = specs.select do |spec|
|
|
168
|
-
next true if spec.source.is_a?(Source::Gemspec)
|
|
169
|
-
dependency.matches_spec?(spec)
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
found
|
|
173
|
-
end
|
|
164
|
+
def specs_by_name(name)
|
|
165
|
+
@specs[name].values
|
|
174
166
|
end
|
|
175
167
|
|
|
176
168
|
EMPTY_SEARCH = [].freeze
|
data/lib/bundler/injector.rb
CHANGED
|
@@ -235,7 +235,7 @@ module Bundler
|
|
|
235
235
|
|
|
236
236
|
gemfile.each_with_index do |line, index|
|
|
237
237
|
next unless !line.nil? && line.strip.start_with?(block_name)
|
|
238
|
-
if gemfile[index + 1]
|
|
238
|
+
if /^\s*end\s*$/.match?(gemfile[index + 1])
|
|
239
239
|
gemfile[index] = nil
|
|
240
240
|
gemfile[index + 1] = nil
|
|
241
241
|
end
|
data/lib/bundler/inline.rb
CHANGED
|
@@ -34,7 +34,8 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
|
34
34
|
|
|
35
35
|
opts = options.dup
|
|
36
36
|
ui = opts.delete(:ui) { Bundler::UI::Shell.new }
|
|
37
|
-
ui.level = "silent" if opts.delete(:quiet)
|
|
37
|
+
ui.level = "silent" if opts.delete(:quiet) || !install
|
|
38
|
+
Bundler.ui = ui
|
|
38
39
|
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
|
39
40
|
|
|
40
41
|
begin
|
|
@@ -52,7 +53,6 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
|
52
53
|
def definition.lock(*); end
|
|
53
54
|
definition.validate_runtime!
|
|
54
55
|
|
|
55
|
-
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
|
56
56
|
if install || definition.missing_specs?
|
|
57
57
|
Bundler.settings.temporary(:inline => true, :no_install => false) do
|
|
58
58
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
|
@@ -53,10 +53,6 @@ module Bundler
|
|
|
53
53
|
@dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep }
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
def missing_lockfile_dependencies(all_spec_names)
|
|
57
|
-
dependencies.reject {|dep| all_spec_names.include? dep.name }
|
|
58
|
-
end
|
|
59
|
-
|
|
60
56
|
# Represents all dependencies
|
|
61
57
|
def all_dependencies
|
|
62
58
|
@spec.dependencies
|
|
@@ -84,8 +80,6 @@ module Bundler
|
|
|
84
80
|
end
|
|
85
81
|
|
|
86
82
|
def call
|
|
87
|
-
check_for_corrupt_lockfile
|
|
88
|
-
|
|
89
83
|
if @rake
|
|
90
84
|
do_install(@rake, 0)
|
|
91
85
|
Gem::Specification.reset
|
|
@@ -128,31 +122,6 @@ module Bundler
|
|
|
128
122
|
Bundler.ui.warn(warning.join("\n"))
|
|
129
123
|
end
|
|
130
124
|
|
|
131
|
-
def check_for_corrupt_lockfile
|
|
132
|
-
missing_dependencies = @specs.map do |s|
|
|
133
|
-
[
|
|
134
|
-
s,
|
|
135
|
-
s.missing_lockfile_dependencies(@specs.map(&:name)),
|
|
136
|
-
]
|
|
137
|
-
end.reject {|a| a.last.empty? }
|
|
138
|
-
return if missing_dependencies.empty?
|
|
139
|
-
|
|
140
|
-
warning = []
|
|
141
|
-
warning << "Your lockfile was created by an old Bundler that left some things out."
|
|
142
|
-
if @size != 1
|
|
143
|
-
warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time."
|
|
144
|
-
@size = 1
|
|
145
|
-
end
|
|
146
|
-
warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile."
|
|
147
|
-
warning << "The missing gems are:"
|
|
148
|
-
|
|
149
|
-
missing_dependencies.each do |spec, missing|
|
|
150
|
-
warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}"
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
Bundler.ui.warn(warning.join("\n"))
|
|
154
|
-
end
|
|
155
|
-
|
|
156
125
|
private
|
|
157
126
|
|
|
158
127
|
def failed_specs
|
data/lib/bundler/installer.rb
CHANGED
|
@@ -136,11 +136,7 @@ module Bundler
|
|
|
136
136
|
|
|
137
137
|
mode = Gem.win_platform? ? "wb:UTF-8" : "w"
|
|
138
138
|
require "erb"
|
|
139
|
-
content =
|
|
140
|
-
ERB.new(template, :trim_mode => "-").result(binding)
|
|
141
|
-
else
|
|
142
|
-
ERB.new(template, nil, "-").result(binding)
|
|
143
|
-
end
|
|
139
|
+
content = ERB.new(template, :trim_mode => "-").result(binding)
|
|
144
140
|
|
|
145
141
|
File.write(binstub_path, content, :mode => mode, :perm => 0o777 & ~File.umask)
|
|
146
142
|
if Gem.win_platform? || options[:all_platforms]
|
|
@@ -183,11 +179,7 @@ module Bundler
|
|
|
183
179
|
|
|
184
180
|
mode = Gem.win_platform? ? "wb:UTF-8" : "w"
|
|
185
181
|
require "erb"
|
|
186
|
-
content =
|
|
187
|
-
ERB.new(template, :trim_mode => "-").result(binding)
|
|
188
|
-
else
|
|
189
|
-
ERB.new(template, nil, "-").result(binding)
|
|
190
|
-
end
|
|
182
|
+
content = ERB.new(template, :trim_mode => "-").result(binding)
|
|
191
183
|
|
|
192
184
|
File.write("#{bin_path}/#{executable}", content, :mode => mode, :perm => 0o755)
|
|
193
185
|
if Gem.win_platform? || options[:all_platforms]
|
|
@@ -226,12 +218,10 @@ module Bundler
|
|
|
226
218
|
|
|
227
219
|
requested_path_gems = @definition.requested_specs.select {|s| s.source.is_a?(Source::Path) }
|
|
228
220
|
path_plugin_files = requested_path_gems.map do |spec|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
raise Gem::InvalidSpecificationException, error_message
|
|
234
|
-
end
|
|
221
|
+
Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}")
|
|
222
|
+
rescue TypeError
|
|
223
|
+
error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
|
|
224
|
+
raise Gem::InvalidSpecificationException, error_message
|
|
235
225
|
end.flatten
|
|
236
226
|
Bundler.rubygems.load_plugin_files(path_plugin_files)
|
|
237
227
|
Bundler.rubygems.load_env_plugins
|
|
@@ -259,17 +249,13 @@ module Bundler
|
|
|
259
249
|
|
|
260
250
|
# returns whether or not a re-resolve was needed
|
|
261
251
|
def resolve_if_needed(options)
|
|
252
|
+
@definition.resolution_mode = options
|
|
253
|
+
|
|
262
254
|
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
|
263
255
|
return false if @definition.nothing_changed? && !@definition.missing_specs?
|
|
264
256
|
end
|
|
265
257
|
|
|
266
|
-
|
|
267
|
-
@definition.resolve_with_cache!
|
|
268
|
-
elsif options["prefer-local"]
|
|
269
|
-
@definition.resolve_prefering_local!
|
|
270
|
-
else
|
|
271
|
-
@definition.resolve_remotely!
|
|
272
|
-
end
|
|
258
|
+
@definition.setup_sources_for_resolve
|
|
273
259
|
|
|
274
260
|
true
|
|
275
261
|
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative "force_platform"
|
|
4
|
+
|
|
3
5
|
module Bundler
|
|
4
6
|
class LazySpecification
|
|
5
7
|
include MatchPlatform
|
|
8
|
+
include ForcePlatform
|
|
6
9
|
|
|
7
10
|
attr_reader :name, :version, :dependencies, :platform
|
|
8
11
|
attr_accessor :source, :remote, :force_ruby_platform
|
|
@@ -13,7 +16,7 @@ module Bundler
|
|
|
13
16
|
@dependencies = []
|
|
14
17
|
@platform = platform || Gem::Platform::RUBY
|
|
15
18
|
@source = source
|
|
16
|
-
@
|
|
19
|
+
@force_ruby_platform = default_force_ruby_platform
|
|
17
20
|
end
|
|
18
21
|
|
|
19
22
|
def full_name
|
|
@@ -76,37 +79,46 @@ module Bundler
|
|
|
76
79
|
def materialize_for_installation
|
|
77
80
|
source.local!
|
|
78
81
|
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
matching_specs = source.specs.search(use_exact_resolved_specifications? ? self : [name, version])
|
|
83
|
+
return self if matching_specs.empty?
|
|
81
84
|
|
|
82
|
-
|
|
85
|
+
candidates = if use_exact_resolved_specifications?
|
|
86
|
+
matching_specs
|
|
83
87
|
else
|
|
84
|
-
|
|
85
|
-
end
|
|
88
|
+
target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
|
|
86
89
|
|
|
87
|
-
|
|
90
|
+
installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)
|
|
88
91
|
|
|
89
|
-
|
|
90
|
-
|
|
92
|
+
specification = __materialize__(installable_candidates, :fallback_to_non_installable => false)
|
|
93
|
+
return specification unless specification.nil?
|
|
91
94
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
search = candidates.reverse.find do |spec|
|
|
95
|
-
spec.is_a?(StubSpecification) ||
|
|
96
|
-
(spec.matches_current_ruby? &&
|
|
97
|
-
spec.matches_current_rubygems?)
|
|
98
|
-
end
|
|
99
|
-
if search.nil? && Bundler.frozen_bundle?
|
|
100
|
-
search = candidates.last
|
|
101
|
-
else
|
|
102
|
-
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
|
95
|
+
if target_platform != platform
|
|
96
|
+
installable_candidates = GemHelpers.select_best_platform_match(matching_specs, platform)
|
|
103
97
|
end
|
|
104
|
-
|
|
98
|
+
|
|
99
|
+
installable_candidates
|
|
105
100
|
end
|
|
101
|
+
|
|
102
|
+
__materialize__(candidates)
|
|
106
103
|
end
|
|
107
104
|
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
# If in frozen mode, we fallback to a non-installable candidate because by
|
|
106
|
+
# doing this we avoid re-resolving and potentially end up changing the
|
|
107
|
+
# lock file, which is not allowed. In that case, we will give a proper error
|
|
108
|
+
# about the mismatch higher up the stack, right before trying to install the
|
|
109
|
+
# bad gem.
|
|
110
|
+
def __materialize__(candidates, fallback_to_non_installable: Bundler.frozen_bundle?)
|
|
111
|
+
search = candidates.reverse.find do |spec|
|
|
112
|
+
spec.is_a?(StubSpecification) ||
|
|
113
|
+
(spec.matches_current_ruby? &&
|
|
114
|
+
spec.matches_current_rubygems?)
|
|
115
|
+
end
|
|
116
|
+
if search.nil? && fallback_to_non_installable
|
|
117
|
+
search = candidates.last
|
|
118
|
+
else
|
|
119
|
+
search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
|
|
120
|
+
end
|
|
121
|
+
search
|
|
110
122
|
end
|
|
111
123
|
|
|
112
124
|
def to_s
|
|
@@ -128,16 +140,8 @@ module Bundler
|
|
|
128
140
|
|
|
129
141
|
private
|
|
130
142
|
|
|
131
|
-
def
|
|
132
|
-
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def method_missing(method, *args, &blk)
|
|
136
|
-
raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification
|
|
137
|
-
|
|
138
|
-
return super unless respond_to?(method)
|
|
139
|
-
|
|
140
|
-
@specification.send(method, *args, &blk)
|
|
143
|
+
def use_exact_resolved_specifications?
|
|
144
|
+
@use_exact_resolved_specifications ||= !source.is_a?(Source::Path) && ruby_platform_materializes_to_ruby_platform?
|
|
141
145
|
end
|
|
142
146
|
|
|
143
147
|
#
|
|
@@ -63,7 +63,7 @@ module Bundler
|
|
|
63
63
|
@state = nil
|
|
64
64
|
@specs = {}
|
|
65
65
|
|
|
66
|
-
if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
|
|
66
|
+
if lockfile.match?(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
|
|
67
67
|
raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \
|
|
68
68
|
"Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock."
|
|
69
69
|
end
|
|
@@ -80,7 +80,7 @@ module Bundler
|
|
|
80
80
|
@state = :ruby
|
|
81
81
|
elsif line == BUNDLED
|
|
82
82
|
@state = :bundled_with
|
|
83
|
-
elsif
|
|
83
|
+
elsif /^[^\s]/.match?(line)
|
|
84
84
|
@state = nil
|
|
85
85
|
elsif @state
|
|
86
86
|
send("parse_#{@state}", line)
|
|
@@ -100,9 +100,9 @@ module Bundler
|
|
|
100
100
|
private
|
|
101
101
|
|
|
102
102
|
TYPES = {
|
|
103
|
-
GIT
|
|
104
|
-
GEM
|
|
105
|
-
PATH
|
|
103
|
+
GIT => Bundler::Source::Git,
|
|
104
|
+
GEM => Bundler::Source::Rubygems,
|
|
105
|
+
PATH => Bundler::Source::Path,
|
|
106
106
|
PLUGIN => Bundler::Plugin,
|
|
107
107
|
}.freeze
|
|
108
108
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-BINSTUBS" "1" "
|
|
4
|
+
.TH "BUNDLE\-BINSTUBS" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-CACHE" "1" "
|
|
4
|
+
.TH "BUNDLE\-CACHE" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-CHECK" "1" "
|
|
4
|
+
.TH "BUNDLE\-CHECK" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-CLEAN" "1" "
|
|
4
|
+
.TH "BUNDLE\-CLEAN" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-CONFIG" "1" "
|
|
4
|
+
.TH "BUNDLE\-CONFIG" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-config\fR \- Set bundler configuration options
|
|
@@ -39,7 +39,7 @@ Bundler default config
|
|
|
39
39
|
.IP "" 0
|
|
40
40
|
.
|
|
41
41
|
.P
|
|
42
|
-
Executing \fBbundle config list\fR
|
|
42
|
+
Executing \fBbundle config list\fR will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
|
|
43
43
|
.
|
|
44
44
|
.P
|
|
45
45
|
Executing \fBbundle config get <name>\fR will print the value of that configuration setting, and where it was set\.
|
|
@@ -19,7 +19,7 @@ Bundler loads configuration settings in this order:
|
|
|
19
19
|
3. Global config (`~/.bundle/config`)
|
|
20
20
|
4. Bundler default config
|
|
21
21
|
|
|
22
|
-
Executing `bundle config list`
|
|
22
|
+
Executing `bundle config list` will print a list of all bundler
|
|
23
23
|
configuration for the current bundle, and where that configuration
|
|
24
24
|
was set.
|
|
25
25
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
|
3
3
|
.
|
|
4
|
-
.TH "BUNDLE\-CONSOLE" "1" "
|
|
4
|
+
.TH "BUNDLE\-CONSOLE" "1" "January 2023" "" ""
|
|
5
5
|
.
|
|
6
6
|
.SH "NAME"
|
|
7
7
|
\fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
|