bundler 2.4.22 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -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 +245 -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 +43 -25
  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/lib/connection_pool/version.rb +1 -1
  131. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  132. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  133. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
  134. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
  135. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  136. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +35 -35
  137. data/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  138. data/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  139. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  140. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  141. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  142. data/lib/bundler/vendored_net_http.rb +8 -0
  143. data/lib/bundler/vendored_persistent.rb +0 -4
  144. data/lib/bundler/vendored_timeout.rb +8 -0
  145. data/lib/bundler/version.rb +1 -1
  146. data/lib/bundler/vlad.rb +1 -1
  147. data/lib/bundler/yaml_serializer.rb +3 -3
  148. data/lib/bundler.rb +38 -27
  149. metadata +11 -5
@@ -10,22 +10,22 @@ module Bundler
10
10
  s.required_rubygems_version = Gem::Requirement.default
11
11
  end
12
12
 
13
- idx << Gem::Specification.new do |s|
14
- s.name = "bundler"
15
- s.version = VERSION
16
- s.license = "MIT"
17
- s.platform = Gem::Platform::RUBY
18
- s.authors = ["bundler team"]
19
- s.bindir = "exe"
20
- s.homepage = "https://bundler.io"
21
- s.summary = "The best way to manage your application's dependencies"
22
- s.executables = %w[bundle]
23
- # can't point to the actual gemspec or else the require paths will be wrong
24
- s.loaded_from = __dir__
25
- end
26
-
27
- if local_spec = Bundler.rubygems.find_bundler(VERSION)
13
+ if local_spec = Gem.loaded_specs["bundler"]
28
14
  idx << local_spec
15
+ else
16
+ idx << Gem::Specification.new do |s|
17
+ s.name = "bundler"
18
+ s.version = VERSION
19
+ s.license = "MIT"
20
+ s.platform = Gem::Platform::RUBY
21
+ s.authors = ["bundler team"]
22
+ s.bindir = "exe"
23
+ s.homepage = "https://bundler.io"
24
+ s.summary = "The best way to manage your application's dependencies"
25
+ s.executables = %w[bundle]
26
+ # can't point to the actual gemspec or else the require paths will be wrong
27
+ s.loaded_from = __dir__
28
+ end
29
29
  end
30
30
 
31
31
  idx.each {|s| s.source = self }
@@ -14,6 +14,7 @@ module Bundler
14
14
  DEFAULT_GLOB = "{,*,*/*}.gemspec"
15
15
 
16
16
  def initialize(options)
17
+ @checksum_store = Checksum::Store.new
17
18
  @options = options.dup
18
19
  @glob = options["glob"] || DEFAULT_GLOB
19
20
 
@@ -85,7 +86,7 @@ module Bundler
85
86
  using_message = "Using #{version_message(spec, options[:previous_spec])} from #{self}"
86
87
  using_message += " and installing its executables" unless spec.executables.empty?
87
88
  print_using_message using_message
88
- generate_bin(spec, :disable_extensions => true)
89
+ generate_bin(spec, disable_extensions: true)
89
90
  nil # no post-install message
90
91
  end
91
92
 
@@ -225,7 +226,7 @@ module Bundler
225
226
  # Some gem authors put absolute paths in their gemspec
226
227
  # and we have to save them from themselves
227
228
  spec.files = spec.files.map do |path|
228
- next path unless /\A#{Pathname::SEPARATOR_PAT}/.match?(path)
229
+ next path unless /\A#{Pathname::SEPARATOR_PAT}/o.match?(path)
229
230
  next if File.directory?(path)
230
231
  begin
231
232
  Pathname.new(path).relative_path_from(gem_dir).to_s
@@ -236,10 +237,10 @@ module Bundler
236
237
 
237
238
  installer = Path::Installer.new(
238
239
  spec,
239
- :env_shebang => false,
240
- :disable_extensions => options[:disable_extensions],
241
- :build_args => options[:build_args],
242
- :bundler_extension_cache_path => extension_cache_path(spec)
240
+ env_shebang: false,
241
+ disable_extensions: options[:disable_extensions],
242
+ build_args: options[:build_args],
243
+ bundler_extension_cache_path: extension_cache_path(spec)
243
244
  )
