bundler 2.4.22 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +63 -0
  3. data/bundler.gemspec +4 -2
  4. data/exe/bundle +1 -10
  5. data/lib/bundler/build_metadata.rb +3 -3
  6. data/lib/bundler/capistrano.rb +1 -1
  7. data/lib/bundler/checksum.rb +254 -0
  8. data/lib/bundler/ci_detector.rb +75 -0
  9. data/lib/bundler/cli/add.rb +3 -3
  10. data/lib/bundler/cli/binstubs.rb +4 -4
  11. data/lib/bundler/cli/cache.rb +1 -1
  12. data/lib/bundler/cli/check.rb +1 -1
  13. data/lib/bundler/cli/common.rb +9 -1
  14. data/lib/bundler/cli/config.rb +8 -7
  15. data/lib/bundler/cli/console.rb +3 -2
  16. data/lib/bundler/cli/doctor.rb +2 -2
  17. data/lib/bundler/cli/exec.rb +1 -1
  18. data/lib/bundler/cli/gem.rb +28 -23
  19. data/lib/bundler/cli/info.rb +2 -13
  20. data/lib/bundler/cli/install.rb +5 -4
  21. data/lib/bundler/cli/issue.rb +1 -1
  22. data/lib/bundler/cli/lock.rb +4 -4
  23. data/lib/bundler/cli/open.rb +1 -1
  24. data/lib/bundler/cli/outdated.rb +6 -6
  25. data/lib/bundler/cli/plugin.rb +7 -14
  26. data/lib/bundler/cli/pristine.rb +38 -30
  27. data/lib/bundler/cli/show.rb +2 -2
  28. data/lib/bundler/cli/update.rb +5 -5
  29. data/lib/bundler/cli.rb +215 -263
  30. data/lib/bundler/compact_index_client/cache.rb +29 -9
  31. data/lib/bundler/compact_index_client/cache_file.rb +153 -0
  32. data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  33. data/lib/bundler/compact_index_client/updater.rb +79 -81
  34. data/lib/bundler/compact_index_client.rb +14 -7
  35. data/lib/bundler/constants.rb +1 -1
  36. data/lib/bundler/current_ruby.rb +5 -21
  37. data/lib/bundler/definition.rb +42 -15
  38. data/lib/bundler/dependency.rb +16 -12
  39. data/lib/bundler/digest.rb +2 -2
  40. data/lib/bundler/dsl.rb +46 -30
  41. data/lib/bundler/endpoint_specification.rb +5 -1
  42. data/lib/bundler/env.rb +1 -3
  43. data/lib/bundler/errors.rb +43 -0
  44. data/lib/bundler/fetcher/base.rb +3 -1
  45. data/lib/bundler/fetcher/compact_index.rb +4 -4
  46. data/lib/bundler/fetcher/downloader.rb +13 -11
  47. data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  48. data/lib/bundler/fetcher/index.rb +1 -1
  49. data/lib/bundler/fetcher.rb +28 -25
  50. data/lib/bundler/friendly_errors.rb +5 -5
  51. data/lib/bundler/gem_helper.rb +1 -1
  52. data/lib/bundler/gem_helpers.rb +5 -2
  53. data/lib/bundler/graph.rb +9 -9
  54. data/lib/bundler/index.rb +1 -2
  55. data/lib/bundler/injector.rb +1 -1
  56. data/lib/bundler/inline.rb +3 -3
  57. data/lib/bundler/installer/gem_installer.rb +5 -5
  58. data/lib/bundler/installer/parallel_installer.rb +16 -8
  59. data/lib/bundler/installer/standalone.rb +2 -3
  60. data/lib/bundler/installer.rb +9 -9
  61. data/lib/bundler/lazy_specification.rb +24 -17
  62. data/lib/bundler/lockfile_generator.rb +9 -0
  63. data/lib/bundler/lockfile_parser.rb +81 -10
  64. data/lib/bundler/man/bundle-add.1 +3 -26
  65. data/lib/bundler/man/bundle-binstubs.1 +4 -16
  66. data/lib/bundler/man/bundle-cache.1 +3 -24
  67. data/lib/bundler/man/bundle-check.1 +3 -12
  68. data/lib/bundler/man/bundle-clean.1 +3 -10
  69. data/lib/bundler/man/bundle-config.1 +20 -211
  70. data/lib/bundler/man/bundle-config.1.ronn +6 -0
  71. data/lib/bundler/man/bundle-console.1 +4 -22
  72. data/lib/bundler/man/bundle-doctor.1 +4 -18
  73. data/lib/bundler/man/bundle-exec.1 +12 -73
  74. data/lib/bundler/man/bundle-gem.1 +13 -49
  75. data/lib/bundler/man/bundle-help.1 +3 -7
  76. data/lib/bundler/man/bundle-info.1 +3 -9
  77. data/lib/bundler/man/bundle-init.1 +3 -12
  78. data/lib/bundler/man/bundle-inject.1 +6 -19
  79. data/lib/bundler/man/bundle-install.1 +27 -125
  80. data/lib/bundler/man/bundle-install.1.ronn +1 -0
  81. data/lib/bundler/man/bundle-list.1 +4 -19
  82. data/lib/bundler/man/bundle-lock.1 +5 -29
  83. data/lib/bundler/man/bundle-open.1 +7 -27
  84. data/lib/bundler/man/bundle-outdated.1 +3 -55
  85. data/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  86. data/lib/bundler/man/bundle-platform.1 +5 -27
  87. data/lib/bundler/man/bundle-plugin.1 +3 -29
  88. data/lib/bundler/man/bundle-pristine.1 +5 -16
  89. data/lib/bundler/man/bundle-remove.1 +4 -14
  90. data/lib/bundler/man/bundle-show.1 +3 -10
  91. data/lib/bundler/man/bundle-update.1 +18 -137
  92. data/lib/bundler/man/bundle-version.1 +3 -16
  93. data/lib/bundler/man/bundle-viz.1 +4 -16
  94. data/lib/bundler/man/bundle.1 +5 -44
  95. data/lib/bundler/man/gemfile.5 +24 -301
  96. data/lib/bundler/man/gemfile.5.ronn +4 -0
  97. data/lib/bundler/match_metadata.rb +4 -0
  98. data/lib/bundler/match_platform.rb +1 -1
  99. data/lib/bundler/plugin/api/source.rb +3 -2
  100. data/lib/bundler/plugin/installer.rb +1 -1
  101. data/lib/bundler/plugin.rb +3 -3
  102. data/lib/bundler/resolver/base.rb +1 -1
  103. data/lib/bundler/resolver/incompatibility.rb +1 -1
  104. data/lib/bundler/resolver/spec_group.rb +1 -4
  105. data/lib/bundler/resolver.rb +16 -16
  106. data/lib/bundler/ruby_dsl.rb +20 -12
  107. data/lib/bundler/ruby_version.rb +1 -1
  108. data/lib/bundler/rubygems_ext.rb +24 -50
  109. data/lib/bundler/rubygems_gem_installer.rb +6 -56
  110. data/lib/bundler/rubygems_integration.rb +25 -94
  111. data/lib/bundler/runtime.rb +2 -2
  112. data/lib/bundler/self_manager.rb +23 -7
  113. data/lib/bundler/settings.rb +27 -7
  114. data/lib/bundler/setup.rb +4 -1
  115. data/lib/bundler/shared_helpers.rb +35 -13
  116. data/lib/bundler/source/git/git_proxy.rb +15 -15
  117. data/lib/bundler/source/git.rb +4 -3
  118. data/lib/bundler/source/metadata.rb +15 -15
  119. data/lib/bundler/source/path.rb +7 -6
  120. data/lib/bundler/source/rubygems.rb +21 -14
  121. data/lib/bundler/source.rb +2 -0
  122. data/lib/bundler/spec_set.rb +38 -10
  123. data/lib/bundler/stub_specification.rb +1 -0
  124. data/lib/bundler/templates/Executable.bundler +1 -1
  125. data/lib/bundler/templates/newgem/README.md.tt +3 -3
  126. data/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  127. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  128. data/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  129. data/lib/bundler/ui/shell.rb +1 -1
  130. data/lib/bundler/vendor/connection_pool/.document +1 -0
  131. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  132. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  133. data/lib/bundler/vendor/fileutils/.document +1 -0
  134. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  135. data/lib/bundler/vendor/net-http-persistent/.document +1 -0
  136. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
  137. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
  138. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  139. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +34 -34
  140. data/lib/bundler/vendor/pub_grub/.document +1 -0
  141. data/lib/bundler/vendor/thor/.document +1 -0
  142. data/lib/bundler/vendor/tsort/.document +1 -0
  143. data/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  144. data/lib/bundler/vendor/uri/.document +1 -0
  145. data/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  146. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  147. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  148. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  149. data/lib/bundler/vendored_net_http.rb +8 -0
  150. data/lib/bundler/vendored_persistent.rb +0 -4
  151. data/lib/bundler/vendored_timeout.rb +8 -0
  152. data/lib/bundler/version.rb +1 -1
  153. data/lib/bundler/vlad.rb +1 -1
  154. data/lib/bundler/yaml_serializer.rb +3 -3
  155. data/lib/bundler.rb +41 -32
  156. metadata +18 -5
