bundler 2.3.25 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  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/outdated.rb +1 -3
  16. data/lib/bundler/cli/viz.rb +1 -1
  17. data/lib/bundler/cli.rb +44 -3
  18. data/lib/bundler/compact_index_client/cache.rb +1 -1
  19. data/lib/bundler/compact_index_client/updater.rb +40 -39
  20. data/lib/bundler/constants.rb +1 -1
  21. data/lib/bundler/definition.rb +61 -31
  22. data/lib/bundler/dependency.rb +12 -11
  23. data/lib/bundler/digest.rb +1 -1
  24. data/lib/bundler/dsl.rb +1 -1
  25. data/lib/bundler/env.rb +1 -1
  26. data/lib/bundler/environment_preserver.rb +1 -0
  27. data/lib/bundler/errors.rb +1 -11
  28. data/lib/bundler/fetcher/compact_index.rb +9 -11
  29. data/lib/bundler/fetcher/dependency.rb +1 -1
  30. data/lib/bundler/fetcher/downloader.rb +2 -5
  31. data/lib/bundler/fetcher.rb +2 -6
  32. data/lib/bundler/force_platform.rb +18 -0
  33. data/lib/bundler/friendly_errors.rb +0 -3
  34. data/lib/bundler/gem_version_promoter.rb +52 -86
  35. data/lib/bundler/graph.rb +3 -3
  36. data/lib/bundler/index.rb +5 -13
  37. data/lib/bundler/injector.rb +1 -1
  38. data/lib/bundler/inline.rb +2 -2
  39. data/lib/bundler/installer/parallel_installer.rb +0 -31
  40. data/lib/bundler/installer.rb +6 -16
  41. data/lib/bundler/lazy_specification.rb +5 -1
  42. data/lib/bundler/lockfile_parser.rb +5 -5
  43. data/lib/bundler/man/bundle-add.1 +1 -1
  44. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  45. data/lib/bundler/man/bundle-cache.1 +1 -1
  46. data/lib/bundler/man/bundle-check.1 +1 -1
  47. data/lib/bundler/man/bundle-clean.1 +2 -2
  48. data/lib/bundler/man/bundle-clean.1.ronn +1 -1
  49. data/lib/bundler/man/bundle-config.1 +1 -1
  50. data/lib/bundler/man/bundle-console.1 +1 -1
  51. data/lib/bundler/man/bundle-doctor.1 +1 -1
  52. data/lib/bundler/man/bundle-exec.1 +1 -1
  53. data/lib/bundler/man/bundle-gem.1 +27 -37
  54. data/lib/bundler/man/bundle-gem.1.ronn +5 -5
  55. data/lib/bundler/man/bundle-help.1 +1 -1
  56. data/lib/bundler/man/bundle-info.1 +1 -1
  57. data/lib/bundler/man/bundle-init.1 +1 -1
  58. data/lib/bundler/man/bundle-inject.1 +1 -1
  59. data/lib/bundler/man/bundle-install.1 +1 -30
  60. data/lib/bundler/man/bundle-install.1.ronn +0 -29
  61. data/lib/bundler/man/bundle-list.1 +1 -1
  62. data/lib/bundler/man/bundle-lock.1 +1 -1
  63. data/lib/bundler/man/bundle-open.1 +1 -1
  64. data/lib/bundler/man/bundle-outdated.1 +1 -1
  65. data/lib/bundler/man/bundle-platform.1 +2 -2
  66. data/lib/bundler/man/bundle-platform.1.ronn +1 -1
  67. data/lib/bundler/man/bundle-plugin.1 +1 -1
  68. data/lib/bundler/man/bundle-pristine.1 +1 -1
  69. data/lib/bundler/man/bundle-remove.1 +1 -1
  70. data/lib/bundler/man/bundle-show.1 +1 -1
  71. data/lib/bundler/man/bundle-update.1 +1 -1
  72. data/lib/bundler/man/bundle-version.1 +1 -1
  73. data/lib/bundler/man/bundle-viz.1 +1 -1
  74. data/lib/bundler/man/bundle.1 +1 -1
  75. data/lib/bundler/man/gemfile.5 +1 -1
  76. data/lib/bundler/mirror.rb +5 -7
  77. data/lib/bundler/plugin/index.rb +4 -4
  78. data/lib/bundler/plugin/installer/rubygems.rb +0 -4
  79. data/lib/bundler/resolver/base.rb +7 -11
  80. data/lib/bundler/resolver/candidate.rb +92 -0
  81. data/lib/bundler/resolver/incompatibility.rb +15 -0
  82. data/lib/bundler/resolver/package.rb +63 -0
  83. data/lib/bundler/resolver/root.rb +25 -0
  84. data/lib/bundler/resolver/spec_group.rb +26 -36
  85. data/lib/bundler/resolver.rb +285 -277
  86. data/lib/bundler/rubygems_ext.rb +33 -6
  87. data/lib/bundler/rubygems_gem_installer.rb +4 -2
  88. data/lib/bundler/rubygems_integration.rb +1 -9
  89. data/lib/bundler/runtime.rb +1 -5
  90. data/lib/bundler/settings.rb +0 -6
  91. data/lib/bundler/shared_helpers.rb +1 -0
  92. data/lib/bundler/source/git/git_proxy.rb +190 -67
  93. data/lib/bundler/source/git.rb +15 -17
  94. data/lib/bundler/source/metadata.rb +0 -1
  95. data/lib/bundler/source/path/installer.rb +1 -22
  96. data/lib/bundler/source/path.rb +5 -5
  97. data/lib/bundler/source/rubygems.rb +13 -67
  98. data/lib/bundler/source_list.rb +8 -2
  99. data/lib/bundler/spec_set.rb +7 -9
  100. data/lib/bundler/templates/Executable +1 -1
  101. data/lib/bundler/templates/Executable.bundler +4 -9
  102. data/lib/bundler/templates/Executable.standalone +2 -0
  103. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  104. data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  105. data/lib/bundler/templates/newgem/README.md.tt +6 -4
  106. data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
  107. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  108. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  109. data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
  110. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  111. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  112. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  113. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  114. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  115. data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  116. data/lib/bundler/ui/shell.rb +35 -12
  117. data/lib/bundler/ui/silent.rb +21 -5
  118. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  119. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  120. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  121. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  122. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  123. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  124. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  125. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  126. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  127. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  128. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
  129. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  130. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  131. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  132. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  133. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
  134. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  135. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  136. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +124 -0
  137. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
  138. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
  139. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  140. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  141. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  142. data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  143. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  144. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  145. data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  146. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  147. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  148. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  149. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  150. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  151. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  152. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  153. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  154. data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  155. data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  156. data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  157. data/lib/bundler/vendored_persistent.rb +1 -33
  158. data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  159. data/lib/bundler/version.rb +5 -1
  160. data/lib/bundler/worker.rb +5 -7
  161. data/lib/bundler.rb +20 -64
  162. metadata +33 -32
  163. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  164. data/lib/bundler/vendor/molinillo/LICENSE +0 -9
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  181. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  182. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  184. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  185. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  186. data/lib/bundler/vendored_molinillo.rb +0 -4
  187. 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
