Hello community,
here is the log from the commit of package rubygem-rubyzip for openSUSE:Factory
checked in at 2020-02-28 15:21:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-rubyzip (Old)
and /work/SRC/openSUSE:Factory/.rubygem-rubyzip.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-rubyzip"
Fri Feb 28 15:21:53 2020 rev:17 rq:780191 version:2.2.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-rubyzip/rubygem-rubyzip.changes
2019-11-13 13:25:58.199550331 +0100
+++
/work/SRC/openSUSE:Factory/.rubygem-rubyzip.new.26092/rubygem-rubyzip.changes
2020-02-28 15:21:54.785962970 +0100
@@ -1,0 +2,47 @@
+Fri Feb 28 09:21:54 UTC 2020 - Stephan Kulow <[email protected]>
+
+- Fix rpmlint complains (removing rubygem-rubyzip.rpmlintrc)
+
+-------------------------------------------------------------------
+Mon Feb 3 08:25:11 UTC 2020 - Dan Čermák <[email protected]>
+
+- New upstream release 2.2.0
+
+ - Add support for decompression plugin gems #427
+
+-------------------------------------------------------------------
+Mon Jan 27 08:28:47 UTC 2020 - Dan Čermák <[email protected]>
+
+- New upstream release 2.1.0
+
+ - Fix (at least partially) the `restore_times` and `restore_permissions`
+ options to `Zip::File.new`
+ [#413](https://github.com/rubyzip/rubyzip/pull/413)
+ - Previously, neither option did anything, regardless of what it was set
+ to. We have therefore defaulted them to `false` to preserve the current
+ behavior, for the time being. If you have explicitly set either to
+ `true`, it will now have an effect.
+ - Fix handling of UniversalTime (`mtime`, `atime`, `ctime`)
+ fields. [#421](https://github.com/rubyzip/rubyzip/pull/421)
+ - Previously, `Zip::File` did not pass the options to `Zip::Entry` in some
+ cases. [#423](https://github.com/rubyzip/rubyzip/pull/423)
+ - Note that `restore_times` in this release does nothing on Windows and
+ only restores `mtime`, not `atime` or `ctime`.
+ - Allow `Zip::File.open` to take an options hash like `Zip::File.new`
+ [#418](https://github.com/rubyzip/rubyzip/pull/418)
+ - Always print warnings with `warn`, instead of a mix of `puts` and `warn`
+ [#416](https://github.com/rubyzip/rubyzip/pull/416)
+ - Create temporary files in the system temporary directory instead of the
+ directory of the zip file
+ [#411](https://github.com/rubyzip/rubyzip/pull/411)
+ - Drop unused `tmpdir` requirement
+ [#411](https://github.com/rubyzip/rubyzip/pull/411)
+
+ Tooling
+
+ - Move CI to xenial and include jruby on JDK11
+ [#419](https://github.com/rubyzip/rubyzip/pull/419/files)
+
+- Add rubygem-rubyzip.rpmlintrc
+
+-------------------------------------------------------------------
Old:
----
rubyzip-2.0.0.gem
New:
----
rubyzip-2.2.0.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-rubyzip.spec ++++++
--- /var/tmp/diff_new_pack.SimrFa/_old 2020-02-28 15:21:56.689966846 +0100
+++ /var/tmp/diff_new_pack.SimrFa/_new 2020-02-28 15:21:56.689966846 +0100
@@ -1,7 +1,7 @@
#
# spec file for package rubygem-rubyzip
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -24,7 +24,7 @@
#
Name: rubygem-rubyzip
-Version: 2.0.0
+Version: 2.2.0
Release: 0
%define mod_name rubyzip
%define mod_full_name %{mod_name}-%{version}
@@ -32,10 +32,10 @@
BuildRequires: %{ruby >= 2.4}
BuildRequires: %{rubygem gem2rpm}
BuildRequires: ruby-macros >= 5
-Url: http://github.com/rubyzip/rubyzip
+URL: http://github.com/rubyzip/rubyzip
Source: https://rubygems.org/gems/%{mod_full_name}.gem
Source1: gem2rpm.yml
-Summary: rubyzip is a ruby module for reading and writing zip files
+Summary: Ruby module for reading and writing zip files
License: BSD-2-Clause
Group: Development/Languages/Ruby
++++++ gem2rpm.yml ++++++
--- /var/tmp/diff_new_pack.SimrFa/_old 2020-02-28 15:21:56.725966920 +0100
+++ /var/tmp/diff_new_pack.SimrFa/_new 2020-02-28 15:21:56.725966920 +0100
@@ -1,6 +1,5 @@
-# ---
-# ## used by gem2rpm
-# :summary: this is a custom summary
+---
+:summary: Ruby module for reading and writing zip files
# ## used by gem2rpm
# :description: |-
# this is a custom description
++++++ rubyzip-2.0.0.gem -> rubyzip-2.2.0.gem ++++++
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/constants.rb new/lib/zip/constants.rb
--- old/lib/zip/constants.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/constants.rb 2020-02-01 16:37:23.000000000 +0100
@@ -60,4 +60,56 @@
FSTYPE_MAC_OSX => 'Mac OS/X (Darwin)'.freeze,
FSTYPE_ATHEOS => 'AtheOS'.freeze
}.freeze
+
+ COMPRESSION_METHOD_STORE = 0
+ COMPRESSION_METHOD_SHRINK = 1
+ COMPRESSION_METHOD_REDUCE_1 = 2
+ COMPRESSION_METHOD_REDUCE_2 = 3
+ COMPRESSION_METHOD_REDUCE_3 = 4
+ COMPRESSION_METHOD_REDUCE_4 = 5
+ COMPRESSION_METHOD_IMPLODE = 6
+ # RESERVED = 7
+ COMPRESSION_METHOD_DEFLATE = 8
+ COMPRESSION_METHOD_DEFLATE_64 = 9
+ COMPRESSION_METHOD_PKWARE_DCLI = 10
+ # RESERVED = 11
+ COMPRESSION_METHOD_BZIP2 = 12
+ # RESERVED = 13
+ COMPRESSION_METHOD_LZMA = 14
+ # RESERVED = 15
+ COMPRESSION_METHOD_IBM_CMPSC = 16
+ # RESERVED = 17
+ COMPRESSION_METHOD_IBM_TERSE = 18
+ COMPRESSION_METHOD_IBM_LZ77 = 19
+ COMPRESSION_METHOD_JPEG = 96
+ COMPRESSION_METHOD_WAVPACK = 97
+ COMPRESSION_METHOD_PPMD = 98
+ COMPRESSION_METHOD_AES = 99
+
+ COMPRESSION_METHODS = {
+ COMPRESSION_METHOD_STORE => 'Store (no compression)',
+ COMPRESSION_METHOD_SHRINK => 'Shrink',
+ COMPRESSION_METHOD_REDUCE_1 => 'Reduce with compression factor 1',
+ COMPRESSION_METHOD_REDUCE_2 => 'Reduce with compression factor 2',
+ COMPRESSION_METHOD_REDUCE_3 => 'Reduce with compression factor 3',
+ COMPRESSION_METHOD_REDUCE_4 => 'Reduce with compression factor 4',
+ COMPRESSION_METHOD_IMPLODE => 'Implode',
+ # RESERVED = 7
+ COMPRESSION_METHOD_DEFLATE => 'Deflate',
+ COMPRESSION_METHOD_DEFLATE_64 => 'Deflate64(tm)',
+ COMPRESSION_METHOD_PKWARE_DCLI => 'PKWARE Data Compression Library
Imploding (old IBM TERSE)',
+ # RESERVED = 11
+ COMPRESSION_METHOD_BZIP2 => 'BZIP2',
+ # RESERVED = 13
+ COMPRESSION_METHOD_LZMA => 'LZMA',
+ # RESERVED = 15
+ COMPRESSION_METHOD_IBM_CMPSC => 'IBM z/OS CMPSC Compression',
+ # RESERVED = 17
+ COMPRESSION_METHOD_IBM_TERSE => 'IBM TERSE (new)',
+ COMPRESSION_METHOD_IBM_LZ77 => 'IBM LZ77 z Architecture (PFS)',
+ COMPRESSION_METHOD_JPEG => 'JPEG variant',
+ COMPRESSION_METHOD_WAVPACK => 'WavPack compressed data',
+ COMPRESSION_METHOD_PPMD => 'PPMd version I, Rev 1',
+ COMPRESSION_METHOD_AES => 'AES encryption',
+ }.freeze
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/crypto/decrypted_io.rb
new/lib/zip/crypto/decrypted_io.rb
--- old/lib/zip/crypto/decrypted_io.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/lib/zip/crypto/decrypted_io.rb 2020-02-01 16:37:23.000000000 +0100
@@ -0,0 +1,39 @@
+module Zip
+ class DecryptedIo #:nodoc:all
+ CHUNK_SIZE = 32_768
+
+ def initialize(io, decrypter)
+ @io = io
+ @decrypter = decrypter
+ end
+
+ def read(length = nil, outbuf = '')
+ return ((length.nil? || length.zero?) ? "" : nil) if eof
+
+ while length.nil? || (buffer.bytesize < length)
+ break if input_finished?
+ buffer << produce_input
+ end
+
+ outbuf.replace(buffer.slice!(0...(length || output_buffer.bytesize)))
+ end
+
+ private
+
+ def eof
+ buffer.empty? && input_finished?
+ end
+
+ def buffer
+ @buffer ||= ''.dup
+ end
+
+ def input_finished?
+ @io.eof
+ end
+
+ def produce_input
+ @decrypter.decrypt(@io.read(CHUNK_SIZE))
+ end
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/decompressor.rb new/lib/zip/decompressor.rb
--- old/lib/zip/decompressor.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/decompressor.rb 2020-02-01 16:37:23.000000000 +0100
@@ -1,9 +1,27 @@
module Zip
class Decompressor #:nodoc:all
CHUNK_SIZE = 32_768
- def initialize(input_stream)
+
+ def self.decompressor_classes
+ @decompressor_classes ||= {}
+ end
+
+ def self.register(compression_method, decompressor_class)
+ decompressor_classes[compression_method] = decompressor_class
+ end
+
+ def self.find_by_compression_method(compression_method)
+ decompressor_classes[compression_method]
+ end
+
+ attr_reader :input_stream
+ attr_reader :decompressed_size
+
+ def initialize(input_stream, decompressed_size = nil)
super()
+
@input_stream = input_stream
+ @decompressed_size = decompressed_size
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/dos_time.rb new/lib/zip/dos_time.rb
--- old/lib/zip/dos_time.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/dos_time.rb 2020-02-01 16:37:23.000000000 +0100
@@ -29,6 +29,11 @@
to_i / 2 == other.to_i / 2
end
+ # Create a DOSTime instance from a vanilla Time instance.
+ def self.from_time(time)
+ local(time.year, time.month, time.day, time.hour, time.min, time.sec)
+ end
+
def self.parse_binary_dos_format(binaryDosDate, binaryDosTime)
second = 2 * (0b11111 & binaryDosTime)
minute = (0b11111100000 & binaryDosTime) >> 5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/entry.rb new/lib/zip/entry.rb
--- old/lib/zip/entry.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/entry.rb 2020-02-01 16:37:23.000000000 +0100
@@ -34,7 +34,7 @@
end
@follow_symlinks = false
- @restore_times = true
+ @restore_times = false
@restore_permissions = false
@restore_ownership = false
# BUG: need an extra field to support uid/gid's
@@ -72,6 +72,14 @@
@extra = ::Zip::ExtraField.new(@extra.to_s) unless
@extra.is_a?(::Zip::ExtraField)
end
+ def encrypted?
+ gp_flags & 1 == 1
+ end
+
+ def incomplete?
+ gp_flags & 8 == 8
+ end
+
def time
if @extra['UniversalTime']
@extra['UniversalTime'].mtime
@@ -163,7 +171,7 @@
# is passed.
def extract(dest_path = nil, &block)
if dest_path.nil? && !name_safe?
- puts "WARNING: skipped #{@name} as unsafe"
+ warn "WARNING: skipped '#{@name}' as unsafe."
return self
end
@@ -406,16 +414,20 @@
@unix_uid = stat.uid
@unix_gid = stat.gid
@unix_perms = stat.mode & 0o7777
+ @time = ::Zip::DOSTime.from_time(stat.mtime)
end
- def set_unix_permissions_on_path(dest_path)
- # BUG: does not update timestamps into account
+ def set_unix_attributes_on_path(dest_path)
# ignore setuid/setgid bits by default. honor if @restore_ownership
unix_perms_mask = 0o1777
unix_perms_mask = 0o7777 if @restore_ownership
::FileUtils.chmod(@unix_perms & unix_perms_mask, dest_path) if
@restore_permissions && @unix_perms
::FileUtils.chown(@unix_uid, @unix_gid, dest_path) if @restore_ownership
&& @unix_uid && @unix_gid && ::Process.egid == 0
- # File::utimes()
+
+ # Restore the timestamp on a file. This will either have come from the
+ # original source file that was copied into the archive, or from the
+ # creation date of the archive if there was no original source file.
+ ::FileUtils.touch(dest_path, mtime: time) if @restore_times
end
def set_extra_attributes_on_path(dest_path) # :nodoc:
@@ -423,7 +435,7 @@
case @fstype
when ::Zip::FSTYPE_UNIX
- set_unix_permissions_on_path(dest_path)
+ set_unix_attributes_on_path(dest_path)
end
end
@@ -591,7 +603,7 @@
def set_time(binary_dos_date, binary_dos_time)
@time = ::Zip::DOSTime.parse_binary_dos_format(binary_dos_date,
binary_dos_time)
rescue ArgumentError
- warn 'Invalid date/time in zip entry' if ::Zip.warn_invalid_date
+ warn 'WARNING: invalid date/time in zip entry.' if
::Zip.warn_invalid_date
end
def create_file(dest_path, _continue_on_exists_proc = proc {
Zip.continue_on_exists_proc })
@@ -601,8 +613,6 @@
end
::File.open(dest_path, 'wb') do |os|
get_input_stream do |is|
- set_extra_attributes_on_path(dest_path)
-
bytes_written = 0
warned = false
buf = ''.dup
@@ -610,17 +620,19 @@
os << buf
bytes_written += buf.bytesize
if bytes_written > size && !warned
- message = "Entry #{name} should be #{size}B but is larger when
inflated"
+ message = "entry '#{name}' should be #{size}B, but is larger
when inflated."
if ::Zip.validate_entry_sizes
raise ::Zip::EntrySizeError, message
else
- puts "WARNING: #{message}"
+ warn "WARNING: #{message}"
warned = true
end
end
end
end
end
+
+ set_extra_attributes_on_path(dest_path)
end
def create_directory(dest_path)
@@ -642,7 +654,7 @@
def create_symlink(dest_path)
# TODO: Symlinks pose security challenges. Symlink support temporarily
# removed in view of https://github.com/rubyzip/rubyzip/issues/369 .
- puts "WARNING: skipped symlink #{dest_path}"
+ warn "WARNING: skipped symlink '#{dest_path}'."
end
# apply missing data from the zip64 extra information field, if present
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/errors.rb new/lib/zip/errors.rb
--- old/lib/zip/errors.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/errors.rb 2020-02-01 16:37:23.000000000 +0100
@@ -7,6 +7,7 @@
class EntrySizeError < Error; end
class InternalError < Error; end
class GPFBit3Error < Error; end
+ class DecompressionError < Error; end
# Backwards compatibility with v1 (delete in v2)
ZipError = Error
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/extra_field/generic.rb
new/lib/zip/extra_field/generic.rb
--- old/lib/zip/extra_field/generic.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/extra_field/generic.rb 2020-02-01 16:37:23.000000000 +0100
@@ -16,7 +16,7 @@
# If nil, start with empty.
return false
elsif binstr[0, 2] != self.class.const_get(:HEADER_ID)
- $stderr.puts 'Warning: weired extra feild header ID. skip parsing'
+ warn 'WARNING: weird extra field header ID. Skip parsing it.'
return false
end
[binstr[2, 2].unpack('v')[0], binstr[4..-1]]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/extra_field/universal_time.rb
new/lib/zip/extra_field/universal_time.rb
--- old/lib/zip/extra_field/universal_time.rb 2019-09-25 22:37:53.000000000
+0200
+++ new/lib/zip/extra_field/universal_time.rb 2020-02-01 16:37:23.000000000
+0100
@@ -4,24 +4,51 @@
HEADER_ID = 'UT'
register_map
+ ATIME_MASK = 0b010
+ CTIME_MASK = 0b100
+ MTIME_MASK = 0b001
+
def initialize(binstr = nil)
@ctime = nil
@mtime = nil
@atime = nil
- @flag = nil
- binstr && merge(binstr)
+ @flag = 0
+
+ merge(binstr) unless binstr.nil?
+ end
+
+ attr_reader :atime, :ctime, :mtime, :flag
+
+ def atime=(time)
+ @flag = time.nil? ? @flag & ~ATIME_MASK : @flag | ATIME_MASK
+ @atime = time
end
- attr_accessor :atime, :ctime, :mtime, :flag
+ def ctime=(time)
+ @flag = time.nil? ? @flag & ~CTIME_MASK : @flag | CTIME_MASK
+ @ctime = time
+ end
+
+ def mtime=(time)
+ @flag = time.nil? ? @flag & ~MTIME_MASK : @flag | MTIME_MASK
+ @mtime = time
+ end
def merge(binstr)
return if binstr.empty?
+
size, content = initial_parse(binstr)
- size || return
- @flag, mtime, atime, ctime = content.unpack('CVVV')
- mtime && @mtime ||= ::Zip::DOSTime.at(mtime)
- atime && @atime ||= ::Zip::DOSTime.at(atime)
- ctime && @ctime ||= ::Zip::DOSTime.at(ctime)
+ return if !size || size <= 0
+
+ @flag, *times = content.unpack('Cl<l<l<')
+
+ # Parse the timestamps, in order, based on which flags are set.
+ return if times[0].nil?
+ @mtime ||= ::Zip::DOSTime.at(times.shift) unless @flag & MTIME_MASK == 0
+ return if times[0].nil?
+ @atime ||= ::Zip::DOSTime.at(times.shift) unless @flag & ATIME_MASK == 0
+ return if times[0].nil?
+ @ctime ||= ::Zip::DOSTime.at(times.shift) unless @flag & CTIME_MASK == 0
end
def ==(other)
@@ -32,15 +59,15 @@
def pack_for_local
s = [@flag].pack('C')
- @flag & 1 != 0 && s << [@mtime.to_i].pack('V')
- @flag & 2 != 0 && s << [@atime.to_i].pack('V')
- @flag & 4 != 0 && s << [@ctime.to_i].pack('V')
+ s << [@mtime.to_i].pack('l<') unless @flag & MTIME_MASK == 0
+ s << [@atime.to_i].pack('l<') unless @flag & ATIME_MASK == 0
+ s << [@ctime.to_i].pack('l<') unless @flag & CTIME_MASK == 0
s
end
def pack_for_c_dir
s = [@flag].pack('C')
- @flag & 1 == 1 && s << [@mtime.to_i].pack('V')
+ s << [@mtime.to_i].pack('l<') unless @flag & MTIME_MASK == 0
s
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/file.rb new/lib/zip/file.rb
--- old/lib/zip/file.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/file.rb 2020-02-01 16:37:23.000000000 +0100
@@ -49,16 +49,25 @@
MAX_SEGMENT_SIZE = 3_221_225_472
MIN_SEGMENT_SIZE = 65_536
DATA_BUFFER_SIZE = 8192
- IO_METHODS = [:tell, :seek, :read, :close]
+ IO_METHODS = [:tell, :seek, :read, :eof, :close]
+
+ DEFAULT_OPTIONS = {
+ restore_ownership: false,
+ restore_permissions: false,
+ restore_times: false
+ }.freeze
attr_reader :name
- # default -> false
+ # default -> false.
attr_accessor :restore_ownership
- # default -> false
+
+ # default -> false, but will be set to true in a future version.
attr_accessor :restore_permissions
- # default -> true
+
+ # default -> false, but will be set to true in a future version.
attr_accessor :restore_times
+
# Returns the zip files comment, if it has one
attr_accessor :comment
@@ -66,6 +75,7 @@
# a new archive if it doesn't exist already.
def initialize(path_or_io, create = false, buffer = false, options = {})
super()
+ options = DEFAULT_OPTIONS.merge(options)
@name = path_or_io.respond_to?(:path) ? path_or_io.path : path_or_io
@comment = ''
@create = create ? true : false # allow any truthy value to mean true
@@ -98,17 +108,17 @@
@stored_entries = @entry_set.dup
@stored_comment = @comment
- @restore_ownership = options[:restore_ownership] || false
- @restore_permissions = options[:restore_permissions] || true
- @restore_times = options[:restore_times] || true
+ @restore_ownership = options[:restore_ownership]
+ @restore_permissions = options[:restore_permissions]
+ @restore_times = options[:restore_times]
end
class << self
- # Same as #new. If a block is passed the ZipFile object is passed
- # to the block and is automatically closed afterwards just as with
- # ruby's builtin File.open method.
- def open(file_name, create = false)
- zf = ::Zip::File.new(file_name, create)
+ # Similar to ::new. If a block is passed the Zip::File object is passed
+ # to the block and is automatically closed afterwards, just as with
+ # ruby's builtin File::open method.
+ def open(file_name, create = false, options = {})
+ zf = ::Zip::File.new(file_name, create, false, options)
return zf unless block_given?
begin
yield zf
@@ -366,7 +376,13 @@
# Searches for entry with the specified name. Returns nil if
# no entry is found. See also get_entry
def find_entry(entry_name)
- @entry_set.find_entry(entry_name)
+ selected_entry = @entry_set.find_entry(entry_name)
+ return if selected_entry.nil?
+
+ selected_entry.restore_ownership = @restore_ownership
+ selected_entry.restore_permissions = @restore_permissions
+ selected_entry.restore_times = @restore_times
+ selected_entry
end
# Searches for entries given a glob
@@ -378,10 +394,8 @@
# if no entry is found.
def get_entry(entry)
selected_entry = find_entry(entry)
- raise Errno::ENOENT, entry unless selected_entry
- selected_entry.restore_ownership = @restore_ownership
- selected_entry.restore_permissions = @restore_permissions
- selected_entry.restore_times = @restore_times
+ raise Errno::ENOENT, entry if selected_entry.nil?
+
selected_entry
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/inflater.rb new/lib/zip/inflater.rb
--- old/lib/zip/inflater.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/inflater.rb 2020-02-01 16:37:23.000000000 +0100
@@ -1,64 +1,50 @@
module Zip
class Inflater < Decompressor #:nodoc:all
- def initialize(input_stream, decrypter = NullDecrypter.new)
- super(input_stream)
- @zlib_inflater = ::Zlib::Inflate.new(-Zlib::MAX_WBITS)
- @output_buffer = ''.dup
- @has_returned_empty_string = false
- @decrypter = decrypter
- end
+ def initialize(*args)
+ super
- def sysread(number_of_bytes = nil, buf = '')
- readEverything = number_of_bytes.nil?
- while readEverything || @output_buffer.bytesize < number_of_bytes
- break if internal_input_finished?
- @output_buffer << internal_produce_input(buf)
- end
- return value_when_finished if @output_buffer.bytesize == 0 &&
input_finished?
- end_index = number_of_bytes.nil? ? @output_buffer.bytesize :
number_of_bytes
- @output_buffer.slice!(0...end_index)
+ @buffer = ''.dup
+ @zlib_inflater = ::Zlib::Inflate.new(-Zlib::MAX_WBITS)
end
- def produce_input
- if @output_buffer.empty?
- internal_produce_input
- else
- @output_buffer.slice!(0...(@output_buffer.length))
+ def read(length = nil, outbuf = '')
+ return ((length.nil? || length.zero?) ? "" : nil) if eof
+
+ while length.nil? || (@buffer.bytesize < length)
+ break if input_finished?
+ @buffer << produce_input
end
+
+ outbuf.replace(@buffer.slice!(0...(length || @buffer.bytesize)))
end
- # to be used with produce_input, not read (as read may still have more
data cached)
- # is data cached anywhere other than @outputBuffer? the comment above may
be wrong
- def input_finished?
- @output_buffer.empty? && internal_input_finished?
+ def eof
+ @buffer.empty? && input_finished?
end
- alias :eof input_finished?
- alias :eof? input_finished?
+ alias_method :eof?, :eof
private
- def internal_produce_input(buf = '')
+ def produce_input
retried = 0
begin
-
@zlib_inflater.inflate(@decrypter.decrypt(@input_stream.read(Decompressor::CHUNK_SIZE,
buf)))
+ @zlib_inflater.inflate(input_stream.read(Decompressor::CHUNK_SIZE))
rescue Zlib::BufError
raise if retried >= 5 # how many times should we retry?
retried += 1
retry
end
+ rescue Zlib::Error
+ raise(::Zip::DecompressionError, 'zlib error while inflating')
end
- def internal_input_finished?
+ def input_finished?
@zlib_inflater.finished?
end
-
- def value_when_finished # mimic behaviour of ruby File object.
- return if @has_returned_empty_string
- @has_returned_empty_string = true
- ''
- end
end
+
+ ::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_DEFLATE,
::Zip::Inflater)
end
# Copyright (C) 2002, 2003 Thomas Sondergaard
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/input_stream.rb new/lib/zip/input_stream.rb
--- old/lib/zip/input_stream.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/input_stream.rb 2020-02-01 16:37:23.000000000 +0100
@@ -39,6 +39,8 @@
# class.
class InputStream
+ CHUNK_SIZE = 32_768
+
include ::Zip::IOExtras::AbstractInputStream
# Opens the indicated zip file. An exception is thrown
@@ -78,16 +80,10 @@
end
# Modeled after IO.sysread
- def sysread(number_of_bytes = nil, buf = nil)
- @decompressor.sysread(number_of_bytes, buf)
- end
-
- def eof
- @output_buffer.empty? && @decompressor.eof
+ def sysread(length = nil, outbuf = '')
+ @decompressor.read(length, outbuf)
end
- alias :eof? eof
-
class << self
# Same as #initialize but if a block is passed the opened
# stream is passed to the block and closed when the block
@@ -103,7 +99,7 @@
end
def open_buffer(filename_or_io, offset = 0)
- puts 'open_buffer is deprecated!!! Use open instead!'
+ warn 'open_buffer is deprecated!!! Use open instead!'
open(filename_or_io, offset)
end
end
@@ -124,46 +120,54 @@
def open_entry
@current_entry = ::Zip::Entry.read_local_entry(@archive_io)
- if @current_entry && @current_entry.gp_flags & 1 == 1 &&
@decrypter.is_a?(NullEncrypter)
+ if @current_entry && @current_entry.encrypted? &&
@decrypter.is_a?(NullEncrypter)
raise Error, 'password required to decode zip file'
end
- if @current_entry && @current_entry.gp_flags & 8 == 8 &&
@current_entry.crc == 0 \
+ if @current_entry && @current_entry.incomplete? && @current_entry.crc ==
0 \
&& @current_entry.compressed_size == 0 \
&& @current_entry.size == 0 && !@complete_entry
raise GPFBit3Error,
'General purpose flag Bit 3 is set so not possible to get proper
info from local header.' \
'Please use ::Zip::File instead of ::Zip::InputStream'
end
+ @decrypted_io = get_decrypted_io
@decompressor = get_decompressor
flush
@current_entry
end
+ def get_decrypted_io
+ header = @archive_io.read(@decrypter.header_bytesize)
+ @decrypter.reset!(header)
+
+ ::Zip::DecryptedIo.new(@archive_io, @decrypter)
+ end
+
def get_decompressor
- if @current_entry.nil?
- ::Zip::NullDecompressor
- elsif @current_entry.compression_method == ::Zip::Entry::STORED
- if @current_entry.gp_flags & 8 == 8 && @current_entry.crc == 0 &&
@current_entry.size == 0 && @complete_entry
- ::Zip::PassThruDecompressor.new(@archive_io, @complete_entry.size)
+ return ::Zip::NullDecompressor if @current_entry.nil?
+
+ decompressed_size =
+ if @current_entry.incomplete? && @current_entry.crc == 0 &&
@current_entry.size == 0 && @complete_entry
+ @complete_entry.size
else
- ::Zip::PassThruDecompressor.new(@archive_io, @current_entry.size)
+ @current_entry.size
end
- elsif @current_entry.compression_method == ::Zip::Entry::DEFLATED
- header = @archive_io.read(@decrypter.header_bytesize)
- @decrypter.reset!(header)
- ::Zip::Inflater.new(@archive_io, @decrypter)
- else
+
+ decompressor_class =
::Zip::Decompressor.find_by_compression_method(@current_entry.compression_method)
+ if decompressor_class.nil?
raise ::Zip::CompressionMethodError,
"Unsupported compression method
#{@current_entry.compression_method}"
end
+
+ decompressor_class.new(@decrypted_io, decompressed_size)
end
def produce_input
- @decompressor.produce_input
+ @decompressor.read(CHUNK_SIZE)
end
def input_finished?
- @decompressor.input_finished?
+ @decompressor.eof
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/ioextras/abstract_input_stream.rb
new/lib/zip/ioextras/abstract_input_stream.rb
--- old/lib/zip/ioextras/abstract_input_stream.rb 2019-09-25
22:37:53.000000000 +0200
+++ new/lib/zip/ioextras/abstract_input_stream.rb 2020-02-01
16:37:23.000000000 +0100
@@ -106,6 +106,12 @@
end
alias_method :each, :each_line
+
+ def eof
+ @output_buffer.empty? && input_finished?
+ end
+
+ alias_method :eof?, :eof
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/null_decompressor.rb
new/lib/zip/null_decompressor.rb
--- old/lib/zip/null_decompressor.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/null_decompressor.rb 2020-02-01 16:37:23.000000000 +0100
@@ -2,18 +2,10 @@
module NullDecompressor #:nodoc:all
module_function
- def sysread(_numberOfBytes = nil, _buf = nil)
+ def read(_length = nil, _outbuf = nil)
nil
end
- def produce_input
- nil
- end
-
- def input_finished?
- true
- end
-
def eof
true
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/pass_thru_decompressor.rb
new/lib/zip/pass_thru_decompressor.rb
--- old/lib/zip/pass_thru_decompressor.rb 2019-09-25 22:37:53.000000000
+0200
+++ new/lib/zip/pass_thru_decompressor.rb 2020-02-01 16:37:23.000000000
+0100
@@ -1,38 +1,29 @@
module Zip
class PassThruDecompressor < Decompressor #:nodoc:all
- def initialize(input_stream, chars_to_read)
- super(input_stream)
- @chars_to_read = chars_to_read
+ def initialize(*args)
+ super
@read_so_far = 0
- @has_returned_empty_string = false
end
- def sysread(number_of_bytes = nil, buf = '')
- if input_finished?
- has_returned_empty_string_val = @has_returned_empty_string
- @has_returned_empty_string = true
- return '' unless has_returned_empty_string_val
- return
- end
+ def read(length = nil, outbuf = '')
+ return ((length.nil? || length.zero?) ? "" : nil) if eof
- if number_of_bytes.nil? || @read_so_far + number_of_bytes >
@chars_to_read
- number_of_bytes = @chars_to_read - @read_so_far
+ if length.nil? || (@read_so_far + length) > decompressed_size
+ length = decompressed_size - @read_so_far
end
- @read_so_far += number_of_bytes
- @input_stream.read(number_of_bytes, buf)
- end
- def produce_input
- sysread(::Zip::Decompressor::CHUNK_SIZE)
+ @read_so_far += length
+ input_stream.read(length, outbuf)
end
- def input_finished?
- @read_so_far >= @chars_to_read
+ def eof
+ @read_so_far >= decompressed_size
end
- alias eof input_finished?
- alias eof? input_finished?
+ alias_method :eof?, :eof
end
+
+ ::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_STORE,
::Zip::PassThruDecompressor)
end
# Copyright (C) 2002, 2003 Thomas Sondergaard
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/streamable_stream.rb
new/lib/zip/streamable_stream.rb
--- old/lib/zip/streamable_stream.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/streamable_stream.rb 2020-02-01 16:37:23.000000000 +0100
@@ -2,12 +2,7 @@
class StreamableStream < DelegateClass(Entry) # nodoc:all
def initialize(entry)
super(entry)
- dirname = if zipfile.is_a?(::String)
- ::File.dirname(zipfile)
- else
- nil
- end
- @temp_file = Tempfile.new(::File.basename(name), dirname)
+ @temp_file = Tempfile.new(::File.basename(name))
@temp_file.binmode
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip/version.rb new/lib/zip/version.rb
--- old/lib/zip/version.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip/version.rb 2020-02-01 16:37:23.000000000 +0100
@@ -1,3 +1,3 @@
module Zip
- VERSION = '2.0.0'
+ VERSION = '2.2.0'
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/zip.rb new/lib/zip.rb
--- old/lib/zip.rb 2019-09-25 22:37:53.000000000 +0200
+++ new/lib/zip.rb 2020-02-01 16:37:23.000000000 +0100
@@ -1,10 +1,10 @@
require 'delegate'
require 'singleton'
require 'tempfile'
-require 'tmpdir'
require 'fileutils'
require 'stringio'
require 'zlib'
+require 'zip/constants'
require 'zip/dos_time'
require 'zip/ioextras'
require 'rbconfig'
@@ -22,6 +22,7 @@
require 'zip/null_input_stream'
require 'zip/pass_thru_compressor'
require 'zip/pass_thru_decompressor'
+require 'zip/crypto/decrypted_io'
require 'zip/crypto/encryption'
require 'zip/crypto/null_encryption'
require 'zip/crypto/traditional_encryption'
@@ -29,7 +30,6 @@
require 'zip/deflater'
require 'zip/streamable_stream'
require 'zip/streamable_directory'
-require 'zip/constants'
require 'zip/errors'
module Zip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2019-09-25 22:37:53.000000000 +0200
+++ new/metadata 2020-02-01 16:37:23.000000000 +0100
@@ -1,14 +1,14 @@
--- !ruby/object:Gem::Specification
name: rubyzip
version: !ruby/object:Gem::Version
- version: 2.0.0
+ version: 2.2.0
platform: ruby
authors:
- Alexander Simonov
autorequire:
bindir: bin
cert_chain: []
-date: 2019-09-25 00:00:00.000000000 Z
+date: 2020-02-01 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: rake
@@ -94,6 +94,7 @@
- lib/zip/central_directory.rb
- lib/zip/compressor.rb
- lib/zip/constants.rb
+- lib/zip/crypto/decrypted_io.rb
- lib/zip/crypto/encryption.rb
- lib/zip/crypto/null_encryption.rb
- lib/zip/crypto/traditional_encryption.rb
@@ -139,9 +140,9 @@
- BSD 2-Clause
metadata:
bug_tracker_uri: https://github.com/rubyzip/rubyzip/issues
- changelog_uri: https://github.com/rubyzip/rubyzip/blob/v2.0.0/Changelog.md
- documentation_uri: https://www.rubydoc.info/gems/rubyzip/2.0.0
- source_code_uri: https://github.com/rubyzip/rubyzip/tree/v2.0.0
+ changelog_uri: https://github.com/rubyzip/rubyzip/blob/v2.2.0/Changelog.md
+ documentation_uri: https://www.rubydoc.info/gems/rubyzip/2.2.0
+ source_code_uri: https://github.com/rubyzip/rubyzip/tree/v2.2.0
wiki_uri: https://github.com/rubyzip/rubyzip/wiki
post_install_message:
rdoc_options: []