From ffd5b7d7ab9b616408d00b895f4ec0b2d38f6dd4 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Fri, 26 Aug 2011 14:30:27 -0500 Subject: [PATCH] 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. --- Library/Homebrew/download_strategy.rb | 8 ++++++-- Library/Homebrew/extend/pathname.rb | 4 ++-- Library/Homebrew/test/test_bucket.rb | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index 58221c28f2..625dbaf9af 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -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 diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index 65d34d4500..018547ff80 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -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 diff --git a/Library/Homebrew/test/test_bucket.rb b/Library/Homebrew/test/test_bucket.rb index 010c06761d..f328dacca1 100644 --- a/Library/Homebrew/test/test_bucket.rb +++ b/Library/Homebrew/test/test_bucket.rb @@ -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