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.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -1
  3. data/README.md +2 -2
  4. data/bundler.gemspec +2 -2
  5. data/exe/bundle +1 -4
  6. data/lib/bundler/build_metadata.rb +2 -2
  7. data/lib/bundler/cli/add.rb +1 -1
  8. data/lib/bundler/cli/check.rb +1 -1
  9. data/lib/bundler/cli/common.rb +1 -0
  10. data/lib/bundler/cli/console.rb +2 -2
  11. data/lib/bundler/cli/doctor.rb +4 -6
  12. data/lib/bundler/cli/gem.rb +62 -40
  13. data/lib/bundler/cli/install.rb +2 -3
  14. data/lib/bundler/cli/lock.rb +8 -5
  15. data/lib/bundler/cli/open.rb +6 -4
  16. data/lib/bundler/cli/outdated.rb +1 -3
  17. data/lib/bundler/cli/viz.rb +1 -1
  18. data/lib/bundler/cli.rb +44 -2
  19. data/lib/bundler/compact_index_client/cache.rb +1 -1
  20. data/lib/bundler/compact_index_client/updater.rb +40 -39
  21. data/lib/bundler/constants.rb +1 -1
  22. data/lib/bundler/definition.rb +87 -51
  23. data/lib/bundler/dependency.rb +12 -11
  24. data/lib/bundler/digest.rb +1 -1
  25. data/lib/bundler/dsl.rb +3 -3
  26. data/lib/bundler/env.rb +1 -1
  27. data/lib/bundler/environment_preserver.rb +1 -0
  28. data/lib/bundler/errors.rb +1 -11
  29. data/lib/bundler/fetcher/compact_index.rb +9 -11
  30. data/lib/bundler/fetcher/dependency.rb +1 -1
  31. data/lib/bundler/fetcher/downloader.rb +2 -5
  32. data/lib/bundler/fetcher.rb +2 -6
  33. data/lib/bundler/force_platform.rb +18 -0
  34. data/lib/bundler/friendly_errors.rb +0 -3
  35. data/lib/bundler/gem_version_promoter.rb +52 -86
  36. data/lib/bundler/graph.rb +3 -3
  37. data/lib/bundler/index.rb +5 -13
  38. data/lib/bundler/injector.rb +1 -1
  39. data/lib/bundler/inline.rb +2 -2
  40. data/lib/bundler/installer/parallel_installer.rb +0 -31
  41. data/lib/bundler/installer.rb +9 -23
  42. data/lib/bundler/lazy_specification.rb +37 -33
  43. data/lib/bundler/lockfile_parser.rb +5 -5
  44. data/lib/bundler/man/bundle-add.1 +1 -1
  45. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  46. data/lib/bundler/man/bundle-cache.1 +1 -1
  47. data/lib/bundler/man/bundle-check.1 +1 -1
  48. data/lib/bundler/man/bundle-clean.1 +1 -1
  49. data/lib/bundler/man/bundle-config.1 +2 -2
  50. data/lib/bundler/man/bundle-config.1.ronn +1 -1
  51. data/lib/bundler/man/bundle-console.1 +1 -1
  52. data/lib/bundler/man/bundle-doctor.1 +1 -1
  53. data/lib/bundler/man/bundle-exec.1 +5 -5
  54. data/lib/bundler/man/bundle-exec.1.ronn +5 -5
  55. data/lib/bundler/man/bundle-gem.1 +27 -37
  56. data/lib/bundler/man/bundle-gem.1.ronn +5 -5
  57. data/lib/bundler/man/bundle-help.1 +1 -1
  58. data/lib/bundler/man/bundle-info.1 +1 -1
  59. data/lib/bundler/man/bundle-init.1 +1 -1
  60. data/lib/bundler/man/bundle-inject.1 +1 -1
  61. data/lib/bundler/man/bundle-install.1 +1 -30
  62. data/lib/bundler/man/bundle-install.1.ronn +0 -29
  63. data/lib/bundler/man/bundle-list.1 +1 -1
  64. data/lib/bundler/man/bundle-lock.1 +1 -1
  65. data/lib/bundler/man/bundle-open.1 +22 -2
  66. data/lib/bundler/man/bundle-open.1.ronn +9 -1
  67. data/lib/bundler/man/bundle-outdated.1 +1 -1
  68. data/lib/bundler/man/bundle-platform.1 +2 -2
  69. data/lib/bundler/man/bundle-platform.1.ronn +1 -1
  70. data/lib/bundler/man/bundle-plugin.1 +1 -1
  71. data/lib/bundler/man/bundle-pristine.1 +1 -1
  72. data/lib/bundler/man/bundle-remove.1 +1 -1
  73. data/lib/bundler/man/bundle-show.1 +1 -1
  74. data/lib/bundler/man/bundle-update.1 +1 -1
  75. data/lib/bundler/man/bundle-version.1 +1 -1
  76. data/lib/bundler/man/bundle-viz.1 +1 -1
  77. data/lib/bundler/man/bundle.1 +1 -1
  78. data/lib/bundler/man/gemfile.5 +1 -1
  79. data/lib/bundler/mirror.rb +5 -7
  80. data/lib/bundler/plugin/index.rb +4 -4
  81. data/lib/bundler/plugin/installer/rubygems.rb +0 -4
  82. data/lib/bundler/resolver/base.rb +42 -15
  83. data/lib/bundler/resolver/candidate.rb +94 -0
  84. data/lib/bundler/resolver/incompatibility.rb +15 -0
  85. data/lib/bundler/resolver/package.rb +72 -0
  86. data/lib/bundler/resolver/root.rb +25 -0
  87. data/lib/bundler/resolver/spec_group.rb +26 -36
  88. data/lib/bundler/resolver.rb +314 -278
  89. data/lib/bundler/rubygems_ext.rb +11 -6
  90. data/lib/bundler/rubygems_gem_installer.rb +4 -2
  91. data/lib/bundler/rubygems_integration.rb +1 -9
  92. data/lib/bundler/runtime.rb +1 -5
  93. data/lib/bundler/settings.rb +0 -6
  94. data/lib/bundler/shared_helpers.rb +1 -0
  95. data/lib/bundler/source/git/git_proxy.rb +193 -67
  96. data/lib/bundler/source/git.rb +15 -17
  97. data/lib/bundler/source/metadata.rb +0 -1
  98. data/lib/bundler/source/path/installer.rb +1 -22
  99. data/lib/bundler/source/path.rb +5 -5
  100. data/lib/bundler/source/rubygems.rb +14 -68
  101. data/lib/bundler/source_list.rb +8 -2
  102. data/lib/bundler/spec_set.rb +7 -9
  103. data/lib/bundler/templates/Executable +1 -1
  104. data/lib/bundler/templates/Executable.bundler +4 -9
  105. data/lib/bundler/templates/Executable.standalone +2 -0
  106. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  107. data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  108. data/lib/bundler/templates/newgem/README.md.tt +6 -4
  109. data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
  110. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  111. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  112. data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
  113. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  114. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  115. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  116. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  117. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  118. data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  119. data/lib/bundler/ui/shell.rb +35 -12
  120. data/lib/bundler/ui/silent.rb +21 -5
  121. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  122. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  123. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  124. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  125. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  126. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  127. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  128. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  129. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  130. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  131. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
  132. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  133. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  134. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  135. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  136. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
  137. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  138. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  139. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +128 -0
  140. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
  141. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
  142. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  143. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  144. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  145. data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  146. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  147. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  148. data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  149. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  150. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  151. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  152. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  153. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  154. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  155. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  156. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  157. data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  158. data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  159. data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  160. data/lib/bundler/vendored_persistent.rb +1 -33
  161. data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  162. data/lib/bundler/version.rb +5 -1
  163. data/lib/bundler/worker.rb +5 -7
  164. data/lib/bundler.rb +20 -64
  165. metadata +33 -32
  166. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  167. data/lib/bundler/vendor/molinillo/LICENSE +0 -9
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  181. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  182. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  184. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  185. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  186. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  187. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  188. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  189. data/lib/bundler/vendored_molinillo.rb +0 -4
  190. 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
