Skip to content

Commit 28d7b40

Browse files
Merge pull request #8072 from rubygems/deivid-rodriguez/gem-cleanup-warnings
Fix `gem cleanup` warning when two versions of psych installed (cherry picked from commit f36d111)
1 parent daf13d1 commit 28d7b40

File tree

4 files changed

+53
-13
lines changed

4 files changed

+53
-13
lines changed

lib/rubygems/commands/cleanup_command.rb

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ def initialize
3838
@default_gems = []
3939
@full = nil
4040
@gems_to_cleanup = nil
41-
@original_home = nil
42-
@original_path = nil
4341
@primary_gems = nil
4442
end
4543

@@ -95,9 +93,6 @@ def execute
9593
end
9694

9795
def clean_gems
98-
@original_home = Gem.dir
99-
@original_path = Gem.path
100-
10196
get_primary_gems
10297
get_candidate_gems
10398
get_gems_to_cleanup
@@ -112,8 +107,6 @@ def clean_gems
112107
deps.reverse_each do |spec|
113108
uninstall_dep spec
114109
end
115-
116-
Gem::Specification.reset
117110
end
118111

119112
def get_candidate_gems
@@ -133,7 +126,7 @@ def get_gems_to_cleanup
133126

134127
default_gems, gems_to_cleanup = gems_to_cleanup.partition(&:default_gem?)
135128

136-
uninstall_from = options[:user_install] ? Gem.user_dir : @original_home
129+
uninstall_from = options[:user_install] ? Gem.user_dir : Gem.dir
137130

138131
gems_to_cleanup = gems_to_cleanup.select do |spec|
139132
spec.base_dir == uninstall_from
@@ -181,8 +174,5 @@ def uninstall_dep(spec)
181174
say "Unable to uninstall #{spec.full_name}:"
182175
say "\t#{e.class}: #{e.message}"
183176
end
184-
ensure
185-
# Restore path Gem::Uninstaller may have changed
186-
Gem.use_paths @original_home, *@original_path
187177
end
188178
end

lib/rubygems/specification.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@ def self.reset
12081208
unresolved.values.each do |dep|
12091209
warn " #{dep}"
12101210

1211-
versions = find_all_by_name(dep.name)
1211+
versions = find_all_by_name(dep.name).uniq(&:full_name)
12121212
unless versions.empty?
12131213
warn " Available/installed versions of this gem:"
12141214
versions.each {|s| warn " - #{s.version}" }
@@ -1412,7 +1412,7 @@ def activate_dependencies
14121412
end
14131413

14141414
begin
1415-
specs = spec_dep.to_specs
1415+
specs = spec_dep.to_specs.uniq(&:full_name)
14161416
rescue Gem::MissingSpecError => e
14171417
raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{spec_file}")
14181418
end

test/rubygems/test_gem_specification.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3067,6 +3067,40 @@ def test_unresolved_specs_with_versions
30673067
assert_equal(expected, actual_stderr)
30683068
end
30693069

3070+
def test_unresolved_specs_with_duplicated_versions
3071+
specification = Gem::Specification.clone
3072+
3073+
set_orig specification
3074+
3075+
specification.define_singleton_method(:unresolved_deps) do
3076+
{ b: Gem::Dependency.new("x","1") }
3077+
end
3078+
3079+
specification.define_singleton_method(:find_all_by_name) do |_dep_name|
3080+
[
3081+
specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") }, # default copy
3082+
specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") }, # regular copy
3083+
specification.new {|s| s.name = "z", s.version = Gem::Version.new("2") }, # regular copy
3084+
]
3085+
end
3086+
3087+
expected = <<-EXPECTED
3088+
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
3089+
x (= 1)
3090+
Available/installed versions of this gem:
3091+
- 1
3092+
- 2
3093+
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
3094+
Please report a bug if this causes problems.
3095+
EXPECTED
3096+
3097+
actual_stdout, actual_stderr = capture_output do
3098+
specification.reset
3099+
end
3100+
assert_empty actual_stdout
3101+
assert_equal(expected, actual_stderr)
3102+
end
3103+
30703104
def test_duplicate_runtime_dependency
30713105
expected = "WARNING: duplicated b dependency [\"~> 3.0\", \"~> 3.0\"]\n"
30723106
out, err = capture_output do

test/rubygems/test_require.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,22 @@ def test_require_is_not_lazy_with_exact_req
182182
assert_equal %w[a-1 b-1], loaded_spec_names
183183
end
184184

185+
def test_require_is_not_lazy_with_shadowed_default_gem
186+
b1_default = new_default_spec("b", "1", nil, "foo.rb")
187+
install_default_gems b1_default
188+
189+
a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
190+
b1 = util_spec("b", "1", nil, "lib/foo.rb")
191+
install_specs b1, a1
192+
193+
# Load default ruby gems fresh as if we've just started a ruby script.
194+
Gem::Specification.reset
195+
196+
assert_require "test_gem_require_a"
197+
assert_equal %w[a-1 b-1], loaded_spec_names
198+
assert_equal unresolved_names, []
199+
end
200+
185201
def test_require_is_lazy_with_inexact_req
186202
a1 = util_spec "a", "1", { "b" => ">= 1" }, "lib/test_gem_require_a.rb"
187203
b1 = util_spec "b", "1", nil, "lib/b/c.rb"

0 commit comments

Comments
 (0)