Add support for xz-compressed tarballs

Rationale: some software (e.g. GNU Coreutils, GnuTLS 3.x), have started
distributing _only_ xz-compressed tarballs. There is no system XZ
utility provided by OS X, but it is necessary so that we can continue to
provide formulae for this software.

If XZUtils isn't installed, we abort and prompt the user to `brew
install xz`.

The `xz` command itself doesn't do any untarring, so we write the
decompressed archive to stdout and pipe it to tar.
This commit is contained in:
Jack Nagel 2011-08-26 14:30:27 -05:00
parent db02ad1acc
commit ffd5b7d7ab
3 changed files with 10 additions and 4 deletions

View File

@ -76,8 +76,8 @@ class CurlDownloadStrategy < AbstractDownloadStrategy
# Use more than 4 characters to not clash with magicbytes
magic_bytes = "____pkg"
else
# get the first four bytes
File.open(@tarball_path) { |f| magic_bytes = f.read(4) }
# get the first six bytes
File.open(@tarball_path) { |f| magic_bytes = f.read(6) }
end
# magic numbers stolen from /usr/share/file/magic/
@ -89,6 +89,10 @@ class CurlDownloadStrategy < AbstractDownloadStrategy
# TODO check if it's really a tar archive
safe_system '/usr/bin/tar', 'xf', @tarball_path
chdir
when /^\xFD7zXZ\x00/ # xz compressed
raise "You must install XZutils: brew install xz" unless system "/usr/bin/which -s xz"
safe_system "xz -dc #{@tarball_path} | /usr/bin/tar xf -"
chdir
when '____pkg'
safe_system '/usr/sbin/pkgutil', '--expand', @tarball_path, File.basename(@url)
chdir

View File

@ -62,9 +62,9 @@ class Pathname
return dst
end
# extended to support the double extensions .tar.gz and .tar.bz2
# extended to support the double extensions .tar.gz, .tar.bz2, and .tar.xz
def extname
/(\.tar\.(gz|bz2))$/.match to_s
/(\.tar\.(gz|bz2|xz))$/.match to_s
return $1 if $1
return File.extname(to_s)
end

View File

@ -32,8 +32,10 @@ class BeerTasting < Test::Unit::TestCase
assert_nothing_raised do
MockFormula.new 'test-0.1.tar.gz'
MockFormula.new 'test-0.1.tar.bz2'
MockFormula.new 'test-0.1.tar.xz'
MockFormula.new 'test-0.1.tgz'
MockFormula.new 'test-0.1.bgz'
MockFormula.new 'test-0.1.txz'
MockFormula.new 'test-0.1.zip'
end
end