@@ -4,17 +4,12 @@ require "rubygems" unless defined?(Gem)
4
4
 
5
5
  module Bundler
6
6
  class RubygemsIntegration
7
- if defined?(Gem::Ext::Builder::CHDIR_MONITOR)
8
- EXT_LOCK = Gem::Ext::Builder::CHDIR_MONITOR
9
- else
10
- require "monitor"
7
+ require "monitor"
11
8
 
12
- EXT_LOCK = Monitor.new
13
- end
9
+ EXT_LOCK = Monitor.new
14
10
 
15
11
  def initialize
16
12
  @replaced_methods = {}
17
- backport_ext_builder_monitor
18
13
  end
19
14
 
20
15
  def version
@@ -43,18 +38,6 @@ module Bundler
43
38
  Gem.loaded_specs[name]
44
39
  end
45
40
 
46
- def add_to_load_path(paths)
47
- return Gem.add_to_load_path(*paths) if Gem.respond_to?(:add_to_load_path)
48
-
49
- if insert_index = Gem.load_path_insert_index
50
- # Gem directories must come after -I and ENV['RUBYLIB']
51
- $LOAD_PATH.insert(insert_index, *paths)
52
- else
53
- # We are probably testing in core, -I and RUBYLIB don't apply
54
- $LOAD_PATH.unshift(*paths)
55
- end
56
- end
57
-
58
41
  def mark_loaded(spec)