- DEBUG = ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]
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 by promoted past the requested level,
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
- attr_accessor :prerelease_specified
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(locked_specs = SpecSet.new([]), unlock_gems = [])
29
+ def initialize
39
30
  @level = :major
40
31
  @strict = false
41
- @locked_specs = locked_specs
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 Dependency and an Array of Specifications of available versions for a
59
- # gem, this method will return the Array of Specifications sorted (and possibly
60
- # truncated if strict is true) in an order to give preference to the current
61
- # level (:major, :minor or :patch) when resolution is deciding what versions
62
- # best resolve all dependencies in the bundle.
63
- # @param dep [Dependency] The Dependency of the gem.
64
- # @param spec_groups [Specification] An array of Specifications for the same gem
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(dep, spec_groups)
69
- @sort_versions[dep] ||= begin
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
- if strict
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(spec_groups, locked_spec)
101
- res = spec_groups.select do |spec_group|
102
- if locked_spec && !major?
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
- must_match = minor? ? [0] : [0, 1]
82
+ specs.select do |spec|
83
+ gsv = spec.version
107
84
 
108
- matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
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
- sort_dep_specs(res, locked_spec)
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(spec_groups, locked_spec)
119
- @locked_version = locked_spec&.version
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
- unless @gem_name && @prerelease_specified[@gem_name]
127
- a_pre = @a_ver.prerelease?
128
- b_pre = @b_ver.prerelease?
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
- @a_ver <=> @b_ver
136
- elsif either_version_older_than_locked
137
- @a_ver <=> @b_ver
138
- elsif segments_do_not_match(:major)
139
- @b_ver <=> @a_ver
140
- elsif !minor? && segments_do_not_match(:minor)
141
- @b_ver <=> @a_ver
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
- @a_ver <=> @b_ver
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
- @locked_version && (@a_ver < @locked_version || @b_ver < @locked_version)
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
- @a_ver.segments[index] != @b_ver.segments[index]
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 unlocking_gem? || @locked_version.nil?
133
+ if unlock || locked_version.nil?
168
134
  result
