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.

Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1575 -1423
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +35 -7
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +58 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +84 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +9 -16
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +87 -66
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +2 -0
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +1 -1
  32. data/lib/bundler/compact_index_client/updater.rb +5 -5
  33. data/lib/bundler/definition.rb +49 -72
  34. data/lib/bundler/dep_proxy.rb +1 -1
  35. data/lib/bundler/dependency.rb +3 -10
  36. data/lib/bundler/dsl.rb +5 -9
  37. data/lib/bundler/endpoint_specification.rb +1 -1
  38. data/lib/bundler/env.rb +1 -1
  39. data/lib/bundler/environment_preserver.rb +26 -2
  40. data/lib/bundler/errors.rb +1 -0
  41. data/lib/bundler/feature_flag.rb +0 -3
  42. data/lib/bundler/fetcher.rb +4 -3
  43. data/lib/bundler/fetcher/base.rb +1 -1
  44. data/lib/bundler/fetcher/compact_index.rb +1 -1
  45. data/lib/bundler/fetcher/downloader.rb +1 -1
  46. data/lib/bundler/fetcher/index.rb +3 -4
  47. data/lib/bundler/friendly_errors.rb +22 -13
  48. data/lib/bundler/gem_helper.rb +32 -17
  49. data/lib/bundler/gem_helpers.rb +6 -1
  50. data/lib/bundler/gem_version_promoter.rb +2 -2
  51. data/lib/bundler/graph.rb +1 -1
  52. data/lib/bundler/index.rb +6 -2
  53. data/lib/bundler/injector.rb +22 -4
  54. data/lib/bundler/inline.rb +2 -2
  55. data/lib/bundler/installer.rb +35 -32
  56. data/lib/bundler/installer/gem_installer.rb +3 -3
  57. data/lib/bundler/installer/parallel_installer.rb +10 -10
  58. data/lib/bundler/installer/standalone.rb +2 -2
  59. data/lib/bundler/lazy_specification.rb +34 -9
  60. data/lib/bundler/lockfile_generator.rb +1 -1
  61. data/lib/bundler/lockfile_parser.rb +1 -1
  62. data/lib/bundler/man/.document +1 -0
  63. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  64. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  65. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  66. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  67. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  68. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  69. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  70. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  71. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  72. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  73. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  74. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  75. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  76. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  77. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  78. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  79. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  80. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  81. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  82. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  83. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  84. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  85. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  86. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  87. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  88. data/lib/bundler/mirror.rb +2 -2
  89. data/lib/bundler/plugin.rb +30 -5
  90. data/lib/bundler/plugin/api/source.rb +1 -1
  91. data/lib/bundler/plugin/dsl.rb +1 -1
  92. data/lib/bundler/plugin/index.rb +10 -1
  93. data/lib/bundler/plugin/installer.rb +1 -1
  94. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  95. data/lib/bundler/plugin/source_list.rb +1 -1
  96. data/lib/bundler/psyched_yaml.rb +0 -15
  97. data/lib/bundler/remote_specification.rb +5 -2
  98. data/lib/bundler/resolver.rb +35 -18
  99. data/lib/bundler/resolver/spec_group.rb +28 -11
  100. data/lib/bundler/retry.rb +1 -1
  101. data/lib/bundler/ruby_version.rb +1 -1
  102. data/lib/bundler/rubygems_ext.rb +53 -9
  103. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  104. data/lib/bundler/rubygems_integration.rb +25 -55
  105. data/lib/bundler/runtime.rb +4 -14
  106. data/lib/bundler/settings.rb +49 -46
  107. data/lib/bundler/shared_helpers.rb +2 -2
  108. data/lib/bundler/similarity_detector.rb +1 -1
  109. data/lib/bundler/source.rb +1 -1
  110. data/lib/bundler/source/git.rb +5 -5
  111. data/lib/bundler/source/git/git_proxy.rb +57 -60
  112. data/lib/bundler/source/path.rb +7 -3
  113. data/lib/bundler/source/path/installer.rb +8 -10
  114. data/lib/bundler/source/rubygems.rb +13 -16
  115. data/lib/bundler/source/rubygems/remote.rb +1 -1
  116. data/lib/bundler/source_list.rb +2 -2
  117. data/lib/bundler/spec_set.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +17 -7
  119. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  120. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  121. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  122. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  123. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  124. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  125. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  126. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  127. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  128. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  129. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  130. data/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -6
  131. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  132. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  133. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  134. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  135. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  136. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  137. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  138. data/lib/bundler/ui/shell.rb +5 -5
  139. data/lib/bundler/uri_credentials_filter.rb +3 -1
  140. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  146. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +79 -208
  147. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  148. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  149. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  150. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  151. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  152. data/lib/bundler/vendored_persistent.rb +0 -7
  153. data/lib/bundler/vendored_tmpdir.rb +4 -0
  154. data/lib/bundler/version.rb +1 -1
  155. data/lib/bundler/worker.rb +1 -1
  156. data/lib/bundler/yaml_serializer.rb +1 -1
  157. data/man/bundle-add.1 +1 -1
  158. data/man/bundle-binstubs.1 +5 -3
  159. data/man/bundle-cache.1 +1 -1
  160. data/man/bundle-check.1 +1 -1
  161. data/man/bundle-clean.1 +1 -1
  162. data/man/bundle-config.1 +16 -25
  163. data/man/bundle-doctor.1 +1 -1
  164. data/man/bundle-exec.1 +1 -1
  165. data/man/bundle-gem.1 +25 -3
  166. data/man/bundle-info.1 +1 -1
  167. data/man/bundle-init.1 +1 -1
  168. data/man/bundle-inject.1 +1 -1
  169. data/man/bundle-install.1 +30 -3
  170. data/man/bundle-list.1 +7 -7
  171. data/man/bundle-lock.1 +1 -1
  172. data/man/bundle-open.1 +1 -1
  173. data/man/bundle-outdated.1 +1 -1
  174. data/man/bundle-platform.1 +1 -1
  175. data/man/bundle-pristine.1 +1 -1
  176. data/man/bundle-remove.1 +1 -1
  177. data/man/bundle-show.1 +1 -1
  178. data/man/bundle-update.1 +1 -1
  179. data/man/bundle-viz.1 +1 -1
  180. data/man/bundle.1 +1 -1
  181. data/man/gemfile.5 +4 -4
  182. metadata +43 -59
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  184. data/man/bundle-add.1.txt +0 -58
  185. data/man/bundle-binstubs.1.txt +0 -48
  186. data/man/bundle-cache.1.txt +0 -78
  187. data/man/bundle-check.1.txt +0 -33
  188. data/man/bundle-clean.1.txt +0 -26
  189. data/man/bundle-config.1.txt +0 -528
  190. data/man/bundle-doctor.1.txt +0 -44
  191. data/man/bundle-exec.1.txt +0 -178
  192. data/man/bundle-gem.1.txt +0 -91
  193. data/man/bundle-info.1.txt +0 -21
  194. data/man/bundle-init.1.txt +0 -34
  195. data/man/bundle-inject.1.txt +0 -32
  196. data/man/bundle-install.1.txt +0 -401
  197. data/man/bundle-list.1.txt +0 -43
  198. data/man/bundle-lock.1.txt +0 -93
  199. data/man/bundle-open.1.txt +0 -29
  200. data/man/bundle-outdated.1.txt +0 -131
  201. data/man/bundle-platform.1.txt +0 -57
  202. data/man/bundle-pristine.1.txt +0 -44
  203. data/man/bundle-remove.1.txt +0 -34
  204. data/man/bundle-show.1.txt +0 -27
  205. data/man/bundle-update.1.txt +0 -390
  206. data/man/bundle-viz.1.txt +0 -39
  207. data/man/bundle.1.txt +0 -116
  208. data/man/gemfile.5.txt +0 -649
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'molinillo/compatibility'
4
3
  require_relative 'molinillo/gem_metadata'
