bundler 2.6.9 → 4.0.10

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 +2212 -1879
  3. data/README.md +11 -11
  4. data/bundler.gemspec +5 -5
  5. data/lib/bundler/build_metadata.rb +10 -11
  6. data/lib/bundler/capistrano.rb +1 -19
  7. data/lib/bundler/checksum.rb +6 -0
  8. data/lib/bundler/cli/add.rb +10 -0
  9. data/lib/bundler/cli/cache.rb +1 -12
  10. data/lib/bundler/cli/common.rb +21 -4
  11. data/lib/bundler/cli/config.rb +1 -2
  12. data/lib/bundler/cli/console.rb +5 -0
  13. data/lib/bundler/cli/exec.rb +29 -4
  14. data/lib/bundler/cli/gem.rb +89 -63
  15. data/lib/bundler/cli/install.rb +15 -90
  16. data/lib/bundler/cli/issue.rb +2 -2
  17. data/lib/bundler/cli/list.rb +33 -2
  18. data/lib/bundler/cli/lock.rb +5 -5
  19. data/lib/bundler/cli/outdated.rb +1 -1
  20. data/lib/bundler/cli/plugin.rb +5 -1
  21. data/lib/bundler/cli/pristine.rb +5 -1
  22. data/lib/bundler/cli/show.rb +3 -7
  23. data/lib/bundler/cli/update.rb +5 -5
  24. data/lib/bundler/cli.rb +162 -127
  25. data/lib/bundler/compact_index_client.rb +1 -6
  26. data/lib/bundler/current_ruby.rb +17 -5
  27. data/lib/bundler/definition.rb +199 -117
  28. data/lib/bundler/dependency.rb +1 -1
  29. data/lib/bundler/deployment.rb +1 -64
  30. data/lib/bundler/digest.rb +1 -1
  31. data/lib/bundler/dsl.rb +48 -48
  32. data/lib/bundler/environment_preserver.rb +1 -0
  33. data/lib/bundler/errors.rb +1 -5
  34. data/lib/bundler/feature_flag.rb +5 -35
  35. data/lib/bundler/fetcher/compact_index.rb +1 -1
  36. data/lib/bundler/fetcher/dependency.rb +9 -2
  37. data/lib/bundler/fetcher/downloader.rb +33 -8
  38. data/lib/bundler/fetcher/gem_remote_fetcher.rb +6 -0
  39. data/lib/bundler/fetcher.rb +49 -19
  40. data/lib/bundler/friendly_errors.rb +4 -3
  41. data/lib/bundler/index.rb +7 -9
  42. data/lib/bundler/injector.rb +1 -2
  43. data/lib/bundler/inline.rb +9 -1
  44. data/lib/bundler/installer/gem_installer.rb +14 -11
  45. data/lib/bundler/installer/parallel_installer.rb +63 -17
  46. data/lib/bundler/installer.rb +6 -19
  47. data/lib/bundler/lazy_specification.rb +47 -20
  48. data/lib/bundler/lockfile_generator.rb +1 -1
  49. data/lib/bundler/lockfile_parser.rb +11 -5
  50. data/lib/bundler/man/bundle-add.1 +1 -1
  51. data/lib/bundler/man/bundle-binstubs.1 +3 -6
  52. data/lib/bundler/man/bundle-binstubs.1.ronn +4 -6
  53. data/lib/bundler/man/bundle-cache.1 +2 -14
  54. data/lib/bundler/man/bundle-cache.1.ronn +1 -14
  55. data/lib/bundler/man/bundle-check.1 +2 -5
  56. data/lib/bundler/man/bundle-check.1.ronn +0 -5
  57. data/lib/bundler/man/bundle-clean.1 +1 -1
  58. data/lib/bundler/man/bundle-config.1 +206 -148
  59. data/lib/bundler/man/bundle-config.1.ronn +135 -118
  60. data/lib/bundler/man/bundle-console.1 +1 -1
  61. data/lib/bundler/man/bundle-doctor.1 +43 -4
  62. data/lib/bundler/man/bundle-doctor.1.ronn +48 -4
  63. data/lib/bundler/man/bundle-env.1 +1 -1
  64. data/lib/bundler/man/bundle-exec.1 +2 -5
  65. data/lib/bundler/man/bundle-exec.1.ronn +1 -5
  66. data/lib/bundler/man/bundle-fund.1 +1 -1
  67. data/lib/bundler/man/bundle-gem.1 +64 -44
  68. data/lib/bundler/man/bundle-gem.1.ronn +10 -9
  69. data/lib/bundler/man/bundle-help.1 +1 -1
  70. data/lib/bundler/man/bundle-info.1 +1 -1
  71. data/lib/bundler/man/bundle-init.1 +1 -1
  72. data/lib/bundler/man/bundle-install.1 +16 -59
  73. data/lib/bundler/man/bundle-install.1.ronn +27 -108
  74. data/lib/bundler/man/bundle-issue.1 +1 -1
  75. data/lib/bundler/man/bundle-licenses.1 +1 -1
  76. data/lib/bundler/man/bundle-list.1 +6 -1
  77. data/lib/bundler/man/bundle-list.1.ronn +5 -0
  78. data/lib/bundler/man/bundle-lock.1 +1 -1
  79. data/lib/bundler/man/bundle-open.1 +1 -1
  80. data/lib/bundler/man/bundle-outdated.1 +1 -1
  81. data/lib/bundler/man/bundle-platform.1 +1 -1
  82. data/lib/bundler/man/bundle-plugin.1 +33 -15
  83. data/lib/bundler/man/bundle-plugin.1.ronn +36 -15
  84. data/lib/bundler/man/bundle-pristine.1 +1 -1
  85. data/lib/bundler/man/bundle-remove.1 +2 -8
  86. data/lib/bundler/man/bundle-remove.1.ronn +1 -8
  87. data/lib/bundler/man/bundle-show.1 +2 -5
  88. data/lib/bundler/man/bundle-show.1.ronn +0 -4
  89. data/lib/bundler/man/bundle-update.1 +5 -5
  90. data/lib/bundler/man/bundle-update.1.ronn +4 -4
  91. data/lib/bundler/man/bundle-version.1 +1 -1
  92. data/lib/bundler/man/bundle.1 +1 -10
  93. data/lib/bundler/man/bundle.1.ronn +0 -9
  94. data/lib/bundler/man/gemfile.5 +32 -1
  95. data/lib/bundler/man/gemfile.5.ronn +28 -0
  96. data/lib/bundler/man/index.txt +0 -2
  97. data/lib/bundler/match_platform.rb +31 -12
  98. data/lib/bundler/materialization.rb +3 -3
  99. data/lib/bundler/plugin/api/source.rb +8 -0
  100. data/lib/bundler/plugin/index.rb +6 -0
  101. data/lib/bundler/plugin/installer.rb +2 -11
  102. data/lib/bundler/plugin/source_list.rb +1 -1
  103. data/lib/bundler/plugin.rb +7 -4
  104. data/lib/bundler/resolver/package.rb +2 -1
  105. data/lib/bundler/resolver/strategy.rb +6 -3
  106. data/lib/bundler/resolver.rb +20 -4
  107. data/lib/bundler/retry.rb +30 -4
  108. data/lib/bundler/ruby_dsl.rb +17 -12
  109. data/lib/bundler/ruby_version.rb +1 -3
  110. data/lib/bundler/rubygems_ext.rb +117 -121
  111. data/lib/bundler/rubygems_gem_installer.rb +5 -4
  112. data/lib/bundler/rubygems_integration.rb +13 -12
  113. data/lib/bundler/runtime.rb +14 -3
  114. data/lib/bundler/self_manager.rb +34 -43
  115. data/lib/bundler/settings/validator.rb +5 -21
  116. data/lib/bundler/settings.rb +17 -32
  117. data/lib/bundler/shared_helpers.rb +12 -18
  118. data/lib/bundler/source/gemspec.rb +4 -0
  119. data/lib/bundler/source/git/git_proxy.rb +55 -29
  120. data/lib/bundler/source/git.rb +2 -3
  121. data/lib/bundler/source/path.rb +12 -7
  122. data/lib/bundler/source/rubygems.rb +59 -43
  123. data/lib/bundler/source/rubygems_aggregate.rb +4 -1
  124. data/lib/bundler/source.rb +3 -1
  125. data/lib/bundler/source_list.rb +5 -50
  126. data/lib/bundler/source_map.rb +8 -7
  127. data/lib/bundler/spec_set.rb +9 -14
  128. data/lib/bundler/stub_specification.rb +1 -0
  129. data/lib/bundler/templates/Executable +0 -11
  130. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +7 -129
  131. data/lib/bundler/templates/newgem/Cargo.toml.tt +6 -0
  132. data/lib/bundler/templates/newgem/Rakefile.tt +5 -0
  133. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  134. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +8 -1
  135. data/lib/bundler/templates/newgem/ext/newgem/build.rs.tt +5 -0
  136. data/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -0
  137. data/lib/bundler/templates/newgem/ext/newgem/go.mod.tt +5 -0
  138. data/lib/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +2 -0
  139. data/lib/bundler/templates/newgem/ext/newgem/newgem.go.tt +31 -0
  140. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +13 -2
  141. data/lib/bundler/templates/newgem/github/workflows/build-gems.yml.tt +69 -0
  142. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +12 -1
  143. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  144. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -1
  145. data/lib/bundler/templates/newgem/newgem.gemspec.tt +10 -10
  146. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +8 -0
  147. data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +6 -0
  148. data/lib/bundler/ui/shell.rb +12 -8
  149. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +26 -23
  150. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  151. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +50 -6
  152. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +57 -52
  153. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  154. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +2 -1
  155. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +84 -42
  156. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +42 -6
  157. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +1 -1
  158. data/lib/bundler/vendor/thor/lib/thor/runner.rb +2 -2
  159. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +3 -7
  160. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  161. data/lib/bundler/vendor/thor/lib/thor.rb +1 -1
  162. data/lib/bundler/vendor/uri/lib/uri/common.rb +57 -15
  163. data/lib/bundler/vendor/uri/lib/uri/file.rb +1 -1
  164. data/lib/bundler/vendor/uri/lib/uri/generic.rb +34 -21
  165. data/lib/bundler/vendor/uri/lib/uri/http.rb +12 -0
  166. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +9 -8
  167. data/lib/bundler/vendor/uri/lib/uri/version.rb +2 -2
  168. data/lib/bundler/version.rb +10 -2
  169. data/lib/bundler/vlad.rb +1 -14
  170. data/lib/bundler/worker.rb +12 -4
  171. data/lib/bundler.rb +20 -40
  172. metadata +13 -25
  173. data/lib/bundler/cli/inject.rb +0 -60
  174. data/lib/bundler/cli/viz.rb +0 -31
  175. data/lib/bundler/gem_helpers.rb +0 -144
  176. data/lib/bundler/graph.rb +0 -152
  177. data/lib/bundler/man/bundle-inject.1 +0 -31
  178. data/lib/bundler/man/bundle-inject.1.ronn +0 -32
  179. data/lib/bundler/man/bundle-viz.1 +0 -30
  180. data/lib/bundler/man/bundle-viz.1.ronn +0 -36
  181. data/lib/bundler/similarity_detector.rb +0 -63
  182. data/lib/bundler/templates/Executable.bundler +0 -109
  183. data/lib/bundler/vendor/connection_pool/.document +0 -1
  184. data/lib/bundler/vendor/fileutils/.document +0 -1
  185. data/lib/bundler/vendor/net-http-persistent/.document +0 -1
  186. data/lib/bundler/vendor/pub_grub/.document +0 -1
  187. data/lib/bundler/vendor/securerandom/.document +0 -1
  188. data/lib/bundler/vendor/thor/.document +0 -1
  189. data/lib/bundler/vendor/tsort/.document +0 -1
  190. data/lib/bundler/vendor/uri/.document +0 -1
