bundler 2.2.29 → 2.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1129 -4
- data/README.md +4 -8
- data/bundler.gemspec +11 -11
- data/exe/bundle +5 -26
- data/exe/bundler +1 -1
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +4 -4
- data/lib/bundler/capistrano.rb +1 -1
- data/lib/bundler/checksum.rb +254 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +4 -4
- data/lib/bundler/cli/binstubs.rb +10 -6
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/check.rb +3 -3
- data/lib/bundler/cli/common.rb +13 -3
- data/lib/bundler/cli/config.rb +18 -8
- data/lib/bundler/cli/console.rb +5 -4
- data/lib/bundler/cli/doctor.rb +12 -5
- data/lib/bundler/cli/exec.rb +1 -1
- data/lib/bundler/cli/fund.rb +1 -1
- data/lib/bundler/cli/gem.rb +141 -48
- data/lib/bundler/cli/info.rb +27 -17
- data/lib/bundler/cli/init.rb +6 -2
- data/lib/bundler/cli/install.rb +22 -39
- data/lib/bundler/cli/issue.rb +5 -4
- data/lib/bundler/cli/lock.rb +36 -29
- data/lib/bundler/cli/open.rb +9 -9
- data/lib/bundler/cli/outdated.rb +19 -12
- data/lib/bundler/cli/platform.rb +8 -6
- data/lib/bundler/cli/plugin.rb +9 -15
- data/lib/bundler/cli/pristine.rb +38 -30
- data/lib/bundler/cli/show.rb +3 -3
- data/lib/bundler/cli/update.rb +12 -7
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +266 -285
- data/lib/bundler/compact_index_client/cache.rb +53 -67
- data/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/lib/bundler/compact_index_client/parser.rb +84 -0
- data/lib/bundler/compact_index_client/updater.rb +83 -76
- data/lib/bundler/compact_index_client.rb +59 -87
- data/lib/bundler/constants.rb +9 -2
- data/lib/bundler/current_ruby.rb +12 -16
- data/lib/bundler/definition.rb +509 -319
- data/lib/bundler/dependency.rb +33 -71
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +88 -69
- data/lib/bundler/endpoint_specification.rb +32 -15
- data/lib/bundler/env.rb +5 -7
- data/lib/bundler/environment_preserver.rb +8 -22
- data/lib/bundler/errors.rb +101 -13
- data/lib/bundler/feature_flag.rb +0 -2
- data/lib/bundler/fetcher/base.rb +11 -11
- data/lib/bundler/fetcher/compact_index.rb +32 -52
- data/lib/bundler/fetcher/dependency.rb +3 -7
- data/lib/bundler/fetcher/downloader.rb +17 -16
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/lib/bundler/fetcher/index.rb +2 -29
- data/lib/bundler/fetcher.rb +87 -79
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +29 -40
- data/lib/bundler/gem_helper.rb +11 -23
- data/lib/bundler/gem_helpers.rb +30 -6
- data/lib/bundler/gem_version_promoter.rb +68 -109
- data/lib/bundler/graph.rb +9 -9
- data/lib/bundler/index.rb +71 -79
- data/lib/bundler/injector.rb +23 -11
- data/lib/bundler/inline.rb +11 -23
- data/lib/bundler/installer/gem_installer.rb +18 -11
- data/lib/bundler/installer/parallel_installer.rb +17 -65
- data/lib/bundler/installer/standalone.rb +56 -15
- data/lib/bundler/installer.rb +35 -61
- data/lib/bundler/lazy_specification.rb +92 -61
- data/lib/bundler/lockfile_generator.rb +12 -3
- data/lib/bundler/lockfile_parser.rb +137 -70
- data/lib/bundler/man/bundle-add.1 +19 -26
- data/lib/bundler/man/bundle-add.1.ronn +16 -4
- data/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/lib/bundler/man/bundle-cache.1 +9 -24
- data/lib/bundler/man/bundle-cache.1.ronn +9 -2
- data/lib/bundler/man/bundle-check.1 +5 -12
- data/lib/bundler/man/bundle-check.1.ronn +3 -0
- data/lib/bundler/man/bundle-clean.1 +4 -11
- data/lib/bundler/man/bundle-clean.1.ronn +1 -1
- data/lib/bundler/man/bundle-config.1 +47 -224
- data/lib/bundler/man/bundle-config.1.ronn +40 -28
- data/lib/bundler/man/bundle-console.1 +35 -0
- data/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/lib/bundler/man/bundle-doctor.1 +4 -18
- data/lib/bundler/man/bundle-exec.1 +16 -77
- data/lib/bundler/man/bundle-exec.1.ronn +8 -9
- data/lib/bundler/man/bundle-gem.1 +45 -72
- data/lib/bundler/man/bundle-gem.1.ronn +32 -5
- data/lib/bundler/man/bundle-help.1 +9 -0
- data/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/lib/bundler/man/bundle-info.1 +5 -11
- data/lib/bundler/man/bundle-info.1.ronn +3 -3
- data/lib/bundler/man/bundle-init.1 +6 -11
- data/lib/bundler/man/bundle-init.1.ronn +2 -0
- data/lib/bundler/man/bundle-inject.1 +8 -18
- data/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/lib/bundler/man/bundle-install.1 +32 -155
- data/lib/bundler/man/bundle-install.1.ronn +11 -33
- data/lib/bundler/man/bundle-list.1 +4 -19
- data/lib/bundler/man/bundle-lock.1 +5 -29
- data/lib/bundler/man/bundle-open.1 +18 -18
- data/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/lib/bundler/man/bundle-outdated.1 +17 -72
- data/lib/bundler/man/bundle-outdated.1.ronn +13 -18
- data/lib/bundler/man/bundle-platform.1 +16 -28
- data/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/lib/bundler/man/bundle-plugin.1 +58 -0
- data/lib/bundler/man/bundle-plugin.1.ronn +63 -0
- data/lib/bundler/man/bundle-pristine.1 +5 -16
- data/lib/bundler/man/bundle-remove.1 +4 -14
- data/lib/bundler/man/bundle-show.1 +3 -10
- data/lib/bundler/man/bundle-update.1 +19 -138
- data/lib/bundler/man/bundle-update.1.ronn +2 -1
- data/lib/bundler/man/bundle-version.1 +22 -0
- data/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/lib/bundler/man/bundle-viz.1 +6 -15
- data/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/lib/bundler/man/bundle.1 +17 -51
- data/lib/bundler/man/bundle.1.ronn +12 -7
- data/lib/bundler/man/gemfile.5 +130 -346
- data/lib/bundler/man/gemfile.5.ronn +121 -86
- data/lib/bundler/man/index.txt +4 -0
- data/lib/bundler/match_metadata.rb +17 -0
- data/lib/bundler/match_platform.rb +1 -2
- data/lib/bundler/match_remote_metadata.rb +29 -0
- data/lib/bundler/mirror.rb +8 -10
- data/lib/bundler/plugin/api/source.rb +9 -13
- data/lib/bundler/plugin/index.rb +13 -5
- data/lib/bundler/plugin/installer/git.rb +0 -4
- data/lib/bundler/plugin/installer/path.rb +18 -0
- data/lib/bundler/plugin/installer/rubygems.rb +0 -8
- data/lib/bundler/plugin/installer.rb +42 -19
- data/lib/bundler/plugin/source_list.rb +4 -4
- data/lib/bundler/plugin.rb +16 -7
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/remote_specification.rb +11 -5
- data/lib/bundler/resolver/base.rb +111 -0
- data/lib/bundler/resolver/candidate.rb +82 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +81 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +53 -66
- data/lib/bundler/resolver.rb +419 -307
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_dsl.rb +42 -7
- data/lib/bundler/ruby_version.rb +16 -22
- data/lib/bundler/rubygems_ext.rb +250 -64
- data/lib/bundler/rubygems_gem_installer.rb +90 -64
- data/lib/bundler/rubygems_integration.rb +81 -190
- data/lib/bundler/runtime.rb +8 -13
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/self_manager.rb +206 -0
- data/lib/bundler/settings.rb +139 -57
- data/lib/bundler/setup.rb +13 -1
- data/lib/bundler/shared_helpers.rb +67 -36
- data/lib/bundler/source/git/git_proxy.rb +285 -82
- data/lib/bundler/source/git.rb +81 -41
- data/lib/bundler/source/metadata.rb +17 -16
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +13 -25
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +164 -234
- data/lib/bundler/source/rubygems_aggregate.rb +1 -1
- data/lib/bundler/source.rb +7 -6
- data/lib/bundler/source_list.rb +40 -32
- data/lib/bundler/source_map.rb +15 -2
- data/lib/bundler/spec_set.rb +156 -46
- data/lib/bundler/stub_specification.rb +18 -5
- data/lib/bundler/templates/Executable +3 -5
- data/lib/bundler/templates/Executable.bundler +7 -12
- data/lib/bundler/templates/Executable.standalone +4 -4
- data/lib/bundler/templates/Gemfile +0 -2
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
- data/lib/bundler/templates/newgem/README.md.tt +7 -11
- data/lib/bundler/templates/newgem/Rakefile.tt +28 -4
- data/lib/bundler/templates/newgem/bin/console.tt +0 -4
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +13 -3
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +25 -17
- data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
- data/lib/bundler/ui/rg_proxy.rb +1 -1
- data/lib/bundler/ui/shell.rb +38 -15
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/uri_credentials_filter.rb +2 -2
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +92 -78
- data/lib/bundler/vendor/fileutils/.document +1 -0
- data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1340 -410
- data/lib/bundler/vendor/net-http-persistent/.document +1 -0
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +57 -57
- data/lib/bundler/vendor/pub_grub/.document +1 -0
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/thor/.document +1 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +12 -14
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +16 -6
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -17
- data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
- data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +10 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -20
- data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +63 -7
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +48 -154
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
- data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +0 -45
- data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/util.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
- data/lib/bundler/vendor/tsort/.document +1 -0
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
- data/lib/bundler/vendor/uri/.document +1 -0
- data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +316 -207
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +33 -13
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -3
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -3
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -23
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +105 -47
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +3 -3
- data/lib/bundler/vendored_net_http.rb +23 -0
- data/lib/bundler/vendored_persistent.rb +0 -36
- data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/vendored_timeout.rb +12 -0
- data/lib/bundler/{vendored_tmpdir.rb → vendored_tsort.rb} +1 -1
- data/lib/bundler/vendored_uri.rb +18 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/vlad.rb +1 -1
- data/lib/bundler/worker.rb +7 -9
- data/lib/bundler/yaml_serializer.rb +21 -12
- data/lib/bundler.rb +114 -121
- metadata +87 -41
- data/lib/bundler/dep_proxy.rb +0 -55
- data/lib/bundler/gemdeps.rb +0 -29
- data/lib/bundler/psyched_yaml.rb +0 -22
- data/lib/bundler/templates/gems.rb +0 -8
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/lib/bundler/version_ranges.rb +0 -122
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
module Bundler
|
4
4
|
class EnvironmentPreserver
|
5
|
-
INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL"
|
5
|
+
INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL"
|
6
6
|
BUNDLER_KEYS = %w[
|
7
7
|
BUNDLE_BIN_PATH
|
8
8
|
BUNDLE_GEMFILE
|
9
9
|
BUNDLER_VERSION
|
10
|
+
BUNDLER_SETUP
|
10
11
|
GEM_HOME
|
11
12
|
GEM_PATH
|
12
13
|
MANPATH
|
@@ -15,17 +16,10 @@ module Bundler
|
|
15
16
|
RUBYLIB
|
16
17
|
RUBYOPT
|
17
18
|
].map(&:freeze).freeze
|
18
|
-
BUNDLER_PREFIX = "BUNDLER_ORIG_"
|
19
|
+
BUNDLER_PREFIX = "BUNDLER_ORIG_"
|
19
20
|
|
20
21
|
def self.from_env
|
21
|
-
new(
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.env_to_hash(env)
|
25
|
-
to_hash = env.to_hash
|
26
|
-
return to_hash unless Gem.win_platform?
|
27
|
-
|
28
|
-
to_hash.each_with_object({}) {|(k,v), a| a[k.upcase] = v }
|
22
|
+
new(ENV.to_hash, BUNDLER_KEYS)
|
29
23
|
end
|
30
24
|
|
31
25
|
# @param env [Hash]
|
@@ -38,15 +32,7 @@ module Bundler
|
|
38
32
|
|
39
33
|
# Replaces `ENV` with the bundler environment variables backed up
|
40
34
|
def replace_with_backup
|
41
|
-
ENV.replace(backup)
|
42
|
-
|
43
|
-
# Fallback logic for Windows below to workaround
|
44
|
-
# https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
|
45
|
-
# supported rubies include the fix for that.
|
46
|
-
|
47
|
-
ENV.clear
|
48
|
-
|
49
|
-
backup.each {|k, v| ENV[k] = v }
|
35
|
+
ENV.replace(backup)
|
50
36
|
end
|
51
37
|
|
52
38
|
# @return [Hash]
|
@@ -54,9 +40,9 @@ module Bundler
|
|
54
40
|
env = @original.clone
|
55
41
|
@keys.each do |key|
|
56
42
|
value = env[key]
|
57
|
-
if !value.nil?
|
43
|
+
if !value.nil?
|
58
44
|
env[@prefix + key] ||= value
|
59
|
-
|
45
|
+
else
|
60
46
|
env[@prefix + key] ||= INTENTIONALLY_NIL
|
61
47
|
end
|
62
48
|
end
|
@@ -68,7 +54,7 @@ module Bundler
|
|
68
54
|
env = @original.clone
|
69
55
|
@keys.each do |key|
|
70
56
|
value_original = env[@prefix + key]
|
71
|
-
next if value_original.nil?
|
57
|
+
next if value_original.nil?
|
72
58
|
if value_original == INTENTIONALLY_NIL
|
73
59
|
env.delete(key)
|
74
60
|
else
|
data/lib/bundler/errors.rb
CHANGED
@@ -21,16 +21,7 @@ module Bundler
|
|
21
21
|
class InstallError < BundlerError; status_code(5); end
|
22
22
|
|
23
23
|
# Internal error, should be rescued
|
24
|
-
class
|
25
|
-
attr_reader :conflicts
|
26
|
-
|
27
|
-
def initialize(conflicts, msg = nil)
|
28
|
-
super(msg)
|
29
|
-
@conflicts = conflicts
|
30
|
-
end
|
31
|
-
|
32
|
-
status_code(6)
|
33
|
-
end
|
24
|
+
class SolveFailure < BundlerError; status_code(6); end
|
34
25
|
|
35
26
|
class GemNotFound < BundlerError; status_code(7); end
|
36
27
|
class InstallHookError < BundlerError; status_code(8); end
|
@@ -41,25 +32,69 @@ module Bundler
|
|
41
32
|
class GemspecError < BundlerError; status_code(14); end
|
42
33
|
class InvalidOption < BundlerError; status_code(15); end
|
43
34
|
class ProductionError < BundlerError; status_code(16); end
|
35
|
+
|
44
36
|
class HTTPError < BundlerError
|
45
37
|
status_code(17)
|
46
38
|
def filter_uri(uri)
|
47
39
|
URICredentialsFilter.credential_filtered_uri(uri)
|
48
40
|
end
|
49
41
|
end
|
42
|
+
|
50
43
|
class RubyVersionMismatch < BundlerError; status_code(18); end
|
51
44
|
class SecurityError < BundlerError; status_code(19); end
|
52
45
|
class LockfileError < BundlerError; status_code(20); end
|
53
46
|
class CyclicDependencyError < BundlerError; status_code(21); end
|
54
47
|
class GemfileLockNotFound < BundlerError; status_code(22); end
|
55
48
|
class PluginError < BundlerError; status_code(29); end
|
56
|
-
class SudoNotPermittedError < BundlerError; status_code(30); end
|
57
49
|
class ThreadCreationError < BundlerError; status_code(33); end
|
58
50
|
class APIResponseMismatchError < BundlerError; status_code(34); end
|
59
51
|
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
60
52
|
class GemfileEvalError < GemfileError; end
|
61
53
|
class MarshalError < StandardError; end
|
62
54
|
|
55
|
+
class ChecksumMismatchError < SecurityError
|
56
|
+
def initialize(lock_name, existing, checksum)
|
57
|
+
@lock_name = lock_name
|
58
|
+
@existing = existing
|
59
|
+
@checksum = checksum
|
60
|
+
end
|
61
|
+
|
62
|
+
def message
|
63
|
+
<<~MESSAGE
|
64
|
+
Bundler found mismatched checksums. This is a potential security risk.
|
65
|
+
#{@lock_name} #{@existing.to_lock}
|
66
|
+
from #{@existing.sources.join("\n and ")}
|
67
|
+
#{@lock_name} #{@checksum.to_lock}
|
68
|
+
from #{@checksum.sources.join("\n and ")}
|
69
|
+
|
70
|
+
#{mismatch_resolution_instructions}
|
71
|
+
To ignore checksum security warnings, disable checksum validation with
|
72
|
+
`bundle config set --local disable_checksum_validation true`
|
73
|
+
MESSAGE
|
74
|
+
end
|
75
|
+
|
76
|
+
def mismatch_resolution_instructions
|
77
|
+
removable, remote = [@existing, @checksum].partition(&:removable?)
|
78
|
+
case removable.size
|
79
|
+
when 0
|
80
|
+
msg = +"Mismatched checksums each have an authoritative source:\n"
|
81
|
+
msg << " 1. #{@existing.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
|
82
|
+
msg << " 2. #{@checksum.sources.reject(&:removable?).map(&:to_s).join(" and ")}\n"
|
83
|
+
msg << "You may need to alter your Gemfile sources to resolve this issue.\n"
|
84
|
+
when 1
|
85
|
+
msg = +"If you trust #{remote.first.sources.first}, to resolve this issue you can:\n"
|
86
|
+
msg << removable.first.removal_instructions
|
87
|
+
when 2
|
88
|
+
msg = +"To resolve this issue you can either:\n"
|
89
|
+
msg << @checksum.removal_instructions
|
90
|
+
msg << "or if you are sure that the new checksum from #{@checksum.sources.first} is correct:\n"
|
91
|
+
msg << @existing.removal_instructions
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
status_code(37)
|
96
|
+
end
|
97
|
+
|
63
98
|
class PermissionError < BundlerError
|
64
99
|
def initialize(path, permission_type = :write)
|
65
100
|
@path = path
|
@@ -75,10 +110,22 @@ module Bundler
|
|
75
110
|
end
|
76
111
|
end
|
77
112
|
|
113
|
+
def permission_type
|
114
|
+
case @permission_type
|
115
|
+
when :create
|
116
|
+
"executable permissions for all parent directories and write permissions for `#{parent_folder}`"
|
117
|
+
else
|
118
|
+
"#{@permission_type} permissions for that path"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def parent_folder
|
123
|
+
File.dirname(@path)
|
124
|
+
end
|
125
|
+
|
78
126
|
def message
|
79
127
|
"There was an error while trying to #{action} `#{@path}`. " \
|
80
|
-
"It is likely that you need to grant #{
|
81
|
-
"for that path."
|
128
|
+
"It is likely that you need to grant #{permission_type}."
|
82
129
|
end
|
83
130
|
|
84
131
|
status_code(23)
|
@@ -156,4 +203,45 @@ module Bundler
|
|
156
203
|
|
157
204
|
status_code(32)
|
158
205
|
end
|
206
|
+
|
207
|
+
class DirectoryRemovalError < BundlerError
|
208
|
+
def initialize(orig_exception, msg)
|
209
|
+
full_message = "#{msg}.\n" \
|
210
|
+
"The underlying error was #{orig_exception.class}: #{orig_exception.message}, with backtrace:\n" \
|
211
|
+
" #{orig_exception.backtrace.join("\n ")}\n\n" \
|
212
|
+
"Bundler Error Backtrace:"
|
213
|
+
super(full_message)
|
214
|
+
end
|
215
|
+
|
216
|
+
status_code(36)
|
217
|
+
end
|
218
|
+
|
219
|
+
class InsecureInstallPathError < BundlerError
|
220
|
+
def initialize(path)
|
221
|
+
@path = path
|
222
|
+
end
|
223
|
+
|
224
|
+
def message
|
225
|
+
"The installation path is insecure. Bundler cannot continue.\n" \
|
226
|
+
"#{@path} is world-writable (without sticky bit).\n" \
|
227
|
+
"Bundler cannot safely replace gems in world-writeable directories due to potential vulnerabilities.\n" \
|
228
|
+
"Please change the permissions of this directory or choose a different install path."
|
229
|
+
end
|
230
|
+
|
231
|
+
status_code(38)
|
232
|
+
end
|
233
|
+
|
234
|
+
class CorruptBundlerInstallError < BundlerError
|
235
|
+
def initialize(loaded_spec)
|
236
|
+
@loaded_spec = loaded_spec
|
237
|
+
end
|
238
|
+
|
239
|
+
def message
|
240
|
+
"The running version of Bundler (#{Bundler::VERSION}) does not match the version of the specification installed for it (#{@loaded_spec.version}). " \
|
241
|
+
"This can be caused by reinstalling Ruby without removing previous installation, leaving around an upgraded default version of Bundler. " \
|
242
|
+
"Reinstalling Ruby from scratch should fix the problem."
|
243
|
+
end
|
244
|
+
|
245
|
+
status_code(39)
|
246
|
+
end
|
159
247
|
end
|
data/lib/bundler/feature_flag.rb
CHANGED
@@ -37,9 +37,7 @@ module Bundler
|
|
37
37
|
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
|
38
38
|
settings_flag(:print_only_version_number) { bundler_3_mode? }
|
39
39
|
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
40
|
-
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
41
40
|
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
42
|
-
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
43
41
|
|
44
42
|
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
45
43
|
|
data/lib/bundler/fetcher/base.rb
CHANGED
@@ -6,12 +6,14 @@ module Bundler
|
|
6
6
|
attr_reader :downloader
|
7
7
|
attr_reader :display_uri
|
8
8
|
attr_reader :remote
|
9
|
+
attr_reader :gem_remote_fetcher
|
9
10
|
|
10
|
-
def initialize(downloader, remote, display_uri)
|
11
|
+
def initialize(downloader, remote, display_uri, gem_remote_fetcher)
|
11
12
|
raise "Abstract class" if self.class == Base
|
12
13
|
@downloader = downloader
|
13
14
|
@remote = remote
|
14
15
|
@display_uri = display_uri
|
16
|
+
@gem_remote_fetcher = gem_remote_fetcher
|
15
17
|
end
|
16
18
|
|
17
19
|
def remote_uri
|
@@ -19,14 +21,12 @@ module Bundler
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def fetch_uri
|
22
|
-
@fetch_uri ||=
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
remote_uri
|
29
|
-
end
|
24
|
+
@fetch_uri ||= if remote_uri.host == "rubygems.org"
|
25
|
+
uri = remote_uri.dup
|
26
|
+
uri.host = "index.rubygems.org"
|
27
|
+
uri
|
28
|
+
else
|
29
|
+
remote_uri
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -40,9 +40,9 @@ module Bundler
|
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def log_specs(
|
43
|
+
def log_specs(&block)
|
44
44
|
if Bundler.ui.debug?
|
45
|
-
Bundler.ui.debug
|
45
|
+
Bundler.ui.debug yield
|
46
46
|
else
|
47
47
|
Bundler.ui.info ".", false
|
48
48
|
end
|
@@ -4,25 +4,21 @@ require_relative "base"
|
|
4
4
|
require_relative "../worker"
|
5
5
|
|
6
6
|
module Bundler
|
7
|
-
autoload :CompactIndexClient, File.expand_path("../compact_index_client", __dir__)
|
8
|
-
|
9
7
|
class Fetcher
|
10
8
|
class CompactIndex < Base
|
11
9
|
def self.compact_index_request(method_name)
|
12
10
|
method = instance_method(method_name)
|
13
11
|
undef_method(method_name)
|
14
12
|
define_method(method_name) do |*args, &blk|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
nil
|
25
|
-
end
|
13
|
+
method.bind(self).call(*args, &blk)
|
14
|
+
rescue NetworkDownError, CompactIndexClient::Updater::MismatchedChecksumError => e
|
15
|
+
raise HTTPError, e.message
|
16
|
+
rescue AuthenticationRequiredError, BadAuthenticationError
|
17
|
+
# Fail since we got a 401 from the server.
|
18
|
+
raise
|
19
|
+
rescue HTTPError => e
|
20
|
+
Bundler.ui.trace(e)
|
21
|
+
nil
|
26
22
|
end
|
27
23
|
end
|
28
24
|
|
@@ -37,43 +33,27 @@ module Bundler
|
|
37
33
|
remaining_gems = gem_names.dup
|
38
34
|
|
39
35
|
until remaining_gems.empty?
|
40
|
-
log_specs "Looking up gems #{remaining_gems.inspect}"
|
41
|
-
|
42
|
-
|
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
|
36
|
+
log_specs { "Looking up gems #{remaining_gems.inspect}" }
|
37
|
+
deps = fetch_gem_infos(remaining_gems).flatten(1)
|
38
|
+
next_gems = deps.flat_map {|d| d[CompactIndexClient::INFO_DEPS].flat_map(&:first) }.uniq
|
50
39
|
deps.each {|dep| gem_info << dep }
|
51
40
|
complete_gems.concat(deps.map(&:first)).uniq!
|
52
41
|
remaining_gems = next_gems - complete_gems
|
53
42
|
end
|
54
|
-
@bundle_worker
|
43
|
+
@bundle_worker&.stop
|
55
44
|
@bundle_worker = nil # reset it. Not sure if necessary
|
56
45
|
|
57
46
|
gem_info
|
58
47
|
end
|
59
48
|
|
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
49
|
def available?
|
71
|
-
|
72
|
-
|
73
|
-
|
50
|
+
unless SharedHelpers.md5_available?
|
51
|
+
Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
|
52
|
+
return nil
|
53
|
+
end
|
74
54
|
# Read info file checksums out of /versions, so we can know if gems are up to date
|
75
|
-
|
76
|
-
rescue CompactIndexClient::Updater::
|
55
|
+
compact_index_client.available?
|
56
|
+
rescue CompactIndexClient::Updater::MismatchedChecksumError => e
|
77
57
|
Bundler.ui.debug(e.message)
|
78
58
|
nil
|
79
59
|
end
|
@@ -92,20 +72,20 @@ module Bundler
|
|
92
72
|
end
|
93
73
|
end
|
94
74
|
|
95
|
-
def
|
96
|
-
compact_index_client.
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
compact_index_client
|
75
|
+
def fetch_gem_infos(names)
|
76
|
+
in_parallel(names) {|name| compact_index_client.info(name) }
|
77
|
+
rescue TooManyRequestsError # rubygems.org is rate limiting us, slow down.
|
78
|
+
@bundle_worker&.stop
|
79
|
+
@bundle_worker = nil # reset it. Not sure if necessary
|
80
|
+
compact_index_client.reset!
|
81
|
+
names.map {|name| compact_index_client.info(name) }
|
104
82
|
end
|
105
83
|
|
106
|
-
def
|
107
|
-
|
108
|
-
|
84
|
+
def in_parallel(inputs, &blk)
|
85
|
+
func = lambda {|object, _index| blk.call(object) }
|
86
|
+
worker = bundle_worker(func)
|
87
|
+
inputs.each {|input| worker.enq(input) }
|
88
|
+
inputs.map { worker.deq }
|
109
89
|
end
|
110
90
|
|
111
91
|
def bundle_worker(func = nil)
|
@@ -132,7 +112,7 @@ module Bundler
|
|
132
112
|
rescue NetworkDownError => e
|
133
113
|
raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"]
|
134
114
|
ui.warn "Using the cached data for the new index because of a network error: #{e}"
|
135
|
-
Net::HTTPNotModified.new(nil, nil, nil)
|
115
|
+
Gem::Net::HTTPNotModified.new(nil, nil, nil)
|
136
116
|
end
|
137
117
|
end
|
138
118
|
end
|
@@ -24,7 +24,7 @@ module Bundler
|
|
24
24
|
def specs(gem_names, full_dependency_list = [], last_spec_list = [])
|
25
25
|
query_list = gem_names.uniq - full_dependency_list
|
26
26
|
|
27
|
-
log_specs "Query List: #{query_list.inspect}"
|
27
|
+
log_specs { "Query List: #{query_list.inspect}" }
|
28
28
|
|
29
29
|
return last_spec_list if query_list.empty?
|
30
30
|
|
@@ -34,14 +34,10 @@ module Bundler
|
|
34
34
|
|
35
35
|
returned_gems = spec_list.map(&:first).uniq
|
36
36
|
specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
|
37
|
-
rescue MarshalError
|
37
|
+
rescue MarshalError, HTTPError, GemspecError
|
38
38
|
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
39
39
|
Bundler.ui.debug "could not fetch from the dependency API, trying the full index"
|
40
40
|
nil
|
41
|
-
rescue HTTPError, GemspecError
|
42
|
-
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
43
|
-
Bundler.ui.debug "could not fetch from the dependency API\nit's suggested to retry using the full index via `bundle install --full-index`"
|
44
|
-
nil
|
45
41
|
end
|
46
42
|
|
47
43
|
def dependency_specs(gem_names)
|
@@ -55,7 +51,7 @@ module Bundler
|
|
55
51
|
gem_list = []
|
56
52
|
gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
|
57
53
|
marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
|
58
|
-
gem_list.concat(Bundler.
|
54
|
+
gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
|
59
55
|
end
|
60
56
|
gem_list
|
61
57
|
end
|
@@ -20,31 +20,35 @@ module Bundler
|
|
20
20
|
Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")
|
21
21
|
|
22
22
|
case response
|
23
|
-
when Net::HTTPSuccess, Net::HTTPNotModified
|
23
|
+
when Gem::Net::HTTPSuccess, Gem::Net::HTTPNotModified
|
24
24
|
response
|
25
|
-
when Net::HTTPRedirection
|
26
|
-
new_uri =
|
25
|
+
when Gem::Net::HTTPRedirection
|
26
|
+
new_uri = Gem::URI.parse(response["location"])
|
27
27
|
if new_uri.host == uri.host
|
28
28
|
new_uri.user = uri.user
|
29
29
|
new_uri.password = uri.password
|
30
30
|
end
|
31
31
|
fetch(new_uri, headers, counter + 1)
|
32
|
-
when Net::HTTPRequestedRangeNotSatisfiable
|
32
|
+
when Gem::Net::HTTPRequestedRangeNotSatisfiable
|
33
33
|
new_headers = headers.dup
|
34
34
|
new_headers.delete("Range")
|
35
35
|
new_headers["Accept-Encoding"] = "gzip"
|
36
36
|
fetch(uri, new_headers)
|
37
|
-
when Net::HTTPRequestEntityTooLarge
|
37
|
+
when Gem::Net::HTTPRequestEntityTooLarge
|
38
38
|
raise FallbackError, response.body
|
39
|
-
when Net::HTTPTooManyRequests
|
39
|
+
when Gem::Net::HTTPTooManyRequests
|
40
40
|
raise TooManyRequestsError, response.body
|
41
|
-
when Net::HTTPUnauthorized
|
41
|
+
when Gem::Net::HTTPUnauthorized
|
42
42
|
raise BadAuthenticationError, uri.host if uri.userinfo
|
43
43
|
raise AuthenticationRequiredError, uri.host
|
44
|
-
when Net::
|
45
|
-
raise
|
44
|
+
when Gem::Net::HTTPForbidden
|
45
|
+
raise AuthenticationForbiddenError, uri.host
|
46
|
+
when Gem::Net::HTTPNotFound
|
47
|
+
raise FallbackError, "Gem::Net::HTTPNotFound: #{filtered_uri}"
|
46
48
|
else
|
47
|
-
|
49
|
+
message = "Gem::#{response.class.name.gsub(/\AGem::/, "")}"
|
50
|
+
message += ": #{response.body}" unless response.body.empty?
|
51
|
+
raise HTTPError, message
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
@@ -54,21 +58,18 @@ module Bundler
|
|
54
58
|
filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
|
55
59
|
|
56
60
|
Bundler.ui.debug "HTTP GET #{filtered_uri}"
|
57
|
-
req = Net::HTTP::Get.new uri.request_uri, headers
|
61
|
+
req = Gem::Net::HTTP::Get.new uri.request_uri, headers
|
58
62
|
if uri.user
|
59
63
|
user = CGI.unescape(uri.user)
|
60
64
|
password = uri.password ? CGI.unescape(uri.password) : nil
|
61
65
|
req.basic_auth(user, password)
|
62
66
|
end
|
63
67
|
connection.request(uri, req)
|
64
|
-
rescue NoMethodError => e
|
65
|
-
raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet }
|
66
|
-
raise LoadError.new("cannot load such file -- openssl")
|
67
68
|
rescue OpenSSL::SSL::SSLError
|
68
69
|
raise CertificateFailureError.new(uri)
|
69
70
|
rescue *HTTP_ERRORS => e
|
70
71
|
Bundler.ui.trace e
|
71
|
-
if e.is_a?(SocketError) || e.message
|
72
|
+
if e.is_a?(SocketError) || e.message.to_s.include?("host down:")
|
72
73
|
raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
|
73
74
|
"connection and try again."
|
74
75
|
else
|
@@ -80,7 +81,7 @@ module Bundler
|
|
80
81
|
private
|
81
82
|
|
82
83
|
def validate_uri_scheme!(uri)
|
83
|
-
return if
|
84
|
+
return if /\Ahttps?\z/.match?(uri.scheme)
|
84
85
|
raise InvalidOption,
|
85
86
|
"The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
|
86
87
|
"Did you mean `http` or `https`?"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rubygems/remote_fetcher"
|
4
|
+
|
5
|
+
module Bundler
|
6
|
+
class Fetcher
|
7
|
+
class GemRemoteFetcher < Gem::RemoteFetcher
|
8
|
+
def request(*args)
|
9
|
+
super do |req|
|
10
|
+
req.delete("User-Agent") if headers["User-Agent"]
|
11
|
+
yield req if block_given?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -6,7 +6,7 @@ module Bundler
|
|
6
6
|
class Fetcher
|
7
7
|
class Index < Base
|
8
8
|
def specs(_gem_names)
|
9
|
-
Bundler.rubygems.fetch_all_remote_specs(remote)
|
9
|
+
Bundler.rubygems.fetch_all_remote_specs(remote, gem_remote_fetcher)
|
10
10
|
rescue Gem::RemoteFetcher::FetchError => e
|
11
11
|
case e.message
|
12
12
|
when /certificate verify failed/
|
@@ -15,38 +15,11 @@ module Bundler
|
|
15
15
|
raise BadAuthenticationError, remote_uri if remote_uri.userinfo
|
16
16
|
raise AuthenticationRequiredError, remote_uri
|
17
17
|
when /403/
|
18
|
-
raise
|
19
|
-
raise AuthenticationRequiredError, remote_uri
|
18
|
+
raise AuthenticationForbiddenError, remote_uri
|
20
19
|
else
|
21
20
|
raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
|
22
21
|
end
|
23
22
|
end
|
24
|
-
|
25
|
-
def fetch_spec(spec)
|
26
|
-
spec -= [nil, "ruby", ""]
|
27
|
-
spec_file_name = "#{spec.join "-"}.gemspec"
|
28
|
-
|
29
|
-
uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
30
|
-
if uri.scheme == "file"
|
31
|
-
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
32
|
-
Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
33
|
-
elsif cached_spec_path = gemspec_cached_path(spec_file_name)
|
34
|
-
Bundler.load_gemspec(cached_spec_path)
|
35
|
-
else
|
36
|
-
Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
|
37
|
-
end
|
38
|
-
rescue MarshalError
|
39
|
-
raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
|
40
|
-
"Your network or your gem server is probably having issues right now."
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
# cached gem specification path, if one exists
|
46
|
-
def gemspec_cached_path(spec_file_name)
|
47
|
-
paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) }
|
48
|
-
paths.find {|path| File.file? path }
|
49
|
-
end
|
50
23
|
end
|
51
24
|
end
|
52
25
|
end
|