@@ -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
@@ -14,6 +17,7 @@ module Bundler
14
17
  @platform = platform || Gem::Platform::RUBY
15
18
  @source = source
16
19
  @specification = nil
20
+ @force_ruby_platform = default_force_ruby_platform
17
21
  end
18
22
 
19
23
  def full_name
@@ -79,7 +83,7 @@ module Bundler
79
83
  candidates = if source.is_a?(Source::Path) || !ruby_platform_materializes_to_ruby_platform?
80
84
  target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform
81
85
 
82
- GemHelpers.select_best_platform_match(source.specs.search(Dependency.new(name, version)), target_platform)
86
+ GemHelpers.select_best_platform_match(source.specs.search([name, version]), target_platform)
83
87
  else
84
88
  source.specs.search(self)
85
89
  end
@@ -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" "December 2022" "" ""
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" "December 2022" "" ""
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" "December 2022" "" ""
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" "December 2022" "" ""
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" "December 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
@@ -20,5 +20,5 @@ Print the changes, but do not clean the unused gems\.
20
20
  .
21
21
  .TP
22
22
  \fB\-\-force\fR
23
- Force a clean even if \fB\-\-path\fR is not set\.
23
+ Forces cleaning up unused gems even if Bundler is configured to use globally installed gems\. As a consequence, removes all system gems except for the ones in the current application\.
24
24
 
@@ -15,4 +15,4 @@ useful when you have made many changes to your gem dependencies.
15
15
  * `--dry-run`:
16
16
  Print the changes, but do not clean the unused gems.
17
17
  * `--force`:
18
- Force a clean even if `--path` is not set.
18
+ Forces cleaning up unused gems even if Bundler is configured to use globally installed gems. As a consequence, removes all system gems except for the ones in the current 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\-CONFIG" "1" "October 2022" "" ""
4
+ .TH "BUNDLE\-CONFIG" "1" "December 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-config\fR \- Set bundler configuration options
@@ -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" "December 2022" "" ""
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" "December 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-doctor\fR \- Checks the bundle for common problems
@@ -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\-EXEC" "1" "October 2022" "" ""
4
+ .TH "BUNDLE\-EXEC" "1" "December 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-exec\fR \- Execute a command in the context of the bundle
@@ -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\-GEM" "1" "October 2022" "" ""
4
+ .TH "BUNDLE\-GEM" "1" "December 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
@@ -31,41 +31,32 @@ The generated project skeleton can be customized with OPTIONS, as explained belo
31
31
  .
32
32
  .SH "OPTIONS"
33
33
  .
34
- .TP
35
- \fB\-\-exe\fR or \fB\-b\fR or \fB\-\-bin\fR
36
- Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\.
34
+ .IP "\(bu" 4
35
+ \fB\-\-exe\fR or \fB\-b\fR or \fB\-\-bin\fR: Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\.
37
36
  .
