rubygems-update 3.1.0.pre3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bundle/config +2 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +43 -0
- data/History.txt +32 -0
- data/Manifest.txt +20 -3
- data/Rakefile +2 -6
- data/bundler/CHANGELOG.md +3 -3
- data/bundler/lib/bundler.rb +0 -1
- data/bundler/lib/bundler/build_metadata.rb +2 -0
- data/bundler/lib/bundler/cli.rb +4 -3
- data/bundler/lib/bundler/cli/config.rb +1 -1
- data/bundler/lib/bundler/cli/exec.rb +12 -3
- data/bundler/lib/bundler/cli/gem.rb +10 -1
- data/bundler/lib/bundler/cli/info.rb +7 -0
- data/bundler/lib/bundler/cli/list.rb +11 -9
- data/bundler/lib/bundler/cli/outdated.rb +86 -63
- data/bundler/lib/bundler/cli/pristine.rb +5 -0
- data/bundler/lib/bundler/cli/update.rb +1 -1
- data/bundler/lib/bundler/feature_flag.rb +1 -1
- data/bundler/lib/bundler/fetcher.rb +2 -2
- data/bundler/lib/bundler/fetcher/downloader.rb +1 -1
- data/bundler/lib/bundler/fetcher/index.rb +1 -1
- data/bundler/lib/bundler/friendly_errors.rb +1 -1
- data/bundler/lib/bundler/gem_helper.rb +12 -10
- data/bundler/lib/bundler/inline.rb +36 -31
- data/bundler/lib/bundler/lazy_specification.rb +0 -1
- data/bundler/lib/bundler/mirror.rb +3 -3
- data/bundler/lib/bundler/plugin/api/source.rb +2 -4
- data/bundler/lib/bundler/remote_specification.rb +0 -2
- data/bundler/lib/bundler/rubygems_integration.rb +5 -42
- data/bundler/lib/bundler/settings.rb +7 -4
- data/bundler/lib/bundler/source/git.rb +9 -9
- data/bundler/lib/bundler/source/git/git_proxy.rb +3 -2
- data/bundler/lib/bundler/source/rubygems.rb +3 -3
- data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +10 -3
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +2 -2
- data/bundler/lib/bundler/uri_credentials_filter.rb +7 -3
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +3 -3
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +26 -26
- data/bundler/lib/bundler/vendor/thor/lib/thor.rb +7 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +10 -6
- data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +29 -19
- data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +1 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +13 -2
- data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +8 -9
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +2 -2
- data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +17 -1
- data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/bundler/lib/bundler/vendored_uri.rb +4 -0
- data/bundler/man/bundle-add.1 +1 -1
- data/bundler/man/bundle-add.1.txt +1 -1
- data/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/man/bundle-binstubs.1.txt +1 -1
- data/bundler/man/bundle-cache.1 +1 -1
- data/bundler/man/bundle-cache.1.txt +1 -1
- data/bundler/man/bundle-check.1 +1 -1
- data/bundler/man/bundle-check.1.txt +1 -1
- data/bundler/man/bundle-clean.1 +1 -1
- data/bundler/man/bundle-clean.1.txt +1 -1
- data/bundler/man/bundle-config.1 +1 -1
- data/bundler/man/bundle-config.1.txt +1 -1
- data/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/man/bundle-doctor.1.txt +1 -1
- data/bundler/man/bundle-exec.1 +1 -1
- data/bundler/man/bundle-exec.1.txt +1 -1
- data/bundler/man/bundle-gem.1 +1 -1
- data/bundler/man/bundle-gem.1.txt +1 -1
- data/bundler/man/bundle-info.1 +1 -1
- data/bundler/man/bundle-info.1.txt +1 -1
- data/bundler/man/bundle-init.1 +1 -1
- data/bundler/man/bundle-init.1.txt +1 -1
- data/bundler/man/bundle-inject.1 +1 -1
- data/bundler/man/bundle-inject.1.txt +1 -1
- data/bundler/man/bundle-install.1 +1 -1
- data/bundler/man/bundle-install.1.txt +1 -1
- data/bundler/man/bundle-list.1 +7 -7
- data/bundler/man/bundle-list.1.txt +9 -8
- data/bundler/man/bundle-list.ronn +6 -6
- data/bundler/man/bundle-lock.1 +1 -1
- data/bundler/man/bundle-lock.1.txt +1 -1
- data/bundler/man/bundle-open.1 +1 -1
- data/bundler/man/bundle-open.1.txt +1 -1
- data/bundler/man/bundle-outdated.1 +1 -1
- data/bundler/man/bundle-outdated.1.txt +1 -1
- data/bundler/man/bundle-platform.1 +1 -1
- data/bundler/man/bundle-platform.1.txt +1 -1
- data/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/man/bundle-pristine.1.txt +1 -1
- data/bundler/man/bundle-remove.1 +1 -1
- data/bundler/man/bundle-remove.1.txt +1 -1
- data/bundler/man/bundle-show.1 +1 -1
- data/bundler/man/bundle-show.1.txt +1 -1
- data/bundler/man/bundle-update.1 +1 -1
- data/bundler/man/bundle-update.1.txt +1 -1
- data/bundler/man/bundle-viz.1 +1 -1
- data/bundler/man/bundle-viz.1.txt +1 -1
- data/bundler/man/bundle.1 +1 -1
- data/bundler/man/bundle.1.txt +1 -1
- data/bundler/man/gemfile.5 +1 -1
- data/bundler/man/gemfile.5.txt +1 -1
- data/lib/rubygems.rb +5 -15
- data/lib/rubygems/command.rb +28 -6
- data/lib/rubygems/commands/generate_index_command.rb +3 -0
- data/lib/rubygems/commands/setup_command.rb +1 -1
- data/lib/rubygems/commands/sources_command.rb +14 -0
- data/lib/rubygems/core_ext/kernel_require.rb +1 -1
- data/lib/rubygems/core_ext/kernel_warn.rb +8 -4
- data/lib/rubygems/ext/builder.rb +1 -1
- data/lib/rubygems/remote_fetcher.rb +20 -31
- data/lib/rubygems/request.rb +2 -0
- data/lib/rubygems/source.rb +7 -1
- data/lib/rubygems/specification_policy.rb +44 -29
- data/lib/rubygems/uri_formatter.rb +0 -1
- data/lib/rubygems/uri_parser.rb +36 -0
- data/lib/rubygems/uri_parsing.rb +23 -0
- data/rubygems-update.gemspec +1 -8
- data/test/rubygems/test_gem.rb +3 -3
- data/test/rubygems/test_gem_command.rb +38 -9
- data/test/rubygems/test_gem_commands_generate_index_command.rb +37 -1
- data/test/rubygems/test_gem_commands_help_command.rb +1 -6
- data/test/rubygems/test_gem_commands_server_command.rb +6 -2
- data/test/rubygems/test_gem_commands_sources_command.rb +74 -0
- data/test/rubygems/test_gem_gem_runner.rb +3 -1
- data/test/rubygems/test_gem_indexer.rb +1 -1
- data/test/rubygems/test_gem_source.rb +14 -0
- data/test/rubygems/test_gem_specification.rb +48 -48
- data/test/rubygems/test_project_sanity.rb +0 -43
- data/test/rubygems/test_remote_fetch_error.rb +1 -1
- data/test/rubygems/test_require.rb +41 -42
- data/util/bisect +0 -21
- data/util/ci.sh +1 -1
- metadata +23 -90
- data/bundler/lib/bundler/gem_remote_fetcher.rb +0 -43
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +0 -5
- data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
data/bundler/man/bundle-lock.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-LOCK" "1" "
|
4
|
+
.TH "BUNDLE\-LOCK" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
data/bundler/man/bundle-open.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-OPEN" "1" "
|
4
|
+
.TH "BUNDLE\-OPEN" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-OUTDATED" "1" "
|
4
|
+
.TH "BUNDLE\-OUTDATED" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-PLATFORM" "1" "
|
4
|
+
.TH "BUNDLE\-PLATFORM" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-platform\fR \- Displays platform compatibility information
|
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-PRISTINE" "1" "
|
4
|
+
.TH "BUNDLE\-PRISTINE" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
data/bundler/man/bundle-remove.1
CHANGED
data/bundler/man/bundle-show.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-SHOW" "1" "
|
4
|
+
.TH "BUNDLE\-SHOW" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
data/bundler/man/bundle-update.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-UPDATE" "1" "
|
4
|
+
.TH "BUNDLE\-UPDATE" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
data/bundler/man/bundle-viz.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "BUNDLE\-VIZ" "1" "
|
4
|
+
.TH "BUNDLE\-VIZ" "1" "December 2019" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
data/bundler/man/bundle.1
CHANGED
data/bundler/man/bundle.1.txt
CHANGED
data/bundler/man/gemfile.5
CHANGED
data/bundler/man/gemfile.5.txt
CHANGED
data/lib/rubygems.rb
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
require 'rbconfig'
|
10
10
|
|
11
11
|
module Gem
|
12
|
-
VERSION = "3.1.0
|
12
|
+
VERSION = "3.1.0".freeze
|
13
13
|
end
|
14
14
|
|
15
15
|
# Must be first since it unloads the prelude from 1.9.2
|
@@ -160,24 +160,14 @@ module Gem
|
|
160
160
|
].freeze
|
161
161
|
|
162
162
|
##
|
163
|
-
# Exception classes used in a Gem.read_binary +rescue+ statement
|
164
|
-
# these are defined in Ruby 1.8.7, hence the need for this convoluted setup.
|
163
|
+
# Exception classes used in a Gem.read_binary +rescue+ statement
|
165
164
|
|
166
|
-
READ_BINARY_ERRORS =
|
167
|
-
read_binary_errors = [Errno::EACCES, Errno::EROFS, Errno::ENOSYS]
|
168
|
-
read_binary_errors << Errno::ENOTSUP if Errno.const_defined?(:ENOTSUP)
|
169
|
-
read_binary_errors
|
170
|
-
end.freeze
|
165
|
+
READ_BINARY_ERRORS = [Errno::EACCES, Errno::EROFS, Errno::ENOSYS, Errno::ENOTSUP].freeze
|
171
166
|
|
172
167
|
##
|
173
|
-
# Exception classes used in Gem.write_binary +rescue+ statement
|
174
|
-
# these are defined in Ruby 1.8.7.
|
168
|
+
# Exception classes used in Gem.write_binary +rescue+ statement
|
175
169
|
|
176
|
-
WRITE_BINARY_ERRORS =
|
177
|
-
write_binary_errors = [Errno::ENOSYS]
|
178
|
-
write_binary_errors << Errno::ENOTSUP if Errno.const_defined?(:ENOTSUP)
|
179
|
-
write_binary_errors
|
180
|
-
end.freeze
|
170
|
+
WRITE_BINARY_ERRORS = [Errno::ENOSYS, Errno::ENOTSUP].freeze
|
181
171
|
|
182
172
|
@@win_platform = nil
|
183
173
|
|
data/lib/rubygems/command.rb
CHANGED
@@ -369,22 +369,44 @@ class Gem::Command
|
|
369
369
|
end
|
370
370
|
end
|
371
371
|
|
372
|
-
|
373
|
-
|
374
|
-
|
372
|
+
##
|
373
|
+
# Mark a command-line option as deprecated, and optionally specify a
|
374
|
+
# deprecation horizon.
|
375
|
+
#
|
376
|
+
# Note that with the current implementation, every version of the option needs
|
377
|
+
# to be explicitly deprecated, so to deprecate an option defined as
|
378
|
+
#
|
379
|
+
# add_option('-t', '--[no-]test', 'Set test mode') do |value, options|
|
380
|
+
# # ... stuff ...
|
381
|
+
# end
|
382
|
+
#
|
383
|
+
# you would need to explicitly add a call to `deprecate_option` for every
|
384
|
+
# version of the option you want to deprecate, like
|
385
|
+
#
|
386
|
+
# deprecate_option('-t')
|
387
|
+
# deprecate_option('--test')
|
388
|
+
# deprecate_option('--no-test')
|
389
|
+
|
390
|
+
def deprecate_option(name, version: nil, extra_msg: nil)
|
391
|
+
@deprecated_options[command].merge!({ name => { "rg_version_to_expire" => version, "extra_msg" => extra_msg } })
|
375
392
|
end
|
376
393
|
|
377
394
|
def check_deprecated_options(options)
|
378
395
|
options.each do |option|
|
379
396
|
if option_is_deprecated?(option)
|
380
|
-
|
397
|
+
deprecation = @deprecated_options[command][option]
|
398
|
+
version_to_expire = deprecation["rg_version_to_expire"]
|
381
399
|
|
382
400
|
deprecate_option_msg = if version_to_expire
|
383
|
-
"The \"#{option}\" option has been deprecated and will be removed in Rubygems #{version_to_expire}
|
401
|
+
"The \"#{option}\" option has been deprecated and will be removed in Rubygems #{version_to_expire}."
|
384
402
|
else
|
385
|
-
"The \"#{option}\" option has been deprecated and will be removed in future versions of Rubygems
|
403
|
+
"The \"#{option}\" option has been deprecated and will be removed in future versions of Rubygems."
|
386
404
|
end
|
387
405
|
|
406
|
+
extra_msg = deprecation["extra_msg"]
|
407
|
+
|
408
|
+
deprecate_option_msg += " #{extra_msg}" if extra_msg
|
409
|
+
|
388
410
|
alert_warning(deprecate_option_msg)
|
389
411
|
end
|
390
412
|
end
|
@@ -25,6 +25,9 @@ class Gem::Commands::GenerateIndexCommand < Gem::Command
|
|
25
25
|
options[:build_modern] = value
|
26
26
|
end
|
27
27
|
|
28
|
+
deprecate_option('--modern', version: '4.0', extra_msg: 'Modern indexes (specs, latest_specs, and prerelease_specs) are always generated, so this option is not needed.')
|
29
|
+
deprecate_option('--no-modern', version: '4.0', extra_msg: 'The `--no-modern` option is currently ignored. Modern indexes (specs, latest_specs, and prerelease_specs) are always generated.')
|
30
|
+
|
28
31
|
add_option '--update',
|
29
32
|
'Update modern indexes with gems added',
|
30
33
|
'since the last update' do |value, options|
|
@@ -98,7 +98,7 @@ class Gem::Commands::SetupCommand < Gem::Command
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def check_ruby_version
|
101
|
-
required_version = Gem::Requirement.new '>=
|
101
|
+
required_version = Gem::Requirement.new '>= 2.3.0'
|
102
102
|
|
103
103
|
unless required_version.satisfied_by? Gem.ruby_version
|
104
104
|
alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
|
@@ -43,6 +43,8 @@ class Gem::Commands::SourcesCommand < Gem::Command
|
|
43
43
|
|
44
44
|
source = Gem::Source.new source_uri
|
45
45
|
|
46
|
+
check_typo_squatting(source)
|
47
|
+
|
46
48
|
begin
|
47
49
|
if Gem.sources.include? source
|
48
50
|
say "source #{source_uri} already present in the cache"
|
@@ -62,6 +64,18 @@ class Gem::Commands::SourcesCommand < Gem::Command
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
67
|
+
def check_typo_squatting(source)
|
68
|
+
if source.typo_squatting?("rubygems.org")
|
69
|
+
question = <<-QUESTION.chomp
|
70
|
+
#{source.uri.to_s} is too similar to https://rubygems.org
|
71
|
+
|
72
|
+
Do you want to add this source?
|
73
|
+
QUESTION
|
74
|
+
|
75
|
+
terminate_interaction 1 unless ask_yes_no question
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
65
79
|
def check_rubygems_https(source_uri) # :nodoc:
|
66
80
|
uri = URI source_uri
|
67
81
|
|
@@ -46,7 +46,7 @@ module Kernel
|
|
46
46
|
$LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
47
47
|
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
48
48
|
begin
|
49
|
-
if File.symlink? safe_lp # for
|
49
|
+
if File.symlink? safe_lp # for backward compatibility
|
50
50
|
next
|
51
51
|
end
|
52
52
|
rescue SecurityError
|
@@ -6,12 +6,16 @@ if RUBY_VERSION >= "2.5"
|
|
6
6
|
module Kernel
|
7
7
|
path = "#{__dir__}/" # Frames to be skipped start with this path.
|
8
8
|
|
9
|
-
# Suppress "method redefined" warning
|
10
|
-
original_warn = instance_method(:warn)
|
11
|
-
Module.new {define_method(:warn, original_warn)}
|
12
|
-
|
13
9
|
original_warn = method(:warn)
|
14
10
|
|
11
|
+
remove_method :warn
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
remove_method :warn
|
16
|
+
|
17
|
+
end
|
18
|
+
|
15
19
|
module_function define_method(:warn) {|*messages, **kw|
|
16
20
|
unless uplevel = kw[:uplevel]
|
17
21
|
if Gem.java_platform?
|
data/lib/rubygems/ext/builder.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
#++
|
7
7
|
|
8
8
|
require 'rubygems/user_interaction'
|
9
|
-
require "open3"
|
10
9
|
|
11
10
|
class Gem::Ext::Builder
|
12
11
|
|
@@ -68,6 +67,7 @@ class Gem::Ext::Builder
|
|
68
67
|
results << "current directory: #{Dir.pwd}"
|
69
68
|
results << (command.respond_to?(:shelljoin) ? command.shelljoin : command)
|
70
69
|
|
70
|
+
require "open3"
|
71
71
|
output, status = Open3.capture2e(*command)
|
72
72
|
if verbose
|
73
73
|
puts output
|
@@ -4,6 +4,7 @@ require 'rubygems/request'
|
|
4
4
|
require 'rubygems/request/connection_pools'
|
5
5
|
require 'rubygems/s3_uri_signer'
|
6
6
|
require 'rubygems/uri_formatter'
|
7
|
+
require 'rubygems/uri_parsing'
|
7
8
|
require 'rubygems/user_interaction'
|
8
9
|
require 'resolv'
|
9
10
|
require 'rubygems/deprecate'
|
@@ -17,12 +18,16 @@ class Gem::RemoteFetcher
|
|
17
18
|
include Gem::UserInteraction
|
18
19
|
extend Gem::Deprecate
|
19
20
|
|
21
|
+
include Gem::UriParsing
|
22
|
+
|
20
23
|
##
|
21
24
|
# A FetchError exception wraps up the various possible IO and HTTP failures
|
22
25
|
# that could happen while downloading from the internet.
|
23
26
|
|
24
27
|
class FetchError < Gem::Exception
|
25
28
|
|
29
|
+
include Gem::UriParsing
|
30
|
+
|
26
31
|
##
|
27
32
|
# The URI which was being accessed when the exception happened.
|
28
33
|
|
@@ -30,13 +35,12 @@ class Gem::RemoteFetcher
|
|
30
35
|
|
31
36
|
def initialize(message, uri)
|
32
37
|
super message
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
38
|
+
|
39
|
+
uri = parse_uri(uri)
|
40
|
+
|
41
|
+
uri.password = 'REDACTED' if uri.respond_to?(:password) && uri.password
|
42
|
+
|
43
|
+
@uri = uri.to_s
|
40
44
|
end
|
41
45
|
|
42
46
|
def to_s # :nodoc:
|
@@ -107,7 +111,7 @@ class Gem::RemoteFetcher
|
|
107
111
|
|
108
112
|
spec, source = found.max_by { |(s,_)| s.version }
|
109
113
|
|
110
|
-
download spec, source.uri
|
114
|
+
download spec, source.uri
|
111
115
|
end
|
112
116
|
|
113
117
|
##
|
@@ -130,18 +134,7 @@ class Gem::RemoteFetcher
|
|
130
134
|
|
131
135
|
FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir
|
132
136
|
|
133
|
-
|
134
|
-
# It should also be considered that source_uri may already be
|
135
|
-
# a valid URI with escaped characters. e.g. "{DESede}" is encoded
|
136
|
-
# as "%7BDESede%7D". If this is escaped again the percentage
|
137
|
-
# symbols will be escaped.
|
138
|
-
unless source_uri.is_a?(URI::Generic)
|
139
|
-
begin
|
140
|
-
source_uri = URI.parse(source_uri)
|
141
|
-
rescue
|
142
|
-
source_uri = URI.parse(URI::DEFAULT_PARSER.escape(source_uri.to_s))
|
143
|
-
end
|
144
|
-
end
|
137
|
+
source_uri = parse_uri(source_uri)
|
145
138
|
|
146
139
|
scheme = source_uri.scheme
|
147
140
|
|
@@ -159,7 +152,7 @@ class Gem::RemoteFetcher
|
|
159
152
|
remote_gem_path = source_uri + "gems/#{gem_file_name}"
|
160
153
|
|
161
154
|
self.cache_update_path remote_gem_path, local_gem_path
|
162
|
-
rescue
|
155
|
+
rescue FetchError
|
163
156
|
raise if spec.original_platform == spec.platform
|
164
157
|
|
165
158
|
alternate_name = "#{spec.original_name}.gem"
|
@@ -236,7 +229,7 @@ class Gem::RemoteFetcher
|
|
236
229
|
unless location = response['Location']
|
237
230
|
raise FetchError.new("redirecting but no redirect location was given", uri)
|
238
231
|
end
|
239
|
-
location =
|
232
|
+
location = parse_uri location
|
240
233
|
|
241
234
|
if https?(uri) && !https?(location)
|
242
235
|
raise FetchError.new("redirecting to non-https resource: #{location}", uri)
|
@@ -254,9 +247,7 @@ class Gem::RemoteFetcher
|
|
254
247
|
# Downloads +uri+ and returns it as a String.
|
255
248
|
|
256
249
|
def fetch_path(uri, mtime = nil, head = false)
|
257
|
-
uri =
|
258
|
-
|
259
|
-
raise ArgumentError, "bad uri: #{uri}" unless uri
|
250
|
+
uri = parse_uri uri
|
260
251
|
|
261
252
|
unless uri.scheme
|
262
253
|
raise ArgumentError, "uri scheme is invalid: #{uri.scheme.inspect}"
|
@@ -268,21 +259,19 @@ class Gem::RemoteFetcher
|
|
268
259
|
begin
|
269
260
|
data = Gem::Util.gunzip data
|
270
261
|
rescue Zlib::GzipFile::Error
|
271
|
-
raise FetchError.new("server did not return a valid file", uri
|
262
|
+
raise FetchError.new("server did not return a valid file", uri)
|
272
263
|
end
|
273
264
|
end
|
274
265
|
|
275
266
|
data
|
276
|
-
rescue FetchError
|
277
|
-
raise
|
278
267
|
rescue Timeout::Error
|
279
|
-
raise UnknownHostError.new('timed out', uri
|
268
|
+
raise UnknownHostError.new('timed out', uri)
|
280
269
|
rescue IOError, SocketError, SystemCallError,
|
281
270
|
*(OpenSSL::SSL::SSLError if defined?(OpenSSL)) => e
|
282
271
|
if e.message =~ /getaddrinfo/
|
283
|
-
raise UnknownHostError.new('no such name', uri
|
272
|
+
raise UnknownHostError.new('no such name', uri)
|
284
273
|
else
|
285
|
-
raise FetchError.new("#{e.class}: #{e}", uri
|
274
|
+
raise FetchError.new("#{e.class}: #{e}", uri)
|
286
275
|
end
|
287
276
|
end
|
288
277
|
|