bundler 2.4.22 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +53 -0
- data/bundler.gemspec +4 -2
- data/exe/bundle +1 -10
- data/lib/bundler/build_metadata.rb +3 -3
- data/lib/bundler/capistrano.rb +1 -1
- data/lib/bundler/checksum.rb +245 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +3 -3
- data/lib/bundler/cli/binstubs.rb +4 -4
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/check.rb +1 -1
- data/lib/bundler/cli/common.rb +9 -1
- data/lib/bundler/cli/config.rb +8 -7
- data/lib/bundler/cli/console.rb +3 -2
- data/lib/bundler/cli/doctor.rb +2 -2
- data/lib/bundler/cli/exec.rb +1 -1
- data/lib/bundler/cli/gem.rb +28 -23
- data/lib/bundler/cli/info.rb +2 -13
- data/lib/bundler/cli/install.rb +5 -4
- data/lib/bundler/cli/issue.rb +1 -1
- data/lib/bundler/cli/lock.rb +4 -4
- data/lib/bundler/cli/open.rb +1 -1
- data/lib/bundler/cli/outdated.rb +6 -6
- data/lib/bundler/cli/plugin.rb +7 -14
- data/lib/bundler/cli/pristine.rb +38 -30
- data/lib/bundler/cli/show.rb +2 -2
- data/lib/bundler/cli/update.rb +5 -5
- data/lib/bundler/cli.rb +215 -263
- data/lib/bundler/compact_index_client/cache.rb +29 -9
- data/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/lib/bundler/compact_index_client/updater.rb +79 -81
- data/lib/bundler/compact_index_client.rb +14 -7
- data/lib/bundler/constants.rb +1 -1
- data/lib/bundler/current_ruby.rb +5 -21
- data/lib/bundler/definition.rb +42 -15
- data/lib/bundler/dependency.rb +16 -12
- data/lib/bundler/digest.rb +2 -2
- data/lib/bundler/dsl.rb +43 -25
- data/lib/bundler/endpoint_specification.rb +5 -1
- data/lib/bundler/env.rb +1 -3
- data/lib/bundler/errors.rb +43 -0
- data/lib/bundler/fetcher/base.rb +3 -1
- data/lib/bundler/fetcher/compact_index.rb +4 -4
- data/lib/bundler/fetcher/downloader.rb +13 -11
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/lib/bundler/fetcher/index.rb +1 -1
- data/lib/bundler/fetcher.rb +28 -25
- data/lib/bundler/friendly_errors.rb +5 -5
- data/lib/bundler/gem_helper.rb +1 -1
- data/lib/bundler/gem_helpers.rb +5 -2
- data/lib/bundler/graph.rb +9 -9
- data/lib/bundler/index.rb +1 -2
- data/lib/bundler/injector.rb +1 -1
- data/lib/bundler/inline.rb +3 -3
- data/lib/bundler/installer/gem_installer.rb +5 -5
- data/lib/bundler/installer/parallel_installer.rb +16 -8
- data/lib/bundler/installer/standalone.rb +2 -3
- data/lib/bundler/installer.rb +9 -9
- data/lib/bundler/lazy_specification.rb +24 -17
- data/lib/bundler/lockfile_generator.rb +9 -0
- data/lib/bundler/lockfile_parser.rb +81 -10
- data/lib/bundler/man/bundle-add.1 +3 -26
- data/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/lib/bundler/man/bundle-cache.1 +3 -24
- data/lib/bundler/man/bundle-check.1 +3 -12
- data/lib/bundler/man/bundle-clean.1 +3 -10
- data/lib/bundler/man/bundle-config.1 +20 -211
- data/lib/bundler/man/bundle-config.1.ronn +6 -0
- data/lib/bundler/man/bundle-console.1 +4 -22
- data/lib/bundler/man/bundle-doctor.1 +4 -18
- data/lib/bundler/man/bundle-exec.1 +12 -73
- data/lib/bundler/man/bundle-gem.1 +13 -49
- data/lib/bundler/man/bundle-help.1 +3 -7
- data/lib/bundler/man/bundle-info.1 +3 -9
- data/lib/bundler/man/bundle-init.1 +3 -12
- data/lib/bundler/man/bundle-inject.1 +6 -19
- data/lib/bundler/man/bundle-install.1 +27 -125
- data/lib/bundler/man/bundle-install.1.ronn +1 -0
- data/lib/bundler/man/bundle-list.1 +4 -19
- data/lib/bundler/man/bundle-lock.1 +5 -29
- data/lib/bundler/man/bundle-open.1 +7 -27
- data/lib/bundler/man/bundle-outdated.1 +3 -55
- data/lib/bundler/man/bundle-outdated.1.ronn +1 -0
- data/lib/bundler/man/bundle-platform.1 +5 -27
- data/lib/bundler/man/bundle-plugin.1 +3 -29
- data/lib/bundler/man/bundle-pristine.1 +5 -16
- data/lib/bundler/man/bundle-remove.1 +4 -14
- data/lib/bundler/man/bundle-show.1 +3 -10
- data/lib/bundler/man/bundle-update.1 +18 -137
- data/lib/bundler/man/bundle-version.1 +3 -16
- data/lib/bundler/man/bundle-viz.1 +4 -16
- data/lib/bundler/man/bundle.1 +5 -44
- data/lib/bundler/man/gemfile.5 +24 -301
- data/lib/bundler/man/gemfile.5.ronn +4 -0
- data/lib/bundler/match_metadata.rb +4 -0
- data/lib/bundler/match_platform.rb +1 -1
- data/lib/bundler/plugin/api/source.rb +3 -2
- data/lib/bundler/plugin/installer.rb +1 -1
- data/lib/bundler/plugin.rb +3 -3
- data/lib/bundler/resolver/base.rb +1 -1
- data/lib/bundler/resolver/incompatibility.rb +1 -1
- data/lib/bundler/resolver/spec_group.rb +1 -4
- data/lib/bundler/resolver.rb +16 -16
- data/lib/bundler/ruby_dsl.rb +20 -12
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +24 -50
- data/lib/bundler/rubygems_gem_installer.rb +6 -56
- data/lib/bundler/rubygems_integration.rb +25 -94
- data/lib/bundler/runtime.rb +2 -2
- data/lib/bundler/self_manager.rb +23 -7
- data/lib/bundler/settings.rb +27 -7
- data/lib/bundler/setup.rb +4 -1
- data/lib/bundler/shared_helpers.rb +35 -13
- data/lib/bundler/source/git/git_proxy.rb +15 -15
- data/lib/bundler/source/git.rb +4 -3
- data/lib/bundler/source/metadata.rb +15 -15
- data/lib/bundler/source/path.rb +7 -6
- data/lib/bundler/source/rubygems.rb +21 -14
- data/lib/bundler/source.rb +2 -0
- data/lib/bundler/spec_set.rb +38 -10
- data/lib/bundler/stub_specification.rb +1 -0
- data/lib/bundler/templates/Executable.bundler +1 -1
- data/lib/bundler/templates/newgem/README.md.tt +3 -3
- data/lib/bundler/templates/newgem/Rakefile.tt +2 -6
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
- data/lib/bundler/templates/newgem/standard.yml.tt +1 -1
- data/lib/bundler/ui/shell.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +35 -35
- data/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendored_net_http.rb +8 -0
- data/lib/bundler/vendored_persistent.rb +0 -4
- data/lib/bundler/vendored_timeout.rb +8 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/vlad.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +3 -3
- data/lib/bundler.rb +38 -27
- metadata +11 -5
@@ -10,22 +10,22 @@ module Bundler
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.default
|
11
11
|
end
|
12
12
|
|
13
|
-
|
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 }
|
data/lib/bundler/source/path.rb
CHANGED
@@ -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, :
|
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}
|
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
|
-
:
|
240
|
-
:
|
241
|
-
:
|
242
|
-
:
|
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
|
-
:
|
174
|
-
:
|
175
|
-
:
|
176
|
-
:
|
177
|
-
:
|
178
|
-
:
|
179
|
-
:
|
180
|
-
:
|
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
|
257
|
-
@
|
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
|
-
|
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.
|
data/lib/bundler/source.rb
CHANGED
data/lib/bundler/spec_set.rb
CHANGED
@@ -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
|
@@ -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
|
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 `
|
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
|
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
|
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 "
|
7
|
+
require "minitest/test_task"
|
8
8
|
|
9
|
-
|
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"
|
data/lib/bundler/ui/shell.rb
CHANGED
@@ -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
|
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,4 +1,4 @@
|
|
1
|
-
|
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
|
-
|
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.
|
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
|
-
|
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
|
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 =
|
31
|
+
@last_use = Gem::Net::HTTP::Persistent::EPOCH
|
32
32
|
@requests = 0
|
33
33
|
end
|
34
34
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
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 =
|
9
|
+
@available = Gem::Net::HTTP::Persistent::TimedStackMulti.new(@size, &block)
|
10
10
|
@key = "current-#{@available.object_id}"
|
11
11
|
end
|
12
12
|
|