59
42
  if spec.respond_to?(:activated=)
60
43
  current = Gem.loaded_specs[spec.name]
@@ -91,9 +74,9 @@ module Bundler
91
74
  def spec_matches_for_glob(spec, glob)
92
75
  return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob)
93
76
 
94
- spec.load_paths.map do |lp|
77
+ spec.load_paths.flat_map do |lp|
95
78
  Dir["#{lp}/#{glob}#{suffix_pattern}"]
96
- end.flatten(1)
79
+ end
97
80
  end
98
81
 
99
82
  def stub_set_spec(stub, spec)
@@ -116,16 +99,6 @@ module Bundler
116
99
  Gem::Util.inflate(obj)
117
100
  end
118
101
 
119
- def correct_for_windows_path(path)
120
- if Gem::Util.respond_to?(:correct_for_windows_path)
121
- Gem::Util.correct_for_windows_path(path)
122
- elsif path[0].chr == "/" && path[1].chr =~ /[a-z]/i && path[2].chr == ":"
123
- path[1..-1]
124
- else
125
- path
126
- end
127
- end
128
-
129
102
  def gem_dir
130
103
  Gem.dir
131
104
  end
@@ -161,7 +134,7 @@ module Bundler
161
134
  def spec_cache_dirs
162
135
  @spec_cache_dirs ||= begin
163
136
  dirs = gem_path.map {|dir| File.join(dir, "specifications") }
164
- dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir) # Not in RubyGems 2.0.3 or earlier
137
+ dirs << Gem.spec_cache_dir
165
138
  dirs.uniq.select {|dir| File.directory? dir }
166
139
  end
167
140
  end
@@ -183,18 +156,6 @@ module Bundler
183
156
  loaded_gem_paths.flatten
184
157
  end
185
158
 
186
- def load_plugins
187
- Gem.load_plugins if Gem.respond_to?(:load_plugins)
188
- end
189
-
190
- def load_plugin_files(files)
191
- Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files)
192
- end
193
-
194
- def load_env_plugins
195
- Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
196
- end
197
-
198
159
  def ui=(obj)
199
160
  Gem::DefaultUserInteraction.ui = obj
200
161
  end
@@ -230,8 +191,7 @@ module Bundler
230
191
  if Gem.respond_to?(:discover_gems_on_require=)
231
192
  Gem.discover_gems_on_require = false
232
193
  else
233
- kernel = (class << ::Kernel; self; end)
234
- [kernel, ::Kernel].each do |k|
194
+ [::Kernel.singleton_class, ::Kernel].each do |k|
235
195
  if k.private_method_defined?(:gem_original_require)
236
196
  redefine_method(k, :require, k.instance_method(:gem_original_require))
237
197
  end
@@ -240,12 +200,9 @@ module Bundler
240
200
  end
241
201
 
242
202
  def replace_gem(specs, specs_by_name)
243
- reverse_rubygems_kernel_mixin
244
-
245
203
  executables = nil
246
204
 
247
- kernel = (class << ::Kernel; self; end)
248
- [kernel, ::Kernel].each do |kernel_class|
205
+ [::Kernel.singleton_class, ::Kernel].each do |kernel_class|
249
206
  redefine_method(kernel_class, :gem) do |dep, *reqs|
250
207
  if executables&.include?(File.basename(caller.first.split(":").first))
251
208
  break
