bundler 2.1.3 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1575 -1423
- data/README.md +6 -8
- data/bundler.gemspec +3 -3
- data/exe/bundle +3 -0
- data/lib/bundler.rb +35 -7
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli.rb +58 -21
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +1 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +14 -0
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +1 -1
- data/lib/bundler/cli/exec.rb +4 -4
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +84 -11
- data/lib/bundler/cli/info.rb +15 -4
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/inject.rb +1 -1
- data/lib/bundler/cli/install.rb +9 -16
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +87 -66
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +2 -0
- data/lib/bundler/compact_index_client.rb +1 -1
- data/lib/bundler/compact_index_client/cache.rb +1 -1
- data/lib/bundler/compact_index_client/updater.rb +5 -5
- data/lib/bundler/definition.rb +49 -72
- data/lib/bundler/dep_proxy.rb +1 -1
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +5 -9
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -3
- data/lib/bundler/fetcher.rb +4 -3
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +1 -1
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +32 -17
- data/lib/bundler/gem_helpers.rb +6 -1
- data/lib/bundler/gem_version_promoter.rb +2 -2
- data/lib/bundler/graph.rb +1 -1
- data/lib/bundler/index.rb +6 -2
- data/lib/bundler/injector.rb +22 -4
- data/lib/bundler/inline.rb +2 -2
- data/lib/bundler/installer.rb +35 -32
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +10 -10
- data/lib/bundler/installer/standalone.rb +2 -2
- data/lib/bundler/lazy_specification.rb +34 -9
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +1 -1
- data/lib/bundler/man/.document +1 -0
- data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
- data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
- data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
- data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
- data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
- data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
- data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
- data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
- data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
- data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
- data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
- data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
- data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
- data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
- data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
- data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
- data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
- data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
- data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin.rb +30 -5
- data/lib/bundler/plugin/api/source.rb +1 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer.rb +1 -1
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/source_list.rb +1 -1
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver.rb +35 -18
- data/lib/bundler/resolver/spec_group.rb +28 -11
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +53 -9
- data/lib/bundler/rubygems_gem_installer.rb +3 -9
- data/lib/bundler/rubygems_integration.rb +25 -55
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +49 -46
- data/lib/bundler/shared_helpers.rb +2 -2
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source.rb +1 -1
- data/lib/bundler/source/git.rb +5 -5
- data/lib/bundler/source/git/git_proxy.rb +57 -60
- data/lib/bundler/source/path.rb +7 -3
- data/lib/bundler/source/path/installer.rb +8 -10
- data/lib/bundler/source/rubygems.rb +13 -16
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source_list.rb +2 -2
- data/lib/bundler/spec_set.rb +2 -1
- data/lib/bundler/stub_specification.rb +17 -7
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/README.md.tt +1 -2
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -6
- data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/shell.rb +5 -5
- data/lib/bundler/uri_credentials_filter.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +79 -208
- data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendored_persistent.rb +0 -7
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +1 -1
- data/man/bundle-add.1 +1 -1
- data/man/bundle-binstubs.1 +5 -3
- data/man/bundle-cache.1 +1 -1
- data/man/bundle-check.1 +1 -1
- data/man/bundle-clean.1 +1 -1
- data/man/bundle-config.1 +16 -25
- data/man/bundle-doctor.1 +1 -1
- data/man/bundle-exec.1 +1 -1
- data/man/bundle-gem.1 +25 -3
- data/man/bundle-info.1 +1 -1
- data/man/bundle-init.1 +1 -1
- data/man/bundle-inject.1 +1 -1
- data/man/bundle-install.1 +30 -3
- data/man/bundle-list.1 +7 -7
- data/man/bundle-lock.1 +1 -1
- data/man/bundle-open.1 +1 -1
- data/man/bundle-outdated.1 +1 -1
- data/man/bundle-platform.1 +1 -1
- data/man/bundle-pristine.1 +1 -1
- data/man/bundle-remove.1 +1 -1
- data/man/bundle-show.1 +1 -1
- data/man/bundle-update.1 +1 -1
- data/man/bundle-viz.1 +1 -1
- data/man/bundle.1 +1 -1
- data/man/gemfile.5 +4 -4
- metadata +43 -59
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/man/bundle-add.1.txt +0 -58
- data/man/bundle-binstubs.1.txt +0 -48
- data/man/bundle-cache.1.txt +0 -78
- data/man/bundle-check.1.txt +0 -33
- data/man/bundle-clean.1.txt +0 -26
- data/man/bundle-config.1.txt +0 -528
- data/man/bundle-doctor.1.txt +0 -44
- data/man/bundle-exec.1.txt +0 -178
- data/man/bundle-gem.1.txt +0 -91
- data/man/bundle-info.1.txt +0 -21
- data/man/bundle-init.1.txt +0 -34
- data/man/bundle-inject.1.txt +0 -32
- data/man/bundle-install.1.txt +0 -401
- data/man/bundle-list.1.txt +0 -43
- data/man/bundle-lock.1.txt +0 -93
- data/man/bundle-open.1.txt +0 -29
- data/man/bundle-outdated.1.txt +0 -131
- data/man/bundle-platform.1.txt +0 -57
- data/man/bundle-pristine.1.txt +0 -44
- data/man/bundle-remove.1.txt +0 -34
- data/man/bundle-show.1.txt +0 -27
- data/man/bundle-update.1.txt +0 -390
- data/man/bundle-viz.1.txt +0 -39
- data/man/bundle.1.txt +0 -116
- data/man/gemfile.5.txt +0 -649
@@ -124,6 +124,7 @@ module Bundler::Molinillo
|
|
124
124
|
dot.join("\n")
|
125
125
|
end
|
126
126
|
|
127
|
+
# @param [DependencyGraph] other
|
127
128
|
# @return [Boolean] whether the two dependency graphs are equal, determined
|
128
129
|
# by a recursive traversal of each {#root_vertices} and its
|
129
130
|
# {Vertex#successors}
|
@@ -190,7 +191,7 @@ module Bundler::Molinillo
|
|
190
191
|
# @return [Edge] the added edge
|
191
192
|
def add_edge(origin, destination, requirement)
|
192
193
|
if destination.path_to?(origin)
|
193
|
-
raise CircularDependencyError.new(
|
194
|
+
raise CircularDependencyError.new(path(destination, origin))
|
194
195
|
end
|
195
196
|
add_edge_no_circular(origin, destination, requirement)
|
196
197
|
end
|
@@ -219,5 +220,37 @@ module Bundler::Molinillo
|
|
219
220
|
def add_edge_no_circular(origin, destination, requirement)
|
220
221
|
log.add_edge_no_circular(self, origin.name, destination.name, requirement)
|
221
222
|
end
|
223
|
+
|
224
|
+
# Returns the path between two vertices
|
225
|
+
# @raise [ArgumentError] if there is no path between the vertices
|
226
|
+
# @param [Vertex] from
|
227
|
+
# @param [Vertex] to
|
228
|
+
# @return [Array<Vertex>] the shortest path from `from` to `to`
|
229
|
+
def path(from, to)
|
230
|
+
distances = Hash.new(vertices.size + 1)
|
231
|
+
distances[from.name] = 0
|
232
|
+
predecessors = {}
|
233
|
+
each do |vertex|
|
234
|
+
vertex.successors.each do |successor|
|
235
|
+
if distances[successor.name] > distances[vertex.name] + 1
|
236
|
+
distances[successor.name] = distances[vertex.name] + 1
|
237
|
+
predecessors[successor] = vertex
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
path = [to]
|
243
|
+
while before = predecessors[to]
|
244
|
+
path << before
|
245
|
+
to = before
|
246
|
+
break if to == from
|
247
|
+
end
|
248
|
+
|
249
|
+
unless path.last.equal?(from)
|
250
|
+
raise ArgumentError, "There is no path from #{from.name} to #{to.name}"
|
251
|
+
end
|
252
|
+
|
253
|
+
path.reverse
|
254
|
+
end
|
222
255
|
end
|
223
256
|
end
|
@@ -65,7 +65,7 @@ module Bundler::Molinillo
|
|
65
65
|
# @param [SpecificationProvider] specification_provider see {#specification_provider}
|
66
66
|
def initialize(conflicts, specification_provider)
|
67
67
|
pairs = []
|
68
|
-
|
68
|
+
conflicts.values.flat_map(&:requirements).each do |conflicting|
|
69
69
|
conflicting.each do |source, conflict_requirements|
|
70
70
|
conflict_requirements.each do |c|
|
71
71
|
pairs << [c, source]
|
@@ -207,7 +207,7 @@ module Bundler::Molinillo
|
|
207
207
|
def start_resolution
|
208
208
|
@started_at = Time.now
|
209
209
|
|
210
|
-
|
210
|
+
push_initial_state
|
211
211
|
|
212
212
|
debug { "Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}" }
|
213
213
|
resolver_ui.before_resolution
|
@@ -273,10 +273,10 @@ module Bundler::Molinillo
|
|
273
273
|
states.last
|
274
274
|
end
|
275
275
|
|
276
|
-
# Creates the initial state for the resolution, based upon the
|
276
|
+
# Creates and pushes the initial state for the resolution, based upon the
|
277
277
|
# {#requested} dependencies
|
278
|
-
# @return [
|
279
|
-
def
|
278
|
+
# @return [void]
|
279
|
+
def push_initial_state
|
280
280
|
graph = DependencyGraph.new.tap do |dg|
|
281
281
|
original_requested.each do |requested|
|
282
282
|
vertex = dg.add_vertex(name_for(requested), nil, true)
|
@@ -285,18 +285,7 @@ module Bundler::Molinillo
|
|
285
285
|
dg.tag(:initial_state)
|
286
286
|
end
|
287
287
|
|
288
|
-
|
289
|
-
initial_requirement = requirements.shift
|
290
|
-
DependencyState.new(
|
291
|
-
initial_requirement && name_for(initial_requirement),
|
292
|
-
requirements,
|
293
|
-
graph,
|
294
|
-
initial_requirement,
|
295
|
-
possibilities_for_requirement(initial_requirement, graph),
|
296
|
-
0,
|
297
|
-
{},
|
298
|
-
[]
|
299
|
-
)
|
288
|
+
push_state_for_requirements(original_requested, true, graph)
|
300
289
|
end
|
301
290
|
|
302
291
|
# Unwinds the states stack because a conflict has been encountered
|
@@ -361,7 +350,7 @@ module Bundler::Molinillo
|
|
361
350
|
current_detail
|
362
351
|
end
|
363
352
|
|
364
|
-
# @param [Array<Object>] array of requirements that combine to create a conflict
|
353
|
+
# @param [Array<Object>] binding_requirements array of requirements that combine to create a conflict
|
365
354
|
# @return [Array<UnwindDetails>] array of UnwindDetails that have a chance
|
366
355
|
# of resolving the passed requirements
|
367
356
|
def unwind_options_for_requirements(binding_requirements)
|
@@ -429,7 +418,7 @@ module Bundler::Molinillo
|
|
429
418
|
end
|
430
419
|
|
431
420
|
# @param [DependencyState] state
|
432
|
-
# @param [Array] array of requirements
|
421
|
+
# @param [Array] binding_requirements array of requirements
|
433
422
|
# @return [Boolean] whether or not the given state has any possibilities
|
434
423
|
# that could satisfy the given requirements
|
435
424
|
def conflict_fixing_possibilities?(state, binding_requirements)
|
@@ -444,7 +433,8 @@ module Bundler::Molinillo
|
|
444
433
|
|
445
434
|
# Filter's a state's possibilities to remove any that would not fix the
|
446
435
|
# conflict we've just rewound from
|
447
|
-
# @param [UnwindDetails] details of the conflict just
|
436
|
+
# @param [UnwindDetails] unwind_details details of the conflict just
|
437
|
+
# unwound from
|
448
438
|
# @return [void]
|
449
439
|
def filter_possibilities_after_unwind(unwind_details)
|
450
440
|
return unless state && !state.possibilities.empty?
|
@@ -458,7 +448,7 @@ module Bundler::Molinillo
|
|
458
448
|
|
459
449
|
# Filter's a state's possibilities to remove any that would not satisfy
|
460
450
|
# the requirements in the conflict we've just rewound from
|
461
|
-
# @param [UnwindDetails] details of the conflict just unwound from
|
451
|
+
# @param [UnwindDetails] unwind_details details of the conflict just unwound from
|
462
452
|
# @return [void]
|
463
453
|
def filter_possibilities_for_primary_unwind(unwind_details)
|
464
454
|
unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
|
@@ -491,7 +481,7 @@ module Bundler::Molinillo
|
|
491
481
|
|
492
482
|
# Filter's a state's possibilities to remove any that would (eventually)
|
493
483
|
# create a requirement in the conflict we've just rewound from
|
494
|
-
# @param [UnwindDetails] details of the conflict just unwound from
|
484
|
+
# @param [UnwindDetails] unwind_details details of the conflict just unwound from
|
495
485
|
# @return [void]
|
496
486
|
def filter_possibilities_for_parent_unwind(unwind_details)
|
497
487
|
unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
|
@@ -500,7 +490,7 @@ module Bundler::Molinillo
|
|
500
490
|
primary_unwinds = unwinds_to_state.select(&:unwinding_to_primary_requirement?).uniq
|
501
491
|
parent_unwinds = unwinds_to_state.uniq - primary_unwinds
|
502
492
|
|
503
|
-
allowed_possibility_sets =
|
493
|
+
allowed_possibility_sets = primary_unwinds.flat_map do |unwind|
|
504
494
|
states[unwind.state_index].possibilities.select do |possibility_set|
|
505
495
|
possibility_set.possibilities.any? do |poss|
|
506
496
|
possibility_satisfies_requirements?(poss, unwind.conflicting_requirements)
|
@@ -508,7 +498,7 @@ module Bundler::Molinillo
|
|
508
498
|
end
|
509
499
|
end
|
510
500
|
|
511
|
-
requirements_to_avoid =
|
501
|
+
requirements_to_avoid = parent_unwinds.flat_map(&:sub_dependencies_to_avoid)
|
512
502
|
|
513
503
|
state.possibilities.reject! do |possibility_set|
|
514
504
|
!allowed_possibility_sets.include?(possibility_set) &&
|
@@ -524,12 +514,12 @@ module Bundler::Molinillo
|
|
524
514
|
|
525
515
|
possible_binding_requirements = conflict.requirements.values.flatten(1).uniq
|
526
516
|
|
527
|
-
# When there
|
528
|
-
# (the one causing the circular) won
|
529
|
-
# (which won
|
530
|
-
# because it
|
531
|
-
# We need to make sure we have that requirement in the conflict
|
532
|
-
# otherwise we won
|
517
|
+
# When there's a `CircularDependency` error the conflicting requirement
|
518
|
+
# (the one causing the circular) won't be `conflict.requirement`
|
519
|
+
# (which won't be for the right state, because we won't have created it,
|
520
|
+
# because it's circular).
|
521
|
+
# We need to make sure we have that requirement in the conflict's list,
|
522
|
+
# otherwise we won't be able to unwind properly, so we just return all
|
533
523
|
# the requirements for the conflict.
|
534
524
|
return possible_binding_requirements if conflict.underlying_error
|
535
525
|
|
@@ -558,8 +548,8 @@ module Bundler::Molinillo
|
|
558
548
|
end
|
559
549
|
|
560
550
|
# @param [Object] requirement we wish to check
|
561
|
-
# @param [Array] array of requirements
|
562
|
-
# @param [Array] array of possibilities the requirements will be used to filter
|
551
|
+
# @param [Array] possible_binding_requirements array of requirements
|
552
|
+
# @param [Array] possibilities array of possibilities the requirements will be used to filter
|
563
553
|
# @return [Boolean] whether or not the given requirement is required to filter
|
564
554
|
# out all elements of the array of possibilities.
|
565
555
|
def binding_requirement_in_set?(requirement, possible_binding_requirements, possibilities)
|
@@ -568,6 +558,7 @@ module Bundler::Molinillo
|
|
568
558
|
end
|
569
559
|
end
|
570
560
|
|
561
|
+
# @param [Object] requirement
|
571
562
|
# @return [Object] the requirement that led to `requirement` being added
|
572
563
|
# to the list of requirements.
|
573
564
|
def parent_of(requirement)
|
@@ -577,6 +568,7 @@ module Bundler::Molinillo
|
|
577
568
|
parent_state.requirement
|
578
569
|
end
|
579
570
|
|
571
|
+
# @param [String] name
|
580
572
|
# @return [Object] the requirement that led to a version of a possibility
|
581
573
|
# with the given name being activated.
|
582
574
|
def requirement_for_existing_name(name)
|
@@ -585,6 +577,7 @@ module Bundler::Molinillo
|
|
585
577
|
states.find { |s| s.name == name }.requirement
|
586
578
|
end
|
587
579
|
|
580
|
+
# @param [Object] requirement
|
588
581
|
# @return [ResolutionState] the state whose `requirement` is the given
|
589
582
|
# `requirement`.
|
590
583
|
def find_state_for(requirement)
|
@@ -592,6 +585,7 @@ module Bundler::Molinillo
|
|
592
585
|
states.find { |i| requirement == i.requirement }
|
593
586
|
end
|
594
587
|
|
588
|
+
# @param [Object] underlying_error
|
595
589
|
# @return [Conflict] a {Conflict} that reflects the failure to activate
|
596
590
|
# the {#possibility} in conjunction with the current {#state}
|
597
591
|
def create_conflict(underlying_error = nil)
|
@@ -628,6 +622,7 @@ module Bundler::Molinillo
|
|
628
622
|
vertex.requirements.map { |r| requirement_tree_for(r) }
|
629
623
|
end
|
630
624
|
|
625
|
+
# @param [Object] requirement
|
631
626
|
# @return [Array<Object>] the list of requirements that led to
|
632
627
|
# `requirement` being required.
|
633
628
|
def requirement_tree_for(requirement)
|
@@ -673,9 +668,8 @@ module Bundler::Molinillo
|
|
673
668
|
attempt_to_filter_existing_spec(existing_vertex)
|
674
669
|
else
|
675
670
|
latest = possibility.latest_version
|
676
|
-
|
677
|
-
|
678
|
-
!requirement_satisfied_by?(requirement, activated, possibility)
|
671
|
+
possibility.possibilities.select! do |possibility|
|
672
|
+
requirement_satisfied_by?(requirement, activated, possibility)
|
679
673
|
end
|
680
674
|
if possibility.latest_version.nil?
|
681
675
|
# ensure there's a possibility for better error messages
|
@@ -705,7 +699,7 @@ module Bundler::Molinillo
|
|
705
699
|
|
706
700
|
# Generates a filtered version of the existing vertex's `PossibilitySet` using the
|
707
701
|
# current state's `requirement`
|
708
|
-
# @param [Object] existing vertex
|
702
|
+
# @param [Object] vertex existing vertex
|
709
703
|
# @return [PossibilitySet] filtered possibility set
|
710
704
|
def filtered_possibility_set(vertex)
|
711
705
|
PossibilitySet.new(vertex.payload.dependencies, vertex.payload.possibilities & possibility.possibilities)
|
@@ -730,7 +724,7 @@ module Bundler::Molinillo
|
|
730
724
|
end
|
731
725
|
|
732
726
|
# Requires the dependencies that the recently activated spec has
|
733
|
-
# @param [Object]
|
727
|
+
# @param [Object] possibility_set the PossibilitySet that has just been
|
734
728
|
# activated
|
735
729
|
# @return [void]
|
736
730
|
def require_nested_dependencies_for(possibility_set)
|
@@ -749,6 +743,8 @@ module Bundler::Molinillo
|
|
749
743
|
# Pushes a new {DependencyState} that encapsulates both existing and new
|
750
744
|
# requirements
|
751
745
|
# @param [Array] new_requirements
|
746
|
+
# @param [Boolean] requires_sort
|
747
|
+
# @param [Object] new_activated
|
752
748
|
# @return [void]
|
753
749
|
def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated)
|
754
750
|
new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts) if requires_sort
|
@@ -767,7 +763,8 @@ module Bundler::Molinillo
|
|
767
763
|
|
768
764
|
# Checks a proposed requirement with any existing locked requirement
|
769
765
|
# before generating an array of possibilities for it.
|
770
|
-
# @param [Object] the proposed requirement
|
766
|
+
# @param [Object] requirement the proposed requirement
|
767
|
+
# @param [Object] activated
|
771
768
|
# @return [Array] possibilities
|
772
769
|
def possibilities_for_requirement(requirement, activated = self.activated)
|
773
770
|
return [] unless requirement
|
@@ -778,7 +775,8 @@ module Bundler::Molinillo
|
|
778
775
|
group_possibilities(search_for(requirement))
|
779
776
|
end
|
780
777
|
|
781
|
-
# @param [Object] the proposed requirement
|
778
|
+
# @param [Object] requirement the proposed requirement
|
779
|
+
# @param [Object] activated
|
782
780
|
# @return [Array] possibility set containing only the locked requirement, if any
|
783
781
|
def locked_requirement_possibility_set(requirement, activated = self.activated)
|
784
782
|
all_possibilities = search_for(requirement)
|
@@ -797,8 +795,8 @@ module Bundler::Molinillo
|
|
797
795
|
# Build an array of PossibilitySets, with each element representing a group of
|
798
796
|
# dependency versions that all have the same sub-dependency version constraints
|
799
797
|
# and are contiguous.
|
800
|
-
# @param [Array] an array of possibilities
|
801
|
-
# @return [Array] an array of possibility sets
|
798
|
+
# @param [Array] possibilities an array of possibilities
|
799
|
+
# @return [Array<PossibilitySet>] an array of possibility sets
|
802
800
|
def group_possibilities(possibilities)
|
803
801
|
possibility_sets = []
|
804
802
|
current_possibility_set = nil
|
@@ -3,11 +3,6 @@ require_relative '../../../../uri/lib/uri'
|
|
3
3
|
require 'cgi' # for escaping
|
4
4
|
require_relative '../../../../connection_pool/lib/connection_pool'
|
5
5
|
|
6
|
-
begin
|
7
|
-
require 'net/http/pipeline'
|
8
|
-
rescue LoadError
|
9
|
-
end
|
10
|
-
|
11
6
|
autoload :OpenSSL, 'openssl'
|
12
7
|
|
13
8
|
##
|
@@ -17,15 +12,11 @@ autoload :OpenSSL, 'openssl'
|
|
17
12
|
# servers you wish to talk to. For each host:port you communicate with a
|
18
13
|
# single persistent connection is created.
|
19
14
|
#
|
20
|
-
#
|
21
|
-
# connections.
|
22
|
-
#
|
23
|
-
# For each thread you start a new connection will be created. A
|
24
|
-
# Bundler::Persistent::Net::HTTP::Persistent connection will not be shared across threads.
|
15
|
+
# Connections will be shared across threads through a connection pool to
|
16
|
+
# increase reuse of connections.
|
25
17
|
#
|
26
|
-
# You can shut down
|
27
|
-
#
|
28
|
-
# method.
|
18
|
+
# You can shut down any remaining HTTP connections when done by calling
|
19
|
+
# #shutdown.
|
29
20
|
#
|
30
21
|
# Example:
|
31
22
|
#
|
@@ -33,7 +24,7 @@ autoload :OpenSSL, 'openssl'
|
|
33
24
|
#
|
34
25
|
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
35
26
|
#
|
36
|
-
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
27
|
+
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
37
28
|
#
|
38
29
|
# # perform a GET
|
39
30
|
# response = http.request uri
|
@@ -55,14 +46,14 @@ autoload :OpenSSL, 'openssl'
|
|
55
46
|
# to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
|
56
47
|
# params which are sent in the body for other requests.
|
57
48
|
#
|
58
|
-
# == SSL
|
49
|
+
# == TLS/SSL
|
59
50
|
#
|
60
|
-
#
|
61
|
-
# Bundler::URI.
|
51
|
+
# TLS connections are automatically created depending upon the scheme of the
|
52
|
+
# Bundler::URI. TLS connections are automatically verified against the default
|
62
53
|
# certificate store for your computer. You can override this by changing
|
63
54
|
# verify_mode or by specifying an alternate cert_store.
|
64
55
|
#
|
65
|
-
# Here are the
|
56
|
+
# Here are the TLS settings, see the individual methods for documentation:
|
66
57
|
#
|
67
58
|
# #certificate :: This client's certificate
|
68
59
|
# #ca_file :: The certificate-authorities
|
@@ -72,7 +63,7 @@ autoload :OpenSSL, 'openssl'
|
|
72
63
|
# #private_key :: The client's SSL private key
|
73
64
|
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
|
74
65
|
# connection
|
75
|
-
# #ssl_timeout ::
|
66
|
+
# #ssl_timeout :: Session lifetime
|
76
67
|
# #ssl_version :: Which specific SSL version to use
|
77
68
|
# #verify_callback :: For server certificate verification
|
78
69
|
# #verify_depth :: Depth of certificate verification
|
@@ -101,14 +92,15 @@ autoload :OpenSSL, 'openssl'
|
|
101
92
|
#
|
102
93
|
# === Segregation
|
103
94
|
#
|
104
|
-
#
|
105
|
-
#
|
95
|
+
# Each Bundler::Persistent::Net::HTTP::Persistent instance has its own pool of connections. There
|
96
|
+
# is no sharing with other instances (as was true in earlier versions).
|
106
97
|
#
|
107
98
|
# === Idle Timeout
|
108
99
|
#
|
109
|
-
# If a connection hasn't been used for this number of seconds it will
|
110
|
-
# reset upon the next use to avoid attempting to send to a
|
111
|
-
# The default value is 5 seconds. nil means no timeout.
|
100
|
+
# If a connection hasn't been used for this number of seconds it will
|
101
|
+
# automatically be reset upon the next use to avoid attempting to send to a
|
102
|
+
# closed connection. The default value is 5 seconds. nil means no timeout.
|
103
|
+
# Set through #idle_timeout.
|
112
104
|
#
|
113
105
|
# Reducing this value may help avoid the "too many connection resets" error
|
114
106
|
# when sending non-idempotent requests while increasing this value will cause
|
@@ -123,8 +115,9 @@ autoload :OpenSSL, 'openssl'
|
|
123
115
|
#
|
124
116
|
# The number of requests that should be made before opening a new connection.
|
125
117
|
# Typically many keep-alive capable servers tune this to 100 or less, so the
|
126
|
-
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
127
|
-
# effect, if set, connections will be reset on the request after
|
118
|
+
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
119
|
+
# no effect, if set, connections will be reset on the request after
|
120
|
+
# max_requests.
|
128
121
|
#
|
129
122
|
# === Open Timeout
|
130
123
|
#
|
@@ -136,45 +129,6 @@ autoload :OpenSSL, 'openssl'
|
|
136
129
|
# Socket options may be set on newly-created connections. See #socket_options
|
137
130
|
# for details.
|
138
131
|
#
|
139
|
-
# === Non-Idempotent Requests
|
140
|
-
#
|
141
|
-
# By default non-idempotent requests will not be retried per RFC 2616. By
|
142
|
-
# setting retry_change_requests to true requests will automatically be retried
|
143
|
-
# once.
|
144
|
-
#
|
145
|
-
# Only do this when you know that retrying a POST or other non-idempotent
|
146
|
-
# request is safe for your application and will not create duplicate
|
147
|
-
# resources.
|
148
|
-
#
|
149
|
-
# The recommended way to handle non-idempotent requests is the following:
|
150
|
-
#
|
151
|
-
# require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
152
|
-
#
|
153
|
-
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
154
|
-
# post_uri = uri + 'create'
|
155
|
-
#
|
156
|
-
# http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
|
157
|
-
#
|
158
|
-
# post = Net::HTTP::Post.new post_uri.path
|
159
|
-
# # ... fill in POST request
|
160
|
-
#
|
161
|
-
# begin
|
162
|
-
# response = http.request post_uri, post
|
163
|
-
# rescue Bundler::Persistent::Net::HTTP::Persistent::Error
|
164
|
-
#
|
165
|
-
# # POST failed, make a new request to verify the server did not process
|
166
|
-
# # the request
|
167
|
-
# exists_uri = uri + '...'
|
168
|
-
# response = http.get exists_uri
|
169
|
-
#
|
170
|
-
# # Retry if it failed
|
171
|
-
# retry if response.code == '404'
|
172
|
-
# end
|
173
|
-
#
|
174
|
-
# The method of determining if the resource was created or not is unique to
|
175
|
-
# the particular service you are using. Of course, you will want to add
|
176
|
-
# protection from infinite looping.
|
177
|
-
#
|
178
132
|
# === Connection Termination
|
179
133
|
#
|
180
134
|
# If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
|
@@ -200,33 +154,27 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
200
154
|
HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
|
201
155
|
|
202
156
|
##
|
203
|
-
# The default connection pool size is 1/4 the allowed open files
|
157
|
+
# The default connection pool size is 1/4 the allowed open files
|
158
|
+
# (<code>ulimit -n</code>) or 256 if your OS does not support file handle
|
159
|
+
# limits (typically windows).
|
204
160
|
|
205
|
-
if
|
206
|
-
|
161
|
+
if Process.const_defined? :RLIMIT_NOFILE
|
162
|
+
open_file_limits = Process.getrlimit(Process::RLIMIT_NOFILE)
|
163
|
+
|
164
|
+
# Under JRuby on Windows Process responds to `getrlimit` but returns something that does not match docs
|
165
|
+
if open_file_limits.respond_to?(:first)
|
166
|
+
DEFAULT_POOL_SIZE = open_file_limits.first / 4
|
167
|
+
else
|
168
|
+
DEFAULT_POOL_SIZE = 256
|
169
|
+
end
|
207
170
|
else
|
208
|
-
DEFAULT_POOL_SIZE =
|
171
|
+
DEFAULT_POOL_SIZE = 256
|
209
172
|
end
|
210
173
|
|
211
174
|
##
|
212
175
|
# The version of Bundler::Persistent::Net::HTTP::Persistent you are using
|
213
176
|
|
214
|
-
VERSION = '
|
215
|
-
|
216
|
-
##
|
217
|
-
# Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with
|
218
|
-
# the exception list for ruby 1.x.
|
219
|
-
|
220
|
-
RETRIED_EXCEPTIONS = [ # :nodoc:
|
221
|
-
(Net::ReadTimeout if Net.const_defined? :ReadTimeout),
|
222
|
-
IOError,
|
223
|
-
EOFError,
|
224
|
-
Errno::ECONNRESET,
|
225
|
-
Errno::ECONNABORTED,
|
226
|
-
Errno::EPIPE,
|
227
|
-
(OpenSSL::SSL::SSLError if HAVE_OPENSSL),
|
228
|
-
Timeout::Error,
|
229
|
-
].compact
|
177
|
+
VERSION = '4.0.0'
|
230
178
|
|
231
179
|
##
|
232
180
|
# Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
|
@@ -353,6 +301,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
353
301
|
|
354
302
|
attr_accessor :max_requests
|
355
303
|
|
304
|
+
##
|
305
|
+
# Number of retries to perform if a request fails.
|
306
|
+
#
|
307
|
+
# See also #max_retries=, Net::HTTP#max_retries=.
|
308
|
+
|
309
|
+
attr_reader :max_retries
|
310
|
+
|
356
311
|
##
|
357
312
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
358
313
|
# HTTP/1.1 servers.
|
@@ -365,8 +320,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
365
320
|
attr_accessor :keep_alive
|
366
321
|
|
367
322
|
##
|
368
|
-
#
|
369
|
-
# from everybody else's.
|
323
|
+
# The name for this collection of persistent connections.
|
370
324
|
|
371
325
|
attr_reader :name
|
372
326
|
|
@@ -495,23 +449,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
495
449
|
|
496
450
|
attr_reader :verify_mode
|
497
451
|
|
498
|
-
##
|
499
|
-
# Enable retries of non-idempotent requests that change data (e.g. POST
|
500
|
-
# requests) when the server has disconnected.
|
501
|
-
#
|
502
|
-
# This will in the worst case lead to multiple requests with the same data,
|
503
|
-
# but it may be useful for some applications. Take care when enabling
|
504
|
-
# this option to ensure it is safe to POST or perform other non-idempotent
|
505
|
-
# requests to the server.
|
506
|
-
|
507
|
-
attr_accessor :retry_change_requests
|
508
|
-
|
509
452
|
##
|
510
453
|
# Creates a new Bundler::Persistent::Net::HTTP::Persistent.
|
511
454
|
#
|
512
|
-
# Set +name+
|
513
|
-
#
|
514
|
-
# good enough. This parameter will be required in a future version.
|
455
|
+
# Set a +name+ for fun. Your library name should be good enough, but this
|
456
|
+
# otherwise has no purpose.
|
515
457
|
#
|
516
458
|
# +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
|
517
459
|
# the environment. See proxy_from_env for details.
|
@@ -524,8 +466,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
524
466
|
# proxy.password = 'hunter2'
|
525
467
|
#
|
526
468
|
# Set +pool_size+ to limit the maximum number of connections allowed.
|
527
|
-
# Defaults to 1/4 the number of allowed file handles
|
528
|
-
#
|
469
|
+
# Defaults to 1/4 the number of allowed file handles or 256 if your OS does
|
470
|
+
# not support a limit on allowed file handles. You can have no more than
|
471
|
+
# this many threads with active HTTP transactions.
|
529
472
|
|
530
473
|
def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
|
531
474
|
@name = name
|
@@ -542,6 +485,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
542
485
|
@write_timeout = nil
|
543
486
|
@idle_timeout = 5
|
544
487
|
@max_requests = nil
|
488
|
+
@max_retries = 1
|
545
489
|
@socket_options = []
|
546
490
|
@ssl_generation = 0 # incremented when SSL session variables change
|
547
491
|
|
@@ -573,8 +517,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
573
517
|
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
574
518
|
end
|
575
519
|
|
576
|
-
@retry_change_requests = false
|
577
|
-
|
578
520
|
self.proxy = proxy if proxy
|
579
521
|
end
|
580
522
|
|
@@ -635,7 +577,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
635
577
|
|
636
578
|
net_http_args = [uri.hostname, uri.port]
|
637
579
|
|
638
|
-
|
580
|
+
# I'm unsure if uri.host or uri.hostname should be checked against
|
581
|
+
# the proxy bypass list.
|
582
|
+
if @proxy_uri and not proxy_bypass? uri.host, uri.port then
|
639
583
|
net_http_args.concat @proxy_args
|
640
584
|
else
|
641
585
|
net_http_args.concat [nil, nil, nil, nil]
|
@@ -655,9 +599,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
655
599
|
reset connection
|
656
600
|
end
|
657
601
|
|
658
|
-
http.
|
659
|
-
http.
|
660
|
-
http.
|
602
|
+
http.keep_alive_timeout = @idle_timeout if @idle_timeout
|
603
|
+
http.max_retries = @max_retries if http.respond_to?(:max_retries=)
|
604
|
+
http.read_timeout = @read_timeout if @read_timeout
|
605
|
+
http.write_timeout = @write_timeout if
|
606
|
+
@write_timeout && http.respond_to?(:write_timeout=)
|
661
607
|
|
662
608
|
return yield connection
|
663
609
|
rescue Errno::ECONNREFUSED
|
@@ -675,27 +621,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
675
621
|
end
|
676
622
|
|
677
623
|
##
|
678
|
-
#
|
679
|
-
# this connection
|
680
|
-
|
681
|
-
def error_message connection
|
682
|
-
connection.requests -= 1 # fixup
|
683
|
-
|
684
|
-
age = Time.now - connection.last_use
|
685
|
-
|
686
|
-
"after #{connection.requests} requests on #{connection.http.object_id}, " \
|
687
|
-
"last used #{age} seconds ago"
|
688
|
-
end
|
689
|
-
|
690
|
-
##
|
691
|
-
# Bundler::URI::escape wrapper
|
624
|
+
# CGI::escape wrapper
|
692
625
|
|
693
626
|
def escape str
|
694
627
|
CGI.escape str if str
|
695
628
|
end
|
696
629
|
|
697
630
|
##
|
698
|
-
#
|
631
|
+
# CGI::unescape wrapper
|
699
632
|
|
700
633
|
def unescape str
|
701
634
|
CGI.unescape str if str
|
@@ -738,6 +671,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
738
671
|
def finish connection
|
739
672
|
connection.finish
|
740
673
|
|
674
|
+
connection.http.instance_variable_set :@last_communicated, nil
|
741
675
|
connection.http.instance_variable_set :@ssl_session, nil unless
|
742
676
|
@reuse_ssl_sessions
|
743
677
|
end
|
@@ -746,24 +680,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
746
680
|
# Returns the HTTP protocol version for +uri+
|
747
681
|
|
748
682
|
def http_version uri
|
749
|
-
@http_versions["#{uri.
|
750
|
-
end
|
751
|
-
|
752
|
-
##
|
753
|
-
# Is +req+ idempotent according to RFC 2616?
|
754
|
-
|
755
|
-
def idempotent? req
|
756
|
-
case req.method
|
757
|
-
when 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE' then
|
758
|
-
true
|
759
|
-
end
|
760
|
-
end
|
761
|
-
|
762
|
-
##
|
763
|
-
# Is the request +req+ idempotent or is retry_change_requests allowed.
|
764
|
-
|
765
|
-
def can_retry? req
|
766
|
-
@retry_change_requests && !idempotent?(req)
|
683
|
+
@http_versions["#{uri.hostname}:#{uri.port}"]
|
767
684
|
end
|
768
685
|
|
769
686
|
##
|
@@ -774,20 +691,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
774
691
|
end
|
775
692
|
|
776
693
|
##
|
777
|
-
#
|
778
|
-
# block is given. Returns all responses received.
|
694
|
+
# Set the maximum number of retries for a request.
|
779
695
|
#
|
780
|
-
#
|
781
|
-
# Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
|
782
|
-
# for further details.
|
696
|
+
# Defaults to one retry.
|
783
697
|
#
|
784
|
-
#
|
785
|
-
# <tt>net-http-persistent</tt> #pipeline will be present.
|
698
|
+
# Set this to 0 to disable retries.
|
786
699
|
|
787
|
-
def
|
788
|
-
|
789
|
-
|
790
|
-
|
700
|
+
def max_retries= retries
|
701
|
+
retries = retries.to_int
|
702
|
+
|
703
|
+
raise ArgumentError, "max_retries must be positive" if retries < 0
|
704
|
+
|
705
|
+
@max_retries = retries
|
706
|
+
|
707
|
+
reconnect
|
791
708
|
end
|
792
709
|
|
793
710
|
##
|
@@ -828,7 +745,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
828
745
|
|
829
746
|
if @proxy_uri then
|
830
747
|
@proxy_args = [
|
831
|
-
@proxy_uri.
|
748
|
+
@proxy_uri.hostname,
|
832
749
|
@proxy_uri.port,
|
833
750
|
unescape(@proxy_uri.user),
|
834
751
|
unescape(@proxy_uri.password),
|
@@ -903,14 +820,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
903
820
|
end
|
904
821
|
|
905
822
|
##
|
906
|
-
# Forces reconnection of HTTP connections
|
823
|
+
# Forces reconnection of all HTTP connections, including TLS/SSL
|
824
|
+
# connections.
|
907
825
|
|
908
826
|
def reconnect
|
909
827
|
@generation += 1
|
910
828
|
end
|
911
829
|
|
912
830
|
##
|
913
|
-
# Forces reconnection of SSL connections.
|
831
|
+
# Forces reconnection of only TLS/SSL connections.
|
914
832
|
|
915
833
|
def reconnect_ssl
|
916
834
|
@ssl_generation += 1
|
@@ -943,14 +861,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
943
861
|
# the response will not have been read).
|
944
862
|
#
|
945
863
|
# +req+ must be a Net::HTTPGenericRequest subclass (see Net::HTTP for a list).
|
946
|
-
#
|
947
|
-
# If there is an error and the request is idempotent according to RFC 2616
|
948
|
-
# it will be retried automatically.
|
949
864
|
|
950
865
|
def request uri, req = nil, &block
|
951
|
-
retried = false
|
952
|
-
bad_response = false
|
953
|
-
|
954
866
|
uri = Bundler::URI uri
|
955
867
|
req = request_setup req || uri
|
956
868
|
response = nil
|
@@ -964,37 +876,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
964
876
|
response = http.request req, &block
|
965
877
|
|
966
878
|
if req.connection_close? or
|
967
|
-
|
879
|
+
(response.http_version <= '1.0' and
|
968
880
|
not response.connection_keep_alive?) or
|
969
|
-
|
881
|
+
response.connection_close? then
|
970
882
|
finish connection
|
971
883
|
end
|
972
|
-
rescue
|
973
|
-
message = error_message connection
|
974
|
-
|
975
|
-
finish connection
|
976
|
-
|
977
|
-
raise Error, "too many bad responses #{message}" if
|
978
|
-
bad_response or not can_retry? req
|
979
|
-
|
980
|
-
bad_response = true
|
981
|
-
retry
|
982
|
-
rescue *RETRIED_EXCEPTIONS => e
|
983
|
-
request_failed e, req, connection if
|
984
|
-
retried or not can_retry? req
|
985
|
-
|
986
|
-
reset connection
|
987
|
-
|
988
|
-
retried = true
|
989
|
-
retry
|
990
|
-
rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2
|
991
|
-
request_failed e, req, connection if retried or not can_retry? req
|
992
|
-
|
993
|
-
reset connection
|
994
|
-
|
995
|
-
retried = true
|
996
|
-
retry
|
997
|
-
rescue Exception => e
|
884
|
+
rescue Exception # make sure to close the connection when it was interrupted
|
998
885
|
finish connection
|
999
886
|
|
1000
887
|
raise
|
@@ -1003,26 +890,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1003
890
|
end
|
1004
891
|
end
|
1005
892
|
|
1006
|
-
@http_versions["#{uri.
|
893
|
+
@http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
|
1007
894
|
|
1008
895
|
response
|
1009
896
|
end
|
1010
897
|
|
1011
|
-
##
|
1012
|
-
# Raises an Error for +exception+ which resulted from attempting the request
|
1013
|
-
# +req+ on the +connection+.
|
1014
|
-
#
|
1015
|
-
# Finishes the +connection+.
|
1016
|
-
|
1017
|
-
def request_failed exception, req, connection # :nodoc:
|
1018
|
-
due_to = "(due to #{exception.message} - #{exception.class})"
|
1019
|
-
message = "too many connection resets #{due_to} #{error_message connection}"
|
1020
|
-
|
1021
|
-
finish connection
|
1022
|
-
|
1023
|
-
raise Error, message, exception.backtrace
|
1024
|
-
end
|
1025
|
-
|
1026
898
|
##
|
1027
899
|
# Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
|
1028
900
|
# request.
|
@@ -1030,7 +902,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1030
902
|
# Returns the request.
|
1031
903
|
|
1032
904
|
def request_setup req_or_uri # :nodoc:
|
1033
|
-
req = if
|
905
|
+
req = if req_or_uri.respond_to? 'request_uri' then
|
1034
906
|
Net::HTTP::Get.new req_or_uri.request_uri
|
1035
907
|
else
|
1036
908
|
req_or_uri
|
@@ -1194,7 +1066,6 @@ application:
|
|
1194
1066
|
|
1195
1067
|
reconnect_ssl
|
1196
1068
|
end
|
1197
|
-
|
1198
1069
|
end
|
1199
1070
|
|
1200
1071
|
require_relative 'persistent/connection'
|