bundler 2.1.2 → 2.2.0
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 -1422
- data/README.md +6 -8
- data/bundler.gemspec +3 -3
- data/exe/bundle +3 -0
- data/lib/bundler.rb +25 -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 +12 -18
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +88 -67
- 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 +47 -61
- data/lib/bundler/dep_proxy.rb +1 -1
- data/lib/bundler/dependency.rb +0 -9
- 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 +33 -19
- 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 +20 -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 +32 -10
- data/lib/bundler/resolver/spec_group.rb +27 -6
- 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 +26 -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 -5
- 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 +72 -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 +46 -62
- 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,20 @@ 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
|
-
DEFAULT_POOL_SIZE = 256
|
207
|
-
else
|
161
|
+
if Process.const_defined? :RLIMIT_NOFILE
|
208
162
|
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
|
163
|
+
else
|
164
|
+
DEFAULT_POOL_SIZE = 256
|
209
165
|
end
|
210
166
|
|
211
167
|
##
|
212
168
|
# The version of Bundler::Persistent::Net::HTTP::Persistent you are using
|
213
169
|
|
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
|
170
|
+
VERSION = '4.0.0'
|
230
171
|
|
231
172
|
##
|
232
173
|
# Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
|
@@ -353,6 +294,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
353
294
|
|
354
295
|
attr_accessor :max_requests
|
355
296
|
|
297
|
+
##
|
298
|
+
# Number of retries to perform if a request fails.
|
299
|
+
#
|
300
|
+
# See also #max_retries=, Net::HTTP#max_retries=.
|
301
|
+
|
302
|
+
attr_reader :max_retries
|
303
|
+
|
356
304
|
##
|
357
305
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
358
306
|
# HTTP/1.1 servers.
|
@@ -365,8 +313,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
365
313
|
attr_accessor :keep_alive
|
366
314
|
|
367
315
|
##
|
368
|
-
#
|
369
|
-
# from everybody else's.
|
316
|
+
# The name for this collection of persistent connections.
|
370
317
|
|
371
318
|
attr_reader :name
|
372
319
|
|
@@ -495,23 +442,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
495
442
|
|
496
443
|
attr_reader :verify_mode
|
497
444
|
|
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
445
|
##
|
510
446
|
# Creates a new Bundler::Persistent::Net::HTTP::Persistent.
|
511
447
|
#
|
512
|
-
# Set +name+
|
513
|
-
#
|
514
|
-
# good enough. This parameter will be required in a future version.
|
448
|
+
# Set a +name+ for fun. Your library name should be good enough, but this
|
449
|
+
# otherwise has no purpose.
|
515
450
|
#
|
516
451
|
# +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
|
517
452
|
# the environment. See proxy_from_env for details.
|
@@ -524,8 +459,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
524
459
|
# proxy.password = 'hunter2'
|
525
460
|
#
|
526
461
|
# Set +pool_size+ to limit the maximum number of connections allowed.
|
527
|
-
# Defaults to 1/4 the number of allowed file handles
|
528
|
-
#
|
462
|
+
# Defaults to 1/4 the number of allowed file handles or 256 if your OS does
|
463
|
+
# not support a limit on allowed file handles. You can have no more than
|
464
|
+
# this many threads with active HTTP transactions.
|
529
465
|
|
530
466
|
def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
|
531
467
|
@name = name
|
@@ -542,6 +478,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
542
478
|
@write_timeout = nil
|
543
479
|
@idle_timeout = 5
|
544
480
|
@max_requests = nil
|
481
|
+
@max_retries = 1
|
545
482
|
@socket_options = []
|
546
483
|
@ssl_generation = 0 # incremented when SSL session variables change
|
547
484
|
|
@@ -573,8 +510,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
573
510
|
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
574
511
|
end
|
575
512
|
|
576
|
-
@retry_change_requests = false
|
577
|
-
|
578
513
|
self.proxy = proxy if proxy
|
579
514
|
end
|
580
515
|
|
@@ -635,7 +570,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
635
570
|
|
636
571
|
net_http_args = [uri.hostname, uri.port]
|
637
572
|
|
638
|
-
|
573
|
+
# I'm unsure if uri.host or uri.hostname should be checked against
|
574
|
+
# the proxy bypass list.
|
575
|
+
if @proxy_uri and not proxy_bypass? uri.host, uri.port then
|
639
576
|
net_http_args.concat @proxy_args
|
640
577
|
else
|
641
578
|
net_http_args.concat [nil, nil, nil, nil]
|
@@ -655,9 +592,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
655
592
|
reset connection
|
656
593
|
end
|
657
594
|
|
658
|
-
http.
|
659
|
-
http.
|
660
|
-
http.
|
595
|
+
http.keep_alive_timeout = @idle_timeout if @idle_timeout
|
596
|
+
http.max_retries = @max_retries if http.respond_to?(:max_retries=)
|
597
|
+
http.read_timeout = @read_timeout if @read_timeout
|
598
|
+
http.write_timeout = @write_timeout if
|
599
|
+
@write_timeout && http.respond_to?(:write_timeout=)
|
661
600
|
|
662
601
|
return yield connection
|
663
602
|
rescue Errno::ECONNREFUSED
|
@@ -675,27 +614,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
675
614
|
end
|
676
615
|
|
677
616
|
##
|
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
|
617
|
+
# CGI::escape wrapper
|
692
618
|
|
693
619
|
def escape str
|
694
620
|
CGI.escape str if str
|
695
621
|
end
|
696
622
|
|
697
623
|
##
|
698
|
-
#
|
624
|
+
# CGI::unescape wrapper
|
699
625
|
|
700
626
|
def unescape str
|
701
627
|
CGI.unescape str if str
|
@@ -738,6 +664,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
738
664
|
def finish connection
|
739
665
|
connection.finish
|
740
666
|
|
667
|
+
connection.http.instance_variable_set :@last_communicated, nil
|
741
668
|
connection.http.instance_variable_set :@ssl_session, nil unless
|
742
669
|
@reuse_ssl_sessions
|
743
670
|
end
|
@@ -746,24 +673,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
746
673
|
# Returns the HTTP protocol version for +uri+
|
747
674
|
|
748
675
|
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)
|
676
|
+
@http_versions["#{uri.hostname}:#{uri.port}"]
|
767
677
|
end
|
768
678
|
|
769
679
|
##
|
@@ -774,20 +684,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
774
684
|
end
|
775
685
|
|
776
686
|
##
|
777
|
-
#
|
778
|
-
# block is given. Returns all responses received.
|
687
|
+
# Set the maximum number of retries for a request.
|
779
688
|
#
|
780
|
-
#
|
781
|
-
# Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
|
782
|
-
# for further details.
|
689
|
+
# Defaults to one retry.
|
783
690
|
#
|
784
|
-
#
|
785
|
-
# <tt>net-http-persistent</tt> #pipeline will be present.
|
691
|
+
# Set this to 0 to disable retries.
|
786
692
|
|
787
|
-
def
|
788
|
-
|
789
|
-
|
790
|
-
|
693
|
+
def max_retries= retries
|
694
|
+
retries = retries.to_int
|
695
|
+
|
696
|
+
raise ArgumentError, "max_retries must be positive" if retries < 0
|
697
|
+
|
698
|
+
@max_retries = retries
|
699
|
+
|
700
|
+
reconnect
|
791
701
|
end
|
792
702
|
|
793
703
|
##
|
@@ -828,7 +738,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
828
738
|
|
829
739
|
if @proxy_uri then
|
830
740
|
@proxy_args = [
|
831
|
-
@proxy_uri.
|
741
|
+
@proxy_uri.hostname,
|
832
742
|
@proxy_uri.port,
|
833
743
|
unescape(@proxy_uri.user),
|
834
744
|
unescape(@proxy_uri.password),
|
@@ -903,14 +813,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
903
813
|
end
|
904
814
|
|
905
815
|
##
|
906
|
-
# Forces reconnection of HTTP connections
|
816
|
+
# Forces reconnection of all HTTP connections, including TLS/SSL
|
817
|
+
# connections.
|
907
818
|
|
908
819
|
def reconnect
|
909
820
|
@generation += 1
|
910
821
|
end
|
911
822
|
|
912
823
|
##
|
913
|
-
# Forces reconnection of SSL connections.
|
824
|
+
# Forces reconnection of only TLS/SSL connections.
|
914
825
|
|
915
826
|
def reconnect_ssl
|
916
827
|
@ssl_generation += 1
|
@@ -943,14 +854,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
943
854
|
# the response will not have been read).
|
944
855
|
#
|
945
856
|
# +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
857
|
|
950
858
|
def request uri, req = nil, &block
|
951
|
-
retried = false
|
952
|
-
bad_response = false
|
953
|
-
|
954
859
|
uri = Bundler::URI uri
|
955
860
|
req = request_setup req || uri
|
956
861
|
response = nil
|
@@ -964,37 +869,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
964
869
|
response = http.request req, &block
|
965
870
|
|
966
871
|
if req.connection_close? or
|
967
|
-
|
872
|
+
(response.http_version <= '1.0' and
|
968
873
|
not response.connection_keep_alive?) or
|
969
|
-
|
874
|
+
response.connection_close? then
|
970
875
|
finish connection
|
971
876
|
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
|
877
|
+
rescue Exception # make sure to close the connection when it was interrupted
|
998
878
|
finish connection
|
999
879
|
|
1000
880
|
raise
|
@@ -1003,26 +883,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1003
883
|
end
|
1004
884
|
end
|
1005
885
|
|
1006
|
-
@http_versions["#{uri.
|
886
|
+
@http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
|
1007
887
|
|
1008
888
|
response
|
1009
889
|
end
|
1010
890
|
|
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
891
|
##
|
1027
892
|
# Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
|
1028
893
|
# request.
|
@@ -1030,7 +895,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1030
895
|
# Returns the request.
|
1031
896
|
|
1032
897
|
def request_setup req_or_uri # :nodoc:
|
1033
|
-
req = if
|
898
|
+
req = if req_or_uri.respond_to? 'request_uri' then
|
1034
899
|
Net::HTTP::Get.new req_or_uri.request_uri
|
1035
900
|
else
|
1036
901
|
req_or_uri
|
@@ -1194,7 +1059,6 @@ application:
|
|
1194
1059
|
|
1195
1060
|
reconnect_ssl
|
1196
1061
|
end
|
1197
|
-
|
1198
1062
|
end
|
1199
1063
|
|
1200
1064
|
require_relative 'persistent/connection'
|