244
245
  installer.post_install
245
246
  rescue Gem::InvalidSpecificationException => e
@@ -19,6 +19,7 @@ module Bundler
19
19
  @allow_remote = false
20
20
  @allow_cached = false
21
21
  @allow_local = options["allow_local"] || false
22
+ @checksum_store = Checksum::Store.new
22
23
 
23
24
  Array(options["remotes"]).reverse_each {|r| add_remote(r) }
24
25
  end
@@ -170,15 +171,14 @@ module Bundler
170
171
 
171
172
  installer = Bundler::RubyGemsGemInstaller.at(
172
173
  path,
173
- :security_policy => Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
174
- :install_dir => install_path.to_s,
175
- :bin_dir => bin_path.to_s,
176
- :ignore_dependencies => true,
177
- :wrappers => true,
178
- :env_shebang => true,
179
- :build_args => options[:build_args],
180
- :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
181
- :bundler_extension_cache_path => extension_cache_path(spec)
174
+ security_policy: Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
175
+ install_dir: install_path.to_s,
176
+ bin_dir: bin_path.to_s,
177
+ ignore_dependencies: true,
178
+ wrappers: true,
179
+ env_shebang: true,
180
+ build_args: options[:build_args],
181
+ bundler_extension_cache_path: extension_cache_path(spec)
182
182
  )
183
183
 
184
184
  if spec.remote
@@ -196,6 +196,8 @@ module Bundler
196
196
  spec.__swap__(s)
197
197
  end
198
198
 
199
+ spec.source.checksum_store.register(spec, installer.gem_checksum)
200
+
199
201
  message = "Installing #{version_message(spec, options[:previous_spec])}"
200
202
  message += " with native extensions" if spec.extensions.any?
201
203
  Bundler.ui.confirm message
@@ -253,11 +255,15 @@ module Bundler
253
255
  end
254
256
  end
255
257
 
256
- def fetchers
257
- @fetchers ||= remotes.map do |uri|
258
+ def remote_fetchers
259
+ @remote_fetchers ||= remotes.to_h do |uri|
258
260
  remote = Source::Rubygems::Remote.new(uri)
259
- Bundler::Fetcher.new(remote)
260
- end
261
+ [remote, Bundler::Fetcher.new(remote)]
262
+ end.freeze
263
+ end
264
+
265
+ def fetchers
266
+ @fetchers ||= remote_fetchers.values.freeze
261
267
  end
262
268
 
263
269
  def double_check_for(unmet_dependency_names)
@@ -478,7 +484,8 @@ module Bundler
478
484
  def download_gem(spec, download_cache_path, previous_spec = nil)
479
485
  uri = spec.remote.uri
480
486
  Bundler.ui.confirm("Fetching #{version_message(spec, previous_spec)}")
481
- Bundler.rubygems.download_gem(spec, uri, download_cache_path)
487
+ gem_remote_fetcher = remote_fetchers.fetch(spec.remote).gem_remote_fetcher
488
+ Bundler.rubygems.download_gem(spec, uri, download_cache_path, gem_remote_fetcher)
482
489
  end
483
490
 
484
491
  # Returns the global cache path of the calling Rubygems::Source object.
@@ -11,6 +11,8 @@ module Bundler
11
11
 
12
12
  attr_accessor :dependency_names
13
13
 
14
+ attr_reader :checksum_store
15
+
14
16
  def unmet_deps
15
17
  specs.unmet_dependency_names
16
18
  end
@@ -52,6 +52,44 @@ module Bundler
52
52
  specs.uniq
53
53
  end
54
54
 