@@ -358,6 +315,14 @@ module Bundler
358
315
  def replace_entrypoints(specs)
359
316
  specs_by_name = add_default_gems_to(specs)
360
317
 
318
+ reverse_rubygems_kernel_mixin
319
+ begin
320
+ # bundled_gems only provide with Ruby 3.3 or later
321
+ require "bundled_gems"
322
+ rescue LoadError
323
+ else
324
+ Gem::BUNDLED_GEMS.replace_require(specs) if Gem::BUNDLED_GEMS.respond_to?(:replace_require)
325
+ end
361
326
  replace_gem(specs, specs_by_name)
362
327
  stub_rubygems(specs)
363
328
  replace_bin_path(specs_by_name)
@@ -447,30 +412,28 @@ module Bundler
447
412
  Gem::Specification.all = specs
448
413
  end
449
414
 
450
- def fetch_specs(remote, name)
415
+ def fetch_specs(remote, name, fetcher)
451
416
  require "rubygems/remote_fetcher"
452
417
  path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
453
- fetcher = gem_remote_fetcher
454
- fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri
455
418
  string = fetcher.fetch_path(path)
456
- Bundler.safe_load_marshal(string)
419
+ specs = Bundler.safe_load_marshal(string)
420
+ raise MarshalError, "Specs #{name} from #{remote} is expected to be an Array but was unexpected class #{specs.class}" unless specs.is_a?(Array)
421
+ specs
457
422
  rescue Gem::RemoteFetcher::FetchError
458
423
  # it's okay for prerelease to fail
459
424
  raise unless name == "prerelease_specs"
460
425
  end
461
426
 
462
- def fetch_all_remote_specs(remote)
463
- specs = fetch_specs(remote, "specs")
464
- pres = fetch_specs(remote, "prerelease_specs") || []
427
+ def fetch_all_remote_specs(remote, gem_remote_fetcher)
428
+ specs = fetch_specs(remote, "specs", gem_remote_fetcher)
429
+ pres = fetch_specs(remote, "prerelease_specs", gem_remote_fetcher) || []
465
430
 
466
431
  specs.concat(pres)
467
432
  end
468
433
 
469
- def download_gem(spec, uri, cache_dir)
434
+ def download_gem(spec, uri, cache_dir, fetcher)
470
435
  require "rubygems/remote_fetcher"
471
436
  uri = Bundler.settings.mirror_for(uri)
472
- fetcher = gem_remote_fetcher
473
- fetcher.headers = { "X-Gemfile-Source" => spec.remote.original_uri.to_s } if spec.remote.original_uri
474
437
  Bundler::Retry.new("download gem from #{uri}").attempts do
475
438
  gem_file_name = spec.file_name
476
439
  local_gem_path = File.join cache_dir, gem_file_name
@@ -478,7 +441,6 @@ module Bundler
478
441
 
479
442
  begin
480
443
  remote_gem_path = uri + "gems/#{gem_file_name}"
481
- remote_gem_path = remote_gem_path.to_s if provides?("< 3.2.0.rc.1")
482
444
 
483
445
  SharedHelpers.filesystem_access(local_gem_path) do
484
446
  fetcher.cache_update_path remote_gem_path, local_gem_path
@@ -497,12 +459,6 @@ module Bundler
497
459
  raise Bundler::HTTPError, "Could not download gem from #{uri} due to underlying error <#{e.message}>"
498
460
  end
499
461
 
500
- def gem_remote_fetcher
501
- require "rubygems/remote_fetcher"
502
- proxy = Gem.configuration[:http_proxy]
503
- Gem::RemoteFetcher.new(proxy)
504
- end
505
-
506
462
  def build(spec, skip_validation = false)
507
463
  require "rubygems/package"
508
464
  Gem::Package.build(spec, skip_validation)
@@ -518,25 +474,6 @@ module Bundler
518
474
  end
519
475
  end
520
476
 
521
- def backport_ext_builder_monitor
522
- # So we can avoid requiring "rubygems/ext" in its entirety
523
- Gem.module_eval <<-RUBY, __FILE__, __LINE__ + 1
524
- module Ext
525
- end
526
- RUBY
527
-
528
- require "rubygems/ext/builder"
529
-
530
- Gem::Ext::Builder.class_eval do
531
- unless const_defined?(:CHDIR_MONITOR)
532
- const_set(:CHDIR_MONITOR, EXT_LOCK)
533
- end
534
-
535
- remove_const(:CHDIR_MUTEX) if const_defined?(:CHDIR_MUTEX)
536
- const_set(:CHDIR_MUTEX, const_get(:CHDIR_MONITOR))
537
- end
538
- end
539
-
540
477
  def find_bundler(version)