@@ -1,69 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "shared_helpers"
4
- Bundler::SharedHelpers.major_deprecation 2, "Bundler no longer integrates with " \
4
+ Bundler::SharedHelpers.feature_removed! "Bundler no longer integrates with " \
5
5
  "Capistrano, but Capistrano provides its own integration with " \
6
6
  "Bundler via the capistrano-bundler gem. Use it instead."
7
-
8
- module Bundler
9
- class Deployment
10
- def self.define_task(context, task_method = :task, opts = {})
11
- if defined?(Capistrano) && context.is_a?(Capistrano::Configuration)
12
- context_name = "capistrano"
13
- role_default = "{:except => {:no_release => true}}"
14
- error_type = ::Capistrano::CommandError
15
- else
16
- context_name = "vlad"
17
- role_default = "[:app]"
18
- error_type = ::Rake::CommandFailedError
19
- end
20
-
21
- roles = context.fetch(:bundle_roles, false)
22
- opts[:roles] = roles if roles
23
-
24
- context.send :namespace, :bundle do
25
- send :desc, <<-DESC
26
- Install the current Bundler environment. By default, gems will be \
27
- installed to the shared/bundle path. Gems in the development and \
28
- test group will not be installed. The install command is executed \
29
- with the --deployment and --quiet flags. If the bundle cmd cannot \
30
- be found then you can override the bundle_cmd variable to specify \
31
- which one it should use. The base path to the app is fetched from \
32
- the :latest_release variable. Set it for custom deploy layouts.
33
-
34
- You can override any of these defaults by setting the variables shown below.
35
-
36
- N.B. bundle_roles must be defined before you require 'bundler/#{context_name}' \
37
- in your deploy.rb file.
38
-
39
- set :bundle_gemfile, "Gemfile"
40
- set :bundle_dir, File.join(fetch(:shared_path), 'bundle')
41
- set :bundle_flags, "--deployment --quiet"
42
- set :bundle_without, [:development, :test]
43
- set :bundle_with, [:mysql]
44
- set :bundle_cmd, "bundle" # e.g. "/opt/ruby/bin/bundle"
45
- set :bundle_roles, #{role_default} # e.g. [:app, :batch]
46
- DESC
47
- send task_method, :install, opts do
48
- bundle_cmd = context.fetch(:bundle_cmd, "bundle")
49
- bundle_flags = context.fetch(:bundle_flags, "--deployment --quiet")
50
- bundle_dir = context.fetch(:bundle_dir, File.join(context.fetch(:shared_path), "bundle"))
51
- bundle_gemfile = context.fetch(:bundle_gemfile, "Gemfile")
52
- bundle_without = [*context.fetch(:bundle_without, [:development, :test])].compact
53
- bundle_with = [*context.fetch(:bundle_with, [])].compact
54
- app_path = context.fetch(:latest_release)
55
- if app_path.to_s.empty?
56
- raise error_type.new("Cannot detect current release path - make sure you have deployed at least once.")
57
- end
58
- args = ["--gemfile #{File.join(app_path, bundle_gemfile)}"]
59
- args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?
60
- args << bundle_flags.to_s
61
- args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty?
62
- args << "--with #{bundle_with.join(" ")}" unless bundle_with.empty?
63
-
64
- run "cd #{app_path} && #{bundle_cmd} install #{args.join(" ")}"
65
- end
66
- end
67
- end
68
- end
69
- end
@@ -26,7 +26,7 @@ module Bundler
26
26
  end
