rubygems-update 3.2.1 → 3.2.2
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/History.txt +14 -2
- data/Manifest.txt +1 -0
- data/bundler/CHANGELOG.md +7 -0
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/install.rb +14 -5
- data/bundler/lib/bundler/resolver.rb +2 -0
- 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/yank_command.rb +0 -1
- data/lib/rubygems/ext/rake_builder.rb +1 -1
- data/lib/rubygems/gemcutter_utilities.rb +20 -15
- data/lib/rubygems/test_utilities.rb +6 -5
- data/rubygems-update.gemspec +1 -1
- data/test/rubygems/test_gem_commands_push_command.rb +41 -2
- data/test/rubygems/test_gem_ext_rake_builder.rb +25 -0
- data/test/test_changelog_generator.rb +17 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d8b149374def285695109ddc454c37bce9e4237c234c5effd43d9cf4ccc26a
|
4
|
+
data.tar.gz: d47581abe6eeacc1037e20a882df82001f5742fb33418d38829c788bb341f073
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34fe6a294d1aaed49dc46a1a3aecdc211a2fb308a88ab352cbc732a0b9dc8ffdedc0e87302efc29275972051f77a275b8caf3c436538dcbb43e569b75ce1e429
|
7
|
+
data.tar.gz: 10af836317bb8539971af80345a129963d56149affab1a89498abde570c31802a374246c0cee85bf3bdfd6c37d6dcfd1db33677b4db9c5514d6cd5102741be89
|
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 3.2.2 / 2020-12-17
|
2
|
+
|
3
|
+
Bug fixes:
|
4
|
+
|
5
|
+
* Fix issue where CLI commands making more than one request to
|
6
|
+
rubygems.org needing an OTP code would crash or ask for the code twice.
|
7
|
+
Pull request #4162 by sonalkr132
|
8
|
+
* Fix building rake extensions that require openssl. Pull request #4165 by
|
9
|
+
deivid-rodriguez
|
10
|
+
* Fix `gem update --system` displaying too many changelog entries. Pull
|
11
|
+
request #4145 by deivid-rodriguez
|
12
|
+
|
1
13
|
=== 3.2.1 / 2020-12-14
|
2
14
|
|
3
15
|
Enhancements:
|
@@ -12,7 +24,7 @@ Bug fixes:
|
|
12
24
|
* Fix Resolver::APISet to always include prereleases when necessary. Pull
|
13
25
|
request #4113 by deivid-rodriguez
|
14
26
|
|
15
|
-
=== 3.2.0 / 2020-12-
|
27
|
+
=== 3.2.0 / 2020-12-07
|
16
28
|
|
17
29
|
Enhancements:
|
18
30
|
|
@@ -68,7 +80,7 @@ Performance:
|
|
68
80
|
* Don't change ruby process CWD when building extensions. Pull request
|
69
81
|
#3498 by deivid-rodriguez
|
70
82
|
|
71
|
-
=== 3.2.0.rc.2 / 2020-10-
|
83
|
+
=== 3.2.0.rc.2 / 2020-10-08
|
72
84
|
|
73
85
|
Enhancements:
|
74
86
|
|
data/Manifest.txt
CHANGED
data/bundler/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# 2.2.2 (December 17, 2020)
|
2
|
+
|
3
|
+
## Bug fixes:
|
4
|
+
|
5
|
+
- Fix resolver crash when a candidate has 0 matching platforms [#4163](https://github.com/rubygems/rubygems/pull/4163)
|
6
|
+
- Restore change to copy global with/without config locally upon `bundle install` [#4154](https://github.com/rubygems/rubygems/pull/4154)
|
7
|
+
|
1
8
|
# 2.2.1 (December 14, 2020)
|
2
9
|
|
3
10
|
## Bug fixes:
|
@@ -4,8 +4,8 @@ module Bundler
|
|
4
4
|
# Represents metadata from when the Bundler gem was built.
|
5
5
|
module BuildMetadata
|
6
6
|
# begin ivars
|
7
|
-
@built_at = "2020-12-
|
8
|
-
@git_commit_sha = "
|
7
|
+
@built_at = "2020-12-17".freeze
|
8
|
+
@git_commit_sha = "d85cd5b7c3".freeze
|
9
9
|
@release = true
|
10
10
|
# end ivars
|
11
11
|
|
@@ -152,18 +152,27 @@ module Bundler
|
|
152
152
|
|
153
153
|
check_for_group_conflicts_in_cli_options
|
154
154
|
|
155
|
+
Bundler.settings.set_command_option :with, nil if options[:with] == []
|
156
|
+
Bundler.settings.set_command_option :without, nil if options[:without] == []
|
157
|
+
|
155
158
|
with = options.fetch(:with, [])
|
156
159
|
with |= Bundler.settings[:with].map(&:to_s)
|
157
160
|
with -= options[:without] if options[:without]
|
158
|
-
with = nil if options[:with] == []
|
159
161
|
|
160
162
|
without = options.fetch(:without, [])
|
161
163
|
without |= Bundler.settings[:without].map(&:to_s)
|
162
164
|
without -= options[:with] if options[:with]
|
163
|
-
without = nil if options[:without] == []
|
164
165
|
|
165
|
-
|
166
|
-
|
166
|
+
options[:with] = with
|
167
|
+
options[:without] = without
|
168
|
+
|
169
|
+
unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
|
170
|
+
# need to nil them out first to get around validation for backwards compatibility
|
171
|
+
Bundler.settings.set_command_option :without, nil
|
172
|
+
Bundler.settings.set_command_option :with, nil
|
173
|
+
Bundler.settings.set_command_option :without, options[:without] - options[:with]
|
174
|
+
Bundler.settings.set_command_option :with, options[:with]
|
175
|
+
end
|
167
176
|
end
|
168
177
|
|
169
178
|
def normalize_settings
|
@@ -190,7 +199,7 @@ module Bundler
|
|
190
199
|
|
191
200
|
Bundler.settings.set_command_option_if_given :clean, options["clean"]
|
192
201
|
|
193
|
-
normalize_groups
|
202
|
+
normalize_groups
|
194
203
|
|
195
204
|
options[:force] = options[:redownload]
|
196
205
|
end
|
@@ -155,6 +155,8 @@ module Bundler
|
|
155
155
|
search.each do |sg|
|
156
156
|
next unless sg.for?(platform)
|
157
157
|
sg_all_platforms = sg.copy_for(self.class.sort_platforms(@platforms).reverse)
|
158
|
+
next unless sg_all_platforms
|
159
|
+
|
158
160
|
selected_sgs << sg_all_platforms
|
159
161
|
|
160
162
|
next if sg_all_platforms.activated_platforms == [Gem::Platform::RUBY]
|
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
|
|
@@ -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,
|
@@ -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'
|
@@ -38,7 +38,7 @@ class Gem::FakeFetcher
|
|
38
38
|
@paths = []
|
39
39
|
end
|
40
40
|
|
41
|
-
def find_data(path
|
41
|
+
def find_data(path)
|
42
42
|
return Gem.read_binary path.path if URI === path and 'file' == path.scheme
|
43
43
|
|
44
44
|
if URI === path and "URI::#{path.scheme.upcase}" != path.class.name
|
@@ -54,10 +54,11 @@ class Gem::FakeFetcher
|
|
54
54
|
raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
|
55
55
|
end
|
56
56
|
|
57
|
-
data
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
if @data[path].kind_of?(Array) && @data[path].first.kind_of?(Array)
|
58
|
+
@data[path].shift
|
59
|
+
else
|
60
|
+
@data[path]
|
61
|
+
end
|
61
62
|
end
|
62
63
|
|
63
64
|
def fetch_path(path, mtime = nil, head = false)
|
data/rubygems-update.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "rubygems-update"
|
5
|
-
s.version = "3.2.
|
5
|
+
s.version = "3.2.2"
|
6
6
|
s.authors = ["Jim Weirich", "Chad Fowler", "Eric Hodel", "Luis Lavena", "Aaron Patterson", "Samuel Giddins", "André Arko", "Evan Phoenix", "Hiroshi SHIBATA"]
|
7
7
|
s.email = ["", "", "drbrain@segment7.net", "luislavena@gmail.com", "aaron@tenderlovemaking.com", "segiddins@segiddins.me", "andre@arko.net", "evan@phx.io", "hsbt@ruby-lang.org"]
|
8
8
|
|
@@ -404,11 +404,13 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|
404
404
|
assert_equal '111111', @fetcher.last_request['OTP']
|
405
405
|
end
|
406
406
|
|
407
|
-
def
|
407
|
+
def test_sending_gem_unathorized_api_key_with_mfa_enabled
|
408
|
+
response_mfa_enabled = "You have enabled multifactor authentication but your request doesn't have the correct OTP code. Please check it and retry."
|
408
409
|
response_forbidden = "The API key doesn't have access"
|
409
410
|
response_success = 'Successfully registered gem: freewill (1.0.0)'
|
410
411
|
|
411
412
|
@fetcher.data["#{@host}/api/v1/gems"] = [
|
413
|
+
[response_mfa_enabled, 401, 'Unauthorized'],
|
412
414
|
[response_forbidden, 403, 'Forbidden'],
|
413
415
|
[response_success, 200, "OK"],
|
414
416
|
]
|
@@ -417,17 +419,54 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
|
417
419
|
@cmd.instance_variable_set :@host, @host
|
418
420
|
@cmd.instance_variable_set :@scope, :push_rubygem
|
419
421
|
|
420
|
-
@ui = Gem::MockGemUi.new "
|
422
|
+
@ui = Gem::MockGemUi.new "11111\nsome@mail.com\npass\n"
|
421
423
|
use_ui @ui do
|
422
424
|
@cmd.send_gem(@path)
|
423
425
|
end
|
424
426
|
|
427
|
+
mfa_notice = "You have enabled multi-factor authentication. Please enter OTP code."
|
425
428
|
access_notice = "The existing key doesn't have access of push_rubygem on https://rubygems.example. Please sign in to update access."
|
429
|
+
assert_match mfa_notice, @ui.output
|
426
430
|
assert_match access_notice, @ui.output
|
427
431
|
assert_match "Email:", @ui.output
|
428
432
|
assert_match "Password:", @ui.output
|
429
433
|
assert_match "Added push_rubygem scope to the existing API key", @ui.output
|
430
434
|
assert_match response_success, @ui.output
|
435
|
+
assert_equal '11111', @fetcher.last_request['OTP']
|
436
|
+
end
|
437
|
+
|
438
|
+
def test_sending_gem_with_no_local_creds
|
439
|
+
Gem.configuration.rubygems_api_key = nil
|
440
|
+
|
441
|
+
response_mfa_enabled = "You have enabled multifactor authentication but your request doesn't have the correct OTP code. Please check it and retry."
|
442
|
+
response_success = 'Successfully registered gem: freewill (1.0.0)'
|
443
|
+
|
444
|
+
@fetcher.data["#{@host}/api/v1/gems"] = [
|
445
|
+
[response_success, 200, "OK"],
|
446
|
+
]
|
447
|
+
|
448
|
+
@fetcher.data["#{@host}/api/v1/api_key"] = [
|
449
|
+
[response_mfa_enabled, 401, 'Unauthorized'],
|
450
|
+
["", 200, "OK"],
|
451
|
+
]
|
452
|
+
|
453
|
+
@cmd.instance_variable_set :@scope, :push_rubygem
|
454
|
+
@cmd.options[:args] = [@path]
|
455
|
+
@cmd.options[:host] = @host
|
456
|
+
|
457
|
+
@ui = Gem::MockGemUi.new "some@mail.com\npass\n11111\n"
|
458
|
+
use_ui @ui do
|
459
|
+
@cmd.execute
|
460
|
+
end
|
461
|
+
|
462
|
+
mfa_notice = "You have enabled multi-factor authentication. Please enter OTP code."
|
463
|
+
assert_match mfa_notice, @ui.output
|
464
|
+
assert_match "Enter your https://rubygems.example credentials.", @ui.output
|
465
|
+
assert_match "Email:", @ui.output
|
466
|
+
assert_match "Password:", @ui.output
|
467
|
+
assert_match "Signed in with API key:", @ui.output
|
468
|
+
assert_match response_success, @ui.output
|
469
|
+
assert_equal '11111', @fetcher.last_request['OTP']
|
431
470
|
end
|
432
471
|
|
433
472
|
private
|
@@ -47,6 +47,31 @@ class TestGemExtRakeBuilder < Gem::TestCase
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
def test_class_no_openssl_override
|
51
|
+
create_temp_mkrf_file('task :default')
|
52
|
+
|
53
|
+
rake = util_spec 'rake' do |s|
|
54
|
+
s.executables = %w[rake]
|
55
|
+
s.files = %w[bin/rake]
|
56
|
+
end
|
57
|
+
|
58
|
+
output = []
|
59
|
+
|
60
|
+
write_file File.join(@tempdir, 'bin', 'rake') do |fp|
|
61
|
+
fp.puts "#!/usr/bin/ruby"
|
62
|
+
fp.puts "require 'openssl'; puts OpenSSL"
|
63
|
+
end
|
64
|
+
|
65
|
+
install_gem rake
|
66
|
+
|
67
|
+
Gem::Ext::RakeBuilder.build 'mkrf_conf.rb', @dest_path, output, [''], nil, @ext
|
68
|
+
|
69
|
+
output = output.join "\n"
|
70
|
+
|
71
|
+
assert_match "OpenSSL", output
|
72
|
+
assert_match %r{^#{Regexp.escape Gem.ruby} mkrf_conf\.rb}, output
|
73
|
+
end
|
74
|
+
|
50
75
|
def test_class_build_no_mkrf_passes_args
|
51
76
|
output = []
|
52
77
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "minitest/autorun"
|
4
|
+
require_relative "../util/changelog"
|
5
|
+
require "rubygems/commands/setup_command"
|
6
|
+
|
7
|
+
class ChangelogTest < Minitest::Test
|
8
|
+
def setup
|
9
|
+
@changelog = Changelog.for_rubygems(Gem::VERSION)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_format_header
|
13
|
+
Time.stub :now, Time.new(2020, 1, 1) do
|
14
|
+
assert_match Gem::Commands::SetupCommand::HISTORY_HEADER, @changelog.send(:format_header)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubygems-update
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
@@ -16,7 +16,7 @@ authors:
|
|
16
16
|
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date: 2020-12-
|
19
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
20
20
|
dependencies: []
|
21
21
|
description: |-
|
22
22
|
A package (also known as a library) contains a set of functionality
|
@@ -762,6 +762,7 @@ files:
|
|
762
762
|
- test/rubygems/test_require.rb
|
763
763
|
- test/rubygems/wrong_key_cert.pem
|
764
764
|
- test/rubygems/wrong_key_cert_32.pem
|
765
|
+
- test/test_changelog_generator.rb
|
765
766
|
homepage: https://rubygems.org
|
766
767
|
licenses:
|
767
768
|
- Ruby
|
@@ -785,7 +786,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
785
786
|
- !ruby/object:Gem::Version
|
786
787
|
version: '0'
|
787
788
|
requirements: []
|
788
|
-
rubygems_version: 3.2.
|
789
|
+
rubygems_version: 3.2.1
|
789
790
|
signing_key:
|
790
791
|
specification_version: 4
|
791
792
|
summary: RubyGems is a package management framework for Ruby.
|