541
478
  find_name("bundler").find {|s| s.version.to_s == version }
542
479
  end
@@ -545,14 +482,8 @@ module Bundler
545
482
  Gem::Specification.stubs_for(name).map(&:to_spec)
546
483
  end
547
484
 
548
- if Gem::Specification.respond_to?(:default_stubs)
549
- def default_stubs
550
- Gem::Specification.default_stubs("*.gemspec")
551
- end
552
- else
553
- def default_stubs
554
- Gem::Specification.send(:default_stubs, "*.gemspec")
555
- end
485
+ def default_stubs
486
+ Gem::Specification.default_stubs("*.gemspec")
556
487
  end
557
488
  end
558
489
 
@@ -28,11 +28,11 @@ module Bundler
28
28
  spec.load_paths.reject {|path| $LOAD_PATH.include?(path) }
29
29
  end.reverse.flatten
30
30
 
31
- Bundler.rubygems.add_to_load_path(load_paths)
31
+ Gem.add_to_load_path(*load_paths)
32
32
 
33
33
  setup_manpath
34
34
 
35
- lock(:preserve_unknown_sections => true)
35
+ lock(preserve_unknown_sections: true)
36
36
 
37
37
  self
38
38
  end
@@ -9,17 +9,23 @@ module Bundler
9
9
  def restart_with_locked_bundler_if_needed
10
10
  return unless needs_switching? && installed?
11
11
 
12
- restart_with(lockfile_version)
12
+ restart_with(restart_version)
13
13
  end
14
14
 
15
15
  def install_locked_bundler_and_restart_with_it_if_needed
16
16
  return unless needs_switching?
17
17
 
18
- Bundler.ui.info \
19
- "Bundler #{current_version} is running, but your lockfile was generated with #{lockfile_version}. " \
20
- "Installing Bundler #{lockfile_version} and restarting using that version."
18
+ if restart_version == lockfile_version
19
+ Bundler.ui.info \
20
+ "Bundler #{current_version} is running, but your lockfile was generated with #{lockfile_version}. " \
21
+ "Installing Bundler #{lockfile_version} and restarting using that version."
22
+ else
23
+ Bundler.ui.info \
24
+ "Bundler #{current_version} is running, but your configuration was #{restart_version}. " \
25
+ "Installing Bundler #{restart_version} and restarting using that version."
26
+ end
21
27
 
22
- install_and_restart_with(lockfile_version)
28
+ install_and_restart_with(restart_version)
23
29
  end
24
30
 
25
31
  def update_bundler_and_restart_with_it_if_needed(target)
@@ -79,7 +85,8 @@ module Bundler
79
85
  autoswitching_applies? &&
80
86
  released?(lockfile_version) &&
81
87
  !running?(lockfile_version) &&
82
- !updating?
88
+ !updating? &&
89
+ Bundler.settings[:version] != "system"
83
90
  end
84
91
 
85
92
  def autoswitching_applies?
@@ -151,7 +158,7 @@ module Bundler
151
158
  def installed?
152
159
  Bundler.configure
153
160
 
154
- Bundler.rubygems.find_bundler(lockfile_version.to_s)
161
+ Bundler.rubygems.find_bundler(restart_version.to_s)
155
162
  end
156
163
 
157
164
  def current_version
@@ -166,5 +173,14 @@ module Bundler
166
173
  rescue ArgumentError
167
174
  @lockfile_version = nil
168
175
  end
176
+
177
+ def restart_version
178
+ return @restart_version if defined?(@restart_version)
179
+ # BUNDLE_VERSION=x.y.z
180
+ @restart_version = Gem::Version.new(Bundler.settings[:version])
181
+ rescue ArgumentError
182
+ # BUNDLE_VERSION=lockfile
183
+ @restart_version = lockfile_version
184
+ end
169
185
  end
170
186
  end
@@ -46,6 +46,20 @@ module Bundler
46
46
  update_requires_all_flag
47
47
  ].freeze
48
48
 
49
+ REMEMBERED_KEYS = %w[
50
+ bin
51
+ cache_all
52
+ clean
53
+ deployment
54
+ frozen
55
+ no_prune
56
+ path
57
+ shebang
58
+ path.system
59
+ without
60
+ with
61
+ ].freeze
62
+
49
63
  NUMBER_KEYS = %w[
50
64
  jobs
51
65
  redirect
@@ -74,6 +88,7 @@ module Bundler
74
88
  shebang
75
89
  system_bindir
76
90
  trust-policy
91
+ version
77
92
  ].freeze
78
93
 