55
+ def complete_platforms!(platforms)
56
+ return platforms.concat([Gem::Platform::RUBY]).uniq if @specs.empty?
57
+
58
+ new_platforms = @specs.flat_map {|spec| spec.source.specs.search([spec.name, spec.version]).map(&:platform) }.uniq.select do |platform|
59
+ next if platforms.include?(platform)
60
+ next unless GemHelpers.generic(platform) == Gem::Platform::RUBY
61
+
62
+ new_specs = []
63
+
64
+ valid_platform = lookup.all? do |_, specs|
65
+ spec = specs.first
66
+ matching_specs = spec.source.specs.search([spec.name, spec.version])
67
+ platform_spec = GemHelpers.select_best_platform_match(matching_specs, platform).find(&:matches_current_metadata?)
68
+
69
+ if platform_spec
70
+ new_specs << LazySpecification.from_spec(platform_spec)
71
+ true
72
+ else
73
+ false
74
+ end
75
+ end
76
+ next unless valid_platform
77
+
78
+ @specs.concat(new_specs.uniq)
79
+ end
80
+ return platforms if new_platforms.empty?
81
+
82
+ platforms.concat(new_platforms)
83
+
84
+ less_specific_platform = new_platforms.find {|platform| platform != Gem::Platform::RUBY && platform === Bundler.local_platform }
85
+ platforms.delete(Bundler.local_platform) if less_specific_platform
86
+
87
+ @sorted = nil
88
+ @lookup = nil
89
+
90
+ platforms
91
+ end
92
+
55
93
  def [](key)
56
94
  key = key.name if key.respond_to?(:name)
57
95
  lookup[key].reverse
@@ -114,16 +152,6 @@ module Bundler
114
152
  @specs.select {|s| s.is_a?(LazySpecification) }
115
153
  end
116
154
 
117
- def merge(set)
118
- arr = sorted.dup
119
- set.each do |set_spec|
120
- full_name = set_spec.full_name
121
- next if arr.any? {|spec| spec.full_name == full_name }
122
- arr << set_spec
123
- end
124
- SpecSet.new(arr)
125
- end
126
-
127
155
  def -(other)
128
156
  SpecSet.new(to_a - other.to_a)
129
157
  end
@@ -9,6 +9,7 @@ module Bundler
9
9
  spec
10
10
  end
11
11
 
12
+ attr_reader :checksum
12
13
  attr_accessor :stub, :ignored
13
14
 
14
15
  def source=(source)
@@ -27,7 +27,7 @@ m = Module.new do
27
27
  bundler_version = nil
28
28
  update_index = nil
29
29
  ARGV.each_with_index do |a, i|
30
- if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
30
+ if update_index && update_index.succ == i && a.match?(Gem::Version::ANCHORED_VERSION_PATTERN)
31
31
  bundler_version = a
32
32
  end
33
33
  next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
@@ -6,15 +6,15 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
6
6
 
7
7
  ## Installation
8
8
 
9
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
9
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
10
 
11
11
  Install the gem and add to the application's Gemfile by executing:
12
12
 
13
- $ bundle add UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
13
+ $ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
14
14
 
15
15
  If bundler is not being used to manage dependencies, install the gem by executing:
16
16
 
17
- $ gem install UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
17
+ $ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
18
18
 
19
19
  ## Usage
20
20
 
@@ -4,13 +4,9 @@ require "bundler/gem_tasks"
4
4
  <% default_task_names = [config[:test_task]].compact -%>
5
5
  <% case config[:test] -%>
6
6
  <% when "minitest" -%>
7
- require "rake/testtask"
7
+ require "minitest/test_task"
8
8
 
9
- Rake::TestTask.new(:test) do |t|
10
- t.libs << "test"
11
- t.libs << "lib"
12
- t.test_files = FileList["test/**/test_*.rb"]
13
- end
9
+ Minitest::TestTask.create
14
10
 
15
11
  <% when "test-unit" -%>
16
12
  require "rake/testtask"
@@ -12,4 +12,4 @@ publish = false
12
12
  crate-type = ["cdylib"]
13
13
 
14
14
  [dependencies]
15
- magnus = { version = "0.6" }
15
+ magnus = { version = "0.6.2" }
@@ -1,3 +1,3 @@
1
1
  # For available configuration options, see:
2
- # https://github.com/testdouble/standard
2
+ # https://github.com/standardrb/standard
3
3
  ruby_version: <%= ::Gem::Version.new(config[:required_ruby_version]).segments[0..1].join(".") %>
@@ -130,7 +130,7 @@ module Bundler
130
130
  def tell_err(message, color = nil, newline = nil)
131
131
  return if @shell.send(:stderr).closed?
132
132
 