27
27
  a, b, c, d, e = *words
28
28
  (16..79).each do |i|
29
- w[i] = SHA1_MASK & rotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1)
29
+ w[i] = SHA1_MASK & rotate(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1)
30
30
  end
31
31
  0.upto(79) do |i|
32
32
  case i
data/lib/bundler/dsl.rb CHANGED
@@ -9,8 +9,9 @@ module Bundler
9
9
 
10
10
  def self.evaluate(gemfile, lockfile, unlock)
11
11
  builder = new
12
+ builder.lockfile(lockfile)
12
13
  builder.eval_gemfile(gemfile)
13
- builder.to_definition(lockfile, unlock)
14
+ builder.to_definition(builder.lockfile_path, unlock)
14
15
  end
15
16
 
16
17
  VALID_PLATFORMS = Bundler::CurrentRuby::PLATFORM_MAP.keys.freeze
@@ -38,6 +39,7 @@ module Bundler
38
39
  @gemspecs = []
39
40
  @gemfile = nil
40
41
  @gemfiles = []
42
+ @lockfile = nil
41
43
  add_git_sources
42
44
  end
43
45
 
@@ -73,7 +75,7 @@ module Bundler
73
75
  case specs_by_name_and_version.size
74
76
  when 1
75
77
  specs = specs_by_name_and_version.values.first
