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 # Use more than 4 characters to not clash with magicbytes
magic_bytes = "____pkg" magic_bytes = "____pkg"
else else
# get the first four bytes # get the first six bytes
File.open(@tarball_path) { |f| magic_bytes = f.read(4) } File.open(@tarball_path) { |f| magic_bytes = f.read(6) }
end end
# magic numbers stolen from /usr/share/file/magic/ # magic numbers stolen from /usr/share/file/magic/
@ -89,6 +89,10 @@ class CurlDownloadStrategy < AbstractDownloadStrategy
# TODO check if it's really a tar archive # TODO check if it's really a tar archive
safe_system '/usr/bin/tar', 'xf', @tarball_path safe_system '/usr/bin/tar', 'xf', @tarball_path
chdir 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' when '____pkg'
safe_system '/usr/sbin/pkgutil', '--expand', @tarball_path, File.basename(@url) safe_system '/usr/sbin/pkgutil', '--expand', @tarball_path, File.basename(@url)
chdir chdir

View File

@ -62,9 +62,9 @@ class Pathname
return dst return dst
end 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 def extname
/(\.tar\.(gz|bz2))$/.match to_s /(\.tar\.(gz|bz2|xz))$/.match to_s
return $1 if $1 return $1 if $1
return File.extname(to_s) return File.extname(to_s)
end end

View File

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