79
94
  DEFAULT_CONFIG = {
@@ -83,6 +98,7 @@ module Bundler
83
98
  "BUNDLE_REDIRECT" => 5,
84
99
  "BUNDLE_RETRY" => 3,
85
100
  "BUNDLE_TIMEOUT" => 10,
101
+ "BUNDLE_VERSION" => "lockfile",
86
102
  }.freeze
87
103
 
88
104
  def initialize(root = nil)
@@ -113,7 +129,7 @@ module Bundler
113
129
  end
114
130
 
115
131
  def set_command_option(key, value)
116
- if Bundler.feature_flag.forget_cli_options?
132
+ if !is_remembered(key) || Bundler.feature_flag.forget_cli_options?
117
133
  temporary(key => value)
118
134
  value
119
135
  else
@@ -319,11 +335,11 @@ module Bundler
319
335
 
320
336
  def configs
321
337
  @configs ||= {
322
- :temporary => @temporary,
323
- :local => @local_config,
324
- :env => @env_config,
325
- :global => @global_config,
326
- :default => DEFAULT_CONFIG,
338
+ temporary: @temporary,
339
+ local: @local_config,
340
+ env: @env_config,
341
+ global: @global_config,
342
+ default: DEFAULT_CONFIG,
327
343
  }
328
344
  end
329
345
 
@@ -372,6 +388,10 @@ module Bundler
372
388
  ARRAY_KEYS.include?(self.class.key_to_s(key))
373
389
  end
374
390
 
391
+ def is_remembered(key)
392
+ REMEMBERED_KEYS.include?(self.class.key_to_s(key))
393
+ end
394
+
375
395
  def is_credential(key)
376
396
  key == "gem.push_key"
377
397
  end
@@ -507,7 +527,7 @@ module Bundler
507
527
  (https?.*?) # URI
508
528
  (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key
509
529
  \z
510
- /ix.freeze
530
+ /ix
511
531
 
512
532
  def self.key_for(key)
513
533
  key = normalize_uri(key).to_s if key.is_a?(String) && key.start_with?("http", "mirror.http")
data/lib/bundler/setup.rb CHANGED
@@ -12,7 +12,10 @@ if Bundler::SharedHelpers.in_bundle?
12
12
  Bundler.ui.error e.message
13
13
  Bundler.ui.warn e.backtrace.join("\n") if ENV["DEBUG"]
14
14
  if e.is_a?(Bundler::GemNotFound)
15
- suggested_cmd = "bundle install"
15
+ default_bundle = Gem.bin_path("bundler", "bundle")
16
+ current_bundle = Bundler::SharedHelpers.bundle_bin_path
17
+ suggested_bundle = default_bundle == current_bundle ? "bundle" : current_bundle
18
+ suggested_cmd = "#{suggested_bundle} install"
16
19
  original_gemfile = Bundler.original_env["BUNDLE_GEMFILE"]
17
20
  suggested_cmd += " --gemfile #{original_gemfile}" if original_gemfile
18
21
  Bundler.ui.warn "Run `#{suggested_cmd}` to install missing gems."
@@ -13,13 +13,13 @@ module Bundler
13
13
  def root
14
14
  gemfile = find_gemfile
15
15
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
16
- Pathname.new(gemfile).tap {|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path.parent
16
+ Pathname.new(gemfile).expand_path.parent
17
17
  end
18
18
 
19
19
  def default_gemfile
20
20
  gemfile = find_gemfile
21
21
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
22
- Pathname.new(gemfile).tap {|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path
22
+ Pathname.new(gemfile).expand_path
23
23
  end
24
24
 
25
25
  def default_lockfile
@@ -28,7 +28,7 @@ module Bundler
28
28
  case gemfile.basename.to_s
29
29
  when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked"))
30
30
  else Pathname.new("#{gemfile}.lock")
31
- end.tap {|x| x.untaint if RUBY_VERSION < "2.7" }
31
+ end
32
32
  end
33
33
 
34
34
  def default_bundle_dir
@@ -100,7 +100,7 @@ module Bundler
100
100
  #
101
101
  # @see {Bundler::PermissionError}
102
102
  def filesystem_access(path, action = :write, &block)
103
- yield(path.dup.tap {|x| x.untaint if RUBY_VERSION < "2.7" })
103
+ yield(path.dup)
104
104
  rescue Errno::EACCES
105
105
  raise PermissionError.new(path, action)
106
106
  rescue Errno::EAGAIN
@@ -117,16 +117,18 @@ module Bundler
117
117
  raise GenericSystemCallError.new(e, "There was an error accessing `#{path}`.")
118
118
  end
119
119
 
120
- def major_deprecation(major_version, message, print_caller_location: false)
120
+ def major_deprecation(major_version, message, removed_message: nil, print_caller_location: false)
121
121
  if print_caller_location
122
122
  caller_location = caller_locations(2, 2).first
123
- message = "#{message} (called at #{caller_location.path}:#{caller_location.lineno})"
123
+ suffix = " (called at #{caller_location.path}:#{caller_location.lineno})"
124
+ message += suffix
125
+ removed_message += suffix if removed_message
124
126
  end
125
127
 
126
128
  bundler_major_version = Bundler.bundler_major_version
127
129
  if bundler_major_version > major_version
128
130
  require_relative "errors"
129
- raise DeprecatedError, "[REMOVED] #{message}"
131
+ raise DeprecatedError, "[REMOVED] #{removed_message || message}"
130
132
  end
131
133
 
132
134
  return unless bundler_major_version >= major_version && prints_major_deprecations?
@@ -193,6 +195,21 @@ module Bundler
193
195
  Digest(name)
194
196
  end
195
197
 
198
+ def checksum_for_file(path, digest)
199
+ return unless path.file?
200
+ # This must use File.read instead of Digest.file().hexdigest
201
+ # because we need to preserve \n line endings on windows when calculating
202
+ # the checksum
203
+ SharedHelpers.filesystem_access(path, :read) do
204
+ File.open(path, "rb") do |f|
205
+ digest = SharedHelpers.digest(digest).new
206
+ buf = String.new(capacity: 16_384, encoding: Encoding::BINARY)
207
+ digest << buf while f.read(16_384, buf)
208
+ digest.hexdigest
209
+ end
210
+ end
211
+ end
212
+
196
213
  def write_to_gemfile(gemfile_path, contents)
197
214
  filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
198
215
  end
@@ -250,7 +267,7 @@ module Bundler
250
267
 
251
268
  def search_up(*names)
252
269
  previous = nil
253
- current = File.expand_path(SharedHelpers.pwd).tap {|x| x.untaint if RUBY_VERSION < "2.7" }
270
+ current = File.expand_path(SharedHelpers.pwd)
254
271
 
255
272
  until !File.directory?(current) || current == previous
256
273
  if ENV["BUNDLER_SPEC_RUN"]
@@ -287,6 +304,13 @@ module Bundler
287
304
  public :set_env
288
305
 
289
306
  def set_bundle_variables
307
+ Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", bundle_bin_path
308
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
309
+ Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
310
+ Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__)
311
+ end
312
+
313
+ def bundle_bin_path
290
314
  # bundler exe & lib folders have same root folder, typical gem installation
291
315
  exe_file = File.expand_path("../../exe/bundle", __dir__)
292
316
 
@@ -296,11 +320,9 @@ module Bundler
296
320
  # bundler is a default gem, exe path is separate
297
321
  exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION) unless File.exist?(exe_file)
298
322
 
299
- Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
300
- Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
301
- Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
302
- Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__) unless RUBY_VERSION < "2.7"
323
+ exe_file
303
324
  end