76
- spec = specs.find {|s| s.match_platform(Bundler.local_platform) } || specs.first
78
+ spec = specs.find {|s| s.installable_on_platform?(Bundler.local_platform) } || specs.first
77
79
 
78
80
  @gemspecs << spec
79
81
 
@@ -101,6 +103,15 @@ module Bundler
101
103
  add_dependency(name, version, options)
102
104
  end
103
105
 
106
+ # For usage in Dsl.evaluate, since lockfile is used as part of the Gemfile.
107
+ def lockfile_path
108
+ @lockfile
109
+ end
110
+
111
+ def lockfile(file)
112
+ @lockfile = file
113
+ end
114
+
104
115
  def source(source, *args, &blk)
105
116
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
106
117
  options = normalize_hash(options)
@@ -175,6 +186,7 @@ module Bundler
175
186
 
176
187
  def to_definition(lockfile, unlock)
177
188
  check_primary_source_safety
189
+ lockfile = @lockfile unless @lockfile.nil?
178
190
  Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
179
191
  end
180
192
 
@@ -240,28 +252,27 @@ module Bundler
240
252
  dep = Dependency.new(name, version, options)
241
253
 
242
254
  # if there's already a dependency with this name we try to prefer one
243
- if current = @dependencies.find {|d| d.name == dep.name }
255
+ if current = @dependencies.find {|d| d.name == name }
244
256
  if current.requirement != dep.requirement
245
257
  current_requirement_open = current.requirements_list.include?(">= 0")
246
258
 
247
259
  gemspec_dep = [dep, current].find(&:gemspec_dev_dep?)
248
260
  if gemspec_dep
249
- gemfile_dep = [dep, current].find(&:gemfile_dep?)
250
-
251
- if gemfile_dep && !current_requirement_open
252
- Bundler.ui.warn "A gemspec development dependency (#{gemspec_dep.name}, #{gemspec_dep.requirement}) is being overridden by a Gemfile dependency (#{gemfile_dep.name}, #{gemfile_dep.requirement}).\n" \
253
- "This behaviour may change in the future. Please remove either of them, or make sure they both have the same requirement\n"
254
- elsif gemfile_dep.nil?
255
- require_relative "vendor/pub_grub/lib/pub_grub/version_range"
256
- require_relative "vendor/pub_grub/lib/pub_grub/version_constraint"
257
- require_relative "vendor/pub_grub/lib/pub_grub/version_union"
258
- require_relative "vendor/pub_grub/lib/pub_grub/rubygems"
259
-
260
- current_gemspec_range = PubGrub::RubyGems.requirement_to_range(current.requirement)
261
- next_gemspec_range = PubGrub::RubyGems.requirement_to_range(dep.requirement)
262
-
263
- if current_gemspec_range.intersects?(next_gemspec_range)
264
- dep = Dependency.new(name, current.requirement.as_list + dep.requirement.as_list, options)
261
+ require_relative "vendor/pub_grub/lib/pub_grub/version_range"
262
+ require_relative "vendor/pub_grub/lib/pub_grub/version_constraint"
263
+ require_relative "vendor/pub_grub/lib/pub_grub/version_union"
264
+ require_relative "vendor/pub_grub/lib/pub_grub/rubygems"
265
+
266
+ current_gemspec_range = PubGrub::RubyGems.requirement_to_range(current.requirement)
267
+ next_gemspec_range = PubGrub::RubyGems.requirement_to_range(dep.requirement)
268
+
269
+ if current_gemspec_range.intersects?(next_gemspec_range)
270
+ dep = Dependency.new(name, current.requirement.as_list + dep.requirement.as_list, options)
271
+ else
272
+ gemfile_dep = [dep, current].find(&:gemfile_dep?)
273
+
274
+ if gemfile_dep
275
+ raise GemfileError, "The #{name} dependency has conflicting requirements in Gemfile (#{gemfile_dep.requirement}) and gemspec (#{gemspec_dep.requirement})"
265
276
  else
