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:
		
							parent
							
								
									db02ad1acc
								
							
						
					
					
						commit
						ffd5b7d7ab
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user