5
4
  require_relative 'molinillo/errors'
6
5
  require_relative 'molinillo/resolver'
@@ -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([origin, destination])
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
@@ -14,11 +14,11 @@ module Bundler::Molinillo
14
14
  end
15
15
 
16
16
  # (see Action#up)
17
- def up(_graph)
17
+ def up(graph)
18
18
  end
19
19
 
20
20
  # (see Action#down)
21
- def down(_graph)
21
+ def down(graph)
22
22
  end
23
23
 
24
24
  # @!group Tag
@@ -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
- Compatibility.flat_map(conflicts.values.flatten, &:requirements).each do |conflicting|
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]
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bundler::Molinillo
4
4
  # The version of Bundler::Molinillo.
5
- VERSION = '0.6.6'.freeze
5
+ VERSION = '0.7.0'.freeze
6
6
  end
@@ -207,7 +207,7 @@ module Bundler::Molinillo
207
207
  def start_resolution
208
208
  @started_at = Time.now
209
209
 
210
- handle_missing_or_push_dependency_state(initial_state)
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 [DependencyState] the initial state for the resolution
279
- def initial_state
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
- requirements = sort_dependencies(original_requested, graph, {})
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 unwound from
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 = Compatibility.flat_map(primary_unwinds) do |unwind|
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 = Compatibility.flat_map(parent_unwinds, &:sub_dependencies_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 theres a `CircularDependency` error the conflicting requirement
528
- # (the one causing the circular) wont be `conflict.requirement`
529
- # (which wont be for the right state, because we wont have created it,
530
- # because its circular).
531
- # We need to make sure we have that requirement in the conflicts list,
532
- # otherwise we wont be able to unwind properly, so we just return all
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
- # use reject!(!satisfied) for 1.8.7 compatibility
677
- possibility.possibilities.reject! do |possibility|
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] activated_possibility the PossibilitySet that has just been
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
- # Multiple Bundler::Persistent::Net::HTTP::Persistent objects will share the same set of
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 the HTTP connections when done by calling #shutdown. You
27
- # should name your Bundler::Persistent::Net::HTTP::Persistent object if you intend to call this
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 name: 'my_app_name'
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
- # SSL connections are automatically created depending upon the scheme of the
61
- # Bundler::URI. SSL connections are automatically verified against the default
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 SSL settings, see the individual methods for documentation:
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 :: SSL session lifetime
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
- # By providing an application name to ::new you can separate your connections
105
- # from the connections of other applications.
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 automatically be
110
- # reset upon the next use to avoid attempting to send to a closed connection.
111
- # The default value is 5 seconds. nil means no timeout. Set through #idle_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 no
127
- # effect, if set, connections will be reset on the request after max_requests.
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 Gem.win_platform? then
206
- DEFAULT_POOL_SIZE = 256
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 = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
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 = '3.1.0'
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
- # A name for this connection. Allows you to keep your connections apart
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+ to keep your connections apart from everybody else's. Not
513
- # required currently, but highly recommended. Your library name should be
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. You can have no more
528
- # than this many threads with active HTTP transactions.
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
- if @proxy_uri and not proxy_bypass? uri.hostname, uri.port then
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.read_timeout = @read_timeout if @read_timeout
659
- http.write_timeout = @write_timeout if @write_timeout && http.respond_to?(:write_timeout=)
660
- http.keep_alive_timeout = @idle_timeout if @idle_timeout
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
- # Returns an error message containing the number of requests performed on
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
- # Bundler::URI::unescape wrapper
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.host}:#{uri.port}"]
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
- # Pipelines +requests+ to the HTTP server at +uri+ yielding responses if a
778
- # block is given. Returns all responses received.
694
+ # Set the maximum number of retries for a request.
779
695
  #
780
- # See
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
- # Only if <tt>net-http-pipeline</tt> was required before
785
- # <tt>net-http-persistent</tt> #pipeline will be present.
698
+ # Set this to 0 to disable retries.
786
699
 
787
- def pipeline uri, requests, &block # :yields: responses
788
- connection_for uri do |connection|
789
- connection.http.pipeline requests, &block
790
- end
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.host,
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
- (response.http_version <= '1.0' and
879
+ (response.http_version <= '1.0' and
968
880
  not response.connection_keep_alive?) or
969
- response.connection_close? then
881
+ response.connection_close? then
970
882
  finish connection
971
883
  end
972
- rescue Net::HTTPBadResponse => e
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.host}:#{uri.port}"] ||= response.http_version
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 Bundler::URI === req_or_uri then
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'