325
+ public :bundle_bin_path
304
326
 
305
327
  def set_path
306
328
  validate_bundle_path
@@ -312,7 +334,7 @@ module Bundler
312
334
  def set_rubyopt
313
335
  rubyopt = [ENV["RUBYOPT"]].compact
314
336
  setup_require = "-r#{File.expand_path("setup", __dir__)}"
315
- return if !rubyopt.empty? && rubyopt.first =~ /#{Regexp.escape(setup_require)}/
337
+ return if !rubyopt.empty? && rubyopt.first.include?(setup_require)
316
338
  rubyopt.unshift setup_require
317
339
  Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
318
340
  end
@@ -80,14 +80,14 @@ module Bundler
80
80
 
81
81
  def current_branch
82
82
  @current_branch ||= with_path do
83
- git_local("rev-parse", "--abbrev-ref", "HEAD", :dir => path).strip
83
+ git_local("rev-parse", "--abbrev-ref", "HEAD", dir: path).strip
84
84
  end
85
85
  end
86
86
 
87
87
  def contains?(commit)
88
88
  allowed_with_path do
89
- result, status = git_null("branch", "--contains", commit, :dir => path)
90
- status.success? && result =~ /^\* (.*)$/
89
+ result, status = git_null("branch", "--contains", commit, dir: path)
90
+ status.success? && result.match?(/^\* (.*)$/)
91
91
  end
92
92
  end
93
93
 
@@ -132,18 +132,18 @@ module Bundler
132
132
 
133
133
  ref = @commit_ref || (locked_to_full_sha? && @revision)
134
134
  if ref
135
- git "config", "uploadpack.allowAnySHA1InWant", "true", :dir => path.to_s if @commit_ref.nil? && needs_allow_any_sha1_in_want?
135
+ git "config", "uploadpack.allowAnySHA1InWant", "true", dir: path.to_s if @commit_ref.nil? && needs_allow_any_sha1_in_want?
136
136
 
