Add support for XIP archives. (#23343)

This commit is contained in:
Markus Reiter 2016-08-02 15:10:16 +02:00 committed by GitHub
parent cb95a2dbdf
commit 93cc9f6852
3 changed files with 28 additions and 4 deletions

View File

@ -7,8 +7,5 @@ cask 'suspicious-package' do
homepage 'http://www.mothersruin.com/software/SuspiciousPackage/'
license :gratis
depends_on formula: 'unar'
container type: :generic_unar
app 'Suspicious Package.app'
end

View File

@ -18,6 +18,7 @@ require "hbc/container/tar"
require "hbc/container/ttf"
require "hbc/container/rar"
require "hbc/container/xar"
require "hbc/container/xip"
require "hbc/container/xz"
require "hbc/container/zip"
@ -34,12 +35,13 @@ class Hbc::Container
Hbc::Container::Sit,
Hbc::Container::Rar,
Hbc::Container::Zip,
Hbc::Container::Xip, # needs to be before xar as this is a cpio inside a gzip inside a xar
Hbc::Container::Xar, # need to be before tar as tar can also list xar
Hbc::Container::Tar, # or compressed tar (bzip2/gzip/lzma/xz)
Hbc::Container::Bzip2, # pure bzip2
Hbc::Container::Gzip, # pure gzip
Hbc::Container::Lzma, # pure lzma
Hbc::Container::Xz, # pure xz
Hbc::Container::Xar,
]
# for explicit use only (never autodetected):
# Hbc::Container::Naked

25
lib/hbc/container/xip.rb Normal file
View File

@ -0,0 +1,25 @@
require "tmpdir"
class Hbc::Container::Xip < Hbc::Container::Base
def self.me?(criteria)
criteria.magic_number(%r{^xar!}n) &&
IO.popen(["/usr/bin/xar", "-t", "-f", criteria.path.to_s], err: "/dev/null") { |io| io.read =~ %r{\AContent\nMetadata\n\Z} }
end
def extract
Dir.mktmpdir do |unpack_dir|
begin
ohai "Verifying signature for #{@path.basename}"
@command.run!("/usr/sbin/pkgutil", args: ["--check-signature", @path])
rescue
raise "Signature check failed."
end
@command.run!("/usr/bin/xar", args: ["-x", "-f", @path, "Content", "-C", unpack_dir])
Dir.chdir(@cask.staged_path) do
@command.run!("/usr/bin/cpio", args: ["--quiet", "-i", "-I", Pathname(unpack_dir).join("Content")])
end
end
end
end