class Mixlib::Archive::Tar

def extract(destination, perms: true, ignore: [])

ignore[Array]:: an array of matches of file paths to ignore
perms:: should the extracter use permissions from the archive.
=== Parameters

Extracts the archive to the given +destination+
def extract(destination, perms: true, ignore: [])
  # (http://stackoverflow.com/a/31310593/506908)
  ignore_re = Regexp.union(ignore)
  reader do |tar|
    dest = nil
    tar.each do |entry|
      if entry.full_name == TAR_LONGLINK
        dest = File.join(destination, entry.read.strip)
        next
      end
      if entry.full_name =~ ignore_re
        Mixlib::Archive::Log.warn "ignoring entry #{entry.full_name}"
        next
      end
      dest ||= File.expand_path(File.join(destination, entry.full_name))
      parent = File.dirname(dest)
      FileUtils.mkdir_p(parent)
      if entry.directory? || (entry.header.typeflag == "" && entry.full_name.end_with?("/"))
        File.delete(dest) if File.file?(dest)
        if perms
          FileUtils.mkdir_p(dest, mode: entry.header.mode, verbose: false)
        else
          FileUtils.mkdir_p(dest, verbose: false)
        end
      elsif entry.file? || (entry.header.typeflag == "" && !entry.full_name.end_with?("/"))
        FileUtils.rm_rf(dest) if File.directory?(dest)
        File.open(dest, "wb") do |f|
          f.print(entry.read)
        end
        FileUtils.chmod(entry.header.mode, dest, verbose: false) if perms
      elsif entry.header.typeflag == "2"
        # handle symlink
        File.symlink(entry.header.linkname, dest)
      else
        Mixlib::Archive::Log.warn "unknown tar entry: #{entry.full_name} type: #{entry.header.typeflag}"
      end
      dest = nil
    end
  end
end