137
- git "fetch", "--force", "--quiet", *extra_fetch_args(ref), :dir => destination
137
+ git "fetch", "--force", "--quiet", *extra_fetch_args(ref), dir: destination
138
138
  end
139
139
 
140
- git "reset", "--hard", @revision, :dir => destination
140
+ git "reset", "--hard", @revision, dir: destination
141
141
 
142
142
  if submodules
143
- git_retry "submodule", "update", "--init", "--recursive", :dir => destination
143
+ git_retry "submodule", "update", "--init", "--recursive", dir: destination
144
144
  elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
145
145
  inner_command = "git -C $toplevel submodule deinit --force $sm_path"
146
- git_retry "submodule", "foreach", "--quiet", inner_command, :dir => destination
146
+ git_retry "submodule", "foreach", "--quiet", inner_command, dir: destination
147
147
  end
148
148
  end
149
149
 
@@ -266,32 +266,32 @@ module Bundler
266
266
  def git_null(*command, dir: nil)
267
267
  check_allowed(command)
268
268
 
269
- capture(command, dir, :ignore_err => true)
269
+ capture(command, dir, ignore_err: true)
270
270
  end
271
271
 
272
272
  def git_retry(*command, dir: nil)
273
273
  command_with_no_credentials = check_allowed(command)
274
274
 
275
275
  Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
276
- git(*command, :dir => dir)
276
+ git(*command, dir: dir)
277
277
  end
278
278
  end
279
279
 
280
280
  def git(*command, dir: nil)
281
- run_command(*command, :dir => dir) do |unredacted_command|
281
+ run_command(*command, dir: dir) do |unredacted_command|
282
282
  check_allowed(unredacted_command)
283
283
  end
284
284
  end
285
285
 
286
286
  def git_local(*command, dir: nil)
287
- run_command(*command, :dir => dir) do |unredacted_command|
287
+ run_command(*command, dir: dir) do |unredacted_command|
288
288
  redact_and_check_presence(unredacted_command)
289
289
  end
290
290
  end
291
291
 
292
292
  def has_revision_cached?
293
293
  return unless @revision && path.exist?
294
- git("cat-file", "-e", @revision, :dir => path)
294
+ git("cat-file", "-e", @revision, dir: path)
295
295
  true
296
296
  rescue GitError
297
297
  false
@@ -314,7 +314,7 @@ module Bundler
314
314
  end
315
315
 
316
316
  def verify(reference)
317
- git("rev-parse", "--verify", reference, :dir => path).strip
317
+ git("rev-parse", "--verify", reference, dir: path).strip
318
318
  end
319
319
 
320
320
  # Adds credentials to the URI
@@ -398,7 +398,7 @@ module Bundler
398
398
  if Bundler.feature_flag.bundler_3_mode? || supports_minus_c?
399
399
  ["git", "-C", dir.to_s, *cmd]
400
400
  else
401
- ["git", *cmd, { :chdir => dir.to_s }]
401
+ ["git", *cmd, { chdir: dir.to_s }]
402
402
  end
403
403
  end
404
404
 
@@ -11,6 +11,7 @@ module Bundler
11
11
 
12
12
  def initialize(options)
13
13
  @options = options
14
+ @checksum_store = Checksum::Store.new
14
15
  @glob = options["glob"] || DEFAULT_GLOB
15
16
 
16
17
  @allow_cached = false
@@ -19,7 +20,7 @@ module Bundler
19
20
  # Stringify options that could be set as symbols
20
21
  %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] }
21
22
 
22
- @uri = URINormalizer.normalize_suffix(options["uri"] || "", :trailing_slash => false)
23
+ @uri = URINormalizer.normalize_suffix(options["uri"] || "", trailing_slash: false)
23
24
  @safe_uri = URICredentialsFilter.credential_filtered_uri(@uri)
24
25
  @branch = options["branch"]
25
26
  @ref = options["ref"] || options["branch"] || options["tag"]
@@ -197,7 +198,7 @@ module Bundler
197
198
  @copied = true
198
199
  end
199
200
 
200
- generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] }
201
+ generate_bin_options = { disable_extensions: !Bundler.rubygems.spec_missing_extensions?(spec), build_args: options[:build_args] }
201
202
  generate_bin(spec, generate_bin_options)
202
203
 
203
204
  requires_checkout? ? spec.post_install_message : nil
@@ -359,7 +360,7 @@ module Bundler
359
360
 
360
361
  def load_gemspec(file)
361
362
  stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
362
- stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.tap {|x| x.untaint if RUBY_VERSION < "2.7" }
363
+ stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s
363
364
  StubSpecification.from_stub(stub)
364
365
  end
365
366