[前][次][番号順一覧][スレッド一覧]

ruby-changes:70757

From: David <ko1@a...>
Date: Thu, 6 Jan 2022 23:53:07 +0900 (JST)
Subject: [ruby-changes:70757] ee5e684bc1 (master): [rubygems/rubygems] Fix `gem install <non-existent-gem> --force` crash

https://git.ruby-lang.org/ruby.git/commit/?id=ee5e684bc1

From ee5e684bc1fda49bc28f0fcfc2f79abb26994f08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@r...>
Date: Thu, 6 Jan 2022 14:05:46 +0100
Subject: [rubygems/rubygems] Fix `gem install <non-existent-gem> --force`
 crash

Before:

```
$ gem install sfdsfdsfsdide --force
ERROR:  While executing gem ... (NoMethodError)
    undefined method `spec' for nil:NilClass

    @always_install << newest.spec
                             ^^^^^
```

After:

```
$ gem install sfdsfdsfsdide --force
ERROR:  Could not find a valid gem 'sfdsfdsfsdide' (>= 0) in any repository
```

https://github.com/rubygems/rubygems/commit/4e2bfd1101
---
 lib/rubygems/resolver/installer_set.rb             | 18 +++++++++---------
 test/rubygems/test_gem_commands_install_command.rb | 16 ++++++++++++++++
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/lib/rubygems/resolver/installer_set.rb b/lib/rubygems/resolver/installer_set.rb
index 237bc3f782a..45252ed2412 100644
--- a/lib/rubygems/resolver/installer_set.rb
+++ b/lib/rubygems/resolver/installer_set.rb
@@ -76,21 +76,21 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set https://github.com/ruby/ruby/blob/trunk/lib/rubygems/resolver/installer_set.rb#L76
 
     newest = found.last
 
+    unless newest
+      exc = Gem::UnsatisfiableDependencyError.new request
+      exc.errors = errors
+
+      raise exc
+    end
+
     unless @force
       found_matching_metadata = found.reverse.find do |spec|
         metadata_satisfied?(spec)
       end
 
       if found_matching_metadata.nil?
-        if newest
-          ensure_required_ruby_version_met(newest.spec)
-          ensure_required_rubygems_version_met(newest.spec)
-        else
-          exc = Gem::UnsatisfiableDependencyError.new request
-          exc.errors = errors
-
-          raise exc
-        end
+        ensure_required_ruby_version_met(newest.spec)
+        ensure_required_rubygems_version_met(newest.spec)
       else
         newest = found_matching_metadata
       end
diff --git a/test/rubygems/test_gem_commands_install_command.rb b/test/rubygems/test_gem_commands_install_command.rb
index 0365b2c4087..47a97dae4be 100644
--- a/test/rubygems/test_gem_commands_install_command.rb
+++ b/test/rubygems/test_gem_commands_install_command.rb
@@ -277,6 +277,22 @@ ERROR:  Could not find a valid gem 'bar' (= 0.5) (required by 'foo' (>= 0)) in a https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_install_command.rb#L277
     assert_match(/ould not find a valid gem 'nonexistent'/, @ui.error)
   end
 
+  def test_execute_nonexistent_force
+    spec_fetcher
+
+    @cmd.options[:args] = %w[nonexistent]
+    @cmd.options[:force] = true
+
+    use_ui @ui do
+      e = assert_raise Gem::MockGemUi::TermError do
+        @cmd.execute
+      end
+      assert_equal 2, e.exit_code
+    end
+
+    assert_match(/ould not find a valid gem 'nonexistent'/, @ui.error)
+  end
+
   def test_execute_dependency_nonexistent
     spec_fetcher do |fetcher|
       fetcher.spec 'foo', 2, 'bar' => '0.5'
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]