# File lib/mixlib/archive/tar.rb, line 23
      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