From fa29377f2b2812cf51c39e2ca804acc1175bd49c Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Wed, 5 Feb 2020 17:38:18 -0700 Subject: [PATCH] Add an option to create temp files in the zip file directory Before zip files were created in the system temporary directory they were created in the same directory as the zip file. This adds an option to have the same behaviour as before by passing in `use_system_temp_dir: false` as an option to `Zip.open`, which passes that down to `Zip::StreamableStream`. --- lib/zip/file.rb | 6 ++++-- lib/zip/streamable_stream.rb | 9 +++++++-- test/streamable_stream_test.rb | 31 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 test/streamable_stream_test.rb diff --git a/lib/zip/file.rb b/lib/zip/file.rb index 45017822..c2fb7234 100644 --- a/lib/zip/file.rb +++ b/lib/zip/file.rb @@ -54,7 +54,8 @@ class File < CentralDirectory DEFAULT_OPTIONS = { restore_ownership: false, restore_permissions: false, - restore_times: false + restore_times: false, + use_system_temp_dir: true }.freeze attr_reader :name @@ -111,6 +112,7 @@ def initialize(path_or_io, create = false, buffer = false, options = {}) @restore_ownership = options[:restore_ownership] @restore_permissions = options[:restore_permissions] @restore_times = options[:restore_times] + @use_system_temp_dir = options[:use_system_temp_dir] end class << self @@ -272,7 +274,7 @@ def get_output_stream(entry, permission_int = nil, comment = nil, extra = nil, c "cannot open stream to directory entry - '#{new_entry}'" end new_entry.unix_perms = permission_int - zip_streamable_entry = StreamableStream.new(new_entry) + zip_streamable_entry = StreamableStream.new(new_entry, @use_system_temp_dir) @entry_set << zip_streamable_entry zip_streamable_entry.get_output_stream(&aProc) end diff --git a/lib/zip/streamable_stream.rb b/lib/zip/streamable_stream.rb index 642ddae2..e6059970 100644 --- a/lib/zip/streamable_stream.rb +++ b/lib/zip/streamable_stream.rb @@ -1,8 +1,13 @@ module Zip class StreamableStream < DelegateClass(Entry) # nodoc:all - def initialize(entry) + def initialize(entry, use_system_temp_dir) super(entry) - @temp_file = Tempfile.new(::File.basename(name)) + dirname = if use_system_temp_dir == false && zipfile.is_a?(::String) + ::File.dirname(zipfile) + else + nil + end + @temp_file = Tempfile.new(::File.basename(name), dirname) @temp_file.binmode end diff --git a/test/streamable_stream_test.rb b/test/streamable_stream_test.rb new file mode 100644 index 00000000..6d2c6c25 --- /dev/null +++ b/test/streamable_stream_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +class FakeEntry + def name + 'something' + end + + def zipfile + 'data/important_stuff.zip' + end +end + +class StreamableStreamTest < MiniTest::Test + def test_use_system_temp_dir_true + entry = FakeEntry.new + stream = ::Zip::StreamableStream.new(entry, true) + stream.get_output_stream do |temp_file| + assert(temp_file.path.start_with?(Dir.tmpdir)) + end + end + + def test_use_system_temp_dir_false + entry = FakeEntry.new + FileUtils.mkdir_p(File.dirname(entry.zipfile)) + stream = ::Zip::StreamableStream.new(entry, false) + stream.get_output_stream do |temp_file| + assert(temp_file.path.start_with?('data/')) + end + FileUtils.rm_r(File.dirname(entry.zipfile)) + end +end