rubygems-update 3.2.0 → 3.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{History.txt → CHANGELOG.md} +482 -457
- data/Manifest.txt +31 -27
- data/POLICIES.md +4 -3
- data/Rakefile +23 -18
- data/bundler/CHANGELOG.md +67 -20
- data/bundler/bundler.gemspec +1 -1
- data/bundler/lib/bundler.rb +8 -2
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli.rb +3 -6
- data/bundler/lib/bundler/cli/gem.rb +2 -0
- data/bundler/lib/bundler/cli/install.rb +14 -5
- data/bundler/lib/bundler/cli/outdated.rb +2 -2
- data/bundler/lib/bundler/cli/update.rb +1 -1
- data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/bundler/lib/bundler/compact_index_client/updater.rb +0 -8
- data/bundler/lib/bundler/definition.rb +24 -21
- data/bundler/lib/bundler/dependency.rb +3 -1
- data/bundler/lib/bundler/gem_helper.rb +3 -3
- data/bundler/lib/bundler/gem_helpers.rb +30 -24
- data/bundler/lib/bundler/lazy_specification.rb +16 -3
- data/bundler/{man → lib/bundler/man}/bundle-add.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-cache.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-check.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-clean.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-config.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-exec.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-gem.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-info.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-init.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-inject.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-install.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-list.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-lock.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-open.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-platform.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-remove.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-show.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-update.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-viz.1 +0 -0
- data/bundler/{man → lib/bundler/man}/bundle.1 +0 -0
- data/bundler/{man → lib/bundler/man}/gemfile.5 +0 -0
- data/bundler/{man → lib/bundler/man}/index.txt +0 -0
- data/bundler/lib/bundler/resolver.rb +29 -27
- data/bundler/lib/bundler/resolver/spec_group.rb +19 -25
- data/bundler/lib/bundler/rubygems_integration.rb +0 -6
- data/bundler/lib/bundler/source/git.rb +18 -16
- data/bundler/lib/bundler/source/git/git_proxy.rb +54 -49
- data/bundler/lib/bundler/source/path/installer.rb +2 -0
- data/bundler/lib/bundler/source/rubygems.rb +10 -1
- data/bundler/lib/bundler/spec_set.rb +5 -8
- data/bundler/lib/bundler/stub_specification.rb +0 -2
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -1
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
- data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +3 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +8 -1
- data/bundler/lib/bundler/version.rb +1 -1
- data/lib/rubygems.rb +1 -1
- data/lib/rubygems/commands/owner_command.rb +0 -1
- data/lib/rubygems/commands/push_command.rb +0 -1
- data/lib/rubygems/commands/setup_command.rb +16 -62
- data/lib/rubygems/commands/yank_command.rb +0 -1
- data/lib/rubygems/dependency_installer.rb +1 -0
- data/lib/rubygems/ext/builder.rb +3 -3
- data/lib/rubygems/ext/cmake_builder.rb +1 -2
- data/lib/rubygems/ext/configure_builder.rb +1 -2
- data/lib/rubygems/ext/rake_builder.rb +1 -1
- data/lib/rubygems/gemcutter_utilities.rb +22 -17
- data/lib/rubygems/installer.rb +0 -23
- data/lib/rubygems/remote_fetcher.rb +4 -2
- data/lib/rubygems/request_set.rb +2 -13
- data/lib/rubygems/resolver.rb +6 -1
- data/lib/rubygems/resolver/api_set.rb +29 -20
- data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
- data/lib/rubygems/resolver/api_specification.rb +4 -3
- data/lib/rubygems/resolver/best_set.rb +2 -2
- data/lib/rubygems/resolver/index_specification.rb +18 -0
- data/lib/rubygems/resolver/installer_set.rb +57 -7
- data/lib/rubygems/resolver/spec_specification.rb +14 -0
- data/lib/rubygems/resolver/specification.rb +12 -0
- data/lib/rubygems/server.rb +6 -1
- data/lib/rubygems/source.rb +11 -6
- data/lib/rubygems/specification.rb +18 -14
- data/lib/rubygems/test_case.rb +17 -4
- data/lib/rubygems/test_utilities.rb +6 -5
- data/rubygems-update.gemspec +2 -2
- data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
- data/test/rubygems/test_gem_commands_install_command.rb +131 -0
- data/test/rubygems/test_gem_commands_push_command.rb +41 -2
- data/test/rubygems/test_gem_commands_setup_command.rb +21 -37
- data/test/rubygems/test_gem_dependency_installer.rb +27 -47
- data/test/rubygems/test_gem_ext_builder.rb +6 -6
- data/test/rubygems/test_gem_ext_cmake_builder.rb +2 -4
- data/test/rubygems/test_gem_ext_configure_builder.rb +2 -2
- data/test/rubygems/test_gem_ext_rake_builder.rb +25 -0
- data/test/rubygems/test_gem_installer.rb +6 -60
- data/test/rubygems/test_gem_remote_fetcher.rb +1 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +54 -51
- data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
- data/test/rubygems/test_gem_resolver_best_set.rb +26 -3
- data/test/rubygems/test_gem_source.rb +2 -2
- data/test/rubygems/test_gem_source_subpath_problem.rb +2 -2
- data/test/rubygems/test_gem_specification.rb +9 -3
- data/test/test_changelog_generator.rb +17 -0
- metadata +38 -58
@@ -145,6 +145,8 @@ module Bundler
|
|
145
145
|
|
146
146
|
Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
|
147
147
|
|
148
|
+
require_relative "../rubygems_gem_installer"
|
149
|
+
|
148
150
|
installed_spec = Bundler::RubyGemsGemInstaller.at(
|
149
151
|
path,
|
150
152
|
:install_dir => install_path.to_s,
|
@@ -487,8 +489,15 @@ module Bundler
|
|
487
489
|
uri = spec.remote.uri
|
488
490
|
Bundler.ui.confirm("Fetching #{version_message(spec)}")
|
489
491
|
rubygems_local_path = Bundler.rubygems.download_gem(spec, uri, download_path)
|
492
|
+
|
493
|
+
# older rubygems return varying file:// variants depending on version
|
494
|
+
rubygems_local_path = rubygems_local_path.gsub(/\Afile:/, "") unless Bundler.rubygems.provides?(">= 3.2.0.rc.2")
|
495
|
+
rubygems_local_path = rubygems_local_path.gsub(%r{\A//}, "") if Bundler.rubygems.provides?("< 3.1.0")
|
496
|
+
|
490
497
|
if rubygems_local_path != local_path
|
491
|
-
|
498
|
+
SharedHelpers.filesystem_access(local_path) do
|
499
|
+
FileUtils.mv(rubygems_local_path, local_path)
|
500
|
+
end
|
492
501
|
end
|
493
502
|
cache_globally(spec, local_path)
|
494
503
|
end
|
@@ -22,10 +22,11 @@ module Bundler
|
|
22
22
|
break unless dep = deps.shift
|
23
23
|
next if !handled.add?(dep) || skip.include?(dep.name)
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
specs_for_dep = spec_for_dependency(dep, match_current_platform)
|
26
|
+
if specs_for_dep.any?
|
27
|
+
specs += specs_for_dep
|
27
28
|
|
28
|
-
|
29
|
+
specs_for_dep.first.dependencies.each do |d|
|
29
30
|
next if d.type == :development
|
30
31
|
d = DepProxy.new(d, dep.__platform) unless match_current_platform
|
31
32
|
deps << d
|
@@ -184,11 +185,7 @@ module Bundler
|
|
184
185
|
def spec_for_dependency(dep, match_current_platform)
|
185
186
|
specs_for_platforms = lookup[dep.name]
|
186
187
|
if match_current_platform
|
187
|
-
Bundler.
|
188
|
-
match = GemHelpers.select_best_platform_match(specs_for_platforms, pl)
|
189
|
-
return match if match
|
190
|
-
end
|
191
|
-
nil
|
188
|
+
GemHelpers.select_best_platform_match(specs_for_platforms, Bundler.local_platform)
|
192
189
|
else
|
193
190
|
GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform)
|
194
191
|
end
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
<%- if config[:mit] -%>
|
15
15
|
spec.license = "MIT"
|
16
16
|
<%- end -%>
|
17
|
-
spec.required_ruby_version = Gem::Requirement.new(">=
|
17
|
+
spec.required_ruby_version = Gem::Requirement.new(">= <%= config[:required_ruby_version] %>")
|
18
18
|
|
19
19
|
spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
20
20
|
|
@@ -159,7 +159,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
159
159
|
# limits (typically windows).
|
160
160
|
|
161
161
|
if Process.const_defined? :RLIMIT_NOFILE
|
162
|
-
|
162
|
+
open_file_limits = Process.getrlimit(Process::RLIMIT_NOFILE)
|
163
|
+
|
164
|
+
# Under JRuby on Windows Process responds to `getrlimit` but returns something that does not match docs
|
165
|
+
if open_file_limits.respond_to?(:first)
|
166
|
+
DEFAULT_POOL_SIZE = open_file_limits.first / 4
|
167
|
+
else
|
168
|
+
DEFAULT_POOL_SIZE = 256
|
169
|
+
end
|
163
170
|
else
|
164
171
|
DEFAULT_POOL_SIZE = 256
|
165
172
|
end
|
data/lib/rubygems.rb
CHANGED
@@ -105,7 +105,6 @@ permission to.
|
|
105
105
|
rubygems_api_request method, "api/v1/gems/#{name}/owners", scope: get_owner_scope(method: method) do |request|
|
106
106
|
request.set_form_data 'email' => owner
|
107
107
|
request.add_field "Authorization", api_key
|
108
|
-
request.add_field "OTP", options[:otp] if options[:otp]
|
109
108
|
end
|
110
109
|
end
|
111
110
|
|
@@ -91,7 +91,6 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
91
91
|
request.add_field "Content-Length", request.body.size
|
92
92
|
request.add_field "Content-Type", "application/octet-stream"
|
93
93
|
request.add_field "Authorization", api_key
|
94
|
-
request.add_field "OTP", options[:otp] if options[:otp]
|
95
94
|
end
|
96
95
|
end
|
97
96
|
|
@@ -6,8 +6,8 @@ require 'rubygems/command'
|
|
6
6
|
# RubyGems checkout or tarball.
|
7
7
|
|
8
8
|
class Gem::Commands::SetupCommand < Gem::Command
|
9
|
-
HISTORY_HEADER =
|
10
|
-
VERSION_MATCHER =
|
9
|
+
HISTORY_HEADER = /^#\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
|
10
|
+
VERSION_MATCHER = /^#\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
|
11
11
|
|
12
12
|
ENV_PATHS = %w[/usr/bin/env /bin/env].freeze
|
13
13
|
|
@@ -167,19 +167,18 @@ By default, this RubyGems will install gem as:
|
|
167
167
|
extend MakeDirs
|
168
168
|
|
169
169
|
lib_dir, bin_dir = make_destination_dirs install_destdir
|
170
|
-
man_dir =
|
170
|
+
man_dir = generate_default_man_dir install_destdir
|
171
171
|
|
172
172
|
install_lib lib_dir
|
173
173
|
|
174
|
-
install_man man_dir
|
175
|
-
|
176
174
|
install_executables bin_dir
|
177
175
|
|
178
176
|
remove_old_bin_files bin_dir
|
179
177
|
|
180
178
|
remove_old_lib_files lib_dir
|
181
179
|
|
182
|
-
|
180
|
+
# Can be removed one we drop support for bundler 2.2.3 (the last version installing man files to man_dir)
|
181
|
+
remove_old_man_files man_dir if man_dir && File.exist?(man_dir)
|
183
182
|
|
184
183
|
install_default_bundler_gem bin_dir
|
185
184
|
|
@@ -330,21 +329,6 @@ By default, this RubyGems will install gem as:
|
|
330
329
|
end
|
331
330
|
end
|
332
331
|
|
333
|
-
def install_man(man_dir)
|
334
|
-
mans = { 'Bundler' => 'bundler/man' }
|
335
|
-
mans.each do |tool, path|
|
336
|
-
say "Installing #{tool} manpages" if @verbose
|
337
|
-
|
338
|
-
bundler_man1_files = bundler_man1_files_in(path)
|
339
|
-
bundler_man5_files = bundler_man5_files_in(path)
|
340
|
-
|
341
|
-
Dir.chdir path do
|
342
|
-
install_file_list(bundler_man1_files, "#{man_dir}/man1")
|
343
|
-
install_file_list(bundler_man5_files, "#{man_dir}/man5")
|
344
|
-
end
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
332
|
def install_rdoc
|
349
333
|
gem_doc_dir = File.join Gem.dir, 'doc'
|
350
334
|
rubygems_name = "rubygems-#{Gem::VERSION}"
|
@@ -391,9 +375,7 @@ By default, this RubyGems will install gem as:
|
|
391
375
|
specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform?
|
392
376
|
mkdir_p specs_dir, :mode => 0755
|
393
377
|
|
394
|
-
bundler_spec = Gem::Specification.load("bundler
|
395
|
-
bundler_spec.files = Dir.chdir("bundler") { Dir["{*.md,{lib,exe,man}/**/*}"] }
|
396
|
-
bundler_spec.executables -= %w[bundler bundle_ruby]
|
378
|
+
bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
|
397
379
|
|
398
380
|
# Remove bundler-*.gemspec in default specification directory.
|
399
381
|
Dir.entries(specs_dir).
|
@@ -455,19 +437,12 @@ By default, this RubyGems will install gem as:
|
|
455
437
|
return lib_dir, bin_dir
|
456
438
|
end
|
457
439
|
|
458
|
-
def make_man_dir(install_destdir)
|
459
|
-
man_dir = generate_default_man_dir(install_destdir)
|
460
|
-
|
461
|
-
mkdir_p man_dir, :mode => 0755
|
462
|
-
|
463
|
-
return man_dir
|
464
|
-
end
|
465
|
-
|
466
440
|
def generate_default_man_dir(install_destdir)
|
467
441
|
prefix = options[:prefix]
|
468
442
|
|
469
443
|
if prefix.empty?
|
470
444
|
man_dir = RbConfig::CONFIG['mandir']
|
445
|
+
return unless man_dir
|
471
446
|
else
|
472
447
|
man_dir = File.join prefix, 'man'
|
473
448
|
end
|
@@ -518,20 +493,6 @@ By default, this RubyGems will install gem as:
|
|
518
493
|
end
|
519
494
|
end
|
520
495
|
|
521
|
-
# for installation of bundler as default gems
|
522
|
-
def bundler_man1_files_in(dir)
|
523
|
-
Dir.chdir dir do
|
524
|
-
Dir['bundle*.1']
|
525
|
-
end
|
526
|
-
end
|
527
|
-
|
528
|
-
# for installation of bundler as default gems
|
529
|
-
def bundler_man5_files_in(dir)
|
530
|
-
Dir.chdir dir do
|
531
|
-
Dir['gemfile.5']
|
532
|
-
end
|
533
|
-
end
|
534
|
-
|
535
496
|
def remove_old_bin_files(bin_dir)
|
536
497
|
old_bin_files = {
|
537
498
|
'gem_mirror' => 'gem mirror',
|
@@ -585,33 +546,26 @@ abort "#{deprecation_message}"
|
|
585
546
|
end
|
586
547
|
end
|
587
548
|
|
588
|
-
def remove_old_man_files(
|
589
|
-
|
590
|
-
man_dirs.each do |old_man_dir, new_man_dir|
|
591
|
-
man1_files = bundler_man1_files_in(new_man_dir)
|
592
|
-
|
593
|
-
old_man1_dir = "#{old_man_dir}/man1"
|
594
|
-
old_man1_files = bundler_man1_files_in(old_man1_dir)
|
595
|
-
old_man1_files += Dir.chdir(old_man1_dir) { Dir["bundle*.1.{txt,ronn}"] }
|
549
|
+
def remove_old_man_files(old_man_dir)
|
550
|
+
old_man1_dir = "#{old_man_dir}/man1"
|
596
551
|
|
597
|
-
|
552
|
+
if File.exist?(old_man1_dir)
|
553
|
+
man1_to_remove = Dir.chdir(old_man1_dir) { Dir["bundle*.1{,.txt,.ronn}"] }
|
598
554
|
|
599
555
|
remove_file_list(man1_to_remove, old_man1_dir)
|
556
|
+
end
|
600
557
|
|
601
|
-
|
602
|
-
|
603
|
-
old_man5_dir = "#{old_man_dir}/man5"
|
604
|
-
old_man5_files = bundler_man5_files_in(old_man5_dir)
|
605
|
-
old_man5_files += Dir.chdir(old_man5_dir) { Dir["gemfile.5.{txt,ronn}"] }
|
558
|
+
old_man5_dir = "#{old_man_dir}/man5"
|
606
559
|
|
607
|
-
|
560
|
+
if File.exist?(old_man5_dir)
|
561
|
+
man5_to_remove = Dir.chdir(old_man5_dir) { Dir["gemfile.5{,.txt,.ronn}"] }
|
608
562
|
|
609
563
|
remove_file_list(man5_to_remove, old_man5_dir)
|
610
564
|
end
|
611
565
|
end
|
612
566
|
|
613
567
|
def show_release_notes
|
614
|
-
release_notes = File.join Dir.pwd, '
|
568
|
+
release_notes = File.join Dir.pwd, 'CHANGELOG.md'
|
615
569
|
|
616
570
|
release_notes =
|
617
571
|
if File.exist? release_notes
|
@@ -74,7 +74,6 @@ data you will need to change them immediately and yank your gem.
|
|
74
74
|
name = get_one_gem_name
|
75
75
|
response = rubygems_api_request(method, api, host, scope: get_yank_scope) do |request|
|
76
76
|
request.add_field("Authorization", api_key)
|
77
|
-
request.add_field("OTP", options[:otp]) if options[:otp]
|
78
77
|
|
79
78
|
data = {
|
80
79
|
'gem_name' => name,
|
@@ -286,6 +286,7 @@ class Gem::DependencyInstaller
|
|
286
286
|
|
287
287
|
installer_set = Gem::Resolver::InstallerSet.new @domain
|
288
288
|
installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir
|
289
|
+
installer_set.force = @force
|
289
290
|
|
290
291
|
if consider_local?
|
291
292
|
if dep_or_name =~ /\.gem$/ and File.file? dep_or_name
|
data/lib/rubygems/ext/builder.rb
CHANGED
@@ -29,7 +29,7 @@ class Gem::Ext::Builder
|
|
29
29
|
make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
|
30
30
|
end
|
31
31
|
|
32
|
-
destdir = '
|
32
|
+
destdir = 'DESTDIR=%s' % ENV['DESTDIR']
|
33
33
|
|
34
34
|
['clean', '', 'install'].each do |target|
|
35
35
|
# Pass DESTDIR via command line to override what's in MAKEFLAGS
|
@@ -37,7 +37,7 @@ class Gem::Ext::Builder
|
|
37
37
|
make_program,
|
38
38
|
destdir,
|
39
39
|
target,
|
40
|
-
].
|
40
|
+
].reject(&:empty?)
|
41
41
|
begin
|
42
42
|
run(cmd, results, "make #{target}".rstrip, make_dir)
|
43
43
|
rescue Gem::InstallError
|
@@ -56,7 +56,7 @@ class Gem::Ext::Builder
|
|
56
56
|
p(command)
|
57
57
|
end
|
58
58
|
results << "current directory: #{dir}"
|
59
|
-
results <<
|
59
|
+
results << command.shelljoin
|
60
60
|
|
61
61
|
require "open3"
|
62
62
|
# Set $SOURCE_DATE_EPOCH for the subprocess.
|
@@ -4,8 +4,7 @@ require_relative '../command'
|
|
4
4
|
class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
|
5
5
|
def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
|
6
6
|
unless File.exist?(File.join(cmake_dir, 'Makefile'))
|
7
|
-
cmd = "cmake . -DCMAKE_INSTALL_PREFIX=#{dest_path}"
|
8
|
-
cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty?
|
7
|
+
cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]
|
9
8
|
|
10
9
|
run cmd, results, class_name, cmake_dir
|
11
10
|
end
|
@@ -8,8 +8,7 @@
|
|
8
8
|
class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
|
9
9
|
def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
|
10
10
|
unless File.exist?(File.join(configure_dir, 'Makefile'))
|
11
|
-
cmd = "sh ./configure --prefix=#{dest_path}"
|
12
|
-
cmd << " #{args.join ' '}" unless args.empty?
|
11
|
+
cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]
|
13
12
|
|
14
13
|
run cmd, results, class_name, configure_dir
|
15
14
|
end
|
@@ -19,7 +19,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
|
|
19
19
|
rake = rake.shellsplit
|
20
20
|
else
|
21
21
|
begin
|
22
|
-
rake = [Gem.ruby, "-I#{File.expand_path("
|
22
|
+
rake = [Gem.ruby, "-I#{File.expand_path("../..", __dir__)}", "-rrubygems", Gem.bin_path('rake', 'rake')]
|
23
23
|
rescue Gem::Exception
|
24
24
|
rake = [Gem.default_exec_format % 'rake']
|
25
25
|
end
|
@@ -94,20 +94,16 @@ module Gem::GemcutterUtilities
|
|
94
94
|
end
|
95
95
|
|
96
96
|
uri = URI.parse "#{self.host}/#{path}"
|
97
|
-
|
98
|
-
request_method = Net::HTTP.const_get method.to_s.capitalize
|
99
|
-
response = Gem::RemoteFetcher.fetcher.request(uri, request_method, &block)
|
97
|
+
response = request_with_otp(method, uri, &block)
|
100
98
|
|
101
99
|
if mfa_unauthorized?(response)
|
102
|
-
|
103
|
-
|
104
|
-
block.call(req)
|
105
|
-
end
|
100
|
+
ask_otp
|
101
|
+
response = request_with_otp(method, uri, &block)
|
106
102
|
end
|
107
103
|
|
108
104
|
if api_key_forbidden?(response)
|
109
105
|
update_scope(scope)
|
110
|
-
|
106
|
+
request_with_otp(method, uri, &block)
|
111
107
|
else
|
112
108
|
response
|
113
109
|
end
|
@@ -117,11 +113,6 @@ module Gem::GemcutterUtilities
|
|
117
113
|
response.kind_of?(Net::HTTPUnauthorized) && response.body.start_with?('You have enabled multifactor authentication')
|
118
114
|
end
|
119
115
|
|
120
|
-
def get_otp
|
121
|
-
say 'You have enabled multi-factor authentication. Please enter OTP code.'
|
122
|
-
ask 'Code: '
|
123
|
-
end
|
124
|
-
|
125
116
|
def update_scope(scope)
|
126
117
|
sign_in_host = self.host
|
127
118
|
pretty_host = pretty_host(sign_in_host)
|
@@ -135,7 +126,7 @@ module Gem::GemcutterUtilities
|
|
135
126
|
response = rubygems_api_request(:put, "api/v1/api_key",
|
136
127
|
sign_in_host, scope: scope) do |request|
|
137
128
|
request.basic_auth email, password
|
138
|
-
request
|
129
|
+
request["OTP"] = options[:otp] if options[:otp]
|
139
130
|
request.body = URI.encode_www_form({:api_key => api_key }.merge(update_scope_params))
|
140
131
|
end
|
141
132
|
|
@@ -168,7 +159,7 @@ module Gem::GemcutterUtilities
|
|
168
159
|
response = rubygems_api_request(:post, "api/v1/api_key",
|
169
160
|
sign_in_host, scope: scope) do |request|
|
170
161
|
request.basic_auth email, password
|
171
|
-
request
|
162
|
+
request["OTP"] = options[:otp] if options[:otp]
|
172
163
|
request.body = URI.encode_www_form({ name: key_name }.merge(scope_params))
|
173
164
|
end
|
174
165
|
|
@@ -229,6 +220,20 @@ module Gem::GemcutterUtilities
|
|
229
220
|
|
230
221
|
private
|
231
222
|
|
223
|
+
def request_with_otp(method, uri, &block)
|
224
|
+
request_method = Net::HTTP.const_get method.to_s.capitalize
|
225
|
+
|
226
|
+
Gem::RemoteFetcher.fetcher.request(uri, request_method) do |req|
|
227
|
+
req["OTP"] = options[:otp] if options[:otp]
|
228
|
+
block.call(req)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def ask_otp
|
233
|
+
say 'You have enabled multi-factor authentication. Please enter OTP code.'
|
234
|
+
options[:otp] = ask 'Code: '
|
235
|
+
end
|
236
|
+
|
232
237
|
def pretty_host(host)
|
233
238
|
if Gem::DEFAULT_HOST == host
|
234
239
|
'RubyGems.org'
|
@@ -255,8 +260,8 @@ module Gem::GemcutterUtilities
|
|
255
260
|
end
|
256
261
|
|
257
262
|
def get_key_name(scope)
|
258
|
-
hostname = Socket.gethostname || "
|
259
|
-
user = ENV["USER"] || ENV["USERNAME"] || "
|
263
|
+
hostname = Socket.gethostname || "unknown-host"
|
264
|
+
user = ENV["USER"] || ENV["USERNAME"] || "unknown-user"
|
260
265
|
ts = Time.now.strftime("%Y%m%d%H%M%S")
|
261
266
|
default_key_name = "#{hostname}-#{user}-#{ts}"
|
262
267
|
|