133
- newline ||= message.to_s !~ /( |\t)\Z/
133
+ newline ||= !message.to_s.match?(/( |\t)\Z/)
134
134
  message = word_wrap(message) if newline.is_a?(Hash) && newline[:wrap]
135
135
 
136
136
  color = nil if color && !$stderr.tty?
@@ -1,3 +1,3 @@
1
1
  class Bundler::ConnectionPool
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.1"
3
3
  end
@@ -1,4 +1,4 @@
1
- require "timeout"
1
+ require_relative "../../../vendored_timeout"
2
2
  require_relative "connection_pool/version"
3
3
 
4
4
  class Bundler::ConnectionPool
@@ -6,7 +6,7 @@ class Bundler::ConnectionPool
6
6
 
7
7
  class PoolShuttingDownError < ::Bundler::ConnectionPool::Error; end
8
8
 
9
- class TimeoutError < ::Timeout::Error; end
9
+ class TimeoutError < ::Gem::Timeout::Error; end
10
10
  end
11
11
 
12
12
  # Generic connection pool class for sharing a limited number of objects or network connections
@@ -36,14 +36,57 @@ end
36
36
  # Accepts the following options:
37
37
  # - :size - number of connections to pool, defaults to 5
38
38
  # - :timeout - amount of time to wait for a connection if none currently available, defaults to 5 seconds
39
+ # - :auto_reload_after_fork - automatically drop all connections after fork, defaults to true
39
40
  #
40
41
  class Bundler::ConnectionPool
41
- DEFAULTS = {size: 5, timeout: 5}
42
+ DEFAULTS = {size: 5, timeout: 5, auto_reload_after_fork: true}
42
43
 
43
44
  def self.wrap(options, &block)
44
45
  Wrapper.new(options, &block)
45
46
  end
46
47
 
48
+ if Process.respond_to?(:fork)
49
+ INSTANCES = ObjectSpace::WeakMap.new
50
+ private_constant :INSTANCES
51
+
52
+ def self.after_fork
53
+ INSTANCES.values.each do |pool|
54
+ next unless pool.auto_reload_after_fork
55
+
56
+ # We're on after fork, so we know all other threads are dead.
57
+ # All we need to do is to ensure the main thread doesn't have a
58
+ # checked out connection
59
+ pool.checkin(force: true)
60
+ pool.reload do |connection|
61
+ # Unfortunately we don't know what method to call to close the connection,
62
+ # so we try the most common one.
63
+ connection.close if connection.respond_to?(:close)
64
+ end
65
+ end
66
+ nil
67
+ end
68
+
69
+ if ::Process.respond_to?(:_fork) # MRI 3.1+
70
+ module ForkTracker
71
+ def _fork
72
+ pid = super
73
+ if pid == 0
74
+ Bundler::ConnectionPool.after_fork
75
+ end
76
+ pid
77
+ end
78
+ end
79
+ Process.singleton_class.prepend(ForkTracker)
80
+ end
81
+ else
82
+ INSTANCES = nil
83
+ private_constant :INSTANCES
84
+
85
+ def self.after_fork
86
+ # noop
87
+ end
88
+ end
89
+
47
90
  def initialize(options = {}, &block)
48
91
  raise ArgumentError, "Connection pool requires a block" unless block
49
92
 
@@ -51,10 +94,12 @@ class Bundler::ConnectionPool
51
94
 
52
95
  @size = Integer(options.fetch(:size))
53
96
  @timeout = options.fetch(:timeout)
97
+ @auto_reload_after_fork = options.fetch(:auto_reload_after_fork)
54
98
 
55
99
  @available = TimedStack.new(@size, &block)
56
100
  @key = :"pool-#{@available.object_id}"
57
101
  @key_count = :"pool-#{@available.object_id}-count"
102
+ INSTANCES[self] = self if INSTANCES
58
103
  end
59
104
 
60
105
  def with(options = {})
@@ -81,16 +126,16 @@ class Bundler::ConnectionPool
81
126
  end
82
127
  end
83
128
 
84
- def checkin
129
+ def checkin(force: false)
85
130
  if ::Thread.current[@key]
86
- if ::Thread.current[@key_count] == 1
131
+ if ::Thread.current[@key_count] == 1 || force
87
132
  @available.push(::Thread.current[@key])