266
277
  raise GemfileError, "Two gemspec development dependencies have conflicting requirements on the same gem: #{dep} and #{current}"
267
278
  end
@@ -273,14 +284,14 @@ module Bundler
273
284
  if dep.requirements_list.include?(">= 0") && !current_requirement_open
274
285
  update_prompt = ". Gem already added"
275
286
  else
276
- update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
287
+ update_prompt = ". If you want to update the gem version, run `bundle update #{name}`"
277
288
 
278
289
  update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current_requirement_open
279
290
  end
280
291
  end
281
292
 
282
293
  raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
283
- "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
294
+ "You specified: #{name} (#{current.requirement}) and #{name} (#{dep.requirement})" \
284
295
  "#{update_prompt}"
285
296
  end
286
297
  end
@@ -291,12 +302,12 @@ module Bundler
291
302
  @dependencies.delete(current)
292
303
  elsif dep.gemspec_dev_dep?
293
304
  return
294
- elsif current.source != dep.source
305
+ elsif current.source.to_s != dep.source.to_s
295
306
  raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
296
- "You specified that #{dep.name} (#{dep.requirement}) should come from " \
307
+ "You specified that #{name} (#{dep.requirement}) should come from " \
297
308
  "#{current.source || "an unspecified source"} and #{dep.source}\n"
298
309
  else
299
- Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
310
+ Bundler.ui.warn "Your Gemfile lists the gem #{name} (#{current.requirement}) more than once.\n" \
300
311
  "You should probably keep only one of them.\n" \
301
312
  "Remove any duplicate entries and specify the gem only once.\n" \
302
313
  "While it's not a problem now, it could cause errors if you change the version of one of them later."
@@ -413,6 +424,13 @@ module Bundler
413
424
  raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
414
425
  end
415
426
 
427
+ windows_platforms = platforms.select {|pl| pl.to_s.match?(/mingw|mswin/) }
428
+ if windows_platforms.any?
429
+ windows_platforms = windows_platforms.map! {|pl| ":#{pl}" }.join(", ")
430
+ deprecated_message = "Platform #{windows_platforms} will be removed in the future. Please use platform :windows instead."
431
+ Bundler::SharedHelpers.feature_deprecated! deprecated_message
432
+ end
433
+
416
434
  # Save sources passed in a key
417
435
  if opts.key?("source")
418
436
  source = normalize_source(opts["source"])
@@ -477,14 +495,10 @@ module Bundler
477
495
  def normalize_source(source)
478
496
  case source
479
497
  when :gemcutter, :rubygems, :rubyforge
480
- message =
481
- "The source :#{source} is deprecated because HTTP requests are insecure.\n" \
482
- "Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not."
483
498
  removed_message =
484
499
  "The source :#{source} is disallowed because HTTP requests are insecure.\n" \
485
500
  "Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not."
486
- Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
487
- "http://rubygems.org"
501
+ Bundler::SharedHelpers.feature_removed! removed_message
488
502
  when String
489
503
  source
490
504
  else
@@ -503,7 +517,7 @@ module Bundler
503
517
  " gem 'rails'\n" \
504
518
  " end\n\n"
505
519
 
506
- SharedHelpers.major_deprecation(2, msg.strip)
520
+ SharedHelpers.feature_removed! msg.strip
507
521
  end
508
522
 
509
523
  def check_rubygems_source_safety
@@ -511,24 +525,10 @@ module Bundler
511
525
  end
512
526
 
513
527
  def multiple_global_source_warning
514
- if Bundler.feature_flag.bundler_3_mode?
515
- msg = "This Gemfile contains multiple global sources. " \
516
- "Each source after the first must include a block to indicate which gems " \
517
- "should come from that source"
518
- raise GemfileEvalError, msg
519
- else
520
- message =
521
- "Your Gemfile contains multiple global sources. " \
522
- "Using `source` more than once without a block is a security risk, and " \
523
- "may result in installing unexpected gems. To resolve this warning, use " \
524
- "a block to indicate which gems should come from the secondary source."
525
- removed_message =
526
- "Your Gemfile contains multiple global sources. " \
527
- "Using `source` more than once without a block is a security risk, and " \
528
- "may result in installing unexpected gems. To resolve this error, use " \
529
- "a block to indicate which gems should come from the secondary source."
530
- Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
531
- end
528
+ msg = "This Gemfile contains multiple global sources. " \
529
+ "Each source after the first must include a block to indicate which gems " \
530
+ "should come from that source"
531
+ raise GemfileEvalError, msg
532
532
  end
533
533
 
534
534
  class DSLError < GemfileError
