rubygems-update 2.4.1 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.txt +38 -0
- data/README.rdoc +1 -1
- data/Rakefile +3 -3
- data/lib/rubygems.rb +1 -1
- data/lib/rubygems/command_manager.rb +1 -1
- data/lib/rubygems/commands/owner_command.rb +3 -1
- data/lib/rubygems/commands/update_command.rb +6 -5
- data/lib/rubygems/config_file.rb +1 -1
- data/lib/rubygems/dependency.rb +4 -2
- data/lib/rubygems/dependency_installer.rb +2 -0
- data/lib/rubygems/exceptions.rb +2 -2
- data/lib/rubygems/installer.rb +13 -4
- data/lib/rubygems/local_remote_options.rb +1 -1
- data/lib/rubygems/package/tar_reader/entry.rb +2 -0
- data/lib/rubygems/rdoc.rb +0 -1
- data/lib/rubygems/request/connection_pools.rb +5 -3
- data/lib/rubygems/request_set.rb +57 -1
- data/lib/rubygems/request_set/gem_dependency_api.rb +58 -10
- data/lib/rubygems/request_set/lockfile.rb +13 -5
- data/lib/rubygems/resolver.rb +2 -1
- data/lib/rubygems/resolver/composed_set.rb +12 -0
- data/lib/rubygems/resolver/conflict.rb +2 -2
- data/lib/rubygems/resolver/dependency_request.rb +2 -2
- data/lib/rubygems/resolver/index_set.rb +1 -1
- data/lib/rubygems/resolver/installer_set.rb +6 -0
- data/lib/rubygems/resolver/lock_specification.rb +4 -0
- data/lib/rubygems/resolver/set.rb +8 -2
- data/lib/rubygems/resolver/vendor_set.rb +2 -0
- data/lib/rubygems/source.rb +2 -0
- data/lib/rubygems/source/git.rb +10 -2
- data/lib/rubygems/specification.rb +9 -3
- data/lib/rubygems/stub_specification.rb +5 -0
- data/lib/rubygems/test_case.rb +1 -1
- data/lib/rubygems/test_utilities.rb +2 -0
- data/lib/rubygems/user_interaction.rb +10 -0
- data/lib/rubygems/util.rb +14 -1
- data/test/rubygems/test_gem_commands_setup_command.rb +6 -8
- data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
- data/test/rubygems/test_gem_commands_update_command.rb +28 -0
- data/test/rubygems/test_gem_dependency.rb +27 -0
- data/test/rubygems/test_gem_dependency_installer.rb +21 -0
- data/test/rubygems/test_gem_ext_builder.rb +1 -1
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +6 -6
- data/test/rubygems/test_gem_installer.rb +27 -3
- data/test/rubygems/test_gem_remote_fetcher.rb +4 -0
- data/test/rubygems/test_gem_request_connection_pools.rb +37 -0
- data/test/rubygems/test_gem_request_set.rb +20 -1
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +95 -9
- data/test/rubygems/test_gem_request_set_lockfile.rb +54 -0
- data/test/rubygems/test_gem_resolver_composed_set.rb +13 -0
- data/test/rubygems/test_gem_resolver_conflict.rb +2 -2
- data/test/rubygems/test_gem_resolver_dependency_request.rb +9 -0
- data/test/rubygems/test_gem_resolver_installer_set.rb +12 -0
- data/test/rubygems/test_gem_resolver_lock_specification.rb +11 -0
- data/test/rubygems/test_gem_resolver_vendor_set.rb +3 -1
- data/test/rubygems/test_gem_silent_ui.rb +5 -0
- data/test/rubygems/test_gem_source.rb +13 -0
- data/test/rubygems/test_gem_source_git.rb +15 -0
- data/test/rubygems/test_gem_specification.rb +46 -10
- data/test/rubygems/test_gem_stub_specification.rb +10 -0
- metadata +3 -3
- metadata.gz.sig +0 -0
@@ -168,8 +168,12 @@ class Gem::RequestSet::Lockfile
|
|
168
168
|
dest = File.expand_path(dest)
|
169
169
|
base = File.expand_path(base)
|
170
170
|
|
171
|
-
if dest.index(base) == 0
|
172
|
-
|
171
|
+
if dest.index(base) == 0 then
|
172
|
+
offset = dest[base.size+1..-1]
|
173
|
+
|
174
|
+
return '.' unless offset
|
175
|
+
|
176
|
+
offset
|
173
177
|
else
|
174
178
|
dest
|
175
179
|
end
|
@@ -387,6 +391,8 @@ class Gem::RequestSet::Lockfile
|
|
387
391
|
skip :newline
|
388
392
|
|
389
393
|
set = Gem::Resolver::GitSet.new
|
394
|
+
set.root_dir = @set.install_dir
|
395
|
+
|
390
396
|
last_spec = nil
|
391
397
|
|
392
398
|
while not @tokens.empty? and :text == peek.first do
|
@@ -448,7 +454,7 @@ class Gem::RequestSet::Lockfile
|
|
448
454
|
else
|
449
455
|
dependency = parse_dependency name, data
|
450
456
|
|
451
|
-
last_spec.
|
457
|
+
last_spec.dependencies << dependency
|
452
458
|
end
|
453
459
|
|
454
460
|
get :r_paren
|
@@ -477,7 +483,7 @@ class Gem::RequestSet::Lockfile
|
|
477
483
|
# the first token of the requirements and returns a Gem::Dependency object.
|
478
484
|
|
479
485
|
def parse_dependency name, op # :nodoc:
|
480
|
-
return Gem::Dependency.new name unless peek[0] == :text
|
486
|
+
return Gem::Dependency.new name, op unless peek[0] == :text
|
481
487
|
|
482
488
|
_, version, = get :text
|
483
489
|
|
@@ -620,8 +626,10 @@ class Gem::RequestSet::Lockfile
|
|
620
626
|
# Writes the lock file alongside the gem dependencies file
|
621
627
|
|
622
628
|
def write
|
629
|
+
content = to_s
|
630
|
+
|
623
631
|
open "#{@gem_deps_file}.lock", 'w' do |io|
|
624
|
-
io.write
|
632
|
+
io.write content
|
625
633
|
end
|
626
634
|
end
|
627
635
|
|
data/lib/rubygems/resolver.rb
CHANGED
@@ -210,8 +210,9 @@ class Gem::Resolver
|
|
210
210
|
|
211
211
|
if (skip_dep_gems = skip_gems[dependency.name]) && !skip_dep_gems.empty?
|
212
212
|
matching = all.select do |api_spec|
|
213
|
-
skip_dep_gems.any?{|s| api_spec.version == s.version}
|
213
|
+
skip_dep_gems.any? { |s| api_spec.version == s.version }
|
214
214
|
end
|
215
|
+
|
215
216
|
all = matching unless matching.empty?
|
216
217
|
end
|
217
218
|
|
@@ -21,6 +21,18 @@ class Gem::Resolver::ComposedSet < Gem::Resolver::Set
|
|
21
21
|
@sets = sets
|
22
22
|
end
|
23
23
|
|
24
|
+
##
|
25
|
+
# When +allow_prerelease+ is set to +true+ prereleases gems are allowed to
|
26
|
+
# match dependencies.
|
27
|
+
|
28
|
+
def prerelease= allow_prerelease
|
29
|
+
super
|
30
|
+
|
31
|
+
sets.each do |set|
|
32
|
+
set.prerelease = allow_prerelease
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
24
36
|
##
|
25
37
|
# Sets the remote network access for all composed sets.
|
26
38
|
|
@@ -83,8 +83,8 @@ class Gem::Resolver::Conflict
|
|
83
83
|
|
84
84
|
explanation % [
|
85
85
|
activated, requirement,
|
86
|
-
request_path(@activated).reverse.join(" depends on\n "),
|
87
|
-
request_path(@failed_dep).reverse.join(" depends on\n "),
|
86
|
+
request_path(@activated).reverse.join(", depends on\n "),
|
87
|
+
request_path(@failed_dep).reverse.join(", depends on\n "),
|
88
88
|
matching,
|
89
89
|
]
|
90
90
|
end
|
@@ -47,8 +47,8 @@ class Gem::Resolver::DependencyRequest
|
|
47
47
|
# NOTE: #match? only matches prerelease versions when #dependency is a
|
48
48
|
# prerelease dependency.
|
49
49
|
|
50
|
-
def match? spec
|
51
|
-
@dependency.match? spec
|
50
|
+
def match? spec, allow_prerelease = false
|
51
|
+
@dependency.match? spec, nil, allow_prerelease
|
52
52
|
end
|
53
53
|
|
54
54
|
##
|
@@ -43,7 +43,7 @@ class Gem::Resolver::IndexSet < Gem::Resolver::Set
|
|
43
43
|
name = req.dependency.name
|
44
44
|
|
45
45
|
@all[name].each do |uri, n|
|
46
|
-
if req.
|
46
|
+
if req.match? n, @prerelease then
|
47
47
|
res << Gem::Resolver::IndexSpecification.new(
|
48
48
|
self, n.name, n.version, uri, n.platform)
|
49
49
|
end
|
@@ -157,6 +157,12 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
|
|
157
157
|
@remote_set.prefetch(reqs)
|
158
158
|
end
|
159
159
|
|
160
|
+
def prerelease= allow_prerelease
|
161
|
+
super
|
162
|
+
|
163
|
+
@remote_set.prerelease = allow_prerelease
|
164
|
+
end
|
165
|
+
|
160
166
|
def inspect # :nodoc:
|
161
167
|
always_install = @always_install.map { |s| s.full_name }
|
162
168
|
|
@@ -67,6 +67,10 @@ class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
|
|
67
67
|
# A specification constructed from the lockfile is returned
|
68
68
|
|
69
69
|
def spec
|
70
|
+
@spec ||= Gem::Specification.find { |spec|
|
71
|
+
spec.name == @name and spec.version == @version
|
72
|
+
}
|
73
|
+
|
70
74
|
@spec ||= Gem::Specification.new do |s|
|
71
75
|
s.name = @name
|
72
76
|
s.version = @version
|
@@ -14,9 +14,15 @@ class Gem::Resolver::Set
|
|
14
14
|
|
15
15
|
attr_accessor :errors
|
16
16
|
|
17
|
+
##
|
18
|
+
# When true, allows matching of requests to prerelease gems.
|
19
|
+
|
20
|
+
attr_accessor :prerelease
|
21
|
+
|
17
22
|
def initialize # :nodoc:
|
18
|
-
@
|
19
|
-
@
|
23
|
+
@prerelease = false
|
24
|
+
@remote = true
|
25
|
+
@errors = []
|
20
26
|
end
|
21
27
|
|
22
28
|
##
|
data/lib/rubygems/source.rb
CHANGED
@@ -78,6 +78,8 @@ class Gem::Source
|
|
78
78
|
# Returns a Set that can fetch specifications from this source.
|
79
79
|
|
80
80
|
def dependency_resolver_set # :nodoc:
|
81
|
+
return Gem::Resolver::IndexSet.new self if 'file' == api_uri.scheme
|
82
|
+
|
81
83
|
bundler_api_uri = api_uri + './api/v1/dependencies'
|
82
84
|
|
83
85
|
begin
|
data/lib/rubygems/source/git.rb
CHANGED
@@ -51,7 +51,7 @@ class Gem::Source::Git < Gem::Source
|
|
51
51
|
# will be checked out when the gem is installed.
|
52
52
|
|
53
53
|
def initialize name, repository, reference, submodules = false
|
54
|
-
super
|
54
|
+
super repository
|
55
55
|
|
56
56
|
@name = name
|
57
57
|
@repository = repository
|
@@ -178,9 +178,17 @@ class Gem::Source::Git < Gem::Source
|
|
178
178
|
# Converts the git reference for the repository into a commit hash.
|
179
179
|
|
180
180
|
def rev_parse # :nodoc:
|
181
|
+
hash = nil
|
182
|
+
|
181
183
|
Dir.chdir repo_cache_dir do
|
182
|
-
Gem::Util.popen(@git, 'rev-parse', @reference).strip
|
184
|
+
hash = Gem::Util.popen(@git, 'rev-parse', @reference).strip
|
183
185
|
end
|
186
|
+
|
187
|
+
raise Gem::Exception,
|
188
|
+
"unable to find reference #{@reference} in #{@repository}" unless
|
189
|
+
$?.success?
|
190
|
+
|
191
|
+
hash
|
184
192
|
end
|
185
193
|
|
186
194
|
##
|
@@ -1421,7 +1421,10 @@ class Gem::Specification < Gem::BasicSpecification
|
|
1421
1421
|
|
1422
1422
|
def build_args
|
1423
1423
|
if File.exist? build_info_file
|
1424
|
-
File.readlines
|
1424
|
+
build_info = File.readlines build_info_file
|
1425
|
+
build_info = build_info.map { |x| x.strip }
|
1426
|
+
build_info.delete ""
|
1427
|
+
build_info
|
1425
1428
|
else
|
1426
1429
|
[]
|
1427
1430
|
end
|
@@ -1449,11 +1452,13 @@ class Gem::Specification < Gem::BasicSpecification
|
|
1449
1452
|
require 'rubygems/ext'
|
1450
1453
|
require 'rubygems/user_interaction'
|
1451
1454
|
|
1452
|
-
|
1455
|
+
ui = Gem::SilentUI.new
|
1456
|
+
Gem::DefaultUserInteraction.use_ui ui do
|
1453
1457
|
builder = Gem::Ext::Builder.new self
|
1454
1458
|
builder.build_extensions
|
1455
1459
|
end
|
1456
1460
|
ensure
|
1461
|
+
ui.close if ui
|
1457
1462
|
Gem::Specification.unresolved_deps.replace unresolved_deps
|
1458
1463
|
end
|
1459
1464
|
end
|
@@ -2653,7 +2658,8 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
|
|
2653
2658
|
dep.requirement.requirements.any? do |op, version|
|
2654
2659
|
op == '~>' and
|
2655
2660
|
not version.prerelease? and
|
2656
|
-
version.segments.length > 2
|
2661
|
+
version.segments.length > 2 and
|
2662
|
+
version.segments.first != 0
|
2657
2663
|
end
|
2658
2664
|
|
2659
2665
|
if overly_strict then
|
@@ -154,8 +154,13 @@ class Gem::StubSpecification < Gem::BasicSpecification
|
|
154
154
|
# The full Gem::Specification for this gem, loaded from evalling its gemspec
|
155
155
|
|
156
156
|
def to_spec
|
157
|
+
@spec ||= Gem.loaded_specs.values.find { |spec|
|
158
|
+
spec.name == @name and spec.version == @version
|
159
|
+
}
|
160
|
+
|
157
161
|
@spec ||= Gem::Specification.load(loaded_from)
|
158
162
|
@spec.ignored = @ignored if instance_variable_defined? :@ignored
|
163
|
+
|
159
164
|
@spec
|
160
165
|
end
|
161
166
|
|
data/lib/rubygems/test_case.rb
CHANGED
@@ -38,6 +38,8 @@ class Gem::FakeFetcher
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def find_data(path)
|
41
|
+
return File.read path.path if URI === path and 'file' == path.scheme
|
42
|
+
|
41
43
|
if URI === path and "URI::#{path.scheme.upcase}" != path.class.name then
|
42
44
|
raise ArgumentError,
|
43
45
|
"mismatch for scheme #{path.scheme} and class #{path.class}"
|
@@ -386,9 +386,13 @@ class Gem::StreamUI
|
|
386
386
|
# handlers that might have been defined.
|
387
387
|
|
388
388
|
def terminate_interaction(status = 0)
|
389
|
+
close
|
389
390
|
raise Gem::SystemExitException, status
|
390
391
|
end
|
391
392
|
|
393
|
+
def close
|
394
|
+
end
|
395
|
+
|
392
396
|
##
|
393
397
|
# Return a progress reporter object chosen from the current verbosity.
|
394
398
|
|
@@ -691,6 +695,12 @@ class Gem::SilentUI < Gem::StreamUI
|
|
691
695
|
super reader, writer, writer, false
|
692
696
|
end
|
693
697
|
|
698
|
+
def close
|
699
|
+
super
|
700
|
+
@ins.close
|
701
|
+
@outs.close
|
702
|
+
end
|
703
|
+
|
694
704
|
def download_reporter(*args) # :nodoc:
|
695
705
|
SilentDownloadReporter.new(@outs, *args)
|
696
706
|
end
|
data/lib/rubygems/util.rb
CHANGED
@@ -66,15 +66,26 @@ module Gem::Util
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
NULL_DEVICE = defined?(IO::NULL) ? IO::NULL : Gem.win_platform? ? 'NUL' : '/dev/null'
|
70
|
+
|
69
71
|
##
|
70
72
|
# Invokes system, but silences all output.
|
71
73
|
|
72
74
|
def self.silent_system *command
|
75
|
+
opt = {:out => NULL_DEVICE, :err => [:child, :out]}
|
76
|
+
if Hash === command.last
|
77
|
+
opt.update(command.last)
|
78
|
+
cmds = command[0...-1]
|
79
|
+
else
|
80
|
+
cmds = command.dup
|
81
|
+
end
|
82
|
+
return system(*(cmds << opt))
|
83
|
+
rescue TypeError
|
73
84
|
require 'thread'
|
74
85
|
|
75
86
|
@silent_mutex ||= Mutex.new
|
76
87
|
|
77
|
-
null_device =
|
88
|
+
null_device = NULL_DEVICE
|
78
89
|
|
79
90
|
@silent_mutex.synchronize do
|
80
91
|
begin
|
@@ -88,6 +99,8 @@ module Gem::Util
|
|
88
99
|
ensure
|
89
100
|
STDOUT.reopen stdout
|
90
101
|
STDERR.reopen stderr
|
102
|
+
stdout.close
|
103
|
+
stderr.close
|
91
104
|
end
|
92
105
|
end
|
93
106
|
end
|
@@ -77,10 +77,10 @@ class TestGemCommandsSetupCommand < Gem::TestCase
|
|
77
77
|
|
78
78
|
def test_show_release_notes
|
79
79
|
@default_external = nil
|
80
|
-
|
81
|
-
@default_external
|
82
|
-
|
83
|
-
end
|
80
|
+
if Object.const_defined? :Encoding
|
81
|
+
@default_external = @ui.outs.external_encoding
|
82
|
+
@ui.outs.set_encoding Encoding::US_ASCII
|
83
|
+
end
|
84
84
|
|
85
85
|
@cmd.options[:previous_version] = Gem::Version.new '2.0.2'
|
86
86
|
|
@@ -127,11 +127,9 @@ class TestGemCommandsSetupCommand < Gem::TestCase
|
|
127
127
|
output = @ui.output
|
128
128
|
output.force_encoding Encoding::UTF_8 if Object.const_defined? :Encoding
|
129
129
|
|
130
|
-
assert_equal expected,
|
130
|
+
assert_equal expected, output
|
131
131
|
ensure
|
132
|
-
|
133
|
-
Encoding.default_external = @default_external
|
134
|
-
end if @default_external
|
132
|
+
@ui.outs.set_encoding @default_external if @default_external
|
135
133
|
end
|
136
134
|
|
137
135
|
end
|
@@ -256,7 +256,7 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
|
|
256
256
|
WARNING: Use your OS package manager to uninstall vendor gems
|
257
257
|
EXPECTED
|
258
258
|
|
259
|
-
|
259
|
+
assert_match expected, @ui.error
|
260
260
|
end
|
261
261
|
|
262
262
|
def test_handle_options_vendor_missing
|
@@ -485,6 +485,34 @@ class TestGemCommandsUpdateCommand < Gem::TestCase
|
|
485
485
|
assert_equal expected, @cmd.options
|
486
486
|
end
|
487
487
|
|
488
|
+
def test_update_gem_prerelease
|
489
|
+
spec_fetcher do |fetcher|
|
490
|
+
fetcher.spec 'a', '1.a'
|
491
|
+
fetcher.gem 'a', '1.b'
|
492
|
+
end
|
493
|
+
|
494
|
+
@cmd.update_gem 'a', Gem::Requirement.new('= 1.b')
|
495
|
+
|
496
|
+
refute_empty @cmd.updated
|
497
|
+
|
498
|
+
assert @cmd.installer.instance_variable_get :@prerelease
|
499
|
+
end
|
500
|
+
|
501
|
+
def test_update_gem_unresolved_dependency
|
502
|
+
spec_fetcher do |fetcher|
|
503
|
+
fetcher.spec 'a', 1
|
504
|
+
fetcher.gem 'a', 2 do |s|
|
505
|
+
s.add_dependency 'b', '>= 2'
|
506
|
+
end
|
507
|
+
|
508
|
+
fetcher.spec 'b', 1
|
509
|
+
end
|
510
|
+
|
511
|
+
@cmd.update_gem 'a'
|
512
|
+
|
513
|
+
assert_empty @cmd.updated
|
514
|
+
end
|
515
|
+
|
488
516
|
def test_update_rubygems_arguments
|
489
517
|
@cmd.options[:system] = true
|
490
518
|
|
@@ -153,6 +153,33 @@ class TestGemDependency < Gem::TestCase
|
|
153
153
|
assert c_dep.match? c_tup
|
154
154
|
end
|
155
155
|
|
156
|
+
def test_match_eh_allow_prerelease
|
157
|
+
a_dep = dep 'a'
|
158
|
+
|
159
|
+
a_tup = Gem::NameTuple.new 'a', 1
|
160
|
+
b_tup = Gem::NameTuple.new 'b', 2
|
161
|
+
c_tup = Gem::NameTuple.new 'c', '2.a'
|
162
|
+
|
163
|
+
assert a_dep.match? a_tup, nil, true
|
164
|
+
refute a_dep.match? b_tup, nil, true
|
165
|
+
|
166
|
+
b_dep = dep 'b', '>= 3'
|
167
|
+
|
168
|
+
refute b_dep.match? b_tup, nil, true
|
169
|
+
|
170
|
+
c_dep = dep 'c', '>= 1'
|
171
|
+
|
172
|
+
assert c_dep.match? c_tup, nil, true
|
173
|
+
|
174
|
+
c_dep = dep 'c'
|
175
|
+
|
176
|
+
assert c_dep.match? c_tup, nil, true
|
177
|
+
|
178
|
+
c_dep = dep 'c', '2.a'
|
179
|
+
|
180
|
+
assert c_dep.match? c_tup, nil, true
|
181
|
+
end
|
182
|
+
|
156
183
|
def test_match_eh_specification
|
157
184
|
a_dep = dep 'a'
|
158
185
|
|