bundler 1.11.1 → 2.2.6
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 +5 -5
- data/CHANGELOG.md +2125 -840
- data/LICENSE.md +18 -19
- data/README.md +33 -11
- data/bundler.gemspec +34 -21
- data/exe/bundle +36 -6
- data/exe/bundler +2 -18
- data/lib/bundler.rb +435 -160
- data/lib/bundler/build_metadata.rb +45 -0
- data/lib/bundler/capistrano.rb +9 -3
- data/lib/bundler/cli.rb +550 -130
- data/lib/bundler/cli/add.rb +47 -0
- data/lib/bundler/cli/binstubs.rb +26 -10
- data/lib/bundler/cli/cache.rb +25 -17
- data/lib/bundler/cli/check.rb +8 -7
- data/lib/bundler/cli/clean.rb +8 -8
- data/lib/bundler/cli/common.rb +69 -9
- data/lib/bundler/cli/config.rb +170 -76
- data/lib/bundler/cli/console.rb +6 -1
- data/lib/bundler/cli/doctor.rb +140 -0
- data/lib/bundler/cli/exec.rb +63 -21
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +158 -42
- data/lib/bundler/cli/info.rb +73 -0
- data/lib/bundler/cli/init.rb +22 -7
- data/lib/bundler/cli/inject.rb +38 -10
- data/lib/bundler/cli/install.rb +139 -104
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +60 -0
- data/lib/bundler/cli/lock.rb +27 -5
- data/lib/bundler/cli/open.rb +13 -5
- data/lib/bundler/cli/outdated.rb +251 -46
- data/lib/bundler/cli/platform.rb +6 -2
- data/lib/bundler/cli/plugin.rb +41 -0
- data/lib/bundler/cli/pristine.rb +52 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +5 -4
- data/lib/bundler/cli/update.rb +67 -26
- data/lib/bundler/cli/viz.rb +11 -6
- data/lib/bundler/compact_index_client.rb +125 -0
- data/lib/bundler/compact_index_client/cache.rb +110 -0
- data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/lib/bundler/compact_index_client/updater.rb +104 -0
- data/lib/bundler/constants.rb +2 -0
- data/lib/bundler/current_ruby.rb +51 -174
- data/lib/bundler/definition.rb +533 -216
- data/lib/bundler/dep_proxy.rb +18 -8
- data/lib/bundler/dependency.rb +39 -12
- data/lib/bundler/deployment.rb +7 -0
- data/lib/bundler/deprecate.rb +31 -2
- data/lib/bundler/dsl.rb +188 -91
- data/lib/bundler/endpoint_specification.rb +51 -10
- data/lib/bundler/env.rb +116 -48
- data/lib/bundler/environment_preserver.rb +82 -0
- data/lib/bundler/errors.rb +108 -31
- data/lib/bundler/feature_flag.rb +60 -0
- data/lib/bundler/fetcher.rb +81 -52
- data/lib/bundler/fetcher/base.rb +15 -3
- data/lib/bundler/fetcher/compact_index.rb +140 -0
- data/lib/bundler/fetcher/dependency.rb +36 -42
- data/lib/bundler/fetcher/downloader.rb +39 -12
- data/lib/bundler/fetcher/index.rb +34 -9
- data/lib/bundler/friendly_errors.rb +132 -88
- data/lib/bundler/gem_helper.rb +92 -50
- data/lib/bundler/gem_helpers.rb +90 -5
- data/lib/bundler/gem_tasks.rb +3 -1
- data/lib/bundler/gem_version_promoter.rb +190 -0
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +20 -41
- data/lib/bundler/index.rb +74 -57
- data/lib/bundler/injector.rb +242 -31
- data/lib/bundler/inline.rb +49 -23
- data/lib/bundler/installer.rb +190 -74
- data/lib/bundler/installer/gem_installer.rb +33 -20
- data/lib/bundler/installer/parallel_installer.rb +201 -97
- data/lib/bundler/installer/standalone.rb +10 -6
- data/lib/bundler/lazy_specification.rb +74 -10
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +126 -74
- data/lib/bundler/{ssl_certs → man}/.document +0 -0
- data/lib/bundler/man/bundle-add.1 +66 -0
- data/lib/bundler/man/bundle-add.1.ronn +46 -0
- data/lib/bundler/man/bundle-binstubs.1 +42 -0
- data/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
- data/lib/bundler/man/bundle-cache.1 +55 -0
- data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +22 -16
- data/lib/bundler/man/bundle-check.1 +31 -0
- data/lib/bundler/man/bundle-check.1.ronn +26 -0
- data/lib/bundler/man/bundle-clean.1 +24 -0
- data/lib/bundler/man/bundle-clean.1.ronn +18 -0
- data/lib/bundler/man/bundle-config.1 +488 -0
- data/lib/bundler/man/bundle-config.1.ronn +388 -0
- data/lib/bundler/man/bundle-doctor.1 +44 -0
- data/lib/bundler/man/bundle-doctor.1.ronn +33 -0
- data/lib/bundler/man/bundle-exec.1 +165 -0
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +20 -4
- data/lib/bundler/man/bundle-gem.1 +102 -0
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +37 -13
- data/lib/bundler/man/bundle-info.1 +20 -0
- data/lib/bundler/man/bundle-info.1.ronn +17 -0
- data/lib/bundler/man/bundle-init.1 +25 -0
- data/lib/bundler/man/bundle-init.1.ronn +29 -0
- data/lib/bundler/man/bundle-inject.1 +33 -0
- data/lib/bundler/man/bundle-inject.1.ronn +22 -0
- data/lib/bundler/man/bundle-install.1 +338 -0
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +82 -76
- data/lib/bundler/man/bundle-list.1 +50 -0
- data/lib/bundler/man/bundle-list.1.ronn +33 -0
- data/lib/bundler/man/bundle-lock.1 +84 -0
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +47 -0
- data/lib/bundler/man/bundle-open.1 +32 -0
- data/lib/bundler/man/bundle-open.1.ronn +19 -0
- data/lib/bundler/man/bundle-outdated.1 +155 -0
- data/lib/bundler/man/bundle-outdated.1.ronn +111 -0
- data/lib/bundler/man/bundle-platform.1 +61 -0
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +1 -1
- data/lib/bundler/man/bundle-pristine.1 +34 -0
- data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
- data/lib/bundler/man/bundle-remove.1 +31 -0
- data/lib/bundler/man/bundle-remove.1.ronn +23 -0
- data/lib/bundler/man/bundle-show.1 +23 -0
- data/lib/bundler/man/bundle-show.1.ronn +21 -0
- data/lib/bundler/man/bundle-update.1 +394 -0
- data/lib/bundler/man/bundle-update.1.ronn +350 -0
- data/lib/bundler/man/bundle-viz.1 +39 -0
- data/lib/bundler/man/bundle-viz.1.ronn +30 -0
- data/lib/bundler/man/bundle.1 +136 -0
- data/lib/bundler/man/bundle.1.ronn +111 -0
- data/lib/bundler/man/gemfile.5 +686 -0
- data/{man → lib/bundler/man}/gemfile.5.ronn +117 -95
- data/lib/bundler/man/index.txt +25 -0
- data/lib/bundler/match_platform.rb +15 -4
- data/lib/bundler/mirror.rb +223 -0
- data/lib/bundler/plugin.rb +330 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/api/source.rb +304 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +182 -0
- data/lib/bundler/plugin/installer.rb +109 -0
- data/lib/bundler/plugin/installer/git.rb +38 -0
- data/lib/bundler/plugin/installer/rubygems.rb +27 -0
- data/lib/bundler/plugin/source_list.rb +27 -0
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +2 -6
- data/lib/bundler/remote_specification.rb +42 -9
- data/lib/bundler/resolver.rb +312 -225
- data/lib/bundler/resolver/spec_group.rb +122 -0
- data/lib/bundler/retry.rb +11 -5
- data/lib/bundler/ruby_dsl.rb +9 -2
- data/lib/bundler/ruby_version.rb +84 -61
- data/lib/bundler/rubygems_ext.rb +92 -53
- data/lib/bundler/rubygems_gem_installer.rb +84 -0
- data/lib/bundler/rubygems_integration.rb +320 -395
- data/lib/bundler/runtime.rb +87 -75
- data/lib/bundler/settings.rb +297 -119
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +13 -12
- data/lib/bundler/shared_helpers.rb +234 -53
- data/lib/bundler/similarity_detector.rb +5 -3
- data/lib/bundler/source.rb +63 -4
- data/lib/bundler/source/gemspec.rb +18 -0
- data/lib/bundler/source/git.rb +97 -50
- data/lib/bundler/source/git/git_proxy.rb +138 -65
- data/lib/bundler/source/metadata.rb +67 -0
- data/lib/bundler/source/path.rb +83 -47
- data/lib/bundler/source/path/installer.rb +42 -11
- data/lib/bundler/source/rubygems.rb +231 -116
- data/lib/bundler/source/rubygems/remote.rb +30 -1
- data/lib/bundler/source_list.rb +103 -21
- data/lib/bundler/spec_set.rb +96 -51
- data/lib/bundler/stub_specification.rb +87 -4
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +14 -1
- data/lib/bundler/templates/Executable.bundler +114 -0
- data/lib/bundler/templates/Executable.standalone +6 -4
- data/lib/bundler/templates/Gemfile +4 -1
- data/lib/bundler/templates/gems.rb +8 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +79 -44
- data/lib/bundler/templates/newgem/Gemfile.tt +18 -2
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
- data/lib/bundler/templates/newgem/README.md.tt +16 -10
- data/lib/bundler/templates/newgem/Rakefile.tt +22 -8
- data/lib/bundler/templates/newgem/bin/console.tt +2 -1
- 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/ext/newgem/newgem.c.tt +4 -4
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
- data/lib/bundler/templates/newgem/gitignore.tt +5 -1
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +9 -6
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +6 -4
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +27 -28
- data/lib/bundler/templates/newgem/rspec.tt +1 -0
- data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +4 -4
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -2
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +3 -1
- data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -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/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
- data/lib/bundler/ui.rb +5 -3
- data/lib/bundler/ui/rg_proxy.rb +3 -1
- data/lib/bundler/ui/shell.rb +54 -21
- data/lib/bundler/ui/silent.rb +26 -1
- data/lib/bundler/uri_credentials_filter.rb +43 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1764 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +11 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +113 -134
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +158 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +82 -8
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +4 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +6 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +555 -150
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +6 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +19 -12
- data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +310 -467
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +58 -25
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +50 -33
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +5 -3
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +9 -19
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +79 -22
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +33 -20
- data/lib/bundler/vendor/thor/lib/thor/base.rb +110 -67
- data/lib/bundler/vendor/thor/lib/thor/command.rb +33 -24
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
- data/lib/bundler/vendor/thor/lib/thor/error.rb +81 -3
- data/lib/bundler/vendor/thor/lib/thor/group.rb +16 -16
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +18 -18
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +60 -26
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +31 -13
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +42 -39
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +109 -39
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +7 -3
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/util.rb +26 -9
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
- data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
- data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
- data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
- data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/bundler/vendored_fileutils.rb +4 -0
- data/lib/bundler/vendored_molinillo.rb +3 -1
- data/lib/bundler/vendored_persistent.rb +45 -9
- data/lib/bundler/vendored_thor.rb +8 -3
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/vendored_uri.rb +4 -0
- data/lib/bundler/version.rb +7 -4
- data/lib/bundler/version_ranges.rb +122 -0
- data/lib/bundler/vlad.rb +8 -2
- data/lib/bundler/worker.rb +38 -6
- data/lib/bundler/yaml_serializer.rb +89 -0
- metadata +164 -158
- data/.gitignore +0 -16
- data/.rspec +0 -3
- data/.rubocop.yml +0 -105
- data/.rubocop_todo.yml +0 -120
- data/.travis.yml +0 -97
- data/CODE_OF_CONDUCT.md +0 -42
- data/CONTRIBUTING.md +0 -32
- data/DEVELOPMENT.md +0 -118
- data/ISSUES.md +0 -96
- data/Rakefile +0 -309
- data/bin/rake +0 -14
- data/bin/rspec +0 -10
- data/bin/rubocop +0 -11
- data/exe/bundle_ruby +0 -60
- data/lib/bundler/cli/package.rb +0 -45
- data/lib/bundler/environment.rb +0 -41
- data/lib/bundler/gem_path_manipulation.rb +0 -8
- data/lib/bundler/gem_remote_fetcher.rb +0 -41
- data/lib/bundler/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
- data/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem +0 -32
- data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
- data/lib/bundler/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
- data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
- data/lib/bundler/ssl_certs/certificate_manager.rb +0 -64
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
- data/lib/bundler/vendor/net/http/faster.rb +0 -26
- data/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb +0 -128
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -10
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -98
- data/man/bundle-config.ronn +0 -187
- data/man/bundle-update.ronn +0 -188
- data/man/bundle.ronn +0 -98
- data/man/index.txt +0 -8
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class FeatureFlag
|
5
|
+
def self.settings_flag(flag, &default)
|
6
|
+
unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
|
7
|
+
raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
|
8
|
+
end
|
9
|
+
|
10
|
+
settings_method("#{flag}?", flag, &default)
|
11
|
+
end
|
12
|
+
private_class_method :settings_flag
|
13
|
+
|
14
|
+
def self.settings_option(key, &default)
|
15
|
+
settings_method(key, key, &default)
|
16
|
+
end
|
17
|
+
private_class_method :settings_option
|
18
|
+
|
19
|
+
def self.settings_method(name, key, &default)
|
20
|
+
define_method(name) do
|
21
|
+
value = Bundler.settings[key]
|
22
|
+
value = instance_eval(&default) if value.nil?
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
private_class_method :settings_method
|
27
|
+
|
28
|
+
(1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }
|
29
|
+
|
30
|
+
settings_flag(:allow_bundler_dependency_conflicts) { bundler_3_mode? }
|
31
|
+
settings_flag(:allow_offline_install) { bundler_3_mode? }
|
32
|
+
settings_flag(:auto_clean_without_path) { bundler_3_mode? }
|
33
|
+
settings_flag(:cache_all) { bundler_3_mode? }
|
34
|
+
settings_flag(:default_install_uses_path) { bundler_3_mode? }
|
35
|
+
settings_flag(:deployment_means_frozen) { bundler_3_mode? }
|
36
|
+
settings_flag(:disable_multisource) { bundler_3_mode? }
|
37
|
+
settings_flag(:forget_cli_options) { bundler_3_mode? }
|
38
|
+
settings_flag(:global_gem_cache) { bundler_3_mode? }
|
39
|
+
settings_flag(:only_update_to_newer_versions) { bundler_3_mode? }
|
40
|
+
settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
|
41
|
+
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
|
42
|
+
settings_flag(:print_only_version_number) { bundler_3_mode? }
|
43
|
+
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
44
|
+
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
45
|
+
settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
|
46
|
+
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
47
|
+
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
48
|
+
|
49
|
+
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
50
|
+
|
51
|
+
def initialize(bundler_version)
|
52
|
+
@bundler_version = Gem::Version.create(bundler_version)
|
53
|
+
end
|
54
|
+
|
55
|
+
def major_version
|
56
|
+
@bundler_version.segments.first
|
57
|
+
end
|
58
|
+
private :major_version
|
59
|
+
end
|
60
|
+
end
|
data/lib/bundler/fetcher.rb
CHANGED
@@ -1,22 +1,29 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "vendored_persistent"
|
2
4
|
require "cgi"
|
3
5
|
require "securerandom"
|
4
6
|
require "zlib"
|
7
|
+
require "rubygems/request"
|
5
8
|
|
6
9
|
module Bundler
|
7
10
|
# Handles all the fetching with the rubygems server
|
8
11
|
class Fetcher
|
9
|
-
autoload :
|
10
|
-
autoload :
|
11
|
-
autoload :
|
12
|
+
autoload :CompactIndex, File.expand_path("fetcher/compact_index", __dir__)
|
13
|
+
autoload :Downloader, File.expand_path("fetcher/downloader", __dir__)
|
14
|
+
autoload :Dependency, File.expand_path("fetcher/dependency", __dir__)
|
15
|
+
autoload :Index, File.expand_path("fetcher/index", __dir__)
|
12
16
|
|
13
17
|
# This error is raised when it looks like the network is down
|
14
18
|
class NetworkDownError < HTTPError; end
|
19
|
+
# This error is raised if we should rate limit our requests to the API
|
20
|
+
class TooManyRequestsError < HTTPError; end
|
15
21
|
# This error is raised if the API returns a 413 (only printed in verbose)
|
16
22
|
class FallbackError < HTTPError; end
|
17
23
|
# This is the error raised if OpenSSL fails the cert verification
|
18
24
|
class CertificateFailureError < HTTPError
|
19
25
|
def initialize(remote_uri)
|
26
|
+
remote_uri = filter_uri(remote_uri)
|
20
27
|
super "Could not verify the SSL certificate for #{remote_uri}.\nThere" \
|
21
28
|
" is a chance you are experiencing a man-in-the-middle attack, but" \
|
22
29
|
" most likely your system doesn't have the CA certificates needed" \
|
@@ -37,14 +44,16 @@ module Bundler
|
|
37
44
|
# This error is raised if HTTP authentication is required, but not provided.
|
38
45
|
class AuthenticationRequiredError < HTTPError
|
39
46
|
def initialize(remote_uri)
|
47
|
+
remote_uri = filter_uri(remote_uri)
|
40
48
|
super "Authentication is required for #{remote_uri}.\n" \
|
41
49
|
"Please supply credentials for this source. You can do this by running:\n" \
|
42
|
-
" bundle config #{remote_uri} username:password"
|
50
|
+
" bundle config set --global #{remote_uri} username:password"
|
43
51
|
end
|
44
52
|
end
|
45
53
|
# This error is raised if HTTP authentication is provided, but incorrect.
|
46
54
|
class BadAuthenticationError < HTTPError
|
47
55
|
def initialize(remote_uri)
|
56
|
+
remote_uri = filter_uri(remote_uri)
|
48
57
|
super "Bad username or password for #{remote_uri}.\n" \
|
49
58
|
"Please double-check your credentials and correct them."
|
50
59
|
end
|
@@ -52,10 +61,17 @@ module Bundler
|
|
52
61
|
|
53
62
|
# Exceptions classes that should bypass retry attempts. If your password didn't work the
|
54
63
|
# first time, it's not going to the third time.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
64
|
+
NET_ERRORS = [:HTTPBadGateway, :HTTPBadRequest, :HTTPFailedDependency,
|
65
|
+
:HTTPForbidden, :HTTPInsufficientStorage, :HTTPMethodNotAllowed,
|
66
|
+
:HTTPMovedPermanently, :HTTPNoContent, :HTTPNotFound,
|
67
|
+
:HTTPNotImplemented, :HTTPPreconditionFailed, :HTTPRequestEntityTooLarge,
|
68
|
+
:HTTPRequestURITooLong, :HTTPUnauthorized, :HTTPUnprocessableEntity,
|
69
|
+
:HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze
|
70
|
+
FAIL_ERRORS = begin
|
71
|
+
fail_errors = [AuthenticationRequiredError, BadAuthenticationError, FallbackError]
|
72
|
+
fail_errors << Gem::Requirement::BadRequirementError if defined?(Gem::Requirement::BadRequirementError)
|
73
|
+
fail_errors.concat(NET_ERRORS.map {|e| SharedHelpers.const_get_safely(e, Net) }.compact)
|
74
|
+
end.freeze
|
59
75
|
|
60
76
|
class << self
|
61
77
|
attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries
|
@@ -81,13 +97,14 @@ module Bundler
|
|
81
97
|
spec -= [nil, "ruby", ""]
|
82
98
|
spec_file_name = "#{spec.join "-"}.gemspec"
|
83
99
|
|
84
|
-
uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
100
|
+
uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
85
101
|
if uri.scheme == "file"
|
86
|
-
Bundler.
|
102
|
+
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
103
|
+
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
87
104
|
elsif cached_spec_path = gemspec_cached_path(spec_file_name)
|
88
105
|
Bundler.load_gemspec(cached_spec_path)
|
89
106
|
else
|
90
|
-
Bundler.load_marshal
|
107
|
+
Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
|
91
108
|
end
|
92
109
|
rescue MarshalError
|
93
110
|
raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
|
@@ -96,7 +113,7 @@ module Bundler
|
|
96
113
|
|
97
114
|
# return the specs in the bundler format as an index with retries
|
98
115
|
def specs_with_retry(gem_names, source)
|
99
|
-
Bundler::Retry.new("fetcher").attempts do
|
116
|
+
Bundler::Retry.new("fetcher", FAIL_ERRORS).attempts do
|
100
117
|
specs(gem_names, source)
|
101
118
|
end
|
102
119
|
end
|
@@ -106,20 +123,25 @@ module Bundler
|
|
106
123
|
old = Bundler.rubygems.sources
|
107
124
|
index = Bundler::Index.new
|
108
125
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
126
|
+
if Bundler::Fetcher.disable_endpoint
|
127
|
+
@use_api = false
|
128
|
+
specs = fetchers.last.specs(gem_names)
|
129
|
+
else
|
130
|
+
specs = []
|
131
|
+
fetchers.shift until fetchers.first.available? || fetchers.empty?
|
132
|
+
fetchers.dup.each do |f|
|
133
|
+
break unless f.api_fetcher? && !gem_names || !specs = f.specs(gem_names)
|
134
|
+
fetchers.delete(f)
|
135
|
+
end
|
136
|
+
@use_api = false if fetchers.none?(&:api_fetcher?)
|
113
137
|
end
|
114
|
-
@use_api = false if fetchers.none?(&:api_fetcher?)
|
115
138
|
|
116
|
-
specs
|
139
|
+
specs.each do |name, version, platform, dependencies, metadata|
|
117
140
|
next if name == "bundler"
|
118
|
-
spec =
|
119
|
-
|
120
|
-
spec = EndpointSpecification.new(name, version, platform, dependencies)
|
141
|
+
spec = if dependencies
|
142
|
+
EndpointSpecification.new(name, version, platform, dependencies, metadata)
|
121
143
|
else
|
122
|
-
|
144
|
+
RemoteSpecification.new(name, version, platform, self)
|
123
145
|
end
|
124
146
|
spec.source = source
|
125
147
|
spec.remote = @remote
|
@@ -137,32 +159,33 @@ module Bundler
|
|
137
159
|
def use_api
|
138
160
|
return @use_api if defined?(@use_api)
|
139
161
|
|
140
|
-
|
141
|
-
|
162
|
+
fetchers.shift until fetchers.first.available?
|
163
|
+
|
164
|
+
@use_api = if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
|
165
|
+
false
|
142
166
|
else
|
143
|
-
fetchers.
|
144
|
-
@use_api = fetchers.any?(&:api_fetcher?)
|
167
|
+
fetchers.first.api_fetcher?
|
145
168
|
end
|
146
169
|
end
|
147
170
|
|
148
171
|
def user_agent
|
149
172
|
@user_agent ||= begin
|
150
|
-
ruby = Bundler.
|
173
|
+
ruby = Bundler::RubyVersion.system
|
151
174
|
|
152
|
-
agent = "bundler/#{Bundler::VERSION}"
|
175
|
+
agent = String.new("bundler/#{Bundler::VERSION}")
|
153
176
|
agent << " rubygems/#{Gem::VERSION}"
|
154
|
-
agent << " ruby/#{ruby.
|
177
|
+
agent << " ruby/#{ruby.versions_string(ruby.versions)}"
|
155
178
|
agent << " (#{ruby.host})"
|
156
179
|
agent << " command/#{ARGV.first}"
|
157
180
|
|
158
181
|
if ruby.engine != "ruby"
|
159
182
|
# engine_version raises on unknown engines
|
160
183
|
engine_version = begin
|
161
|
-
ruby.
|
162
|
-
rescue
|
184
|
+
ruby.engine_versions
|
185
|
+
rescue RuntimeError
|
163
186
|
"???"
|
164
187
|
end
|
165
|
-
agent << " #{ruby.engine}/#{engine_version}"
|
188
|
+
agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
|
166
189
|
end
|
167
190
|
|
168
191
|
agent << " options/#{Bundler.settings.all.join(",")}"
|
@@ -185,18 +208,17 @@ module Bundler
|
|
185
208
|
end
|
186
209
|
|
187
210
|
def http_proxy
|
188
|
-
|
189
|
-
|
190
|
-
end
|
211
|
+
return unless uri = connection.proxy_uri
|
212
|
+
uri.to_s
|
191
213
|
end
|
192
214
|
|
193
215
|
def inspect
|
194
216
|
"#<#{self.class}:0x#{object_id} uri=#{uri}>"
|
195
217
|
end
|
196
218
|
|
197
|
-
|
219
|
+
private
|
198
220
|
|
199
|
-
FETCHERS = [Dependency, Index]
|
221
|
+
FETCHERS = [CompactIndex, Dependency, Index].freeze
|
200
222
|
|
201
223
|
def cis
|
202
224
|
env_cis = {
|
@@ -207,8 +229,9 @@ module Bundler
|
|
207
229
|
"BUILDBOX" => "buildbox",
|
208
230
|
"GO_SERVER_URL" => "go",
|
209
231
|
"SNAP_CI" => "snap",
|
232
|
+
"GITLAB_CI" => "gitlab",
|
210
233
|
"CI_NAME" => ENV["CI_NAME"],
|
211
|
-
"CI" => "ci"
|
234
|
+
"CI" => "ci",
|
212
235
|
}
|
213
236
|
env_cis.find_all {|env, _| ENV[env] }.map {|_, ci| ci }
|
214
237
|
end
|
@@ -220,9 +243,9 @@ module Bundler
|
|
220
243
|
Bundler.settings[:ssl_client_cert]
|
221
244
|
raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)
|
222
245
|
|
223
|
-
con =
|
246
|
+
con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
|
224
247
|
if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
|
225
|
-
con.proxy = URI.parse(gem_proxy)
|
248
|
+
con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
|
226
249
|
end
|
227
250
|
|
228
251
|
if remote_uri.scheme == "https"
|
@@ -231,13 +254,17 @@ module Bundler
|
|
231
254
|
con.cert_store = bundler_cert_store
|
232
255
|
end
|
233
256
|
|
234
|
-
|
235
|
-
|
257
|
+
ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
|
258
|
+
(Bundler.rubygems.configuration.ssl_client_cert if
|
259
|
+
Bundler.rubygems.configuration.respond_to?(:ssl_client_cert))
|
260
|
+
if ssl_client_cert
|
261
|
+
pem = File.read(ssl_client_cert)
|
236
262
|
con.cert = OpenSSL::X509::Certificate.new(pem)
|
237
263
|
con.key = OpenSSL::PKey::RSA.new(pem)
|
238
264
|
end
|
239
265
|
|
240
266
|
con.read_timeout = Fetcher.api_timeout
|
267
|
+
con.open_timeout = Fetcher.api_timeout
|
241
268
|
con.override_headers["User-Agent"] = user_agent
|
242
269
|
con.override_headers["X-Gemfile-Source"] = @remote.original_uri.to_s if @remote.original_uri
|
243
270
|
con
|
@@ -255,26 +282,28 @@ module Bundler
|
|
255
282
|
Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
|
256
283
|
Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
|
257
284
|
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
|
258
|
-
|
259
|
-
]
|
285
|
+
PersistentHTTP::Error, Zlib::BufError, Errno::EHOSTUNREACH
|
286
|
+
].freeze
|
260
287
|
|
261
288
|
def bundler_cert_store
|
262
289
|
store = OpenSSL::X509::Store.new
|
263
|
-
|
264
|
-
|
265
|
-
|
290
|
+
ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
|
291
|
+
(Bundler.rubygems.configuration.ssl_ca_cert if
|
292
|
+
Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert))
|
293
|
+
if ssl_ca_cert
|
294
|
+
if File.directory? ssl_ca_cert
|
295
|
+
store.add_path ssl_ca_cert
|
266
296
|
else
|
267
|
-
store.add_file
|
297
|
+
store.add_file ssl_ca_cert
|
268
298
|
end
|
269
299
|
else
|
270
300
|
store.set_default_paths
|
271
|
-
|
272
|
-
Dir.glob(certs).each {|c| store.add_file c }
|
301
|
+
Gem::Request.get_cert_files.each {|c| store.add_file c }
|
273
302
|
end
|
274
303
|
store
|
275
304
|
end
|
276
305
|
|
277
|
-
|
306
|
+
private
|
278
307
|
|
279
308
|
def remote_uri
|
280
309
|
@remote.uri
|
data/lib/bundler/fetcher/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bundler
|
2
4
|
class Fetcher
|
3
5
|
class Base
|
@@ -20,7 +22,7 @@ module Bundler
|
|
20
22
|
@fetch_uri ||= begin
|
21
23
|
if remote_uri.host == "rubygems.org"
|
22
24
|
uri = remote_uri.dup
|
23
|
-
uri.host = "
|
25
|
+
uri.host = "index.rubygems.org"
|
24
26
|
uri
|
25
27
|
else
|
26
28
|
remote_uri
|
@@ -28,13 +30,23 @@ module Bundler
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
32
|
-
|
33
|
+
def available?
|
34
|
+
true
|
33
35
|
end
|
34
36
|
|
35
37
|
def api_fetcher?
|
36
38
|
false
|
37
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def log_specs(debug_msg)
|
44
|
+
if Bundler.ui.debug?
|
45
|
+
Bundler.ui.debug debug_msg
|
46
|
+
else
|
47
|
+
Bundler.ui.info ".", false
|
48
|
+
end
|
49
|
+
end
|
38
50
|
end
|
39
51
|
end
|
40
52
|
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base"
|
4
|
+
require_relative "../worker"
|
5
|
+
|
6
|
+
module Bundler
|
7
|
+
autoload :CompactIndexClient, File.expand_path("../compact_index_client", __dir__)
|
8
|
+
|
9
|
+
class Fetcher
|
10
|
+
class CompactIndex < Base
|
11
|
+
def self.compact_index_request(method_name)
|
12
|
+
method = instance_method(method_name)
|
13
|
+
undef_method(method_name)
|
14
|
+
define_method(method_name) do |*args, &blk|
|
15
|
+
begin
|
16
|
+
method.bind(self).call(*args, &blk)
|
17
|
+
rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
|
18
|
+
raise HTTPError, e.message
|
19
|
+
rescue AuthenticationRequiredError
|
20
|
+
# Fail since we got a 401 from the server.
|
21
|
+
raise
|
22
|
+
rescue HTTPError => e
|
23
|
+
Bundler.ui.trace(e)
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def specs(gem_names)
|
30
|
+
specs_for_names(gem_names)
|
31
|
+
end
|
32
|
+
compact_index_request :specs
|
33
|
+
|
34
|
+
def specs_for_names(gem_names)
|
35
|
+
gem_info = []
|
36
|
+
complete_gems = []
|
37
|
+
remaining_gems = gem_names.dup
|
38
|
+
|
39
|
+
until remaining_gems.empty?
|
40
|
+
log_specs "Looking up gems #{remaining_gems.inspect}"
|
41
|
+
|
42
|
+
deps = begin
|
43
|
+
parallel_compact_index_client.dependencies(remaining_gems)
|
44
|
+
rescue TooManyRequestsError
|
45
|
+
@bundle_worker.stop if @bundle_worker
|
46
|
+
@bundle_worker = nil # reset it. Not sure if necessary
|
47
|
+
serial_compact_index_client.dependencies(remaining_gems)
|
48
|
+
end
|
49
|
+
next_gems = deps.map {|d| d[3].map(&:first).flatten(1) }.flatten(1).uniq
|
50
|
+
deps.each {|dep| gem_info << dep }
|
51
|
+
complete_gems.concat(deps.map(&:first)).uniq!
|
52
|
+
remaining_gems = next_gems - complete_gems
|
53
|
+
end
|
54
|
+
@bundle_worker.stop if @bundle_worker
|
55
|
+
@bundle_worker = nil # reset it. Not sure if necessary
|
56
|
+
|
57
|
+
gem_info
|
58
|
+
end
|
59
|
+
|
60
|
+
def fetch_spec(spec)
|
61
|
+
spec -= [nil, "ruby", ""]
|
62
|
+
contents = compact_index_client.spec(*spec)
|
63
|
+
return nil if contents.nil?
|
64
|
+
contents.unshift(spec.first)
|
65
|
+
contents[3].map! {|d| Gem::Dependency.new(*d) }
|
66
|
+
EndpointSpecification.new(*contents)
|
67
|
+
end
|
68
|
+
compact_index_request :fetch_spec
|
69
|
+
|
70
|
+
def available?
|
71
|
+
return nil unless SharedHelpers.md5_available?
|
72
|
+
user_home = Bundler.user_home
|
73
|
+
return nil unless user_home.directory? && user_home.writable?
|
74
|
+
# Read info file checksums out of /versions, so we can know if gems are up to date
|
75
|
+
fetch_uri.scheme != "file" && compact_index_client.update_and_parse_checksums!
|
76
|
+
rescue CompactIndexClient::Updater::MisMatchedChecksumError => e
|
77
|
+
Bundler.ui.debug(e.message)
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
compact_index_request :available?
|
81
|
+
|
82
|
+
def api_fetcher?
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def compact_index_client
|
89
|
+
@compact_index_client ||=
|
90
|
+
SharedHelpers.filesystem_access(cache_path) do
|
91
|
+
CompactIndexClient.new(cache_path, client_fetcher)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def parallel_compact_index_client
|
96
|
+
compact_index_client.execution_mode = lambda do |inputs, &blk|
|
97
|
+
func = lambda {|object, _index| blk.call(object) }
|
98
|
+
worker = bundle_worker(func)
|
99
|
+
inputs.each {|input| worker.enq(input) }
|
100
|
+
inputs.map { worker.deq }
|
101
|
+
end
|
102
|
+
|
103
|
+
compact_index_client
|
104
|
+
end
|
105
|
+
|
106
|
+
def serial_compact_index_client
|
107
|
+
compact_index_client.sequential_execution_mode!
|
108
|
+
compact_index_client
|
109
|
+
end
|
110
|
+
|
111
|
+
def bundle_worker(func = nil)
|
112
|
+
@bundle_worker ||= begin
|
113
|
+
worker_name = "Compact Index (#{display_uri.host})"
|
114
|
+
Bundler::Worker.new(Bundler.current_ruby.rbx? ? 1 : 25, worker_name, func)
|
115
|
+
end
|
116
|
+
@bundle_worker.tap do |worker|
|
117
|
+
worker.instance_variable_set(:@func, func) if func
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def cache_path
|
122
|
+
Bundler.user_cache.join("compact_index", remote.cache_slug)
|
123
|
+
end
|
124
|
+
|
125
|
+
def client_fetcher
|
126
|
+
ClientFetcher.new(self, Bundler.ui)
|
127
|
+
end
|
128
|
+
|
129
|
+
ClientFetcher = Struct.new(:fetcher, :ui) do
|
130
|
+
def call(path, headers)
|
131
|
+
fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
|
132
|
+
rescue NetworkDownError => e
|
133
|
+
raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"]
|
134
|
+
ui.warn "Using the cached data for the new index because of a network error: #{e}"
|
135
|
+
Net::HTTPNotModified.new(nil, nil, nil)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|