@@ -6,6 +6,7 @@ module Bundler
6
6
  BUNDLER_KEYS = %w[
7
7
  BUNDLE_BIN_PATH
8
8
  BUNDLE_GEMFILE
9
+ BUNDLE_LOCKFILE
9
10
  BUNDLER_VERSION
10
11
  BUNDLER_SETUP
11
12
  GEM_HOME
@@ -25,6 +25,7 @@ module Bundler
25
25
 
26
26
  class GemNotFound < BundlerError; status_code(7); end
27
27
  class InstallHookError < BundlerError; status_code(8); end
28
+ class RemovedError < BundlerError; status_code(9); end
28
29
  class GemfileNotFound < BundlerError; status_code(10); end
29
30
  class GitError < BundlerError; status_code(11); end
30
31
  class DeprecatedError < BundlerError; status_code(12); end
@@ -76,11 +77,6 @@ module Bundler
76
77
  def mismatch_resolution_instructions
77
78
  removable, remote = [@existing, @checksum].partition(&:removable?)
78
79
  case removable.size
79
- when 0
80
- msg = +"Mismatched checksums each have an authoritative source:\n"
81
- msg << " 1. #{@existing.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
82
- msg << " 2. #{@checksum.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
83
- msg << "You may need to alter your Gemfile sources to resolve this issue.\n"
84
80
  when 1
85
81
  msg = +"If you trust #{remote.first.sources.first}, to resolve this issue you can:\n"
86
82
  msg << removable.first.removal_instructions
@@ -2,45 +2,15 @@
2
2
 
3
3
  module Bundler
4
4
  class FeatureFlag
5
- def self.settings_flag(flag, &default)
6
- unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
7
- raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
8
- end
9
-
10
- settings_method("#{flag}?", flag, &default)
11
- end
12
- private_class_method :settings_flag
5
+ (1..10).each {|v| define_method("bundler_#{v}_mode?") { @major_version >= v } }
13
6
 
14
- def self.settings_option(key, &default)
15
- settings_method(key, key, &default)
7
+ def removed_major?(target_major_version)
8
+ @major_version > target_major_version
16
9
  end
17
- private_class_method :settings_option
18
10
 
19
- def self.settings_method(name, key, &default)
20
- define_method(name) do
21
- value = Bundler.settings[key]
22
- value = instance_eval(&default) if value.nil?
23
- value
24
- end
11
+ def deprecated_major?(target_major_version)
12
+ @major_version >= target_major_version
25
13
  end
26
- private_class_method :settings_method
27
-
28
- (1..10).each {|v| define_method("bundler_#{v}_mode?") { @major_version >= v } }
29
-
30
- settings_flag(:allow_offline_install) { bundler_3_mode? }
31
- settings_flag(:auto_clean_without_path) { bundler_3_mode? }
32
- settings_flag(:cache_all) { bundler_3_mode? }
33
- settings_flag(:default_install_uses_path) { bundler_3_mode? }
34
- settings_flag(:forget_cli_options) { bundler_3_mode? }
35
- settings_flag(:global_gem_cache) { bundler_3_mode? }
36
- settings_flag(:lockfile_checksums) { bundler_3_mode? }
37
- settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
38
- settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
39
- settings_flag(:print_only_version_number) { bundler_3_mode? }
40
- settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
41
- settings_flag(:update_requires_all_flag) { bundler_4_mode? }
42
-
43
- settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
44
14
 
45
15
  def initialize(bundler_version)
46
16
  @bundler_version = Gem::Version.create(bundler_version)
@@ -110,7 +110,7 @@ module Bundler
110
110
  def call(path, headers)
111
111
  fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
112
112
  rescue NetworkDownError => e
113
- raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"]
113
+ raise unless headers["If-None-Match"]
114
114
  ui.warn "Using the cached data for the new index because of a network error: #{e}"
115
115
  Gem::Net::HTTPNotModified.new(nil, nil, nil)
116
116
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "base"
4
- require "cgi"
4
+ require "cgi/escape"
5
+ require "cgi/util" unless defined?(CGI::EscapeExt)
5
6
 
6
7
  module Bundler
7
8
  class Fetcher
@@ -49,7 +50,7 @@ module Bundler
49
50
 
50
51
  def unmarshalled_dep_gems(gem_names)
51
52
  gem_list = []
52
- gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
53
+ gem_names.each_slice(api_request_size) do |names|
53
54
  marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
54
55
  gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
55
56
  end
@@ -73,6 +74,12 @@ module Bundler
73
74
  uri.query = "gems=#{CGI.escape(gem_names.sort.join(","))}" if gem_names.any?
74
75
  uri
75
76
  end
77
+
78
+ private
79
+
80
+ def api_request_size
81
+ Bundler.settings[:api_request_size]&.to_i || Source::Rubygems::API_REQUEST_SIZE
82
+ end
76
83
  end
77
84
  end
78
85
  end
@@ -3,6 +3,28 @@
3
3
  module Bundler
4
4
  class Fetcher
5
5
  class Downloader
6
+ HTTP_NON_RETRYABLE_ERRORS = [
7
+ SocketError,
8
+ Errno::EADDRNOTAVAIL,
9
+ Errno::ENETDOWN,
10
+ Errno::ENETUNREACH,
11
+ Gem::Net::HTTP::Persistent::Error,
12
+ Errno::EHOSTUNREACH,
13
+ ].freeze
14
+
15
+ HTTP_RETRYABLE_ERRORS = [
16
+ Gem::Timeout::Error,
17
+ EOFError,
18
+ Errno::EINVAL,
19
+ Errno::ECONNRESET,
20
+ Errno::ETIMEDOUT,
21
+ Errno::EAGAIN,
22
+ Gem::Net::HTTPBadResponse,
23
+ Gem::Net::HTTPHeaderSyntaxError,
24
+ Gem::Net::ProtocolError,
25
+ Zlib::BufError,
26
+ ].freeze
27
+
6
28
  attr_reader :connection
7
29
  attr_reader :redirect_limit
8
30
 
@@ -32,7 +54,6 @@ module Bundler
32
54
  when Gem::Net::HTTPRequestedRangeNotSatisfiable
33
55
  new_headers = headers.dup
34
56
  new_headers.delete("Range")
35
- new_headers["Accept-Encoding"] = "gzip"
36
57
  fetch(uri, new_headers)
37
58
  when Gem::Net::HTTPRequestEntityTooLarge
38
59
  raise FallbackError, response.body
@@ -67,15 +88,19 @@ module Bundler
67
88
  connection.request(uri, req)
68
89
  rescue OpenSSL::SSL::SSLError
69
90
  raise CertificateFailureError.new(uri)
70
- rescue *HTTP_ERRORS => e
91
+ rescue *HTTP_NON_RETRYABLE_ERRORS => e
71
92
  Bundler.ui.trace e
72
- if e.is_a?(SocketError) || e.message.to_s.include?("host down:")
73
- raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
74
- "connection and try again."
75
- else
76
- raise HTTPError, "Network error while fetching #{filtered_uri}" \
93
+
94
+ host = uri.host
95
+ host_port = "#{host}:#{uri.port}"
96
+ host = host_port if filtered_uri.to_s.include?(host_port)
97
+ raise NetworkDownError, "Could not reach host #{host}. Check your network " \
98
+ "connection and try again."
99
+ rescue *HTTP_RETRYABLE_ERRORS => e
100
+ Bundler.ui.trace e
101
+
102
+ raise HTTPError, "Network error while fetching #{filtered_uri}" \
77
103
  " (#{e})"
78
- end
79
104
  end
80
105
 
81
106
  private
@@ -5,6 +5,12 @@ require "rubygems/remote_fetcher"
5
5
  module Bundler
6
6
  class Fetcher
7
7
  class GemRemoteFetcher < Gem::RemoteFetcher
8
+ def initialize(*)
9
+ super
10
+
11
+ @pool_size = Bundler.settings.installation_parallelization
12
+ end
13
+
8
14
  def request(*args)
9
15
  super do |req|
10
16
  req.delete("User-Agent") if headers["User-Agent"]
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative "vendored_persistent"
4
4
  require_relative "vendored_timeout"
5
- require "cgi"
6
5
  require_relative "vendored_securerandom"
7
6
  require "zlib"
8
7
 
@@ -73,19 +72,57 @@ module Bundler
73
72
  end
74
73
  end
75
74
 
75
+ HTTP_ERRORS = (Downloader::HTTP_RETRYABLE_ERRORS + Downloader::HTTP_NON_RETRYABLE_ERRORS).freeze
76
+ deprecate_constant :HTTP_ERRORS
77
+
78
+ NET_ERRORS = [
79
+ :HTTPBadGateway,
80
+ :HTTPBadRequest,
81
+ :HTTPFailedDependency,
82
+ :HTTPForbidden,
83
+ :HTTPInsufficientStorage,
84
+ :HTTPMethodNotAllowed,
85
+ :HTTPMovedPermanently,
86
+ :HTTPNoContent,
87
+ :HTTPNotFound,
88
+ :HTTPNotImplemented,
89
+ :HTTPPreconditionFailed,
90
+ :HTTPRequestEntityTooLarge,
91
+ :HTTPRequestURITooLong,
92
+ :HTTPUnauthorized,
93
+ :HTTPUnprocessableEntity,
94
+ :HTTPUnsupportedMediaType,
95
+ :HTTPVersionNotSupported,
96
+ ].freeze
97
+ deprecate_constant :NET_ERRORS
98
+
76
99
  # Exceptions classes that should bypass retry attempts. If your password didn't work the
77
100
  # first time, it's not going to the third time.
78
- NET_ERRORS = [:HTTPBadGateway, :HTTPBadRequest, :HTTPFailedDependency,
79
- :HTTPForbidden, :HTTPInsufficientStorage, :HTTPMethodNotAllowed,
80
- :HTTPMovedPermanently, :HTTPNoContent, :HTTPNotFound,
81
- :HTTPNotImplemented, :HTTPPreconditionFailed, :HTTPRequestEntityTooLarge,
82
- :HTTPRequestURITooLong, :HTTPUnauthorized, :HTTPUnprocessableEntity,
83
- :HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze
84
- FAIL_ERRORS = begin
85
- fail_errors = [AuthenticationRequiredError, BadAuthenticationError, AuthenticationForbiddenError, FallbackError, SecurityError]
86
- fail_errors << Gem::Requirement::BadRequirementError
87
- fail_errors.concat(NET_ERRORS.map {|e| Gem::Net.const_get(e) })
88
- end.freeze
101
+ FAIL_ERRORS = [
102
+ AuthenticationRequiredError,
103
+ BadAuthenticationError,
104
+ AuthenticationForbiddenError,
105
+ FallbackError,
106
+ SecurityError,
107
+ Gem::Requirement::BadRequirementError,
108
+ Gem::Net::HTTPBadGateway,
109
+ Gem::Net::HTTPBadRequest,
110
+ Gem::Net::HTTPFailedDependency,
111
+ Gem::Net::HTTPForbidden,
112
+ Gem::Net::HTTPInsufficientStorage,
113
+ Gem::Net::HTTPMethodNotAllowed,
114
+ Gem::Net::HTTPMovedPermanently,
115
+ Gem::Net::HTTPNoContent,
116
+ Gem::Net::HTTPNotFound,
117
+ Gem::Net::HTTPNotImplemented,
118
+ Gem::Net::HTTPPreconditionFailed,
119
+ Gem::Net::HTTPRequestEntityTooLarge,
120
+ Gem::Net::HTTPRequestURITooLong,
121
+ Gem::Net::HTTPUnauthorized,
122
+ Gem::Net::HTTPUnprocessableEntity,
123
+ Gem::Net::HTTPUnsupportedMediaType,
124
+ Gem::Net::HTTPVersionNotSupported,
125
+ ].freeze
89
126
 
90
127
  class << self
91
128
  attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries
@@ -294,13 +331,6 @@ module Bundler
294
331
  paths.find {|path| File.file? path }
295
332
  end
296
333
 
297
- HTTP_ERRORS = [
298
- Gem::Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
299
- Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
300
- Gem::Net::HTTPBadResponse, Gem::Net::HTTPHeaderSyntaxError, Gem::Net::ProtocolError,
301
- Gem::Net::HTTP::Persistent::Error, Zlib::BufError, Errno::EHOSTUNREACH
302
- ].freeze
303
-
304
334
  def bundler_cert_store
305
335
  store = OpenSSL::X509::Store.new
306
336
  ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
@@ -102,13 +102,14 @@ module Bundler
102
102
  def issues_url(exception)
103
103
  message = exception.message.lines.first.tr(":", " ").chomp
104
104
  message = message.split("-").first if exception.is_a?(Errno)
105
- require "cgi"
106
- "https://github.com/rubygems/rubygems/search?q=" \
105
+ require "cgi/escape"
106
+ require "cgi/util" unless defined?(CGI::EscapeExt)
107
+ "https://github.com/ruby/rubygems/search?q=" \
107
108
  "#{CGI.escape(message)}&type=Issues"
108
109
  end
109
110
 
110
111
  def new_issue_url
111
- "https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md"
112
+ "https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md"
112
113
  end
113
114
  end
114
115
 
data/lib/bundler/index.rb CHANGED
@@ -46,13 +46,6 @@ module Bundler
46
46
  true
47
47
  end
48
48
 
49
- def search_all(name, &blk)
50
- return enum_for(:search_all, name) unless blk
51
- specs_by_name(name).each(&blk)
52
- @duplicates[name]&.each(&blk)
53
- @sources.each {|source| source.search_all(name, &blk) }
54
- end
55
-
56
49
  # Search this index's specs, and any source indexes that this index knows
57
50
  # about, returning all of the results.
58
51
  def search(query)
@@ -131,6 +124,11 @@ module Bundler
131
124
  return unless other
132
125
  other.each do |spec|
133
126
  if existing = find_by_spec(spec)
127
+ unless dependencies_eql?(existing, spec)
128
+ Bundler.ui.warn "Local specification for #{spec.full_name} has different dependencies than the remote gem, ignoring it"
129
+ next
130
+ end
131
+
134
132
  add_duplicate(existing)
135
133
  end
136
134
  add spec
@@ -153,8 +151,8 @@ module Bundler
153
151
  end
154
152
 
155
153
  def dependencies_eql?(spec, other_spec)
156
- deps = spec.dependencies.select {|d| d.type != :development }
157
- other_deps = other_spec.dependencies.select {|d| d.type != :development }
154
+ deps = spec.runtime_dependencies
155
+ other_deps = other_spec.runtime_dependencies
158
156
  deps.sort == other_deps.sort
159
157
  end
160
158
 
@@ -80,11 +80,10 @@ module Bundler
80
80
  def conservative_version(spec)
81
81
  version = spec.version
82
82
  return ">= 0" if version.nil?
83
- segments = version.segments
84
83
  seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
85
84
 
86
85
  prerelease_suffix = version.to_s.delete_prefix(version.release.to_s) if version.prerelease?
87
- "#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
86
+ "#{version_prefix}#{version.segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
88
87
  end
89
88
 
90
89
  def version_prefix