bundler 2.1.1 → 2.2.0.rc.2
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 +1543 -1418
- data/README.md +6 -8
- data/bundler.gemspec +3 -3
- data/exe/bundle +3 -0
- data/lib/bundler.rb +21 -7
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli.rb +54 -20
- data/lib/bundler/cli/add.rb +1 -1
- 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 +1 -1
- 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 +89 -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/definition.rb +51 -60
- 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/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -2
- 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 +1 -1
- data/lib/bundler/friendly_errors.rb +7 -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 +1 -1
- data/lib/bundler/injector.rb +15 -4
- data/lib/bundler/inline.rb +2 -2
- data/lib/bundler/installer.rb +30 -29
- 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 +19 -6
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +1 -1
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin.rb +30 -5
- 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 -9
- 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 +23 -54
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +49 -45
- 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 +56 -59
- 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 +1 -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 -1
- 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 +2 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -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 +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +79 -212
- 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/vendored_persistent.rb +0 -7
- 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-add.ronn → bundle-add.1.ronn} +0 -0
- data/man/bundle-binstubs.1 +5 -3
- data/man/{bundle-binstubs.ronn → bundle-binstubs.1.ronn} +2 -4
- data/man/bundle-cache.1 +1 -1
- data/man/{bundle-cache.ronn → bundle-cache.1.ronn} +0 -0
- data/man/bundle-check.1 +1 -1
- data/man/{bundle-check.ronn → bundle-check.1.ronn} +0 -0
- data/man/bundle-clean.1 +1 -1
- data/man/{bundle-clean.ronn → bundle-clean.1.ronn} +0 -0
- data/man/bundle-config.1 +16 -22
- data/man/{bundle-config.ronn → bundle-config.1.ronn} +19 -22
- data/man/bundle-doctor.1 +1 -1
- data/man/{bundle-doctor.ronn → bundle-doctor.1.ronn} +0 -0
- data/man/bundle-exec.1 +1 -1
- data/man/{bundle-exec.ronn → bundle-exec.1.ronn} +0 -0
- data/man/bundle-gem.1 +25 -3
- data/man/{bundle-gem.ronn → bundle-gem.1.ronn} +30 -7
- data/man/bundle-info.1 +1 -1
- data/man/{bundle-info.ronn → bundle-info.1.ronn} +0 -0
- data/man/bundle-init.1 +1 -1
- data/man/{bundle-init.ronn → bundle-init.1.ronn} +0 -0
- data/man/bundle-inject.1 +1 -1
- data/man/{bundle-inject.ronn → bundle-inject.1.ronn} +0 -0
- data/man/bundle-install.1 +29 -2
- data/man/{bundle-install.ronn → bundle-install.1.ronn} +24 -2
- data/man/bundle-list.1 +7 -7
- data/man/{bundle-list.ronn → bundle-list.1.ronn} +6 -6
- data/man/bundle-lock.1 +1 -1
- data/man/{bundle-lock.ronn → bundle-lock.1.ronn} +0 -0
- data/man/bundle-open.1 +1 -1
- data/man/{bundle-open.ronn → bundle-open.1.ronn} +0 -0
- data/man/bundle-outdated.1 +1 -1
- data/man/{bundle-outdated.ronn → bundle-outdated.1.ronn} +0 -0
- data/man/bundle-platform.1 +1 -1
- data/man/{bundle-platform.ronn → bundle-platform.1.ronn} +0 -0
- data/man/bundle-pristine.1 +1 -1
- data/man/{bundle-pristine.ronn → bundle-pristine.1.ronn} +0 -0
- data/man/bundle-remove.1 +1 -1
- data/man/{bundle-remove.ronn → bundle-remove.1.ronn} +0 -0
- data/man/bundle-show.1 +1 -1
- data/man/{bundle-show.ronn → bundle-show.1.ronn} +0 -0
- data/man/bundle-update.1 +1 -1
- data/man/{bundle-update.ronn → bundle-update.1.ronn} +0 -0
- data/man/bundle-viz.1 +1 -1
- data/man/{bundle-viz.ronn → bundle-viz.1.ronn} +0 -0
- data/man/bundle.1 +1 -1
- data/man/{bundle.ronn → bundle.1.ronn} +0 -0
- data/man/gemfile.5 +4 -4
- data/man/gemfile.5.ronn +4 -4
- metadata +39 -58
- 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
- data/man/index.txt +0 -25
@@ -2,73 +2,83 @@
|
|
2
2
|
|
3
3
|
## Our Pledge
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
9
|
-
nationality, personal appearance, race, religion, or sexual identity and
|
10
|
-
orientation.
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
6
|
+
|
7
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
11
8
|
|
12
9
|
## Our Standards
|
13
10
|
|
14
|
-
Examples of behavior that contributes to
|
15
|
-
include:
|
11
|
+
Examples of behavior that contributes to a positive environment for our community include:
|
16
12
|
|
17
|
-
*
|
18
|
-
* Being respectful of differing viewpoints and experiences
|
19
|
-
*
|
20
|
-
*
|
21
|
-
*
|
13
|
+
* Demonstrating empathy and kindness toward other people
|
14
|
+
* Being respectful of differing opinions, viewpoints, and experiences
|
15
|
+
* Giving and gracefully accepting constructive feedback
|
16
|
+
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
17
|
+
* Focusing on what is best not just for us as individuals, but for the overall community
|
22
18
|
|
23
|
-
Examples of unacceptable behavior
|
19
|
+
Examples of unacceptable behavior include:
|
24
20
|
|
25
|
-
* The use of sexualized language or imagery and
|
26
|
-
advances
|
27
|
-
* Trolling, insulting
|
21
|
+
* The use of sexualized language or imagery, and sexual attention or
|
22
|
+
advances of any kind
|
23
|
+
* Trolling, insulting or derogatory comments, and personal or political attacks
|
28
24
|
* Public or private harassment
|
29
|
-
* Publishing others' private information, such as a physical or
|
30
|
-
address, without explicit permission
|
25
|
+
* Publishing others' private information, such as a physical or email
|
26
|
+
address, without their explicit permission
|
31
27
|
* Other conduct which could reasonably be considered inappropriate in a
|
32
28
|
professional setting
|
33
29
|
|
34
|
-
##
|
30
|
+
## Enforcement Responsibilities
|
35
31
|
|
36
|
-
|
37
|
-
behavior and are expected to take appropriate and fair corrective action in
|
38
|
-
response to any instances of unacceptable behavior.
|
32
|
+
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
39
33
|
|
40
|
-
|
41
|
-
reject comments, commits, code, wiki edits, issues, and other contributions
|
42
|
-
that are not aligned to this Code of Conduct, or to ban temporarily or
|
43
|
-
permanently any contributor for other behaviors that they deem inappropriate,
|
44
|
-
threatening, offensive, or harmful.
|
34
|
+
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
|
45
35
|
|
46
36
|
## Scope
|
47
37
|
|
48
|
-
This Code of Conduct applies
|
49
|
-
when an individual is representing the project or its community. Examples of
|
50
|
-
representing a project or community include using an official project e-mail
|
51
|
-
address, posting via an official social media account, or acting as an appointed
|
52
|
-
representative at an online or offline event. Representation of a project may be
|
53
|
-
further defined and clarified by project maintainers.
|
38
|
+
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
54
39
|
|
55
40
|
## Enforcement
|
56
41
|
|
57
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
42
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at <%= config[:email] %>. All complaints will be reviewed and investigated promptly and fairly.
|
43
|
+
|
44
|
+
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
|
45
|
+
|
46
|
+
## Enforcement Guidelines
|
47
|
+
|
48
|
+
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
|
49
|
+
|
50
|
+
### 1. Correction
|
51
|
+
|
52
|
+
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
53
|
+
|
54
|
+
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
55
|
+
|
56
|
+
### 2. Warning
|
57
|
+
|
58
|
+
**Community Impact**: A violation through a single incident or series of actions.
|
63
59
|
|
64
|
-
|
65
|
-
|
66
|
-
|
60
|
+
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
|
61
|
+
|
62
|
+
### 3. Temporary Ban
|
63
|
+
|
64
|
+
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
65
|
+
|
66
|
+
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
67
|
+
|
68
|
+
### 4. Permanent Ban
|
69
|
+
|
70
|
+
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
71
|
+
|
72
|
+
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
67
73
|
|
68
74
|
## Attribution
|
69
75
|
|
70
|
-
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version
|
71
|
-
available at
|
76
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
|
77
|
+
available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
78
|
+
|
79
|
+
Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
|
80
|
+
|
81
|
+
[homepage]: https://www.contributor-covenant.org
|
72
82
|
|
73
|
-
|
74
|
-
|
83
|
+
For answers to common questions about this code of conduct, see the FAQ at
|
84
|
+
https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
|
@@ -1,12 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source "https://rubygems.org"
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in <%= config[:name] %>.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
gem "rake", "~>
|
8
|
+
gem "rake", "~> 13.0"
|
7
9
|
<%- if config[:ext] -%>
|
10
|
+
|
8
11
|
gem "rake-compiler"
|
9
12
|
<%- end -%>
|
10
13
|
<%- if config[:test] -%>
|
14
|
+
|
11
15
|
gem "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>"
|
12
16
|
<%- end -%>
|
17
|
+
<%- if config[:rubocop] -%>
|
18
|
+
|
19
|
+
gem "rubocop", "~> 0.80"
|
20
|
+
<%- end -%>
|
@@ -28,7 +28,7 @@ TODO: Write usage instructions here
|
|
28
28
|
|
29
29
|
After checking out the repo, run `bin/setup` to install dependencies.<% if config[:test] %> Then, run `rake <%= config[:test].sub('mini', '').sub('rspec', 'spec') %>` to run the tests.<% end %> You can also run `bin/console` for an interactive prompt that will allow you to experiment.<% if config[:bin] %> Run `bundle exec <%= config[:name] %>` to use the gem in this directory, ignoring other installed copies of this gem.<% end %>
|
30
30
|
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
32
|
|
33
33
|
## Contributing
|
34
34
|
|
@@ -1,5 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "bundler/gem_tasks"
|
2
|
-
<%
|
4
|
+
<% default_task_names = [config[:test_task]].compact -%>
|
5
|
+
<% case config[:test] -%>
|
6
|
+
<% when "minitest", "test-unit" -%>
|
3
7
|
require "rake/testtask"
|
4
8
|
|
5
9
|
Rake::TestTask.new(:test) do |t|
|
@@ -8,22 +12,32 @@ Rake::TestTask.new(:test) do |t|
|
|
8
12
|
t.test_files = FileList["test/**/*_test.rb"]
|
9
13
|
end
|
10
14
|
|
11
|
-
<%
|
15
|
+
<% when "rspec" -%>
|
12
16
|
require "rspec/core/rake_task"
|
13
17
|
|
14
18
|
RSpec::Core::RakeTask.new(:spec)
|
15
19
|
|
20
|
+
<% end -%>
|
21
|
+
<% if config[:rubocop] -%>
|
22
|
+
<% default_task_names << :rubocop -%>
|
23
|
+
require "rubocop/rake_task"
|
24
|
+
|
25
|
+
RuboCop::RakeTask.new
|
26
|
+
|
16
27
|
<% end -%>
|
17
28
|
<% if config[:ext] -%>
|
29
|
+
<% default_task_names.unshift(:clobber, :compile) -%>
|
18
30
|
require "rake/extensiontask"
|
19
31
|
|
20
|
-
task :
|
32
|
+
task build: :compile
|
21
33
|
|
22
34
|
Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext|
|
23
35
|
ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
|
24
36
|
end
|
25
37
|
|
26
|
-
|
38
|
+
<% end -%>
|
39
|
+
<% if default_task_names.size == 1 -%>
|
40
|
+
task default: <%= default_task_names.first.inspect %>
|
27
41
|
<% else -%>
|
28
|
-
task :
|
42
|
+
task default: %i[<%= default_task_names.join(" ") %>]
|
29
43
|
<% end -%>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push,pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- name: Set up Ruby
|
11
|
+
uses: ruby/setup-ruby@v1
|
12
|
+
with:
|
13
|
+
ruby-version: <%= RUBY_VERSION %>
|
14
|
+
- name: Run the default task
|
15
|
+
run: |
|
16
|
+
gem install bundler -v <%= Bundler::VERSION %>
|
17
|
+
bundle install
|
18
|
+
bundle exec rake
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/<%=config[:namespaced_path]%>/version"
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
6
|
spec.name = <%= config[:name].inspect %>
|
@@ -6,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
6
8
|
spec.authors = [<%= config[:author].inspect %>]
|
7
9
|
spec.email = [<%= config[:email].inspect %>]
|
8
10
|
|
9
|
-
spec.summary =
|
10
|
-
spec.description =
|
11
|
+
spec.summary = "TODO: Write a short summary, because RubyGems requires one."
|
12
|
+
spec.description = "TODO: Write a longer description or delete this line."
|
11
13
|
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
12
14
|
<%- if config[:mit] -%>
|
13
15
|
spec.license = "MIT"
|
@@ -22,11 +24,11 @@ Gem::Specification.new do |spec|
|
|
22
24
|
|
23
25
|
# Specify which files should be added to the gem when it is released.
|
24
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
-
spec.files
|
26
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{
|
27
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
28
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
27
29
|
end
|
28
30
|
spec.bindir = "exe"
|
29
|
-
spec.executables = spec.files.grep(%r{
|
31
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
30
32
|
spec.require_paths = ["lib"]
|
31
33
|
<%- if config[:ext] -%>
|
32
34
|
spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"]
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class <%= config[:constant_name] %>Test < Test::Unit::TestCase
|
6
|
+
test "VERSION" do
|
7
|
+
assert do
|
8
|
+
::<%= config[:constant_name] %>.const_defined?(:VERSION)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
test "something useful" do
|
13
|
+
assert_equal("expected", "actual")
|
14
|
+
end
|
15
|
+
end
|
data/lib/bundler/ui/shell.rb
CHANGED
@@ -28,17 +28,17 @@ module Bundler
|
|
28
28
|
tell_me(msg, :green, newline) if level("confirm")
|
29
29
|
end
|
30
30
|
|
31
|
-
def warn(msg, newline = nil)
|
31
|
+
def warn(msg, newline = nil, color = :yellow)
|
32
32
|
return unless level("warn")
|
33
33
|
return if @warning_history.include? msg
|
34
34
|
@warning_history << msg
|
35
35
|
|
36
|
-
tell_err(msg,
|
36
|
+
tell_err(msg, color, newline)
|
37
37
|
end
|
38
38
|
|
39
|
-
def error(msg, newline = nil)
|
39
|
+
def error(msg, newline = nil, color = :red)
|
40
40
|
return unless level("error")
|
41
|
-
tell_err(msg,
|
41
|
+
tell_err(msg, color, newline)
|
42
42
|
end
|
43
43
|
|
44
44
|
def debug(msg, newline = nil)
|
@@ -92,7 +92,7 @@ module Bundler
|
|
92
92
|
[]
|
93
93
|
end
|
94
94
|
|
95
|
-
|
95
|
+
private
|
96
96
|
|
97
97
|
# valimism
|
98
98
|
def tell_me(msg, color = nil, newline = nil)
|
@@ -3,13 +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
|
-
autoload :OpenSSL, 'openssl'
|
12
|
-
|
13
6
|
##
|
14
7
|
# Persistent connections for Net::HTTP
|
15
8
|
#
|
@@ -17,15 +10,11 @@ autoload :OpenSSL, 'openssl'
|
|
17
10
|
# servers you wish to talk to. For each host:port you communicate with a
|
18
11
|
# single persistent connection is created.
|
19
12
|
#
|
20
|
-
#
|
21
|
-
# connections.
|
13
|
+
# Connections will be shared across threads through a connection pool to
|
14
|
+
# increase reuse of connections.
|
22
15
|
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
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.
|
16
|
+
# You can shut down any remaining HTTP connections when done by calling
|
17
|
+
# #shutdown.
|
29
18
|
#
|
30
19
|
# Example:
|
31
20
|
#
|
@@ -33,7 +22,7 @@ autoload :OpenSSL, 'openssl'
|
|
33
22
|
#
|
34
23
|
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
35
24
|
#
|
36
|
-
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
25
|
+
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
37
26
|
#
|
38
27
|
# # perform a GET
|
39
28
|
# response = http.request uri
|
@@ -55,14 +44,14 @@ autoload :OpenSSL, 'openssl'
|
|
55
44
|
# to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
|
56
45
|
# params which are sent in the body for other requests.
|
57
46
|
#
|
58
|
-
# == SSL
|
47
|
+
# == TLS/SSL
|
59
48
|
#
|
60
|
-
#
|
61
|
-
# Bundler::URI.
|
49
|
+
# TLS connections are automatically created depending upon the scheme of the
|
50
|
+
# Bundler::URI. TLS connections are automatically verified against the default
|
62
51
|
# certificate store for your computer. You can override this by changing
|
63
52
|
# verify_mode or by specifying an alternate cert_store.
|
64
53
|
#
|
65
|
-
# Here are the
|
54
|
+
# Here are the TLS settings, see the individual methods for documentation:
|
66
55
|
#
|
67
56
|
# #certificate :: This client's certificate
|
68
57
|
# #ca_file :: The certificate-authorities
|
@@ -72,7 +61,7 @@ autoload :OpenSSL, 'openssl'
|
|
72
61
|
# #private_key :: The client's SSL private key
|
73
62
|
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
|
74
63
|
# connection
|
75
|
-
# #ssl_timeout ::
|
64
|
+
# #ssl_timeout :: Session lifetime
|
76
65
|
# #ssl_version :: Which specific SSL version to use
|
77
66
|
# #verify_callback :: For server certificate verification
|
78
67
|
# #verify_depth :: Depth of certificate verification
|
@@ -101,14 +90,15 @@ autoload :OpenSSL, 'openssl'
|
|
101
90
|
#
|
102
91
|
# === Segregation
|
103
92
|
#
|
104
|
-
#
|
105
|
-
#
|
93
|
+
# Each Bundler::Persistent::Net::HTTP::Persistent instance has its own pool of connections. There
|
94
|
+
# is no sharing with other instances (as was true in earlier versions).
|
106
95
|
#
|
107
96
|
# === Idle Timeout
|
108
97
|
#
|
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.
|
98
|
+
# If a connection hasn't been used for this number of seconds it will
|
99
|
+
# automatically be reset upon the next use to avoid attempting to send to a
|
100
|
+
# closed connection. The default value is 5 seconds. nil means no timeout.
|
101
|
+
# Set through #idle_timeout.
|
112
102
|
#
|
113
103
|
# Reducing this value may help avoid the "too many connection resets" error
|
114
104
|
# when sending non-idempotent requests while increasing this value will cause
|
@@ -123,8 +113,9 @@ autoload :OpenSSL, 'openssl'
|
|
123
113
|
#
|
124
114
|
# The number of requests that should be made before opening a new connection.
|
125
115
|
# 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
|
116
|
+
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
117
|
+
# no effect, if set, connections will be reset on the request after
|
118
|
+
# max_requests.
|
128
119
|
#
|
129
120
|
# === Open Timeout
|
130
121
|
#
|
@@ -136,45 +127,6 @@ autoload :OpenSSL, 'openssl'
|
|
136
127
|
# Socket options may be set on newly-created connections. See #socket_options
|
137
128
|
# for details.
|
138
129
|
#
|
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
130
|
# === Connection Termination
|
179
131
|
#
|
180
132
|
# If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
|
@@ -195,38 +147,30 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
195
147
|
EPOCH = Time.at 0 # :nodoc:
|
196
148
|
|
197
149
|
##
|
198
|
-
# Is OpenSSL available?
|
150
|
+
# Is OpenSSL available?
|
199
151
|
|
200
|
-
HAVE_OPENSSL =
|
152
|
+
HAVE_OPENSSL = begin # :nodoc:
|
153
|
+
require 'openssl'
|
154
|
+
true
|
155
|
+
rescue LoadError
|
156
|
+
false
|
157
|
+
end
|
201
158
|
|
202
159
|
##
|
203
|
-
# The default connection pool size is 1/4 the allowed open files
|
160
|
+
# The default connection pool size is 1/4 the allowed open files
|
161
|
+
# (<code>ulimit -n</code>) or 256 if your OS does not support file handle
|
162
|
+
# limits (typically windows).
|
204
163
|
|
205
|
-
if
|
206
|
-
DEFAULT_POOL_SIZE = 256
|
207
|
-
else
|
164
|
+
if Process.const_defined? :RLIMIT_NOFILE
|
208
165
|
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
|
166
|
+
else
|
167
|
+
DEFAULT_POOL_SIZE = 256
|
209
168
|
end
|
210
169
|
|
211
170
|
##
|
212
171
|
# The version of Bundler::Persistent::Net::HTTP::Persistent you are using
|
213
172
|
|
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
|
173
|
+
VERSION = '4.0.0'
|
230
174
|
|
231
175
|
##
|
232
176
|
# Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
|
@@ -353,6 +297,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
353
297
|
|
354
298
|
attr_accessor :max_requests
|
355
299
|
|
300
|
+
##
|
301
|
+
# Number of retries to perform if a request fails.
|
302
|
+
#
|
303
|
+
# See also #max_retries=, Net::HTTP#max_retries=.
|
304
|
+
|
305
|
+
attr_reader :max_retries
|
306
|
+
|
356
307
|
##
|
357
308
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
358
309
|
# HTTP/1.1 servers.
|
@@ -365,8 +316,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
365
316
|
attr_accessor :keep_alive
|
366
317
|
|
367
318
|
##
|
368
|
-
#
|
369
|
-
# from everybody else's.
|
319
|
+
# The name for this collection of persistent connections.
|
370
320
|
|
371
321
|
attr_reader :name
|
372
322
|
|
@@ -495,23 +445,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
495
445
|
|
496
446
|
attr_reader :verify_mode
|
497
447
|
|
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
448
|
##
|
510
449
|
# Creates a new Bundler::Persistent::Net::HTTP::Persistent.
|
511
450
|
#
|
512
|
-
# Set +name+
|
513
|
-
#
|
514
|
-
# good enough. This parameter will be required in a future version.
|
451
|
+
# Set a +name+ for fun. Your library name should be good enough, but this
|
452
|
+
# otherwise has no purpose.
|
515
453
|
#
|
516
454
|
# +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
|
517
455
|
# the environment. See proxy_from_env for details.
|
@@ -524,8 +462,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
524
462
|
# proxy.password = 'hunter2'
|
525
463
|
#
|
526
464
|
# Set +pool_size+ to limit the maximum number of connections allowed.
|
527
|
-
# Defaults to 1/4 the number of allowed file handles
|
528
|
-
#
|
465
|
+
# Defaults to 1/4 the number of allowed file handles or 256 if your OS does
|
466
|
+
# not support a limit on allowed file handles. You can have no more than
|
467
|
+
# this many threads with active HTTP transactions.
|
529
468
|
|
530
469
|
def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
|
531
470
|
@name = name
|
@@ -542,6 +481,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
542
481
|
@write_timeout = nil
|
543
482
|
@idle_timeout = 5
|
544
483
|
@max_requests = nil
|
484
|
+
@max_retries = 1
|
545
485
|
@socket_options = []
|
546
486
|
@ssl_generation = 0 # incremented when SSL session variables change
|
547
487
|
|
@@ -573,8 +513,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
573
513
|
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
574
514
|
end
|
575
515
|
|
576
|
-
@retry_change_requests = false
|
577
|
-
|
578
516
|
self.proxy = proxy if proxy
|
579
517
|
end
|
580
518
|
|
@@ -635,7 +573,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
635
573
|
|
636
574
|
net_http_args = [uri.hostname, uri.port]
|
637
575
|
|
638
|
-
|
576
|
+
# I'm unsure if uri.host or uri.hostname should be checked against
|
577
|
+
# the proxy bypass list.
|
578
|
+
if @proxy_uri and not proxy_bypass? uri.host, uri.port then
|
639
579
|
net_http_args.concat @proxy_args
|
640
580
|
else
|
641
581
|
net_http_args.concat [nil, nil, nil, nil]
|
@@ -655,9 +595,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
655
595
|
reset connection
|
656
596
|
end
|
657
597
|
|
658
|
-
http.
|
659
|
-
http.
|
660
|
-
http.
|
598
|
+
http.keep_alive_timeout = @idle_timeout if @idle_timeout
|
599
|
+
http.max_retries = @max_retries if http.respond_to?(:max_retries=)
|
600
|
+
http.read_timeout = @read_timeout if @read_timeout
|
601
|
+
http.write_timeout = @write_timeout if
|
602
|
+
@write_timeout && http.respond_to?(:write_timeout=)
|
661
603
|
|
662
604
|
return yield connection
|
663
605
|
rescue Errno::ECONNREFUSED
|
@@ -675,27 +617,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
675
617
|
end
|
676
618
|
|
677
619
|
##
|
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
|
620
|
+
# CGI::escape wrapper
|
692
621
|
|
693
622
|
def escape str
|
694
623
|
CGI.escape str if str
|
695
624
|
end
|
696
625
|
|
697
626
|
##
|
698
|
-
#
|
627
|
+
# CGI::unescape wrapper
|
699
628
|
|
700
629
|
def unescape str
|
701
630
|
CGI.unescape str if str
|
@@ -738,6 +667,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
738
667
|
def finish connection
|
739
668
|
connection.finish
|
740
669
|
|
670
|
+
connection.http.instance_variable_set :@last_communicated, nil
|
741
671
|
connection.http.instance_variable_set :@ssl_session, nil unless
|
742
672
|
@reuse_ssl_sessions
|
743
673
|
end
|
@@ -746,24 +676,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
746
676
|
# Returns the HTTP protocol version for +uri+
|
747
677
|
|
748
678
|
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)
|
679
|
+
@http_versions["#{uri.hostname}:#{uri.port}"]
|
767
680
|
end
|
768
681
|
|
769
682
|
##
|
@@ -774,20 +687,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
774
687
|
end
|
775
688
|
|
776
689
|
##
|
777
|
-
#
|
778
|
-
# block is given. Returns all responses received.
|
690
|
+
# Set the maximum number of retries for a request.
|
779
691
|
#
|
780
|
-
#
|
781
|
-
# Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
|
782
|
-
# for further details.
|
692
|
+
# Defaults to one retry.
|
783
693
|
#
|
784
|
-
#
|
785
|
-
# <tt>net-http-persistent</tt> #pipeline will be present.
|
694
|
+
# Set this to 0 to disable retries.
|
786
695
|
|
787
|
-
def
|
788
|
-
|
789
|
-
|
790
|
-
|
696
|
+
def max_retries= retries
|
697
|
+
retries = retries.to_int
|
698
|
+
|
699
|
+
raise ArgumentError, "max_retries must be positive" if retries < 0
|
700
|
+
|
701
|
+
@max_retries = retries
|
702
|
+
|
703
|
+
reconnect
|
791
704
|
end
|
792
705
|
|
793
706
|
##
|
@@ -828,7 +741,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
828
741
|
|
829
742
|
if @proxy_uri then
|
830
743
|
@proxy_args = [
|
831
|
-
@proxy_uri.
|
744
|
+
@proxy_uri.hostname,
|
832
745
|
@proxy_uri.port,
|
833
746
|
unescape(@proxy_uri.user),
|
834
747
|
unescape(@proxy_uri.password),
|
@@ -903,14 +816,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
903
816
|
end
|
904
817
|
|
905
818
|
##
|
906
|
-
# Forces reconnection of HTTP connections
|
819
|
+
# Forces reconnection of all HTTP connections, including TLS/SSL
|
820
|
+
# connections.
|
907
821
|
|
908
822
|
def reconnect
|
909
823
|
@generation += 1
|
910
824
|
end
|
911
825
|
|
912
826
|
##
|
913
|
-
# Forces reconnection of SSL connections.
|
827
|
+
# Forces reconnection of only TLS/SSL connections.
|
914
828
|
|
915
829
|
def reconnect_ssl
|
916
830
|
@ssl_generation += 1
|
@@ -943,14 +857,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
943
857
|
# the response will not have been read).
|
944
858
|
#
|
945
859
|
# +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
860
|
|
950
861
|
def request uri, req = nil, &block
|
951
|
-
retried = false
|
952
|
-
bad_response = false
|
953
|
-
|
954
862
|
uri = Bundler::URI uri
|
955
863
|
req = request_setup req || uri
|
956
864
|
response = nil
|
@@ -964,37 +872,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
964
872
|
response = http.request req, &block
|
965
873
|
|
966
874
|
if req.connection_close? or
|
967
|
-
|
875
|
+
(response.http_version <= '1.0' and
|
968
876
|
not response.connection_keep_alive?) or
|
969
|
-
|
877
|
+
response.connection_close? then
|
970
878
|
finish connection
|
971
879
|
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
|
880
|
+
rescue Exception # make sure to close the connection when it was interrupted
|
998
881
|
finish connection
|
999
882
|
|
1000
883
|
raise
|
@@ -1003,26 +886,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1003
886
|
end
|
1004
887
|
end
|
1005
888
|
|
1006
|
-
@http_versions["#{uri.
|
889
|
+
@http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
|
1007
890
|
|
1008
891
|
response
|
1009
892
|
end
|
1010
893
|
|
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
894
|
##
|
1027
895
|
# Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
|
1028
896
|
# request.
|
@@ -1030,7 +898,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1030
898
|
# Returns the request.
|
1031
899
|
|
1032
900
|
def request_setup req_or_uri # :nodoc:
|
1033
|
-
req = if
|
901
|
+
req = if req_or_uri.respond_to? 'request_uri' then
|
1034
902
|
Net::HTTP::Get.new req_or_uri.request_uri
|
1035
903
|
else
|
1036
904
|
req_or_uri
|
@@ -1194,7 +1062,6 @@ application:
|
|
1194
1062
|
|
1195
1063
|
reconnect_ssl
|
1196
1064
|
end
|
1197
|
-
|
1198
1065
|
end
|
1199
1066
|
|
1200
1067
|
require_relative 'persistent/connection'
|