aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/rubygems.rb4
-rw-r--r--test/rubygems/test_gem_installer.rb31
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index a869fc4c45..0c0ca9c1ba 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -774,6 +774,10 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
open_file(path, "wb") do |io|
io.write data
end
+ rescue Errno::ENOSPC
+ # If we ran out of space but the file exists, it's *guaranteed* to be corrupted.
+ File.delete(path) if File.exist?(path)
+ raise
end
##
diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb
index 0d0746ec84..f9209350fb 100644
--- a/test/rubygems/test_gem_installer.rb
+++ b/test/rubygems/test_gem_installer.rb
@@ -2222,6 +2222,37 @@ gem 'other', version
assert_equal @spec, eval(File.read(@spec.spec_file))
end
+ def test_leaves_no_empty_cached_spec_when_no_more_disk_space
+ @spec = setup_base_spec
+ FileUtils.rm @spec.spec_file
+ assert_path_not_exist @spec.spec_file
+
+ @spec.files = %w[a.rb b.rb c.rb]
+
+ installer = Gem::Installer.for_spec @spec
+ installer.gem_home = @gemhome
+
+ File.class_eval do
+ alias_method :original_write, :write
+
+ def write(data)
+ raise Errno::ENOSPC
+ end
+ end
+
+ assert_raise Errno::ENOSPC do
+ installer.write_spec
+ end
+
+ assert_path_not_exist @spec.spec_file
+ ensure
+ File.class_eval do
+ remove_method :write
+ alias_method :write, :original_write # rubocop:disable Lint/DuplicateMethods
+ remove_method :original_write
+ end
+ end
+
def test_dir
installer = setup_base_installer