def extract(destination, perms: true, ignore: [])
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"
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