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