38
- .TP
39
- \fB\-\-no\-exe\fR
40
- Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\.
37
+ .IP "\(bu" 4
38
+ \fB\-\-no\-exe\fR: Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\.
41
39
  .
42
- .TP
43
- \fB\-\-coc\fR
44
- Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
40
+ .IP "\(bu" 4
41
+ \fB\-\-coc\fR: Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
45
42
  .
46
- .TP
47
- \fB\-\-no\-coc\fR
48
- Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\.
43
+ .IP "\(bu" 4
44
+ \fB\-\-no\-coc\fR: Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\.
49
45
  .
50
- .TP
51
- \fB\-\-ext\fR
52
- Add boilerplate for C extension code to the generated project\. This behavior is disabled by default\.
46
+ .IP "\(bu" 4
47
+ \fB\-\-ext=c\fR, \fB\-\-ext=rust\fR Add boilerplate for C or Rust (currently magnus \fIhttps://docs\.rs/magnus\fR based) extension code to the generated project\. This behavior is disabled by default\.
53
48
  .
54
- .TP
55
- \fB\-\-no\-ext\fR
56
- Do not add C extension code (overrides \fB\-\-ext\fR specified in the global config)\.
49
+ .IP "\(bu" 4
50
+ \fB\-\-no\-ext\fR: Do not add extension code (overrides \fB\-\-ext\fR specified in the global config)\.
57
51
  .
58
- .TP
59
- \fB\-\-mit\fR
60
- Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
52
+ .IP "\(bu" 4
53
+ \fB\-\-mit\fR: Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
61
54
  .
62
- .TP
63
- \fB\-\-no\-mit\fR
64
- Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\.
55
+ .IP "\(bu" 4
56
+ \fB\-\-no\-mit\fR: Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\.
65
57
  .
66
- .TP
67
- \fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR, \fB\-\-test=test\-unit\fR
68
- Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR, \fBrspec\fR and \fBtest\-unit\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. Given no option is specified:
58
+ .IP "\(bu" 4
59
+ \fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR, \fB\-\-test=test\-unit\fR: Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR, \fBrspec\fR and \fBtest\-unit\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. Given no option is specified:
69
60
  .
70
61
  .IP
71
62
  When Bundler is configured to generate tests, this defaults to Bundler\'s global config setting \fBgem\.test\fR\.
@@ -76,9 +67,8 @@ When Bundler is configured to not generate tests, an interactive prompt will be
76
67
  .IP
77
68
  When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
78
69
  .
79
- .TP
80
- \fB\-\-ci\fR, \fB\-\-ci=github\fR, \fB\-\-ci=travis\fR, \fB\-\-ci=gitlab\fR, \fB\-\-ci=circle\fR
81
- Specify the continuous integration service that Bundler should use when generating the project\. Acceptable values are \fBgithub\fR, \fBtravis\fR, \fBgitlab\fR and \fBcircle\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
70
+ .IP "\(bu" 4
71
+ \fB\-\-ci\fR, \fB\-\-ci=github\fR, \fB\-\-ci=gitlab\fR, \fB\-\-ci=circle\fR: Specify the continuous integration service that Bundler should use when generating the project\. Acceptable values are \fBgithub\fR, \fBgitlab\fR and \fBcircle\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
82
72
  .
83
73
  .IP
84
74
  When Bundler is configured to generate CI files, this defaults to Bundler\'s global config setting \fBgem\.ci\fR\.
@@ -89,9 +79,8 @@ When Bundler is configured to not generate CI files, an interactive prompt will
89
79
  .IP
90
80
  When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
91
81
  .
92
- .TP
93
- \fB\-\-linter\fR, \fB\-\-linter=rubocop\fR, \fB\-\-linter=standard\fR
94
- Specify the linter and code formatter that Bundler should add to the project\'s development dependencies\. Acceptable values are \fBrubocop\fR and \fBstandard\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
82
+ .IP "\(bu" 4
83
+ \fB\-\-linter\fR, \fB\-\-linter=rubocop\fR, \fB\-\-linter=standard\fR: Specify the linter and code formatter that Bundler should add to the project\'s development dependencies\. Acceptable values are \fBrubocop\fR and \fBstandard\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
95
84
  .
96
85
  .IP
97
86
  When Bundler is configured to add a linter, this defaults to Bundler\'s global config setting \fBgem\.linter\fR\.
@@ -102,9 +91,10 @@ When Bundler is configured not to add a linter, an interactive prompt will be di
102
91
  .IP
103
92
  When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
104
93
  .
105
- .TP
106
- \fB\-e\fR, \fB\-\-edit[=EDITOR]\fR
107
- Open the resulting GEM_NAME\.gemspec in EDITOR, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\.
94
+ .IP "\(bu" 4
95
+ \fB\-e\fR, \fB\-\-edit[=EDITOR]\fR: Open the resulting GEM_NAME\.gemspec in EDITOR, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\.
96
+ .
97
+ .IP "" 0
108
98
  .
109
99
  .SH "SEE ALSO"
110
100
  .