module MultiZip::Backend::Cli::InfoZip::InstanceMethods
Public Instance Methods
list_members(prefix = nil, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 159 def list_members(prefix = nil, options={}) archive_exists! response = MultiZip::Backend::Cli::InfoZip.spawn([ UNZIP_PROGRAM, UNZIP_PROGRAM_LIST_MEMBERS_SWITCHES, @filename ].flatten) return [] if response.first.to_s =~ /^#{UNZIP_PROGRAM_EMPTY_ZIPFILE_MESSAGE}/ if response.first member_list = response.first.split("\n").sort member_list = member_list.select{|m| m =~ /^#{prefix}/} if prefix return member_list else # error, response.last should contain error message raise_info_zip_error!(response.last) end end
member_info(member_path, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 219 def member_info(member_path, options={}) archive_exists! response = MultiZip::Backend::Cli::InfoZip.spawn([ UNZIP_PROGRAM, UNZIP_PROGRAM_MEMBER_INFO_SWITCHES, @filename, member_path ].flatten).compact if response.join =~ /#{UNZIP_PROGRAM_INVALID_FILE_MESSAGE}/ raise_info_zip_error!(response.join) end # example line: # -rwx------ 2.1 unx 558 bX defN 15-Jun-22 17:53 ROBO3DR1PLUSV1/BlinkM.cpp line = response.detect{|r| r.strip.match(/#{member_path}$/)} raise MultiZip::MemberNotFoundError.new(member_path) if line.nil? || line =~ /#{UNZIP_PROGRAM_MEMBER_NOT_FOUND_MESSAGE}/i fields = line.split(/\s+/) path = fields.last unless path == member_path raise MultiZip::Backend::Cli::InfoZip::ResponseError, "Unexpected file name format or position: #{line.inspect}" end size = fields[3] unless size =~ /\d+/ raise MultiZip::Backend::Cli::InfoZip::ResponseError, "Unexpected file size format or position: #{line.inspect}" end type = case fields[0].slice(0,1) when 'd' :directory when 'l' :symlink when '-' :file else raise MultiZip::Backend::Cli::InfoZip::ResponseError, "Unexpected file type field format or position: #{line.inspect}" end { :path => fields.last, :size => size.to_i, :type => type, :original => line } end
raise_info_zip_error!(message, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 269 def raise_info_zip_error!(message, options={}) infozip_error = MultiZip::Backend::Cli::InfoZip::ResponseError.new(message) case message when /#{UNZIP_PROGRAM_INVALID_FILE_MESSAGE}/ raise MultiZip::InvalidArchiveError.new(@filename, infozip_error) when /cannot find or open/ raise MultiZip::ArchiveNotFoundError.new(@filename, infozip_error) when /filename not matched/ raise MultiZip::MemberNotFoundError.new(options[:member_path]) else raise MultiZip::UnknownError.new(@filename, infozip_error) end end
read_member(member_path, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 176 def read_member(member_path, options={}) archive_exists! member_not_found!(member_path) if member_path =~ /\/$/ response = MultiZip::Backend::Cli::InfoZip.spawn([ UNZIP_PROGRAM, UNZIP_PROGRAM_READ_MEMBER_SWITCH, @filename, member_path ].flatten) return response.first if response.first raise_info_zip_error!(response.last, :member_path => member_path) end
remove_member(member_path, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 206 def remove_member(member_path, options={}) archive_exists! raise MultiZip::MemberNotFoundError.new(member_path) unless member_exists?(member_path) response = MultiZip::Backend::Cli::InfoZip.spawn([ ZIP_PROGRAM, ZIP_PROGRAM_REMOVE_MEMBER_SWITCH, @filename, member_path ].flatten) return response.first if response.first raise_info_zip_error!(response.last, :member_path => member_path) end
write_member(member_path, member_content, options={})
click to toggle source
# File lib/multi_zip/backend/cli/info_zip.rb, line 188 def write_member(member_path, member_content, options={}) Dir.mktmpdir do |tempdir| member_file = File.new("#{tempdir}/#{member_path}", 'wb') member_file.print member_content member_file.close cwd = Dir.pwd Dir.chdir(tempdir) response = MultiZip::Backend::Cli::InfoZip.spawn([ ZIP_PROGRAM, @filename, member_path ]) Dir.chdir(cwd) end true end