169
135
  else
170
- move_version_to_end(result, @locked_version)
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 => "filled",
117
+ :style => "filled",
118
118
  :fillcolor => "#B9B9D5",
119
- :shape => "box3d",
120
- :fontsize => 16,
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 Gem::Dependency then search_by_dependency(query)
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 specs_by_name(name)
161
- @specs[name].values
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 search_by_dependency(dependency)
165
- @cache[dependency] ||= begin
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
@@ -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] =~ /^\s*end\s*$/
238
+ if /^\s*end\s*$/.match?(gemfile[index + 1])
239
239
  gemfile[index] = nil
240
240
  gemfile[index + 1] = nil
241
241
  end
@@ -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
@@ -136,11 +136,7 @@ module Bundler
136
136
 
137
137
  mode = Gem.win_platform? ? "wb:UTF-8" : "w"
138
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
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 = if RUBY_VERSION >= "2.6"
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
- begin
230
- Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}")
231
- rescue TypeError
232
- error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
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
- if options["local"]
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
- @specification = nil
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
- candidates = if source.is_a?(Source::Path) || !ruby_platform_materializes_to_ruby_platform?
80
- target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
82
+ matching_specs = source.specs.search(use_exact_resolved_specifications? ? self : [name, version])
83
+ return self if matching_specs.empty?
81
84
 
82
- GemHelpers.select_best_platform_match(source.specs.search(Dependency.new(name, version)), target_platform)
85
+ candidates = if use_exact_resolved_specifications?
86
+ matching_specs
83
87
  else
84
- source.specs.search(self)
85
- end
88
+ target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
86
89
 
87
- return self if candidates.empty?
90
+ installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)
88
91
 
89
- __materialize__(candidates)
90
- end
92
+ specification = __materialize__(installable_candidates, :fallback_to_non_installable => false)
93
+ return specification unless specification.nil?
91
94
 
92
- def __materialize__(candidates)
93
- @specification = begin
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
- search
98
+
99
+ installable_candidates
105
100
  end
101
+
102
+ __materialize__(candidates)
106
103
  end
107
104
 
108
- def respond_to?(*args)
109
- super || @specification ? @specification.respond_to?(*args) : nil
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 to_ary
132
- nil
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 line =~ /^[^\s]/
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 => Bundler::Source::Git,
104
- GEM => Bundler::Source::Rubygems,
105
- PATH => Bundler::Source::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\-ADD" "1" "October 2022" "" ""
4
+ .TH "BUNDLE\-ADD" "1" "January 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
@@ -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" "October 2022" "" ""
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" "October 2022" "" ""
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" "October 2022" "" ""
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" "October 2022" "" ""
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" "October 2022" "" ""
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 with will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
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` with will print a list of all bundler
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" "October 2022" "" ""
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
@@ -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\-DOCTOR" "1" "October 2022" "" ""
4
+ .TH "BUNDLE\-DOCTOR" "1" "January 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-doctor\fR \- Checks the bundle for common problems