88
133
  ::Thread.current[@key] = nil
89
134
  ::Thread.current[@key_count] = nil
90
135
  else
91
136
  ::Thread.current[@key_count] -= 1
92
137
  end
93
- else
138
+ elsif !force
94
139
  raise Bundler::ConnectionPool::Error, "no connections are checked out"
95
140
  end
96
141
 
@@ -117,6 +162,8 @@ class Bundler::ConnectionPool
117
162
 
118
163
  # Size of this connection pool
119
164
  attr_reader :size
165
+ # Automatically drop all connections after fork
166
+ attr_reader :auto_reload_after_fork
120
167
 
121
168
  # Number of pool entries available for checkout at this instant.
122
169
  def available
@@ -180,7 +180,7 @@ end
180
180
  # - {CVE-2004-0452}[https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452].
181
181
  #
182
182
  module Bundler::FileUtils
183
- VERSION = "1.7.0"
183
+ VERSION = "1.7.2"
184
184
 
185
185
  def self.private_module_function(name) #:nodoc:
186
186
  module_function name
@@ -192,8 +192,6 @@ module Bundler::FileUtils
192
192
  #
193
193
  # Bundler::FileUtils.pwd # => "/rdoc/fileutils"
194
194
  #
195
- # Bundler::FileUtils.getwd is an alias for Bundler::FileUtils.pwd.
196
- #
197
195
  # Related: Bundler::FileUtils.cd.
198
196
  #
199
197
  def pwd
@@ -235,8 +233,6 @@ module Bundler::FileUtils
235
233
  # cd ..
236
234
  # cd fileutils
237
235
  #
238
- # Bundler::FileUtils.chdir is an alias for Bundler::FileUtils.cd.
239
- #
240
236
  # Related: Bundler::FileUtils.pwd.
241
237
  #
242
238
  def cd(dir, verbose: nil, &block) # :yield: dir
@@ -515,8 +511,6 @@ module Bundler::FileUtils
515
511
  # Raises an exception if +dest+ is the path to an existing file
516
512
  # and keyword argument +force+ is not +true+.
517
513
  #
518
- # Bundler::FileUtils#link is an alias for Bundler::FileUtils#ln.
519
- #
520
514
  # Related: Bundler::FileUtils.link_entry (has different options).
521
515
  #
522
516
  def ln(src, dest, force: nil, noop: nil, verbose: nil)
@@ -707,8 +701,6 @@ module Bundler::FileUtils
707
701
  # ln -sf src2.txt dest2.txt
708
702
  # ln -s srcdir3/src0.txt srcdir3/src1.txt destdir3
709
703
  #
710
- # Bundler::FileUtils.symlink is an alias for Bundler::FileUtils.ln_s.
711
- #
712
704
  # Related: Bundler::FileUtils.ln_sf.
713
705
  #
714
706
  def ln_s(src, dest, force: nil, relative: false, target_directory: true, noop: nil, verbose: nil)
@@ -876,8 +868,6 @@ module Bundler::FileUtils
876
868
  #
877
869
  # Raises an exception if +src+ is a directory.
878
870
  #
879
- # Bundler::FileUtils.copy is an alias for Bundler::FileUtils.cp.
880
- #
881
871
  # Related: {methods for copying}[rdoc-ref:FileUtils@Copying].
882
872
  #
883
873
  def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
@@ -1164,8 +1154,6 @@ module Bundler::FileUtils
1164
1154
  # mv src0 dest0
1165
1155
  # mv src1.txt src1 dest1
1166
1156
  #
1167
- # Bundler::FileUtils.move is an alias for Bundler::FileUtils.mv.
1168
- #
1169
1157
  def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
1170
1158
  fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
1171
1159
  return if noop
@@ -1223,8 +1211,6 @@ module Bundler::FileUtils
1223
1211
  #
1224
1212
  # rm src0.dat src0.txt
1225
1213
  #
1226
- # Bundler::FileUtils.remove is an alias for Bundler::FileUtils.rm.
1227
- #
1228
1214
  # Related: {methods for deleting}[rdoc-ref:FileUtils@Deleting].
1229
1215
  #
1230
1216
  def rm(list, force: nil, noop: nil, verbose: nil)
@@ -1250,8 +1236,6 @@ module Bundler::FileUtils
1250
1236
  #
1251
1237
  # See Bundler::FileUtils.rm for keyword arguments.
1252
1238
  #
1253
- # Bundler::FileUtils.safe_unlink is an alias for Bundler::FileUtils.rm_f.
1254
- #
1255
1239
  # Related: {methods for deleting}[rdoc-ref:FileUtils@Deleting].
1256
1240
  #
1257
1241
  def rm_f(list, noop: nil, verbose: nil)
@@ -1339,8 +1323,6 @@ module Bundler::FileUtils
1339
1323
  #
1340
1324
  # See Bundler::FileUtils.rm_r for keyword arguments.
1341
1325
  #
1342
- # Bundler::FileUtils.rmtree is an alias for Bundler::FileUtils.rm_rf.
1343
- #
1344
1326
  # Related: {methods for deleting}[rdoc-ref:FileUtils@Deleting].
1345
1327
  #
1346
1328
  def rm_rf(list, noop: nil, verbose: nil, secure: nil)
@@ -1642,7 +1624,13 @@ module Bundler::FileUtils
1642
1624
  st = File.stat(s)
1643
1625
  unless File.exist?(d) and compare_file(s, d)
1644
1626
  remove_file d, true
1645
- copy_file s, d
1627
+ if d.end_with?('/')
1628
+ mkdir_p d
1629
+ copy_file s, d + File.basename(s)
1630
+ else
1631
+ mkdir_p File.expand_path('..', d)
1632
+ copy_file s, d
1633
+ end
1646
1634
  File.utime st.atime, st.mtime, d if preserve
1647
1635
  File.chmod fu_mode(mode, st), d if mode
1648
1636
  File.chown uid, gid, d if uid or gid
@@ -1,8 +1,8 @@
1
1
  ##
2
- # A Net::HTTP connection wrapper that holds extra information for managing the
2
+ # A Gem::Net::HTTP connection wrapper that holds extra information for managing the
3
3
  # connection's lifetime.
4
4
 
5
- class Bundler::Persistent::Net::HTTP::Persistent::Connection # :nodoc:
5
+ class Gem::Net::HTTP::Persistent::Connection # :nodoc:
6
6
 
7
7
  attr_accessor :http
8
8
 
@@ -28,7 +28,7 @@ class Bundler::Persistent::Net::HTTP::Persistent::Connection # :nodoc:
28
28
  alias_method :close, :finish
29
29
 
30
30
  def reset
31
- @last_use = Bundler::Persistent::Net::HTTP::Persistent::EPOCH
31
+ @last_use = Gem::Net::HTTP::Persistent::EPOCH
32
32
  @requests = 0
33
33
  end
34
34
 
@@ -1,4 +1,4 @@
1
- class Bundler::Persistent::Net::HTTP::Persistent::Pool < Bundler::ConnectionPool # :nodoc:
1
+ class Gem::Net::HTTP::Persistent::Pool < Bundler::ConnectionPool # :nodoc:
2
2
 
3
3
  attr_reader :available # :nodoc:
4
4
  attr_reader :key # :nodoc:
@@ -6,7 +6,7 @@ class Bundler::Persistent::Net::HTTP::Persistent::Pool < Bundler::ConnectionPool
6
6
  def initialize(options = {}, &block)
7
7
  super
8
8
 
9
- @available = Bundler::Persistent::Net::HTTP::Persistent::TimedStackMulti.new(@size, &block)
9
+ @available = Gem::Net::HTTP::Persistent::TimedStackMulti.new(@size, &block)
10
10
  @key = "current-#{@available.object_id}"
11
11
  end
12
12
 
@@ -1,4 +1,4 @@
1
- class Bundler::Persistent::Net::HTTP::Persistent::TimedStackMulti < Bundler::ConnectionPool::TimedStack # :nodoc:
1
+ class Gem::Net::HTTP::Persistent::TimedStackMulti < Bundler::ConnectionPool::TimedStack # :nodoc:
2
2
 
3
3
  ##
4
4
  # Returns a new hash that has arrays for keys