From 16c6b8987b3d2cd3b0ba04a71373b1df191aae6d Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Wed, 20 Jul 2016 05:30:15 +0200 Subject: [PATCH] Fix and refactor recognition of container types. (#22857) * Fix and refactor recognition of container types. * Use retry instead of redundant code when ejecting DMGs. * Use BOM file for extracting DMGs. * Add `lzma` compression. --- ci/travis/install.sh | 1 + lib/hbc/container.rb | 10 ++- lib/hbc/container/bzip2.rb | 2 +- lib/hbc/container/cab.rb | 17 +++-- lib/hbc/container/criteria.rb | 42 ++-------- lib/hbc/container/dmg.rb | 102 +++++++++++++++++-------- lib/hbc/container/generic_unar.rb | 14 +++- lib/hbc/container/gzip.rb | 5 +- lib/hbc/container/lzma.rb | 21 +++++ lib/hbc/container/otf.rb | 4 +- lib/hbc/container/pkg.rb | 7 +- lib/hbc/container/rar.rb | 5 +- lib/hbc/container/seven_zip.rb | 6 +- lib/hbc/container/sit.rb | 4 +- lib/hbc/container/tar.rb | 6 +- lib/hbc/container/ttf.rb | 9 +-- lib/hbc/container/xar.rb | 4 +- lib/hbc/container/xz.rb | 21 +++++ lib/hbc/container/zip.rb | 4 +- test/cask/installer_test.rb | 32 ++++++++ test/support/Casks/lzma-asset.rb | 11 +++ test/support/Casks/xzipped-asset.rb | 11 +++ test/support/binaries/lzma-asset.lzma | Bin 0 -> 41 bytes test/support/binaries/xzipped-asset.xz | Bin 0 -> 76 bytes test/test_helper.rb | 2 + 25 files changed, 226 insertions(+), 114 deletions(-) mode change 100644 => 100755 ci/travis/install.sh create mode 100644 lib/hbc/container/lzma.rb create mode 100644 lib/hbc/container/xz.rb create mode 100644 test/support/Casks/lzma-asset.rb create mode 100644 test/support/Casks/xzipped-asset.rb create mode 100644 test/support/binaries/lzma-asset.lzma create mode 100644 test/support/binaries/xzipped-asset.xz diff --git a/ci/travis/install.sh b/ci/travis/install.sh old mode 100644 new mode 100755 index 3f448de956..9a4c678b06 --- a/ci/travis/install.sh +++ b/ci/travis/install.sh @@ -22,5 +22,6 @@ if must_run_tests; then # install Formulae and Casks without which some tests would be skipped brew_install cabextract brew_install unar + brew_install xz run brew cask install Casks/adobe-air.rb fi diff --git a/lib/hbc/container.rb b/lib/hbc/container.rb index 01d029970a..dc5b94bcf5 100644 --- a/lib/hbc/container.rb +++ b/lib/hbc/container.rb @@ -8,6 +8,7 @@ require "hbc/container/criteria" require "hbc/container/dmg" require "hbc/container/generic_unar" require "hbc/container/gzip" +require "hbc/container/lzma" require "hbc/container/naked" require "hbc/container/otf" require "hbc/container/pkg" @@ -17,6 +18,7 @@ require "hbc/container/tar" require "hbc/container/ttf" require "hbc/container/rar" require "hbc/container/xar" +require "hbc/container/xz" require "hbc/container/zip" class Hbc::Container @@ -30,11 +32,13 @@ class Hbc::Container Hbc::Container::Dmg, Hbc::Container::SevenZip, Hbc::Container::Sit, - Hbc::Container::Tar, # or compressed tar Hbc::Container::Rar, Hbc::Container::Zip, - Hbc::Container::Bzip2, - Hbc::Container::Gzip, # pure gzip, not tar/gzip + 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): diff --git a/lib/hbc/container/bzip2.rb b/lib/hbc/container/bzip2.rb index d89ddac6ce..e55e1b8f82 100644 --- a/lib/hbc/container/bzip2.rb +++ b/lib/hbc/container/bzip2.rb @@ -2,7 +2,7 @@ require "tmpdir" class Hbc::Container::Bzip2 < Hbc::Container::Base def self.me?(criteria) - criteria.file.include? "compressed-encoding=application/x-bzip2;" + criteria.magic_number(%r{^BZh}n) end def extract diff --git a/lib/hbc/container/cab.rb b/lib/hbc/container/cab.rb index 9ba65ca9e4..3b45dce503 100644 --- a/lib/hbc/container/cab.rb +++ b/lib/hbc/container/cab.rb @@ -2,17 +2,20 @@ require "tmpdir" class Hbc::Container::Cab < Hbc::Container::Base def self.me?(criteria) - (criteria.file.include?("application/octet-stream;") || - criteria.file.include?("application/vnd.ms-cab-compressed;")) && - !criteria.cabextract.nil? && - criteria.cabextract.include?("All done, no errors") + cabextract = Hbc.homebrew_prefix.join("bin", "cabextract") + + criteria.magic_number(%r{^MSCF}n) && + cabextract.exist? && + criteria.command.run(cabextract, args: ["-t", "--", criteria.path.to_s]).stderr.empty? end def extract - cabextract = Hbc.homebrew_prefix.join("bin/cabextract") - unless Pathname.new(cabextract).exist? - raise Hbc::CaskError, "Expected to find cabextract executable. Cask '#{@cask}' must add: depends_on :formula => 'cabextract'" + cabextract = Hbc.homebrew_prefix.join("bin", "cabextract") + + unless cabextract.exist? + raise Hbc::CaskError, "Expected to find cabextract executable. Cask '#{@cask}' must add: depends_on formula: 'cabextract'" end + Dir.mktmpdir do |unpack_dir| @command.run!(cabextract, args: ["-d", unpack_dir, "--", @path]) @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) diff --git a/lib/hbc/container/criteria.rb b/lib/hbc/container/criteria.rb index e0c25b57ff..4b38e61ef2 100644 --- a/lib/hbc/container/criteria.rb +++ b/lib/hbc/container/criteria.rb @@ -1,46 +1,18 @@ class Hbc::Container::Criteria - attr_reader :path + attr_reader :path, :command def initialize(path, command) @path = path @command = command end - def file - @file ||= @command.run("/usr/bin/file", args: ["-Izb", "--", path]).stdout + def extension(regex) + path.extname.sub(%r{^\.}, "") =~ Regexp.new(regex.source, regex.options | Regexp::IGNORECASE) end - def imageinfo - @imageinfo ||= @command.run("/usr/bin/hdiutil", - # realpath is a failsafe against unusual filenames - args: ["imageinfo", Pathname.new(path).realpath], - print_stderr: false).stdout - end - - def cabextract - if Hbc.homebrew_prefix.join("bin/cabextract").exist? - @cabextract ||= @command.run(Hbc.homebrew_prefix.join("bin/cabextract"), - args: ["-t", "--", path], - print_stderr: false).stdout - end - end - - def lsar - if Hbc.homebrew_prefix.join("bin/lsar").exist? - @lsar ||= @command.run(Hbc.homebrew_prefix.join("bin/lsar"), - args: ["-l", "-t", "--", path], - print_stderr: false).stdout - end - end - - def extension(test) - path.extname.sub(%r{\A\.}, "").casecmp(test).zero? - end - - def magic_number(num, test) - File.open(path, "rb") do |file| - bytes = file.read(num).unpack("C*") - bytes == test - end + def magic_number(regex) + # 262: length of the longest regex (currently: Hbc::Container::Tar) + @magic_number ||= File.open(path, "rb") { |f| f.read(262) } + @magic_number =~ regex end end diff --git a/lib/hbc/container/dmg.rb b/lib/hbc/container/dmg.rb index 03f46e78b5..8826d65197 100644 --- a/lib/hbc/container/dmg.rb +++ b/lib/hbc/container/dmg.rb @@ -1,6 +1,11 @@ +require "tempfile" + class Hbc::Container::Dmg < Hbc::Container::Base def self.me?(criteria) - !criteria.imageinfo.empty? + !criteria.command.run("/usr/bin/hdiutil", + # realpath is a failsafe against unusual filenames + args: ["imageinfo", Pathname.new(criteria.path).realpath], + print_stderr: false).stdout.empty? end attr_reader :mounts @@ -13,17 +18,17 @@ class Hbc::Container::Dmg < Hbc::Container::Base mount! assert_mounts_found @mounts.each do |mount| - @command.run("/usr/bin/ditto", - # TODO: per https://github.com/caskroom/homebrew-cask/issues/6382, ditto - # complains to stderr about unreadable .Trashes directories, so all - # stderr output is silenced for now. But better solutions would be - # - use the --bom option to ditto to selectively avoid certain files - # - .Trashes - # - symlinks to Applications - # - or support some type of text filter to be passed to - # :print_stderr instead of true/false - print_stderr: false, - args: ["--", mount, @cask.staged_path]) + Tempfile.open(["", ".bom"]) do |bomfile| + bomfile.close + + Tempfile.open(["", ".list"]) do |filelist| + filelist.write(bom_filelist_from_path(mount)) + filelist.close + + @command.run("/usr/bin/mkbom", args: ["-s", "-i", filelist.path, "--", bomfile.path]) + @command.run("/usr/bin/ditto", args: ["--bom", bomfile.path, "--", mount, @cask.staged_path]) + end + end end ensure eject! @@ -38,6 +43,61 @@ class Hbc::Container::Dmg < Hbc::Container::Base @mounts = mounts_from_plist(plist) end + def eject! + @mounts.each do |mount| + # realpath is a failsafe against unusual filenames + mountpath = Pathname.new(mount).realpath + next unless mountpath.exist? + + begin + tries ||= 2 + @command.run("/usr/sbin/diskutil", + args: ["eject", mountpath], + print_stderr: false) + + raise Hbc::CaskError, "Failed to eject #{mountpath}" if mountpath.exist? + rescue Hbc::CaskError => e + raise e if (tries -= 1).zero? + sleep 1 + retry + end + end + end + + private + + def bom_filelist_from_path(mount) + mountpath = Pathname.new(mount).realpath + + paths = Dir.glob(mountpath.join("**", "*"), File::FNM_DOTMATCH) + .map { |path| Pathname.new(path).relative_path_from(mountpath) } + + paths = paths.reject { |path| + path = mountpath.join(path.sub(%r{/.*}, "")) + + # unnecessary DMG metadata + %w[ + .background + .com.apple.timemachine.donotpresent + .DocumentRevisions-V100 + .DS_Store + .fseventsd + .Spotlight-V100 + .TemporaryItems + .Trashes + .VolumeIcon.icns + ].include?(path.basename.to_s) || + + # symlinks to system directories (commonly to /Applications) + (path.symlink? && + Hbc::MacOS::SYSTEM_DIRS.include?(Pathname.new(File.readlink(path)))) + } + + paths.map(&:to_s) + .map { |path| path.prepend(path == "." ? "" : "./").concat("\n") } + .join + end + def mounts_from_plist(plist) return [] unless plist.respond_to?(:fetch) plist.fetch("system-entities", []).map { |entity| @@ -48,22 +108,4 @@ class Hbc::Container::Dmg < Hbc::Container::Base def assert_mounts_found raise Hbc::CaskError, "No mounts found in '#{@path}'; perhaps it is a bad DMG?" if @mounts.empty? end - - def eject! - @mounts.each do |mount| - # realpath is a failsafe against unusual filenames - mountpath = Pathname.new(mount).realpath - next unless mountpath.exist? - @command.run("/usr/sbin/diskutil", - args: ["eject", mountpath], - print_stderr: false) - next unless mountpath.exist? - sleep 1 - @command.run("/usr/sbin/diskutil", - args: ["eject", mountpath], - print_stderr: false) - next unless mountpath.exist? - raise Hbc::CaskError, "Failed to eject #{mountpath}" - end - end end diff --git a/lib/hbc/container/generic_unar.rb b/lib/hbc/container/generic_unar.rb index f03257ddef..b5bf715542 100644 --- a/lib/hbc/container/generic_unar.rb +++ b/lib/hbc/container/generic_unar.rb @@ -2,14 +2,20 @@ require "tmpdir" class Hbc::Container::GenericUnar < Hbc::Container::Base def self.me?(criteria) - !criteria.lsar.nil? && criteria.lsar.include?("passed, 0 failed") + lsar = Hbc.homebrew_prefix.join("bin", "lsar") + lsar.exist? && + criteria.command.run(lsar, + args: ["-l", "-t", "--", criteria.path], + print_stderr: false).stdout.chomp.end_with?("passed, 0 failed.") end def extract - unar = Hbc.homebrew_prefix.join("bin/unar") - unless Pathname.new(unar).exist? - raise Hbc::CaskError, "Expected to find unar executable. Cask #{@cask} must add: depends_on :formula => 'unar'" + unar = Hbc.homebrew_prefix.join("bin", "unar") + + unless unar.exist? + raise Hbc::CaskError, "Expected to find unar executable. Cask #{@cask} must add: depends_on formula: 'unar'" end + Dir.mktmpdir do |unpack_dir| @command.run!(unar, args: ["-force-overwrite", "-quiet", "-no-directory", "-output-directory", unpack_dir, "--", @path]) @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) diff --git a/lib/hbc/container/gzip.rb b/lib/hbc/container/gzip.rb index eb37db5b29..5812552510 100644 --- a/lib/hbc/container/gzip.rb +++ b/lib/hbc/container/gzip.rb @@ -1,11 +1,8 @@ - -# for pure gzip only, not tar-gzip (.tgz or .tar.gz) - require "tmpdir" class Hbc::Container::Gzip < Hbc::Container::Base def self.me?(criteria) - criteria.file.include? "compressed-encoding=application/x-gzip;" + criteria.magic_number(%r{^\037\213}n) end def extract diff --git a/lib/hbc/container/lzma.rb b/lib/hbc/container/lzma.rb new file mode 100644 index 0000000000..76b32e2c88 --- /dev/null +++ b/lib/hbc/container/lzma.rb @@ -0,0 +1,21 @@ +require "tmpdir" + +class Hbc::Container::Lzma < Hbc::Container::Base + def self.me?(criteria) + criteria.magic_number(%r{^\]\000\000\200\000}n) + end + + def extract + unlzma = Hbc.homebrew_prefix.join("bin", "unlzma") + + unless unlzma.exist? + raise Hbc::CaskError, "Expected to find unlzma executable. Cask '#{@cask}' must add: depends_on formula: 'lzma'" + end + + Dir.mktmpdir do |unpack_dir| + @command.run!("/usr/bin/ditto", args: ["--", @path, unpack_dir]) + @command.run!(unlzma, args: ["-q", "--", Pathname(unpack_dir).join(@path.basename)]) + @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) + end + end +end diff --git a/lib/hbc/container/otf.rb b/lib/hbc/container/otf.rb index 0bb021a02f..f1b4b267d4 100644 --- a/lib/hbc/container/otf.rb +++ b/lib/hbc/container/otf.rb @@ -1,7 +1,5 @@ class Hbc::Container::Otf < Hbc::Container::Naked def self.me?(criteria) - criteria.extension("otf") && - (criteria.file.include?("application/vnd.ms-opentype") || - criteria.file.include?("application/x-font-ttf")) + criteria.magic_number(%r{^OTTO}n) end end diff --git a/lib/hbc/container/pkg.rb b/lib/hbc/container/pkg.rb index 7060682f99..f6b172d1bb 100644 --- a/lib/hbc/container/pkg.rb +++ b/lib/hbc/container/pkg.rb @@ -1,8 +1,7 @@ class Hbc::Container::Pkg < Hbc::Container::Naked def self.me?(criteria) - (criteria.extension("pkg") || - criteria.extension("mpkg")) && - (criteria.file.include?("application/x-directory") || - criteria.magic_number(4, "xar!".unpack("C*"))) + criteria.extension(%r{m?pkg$}) && + (criteria.path.directory? || + criteria.magic_number(%r{^xar!}n)) end end diff --git a/lib/hbc/container/rar.rb b/lib/hbc/container/rar.rb index 6ab3eef237..27353f2a2a 100644 --- a/lib/hbc/container/rar.rb +++ b/lib/hbc/container/rar.rb @@ -1,9 +1,6 @@ class Hbc::Container::Rar < Hbc::Container::GenericUnar def self.me?(criteria) - (criteria.file.include?("application/x-rar;") || - criteria.file.include?("application/octet-stream;")) && - !criteria.lsar.nil? && - criteria.lsar.split("\n").first.split(":").last.include?("RAR") && + criteria.magic_number(%r{^Rar!}n) && super end end diff --git a/lib/hbc/container/seven_zip.rb b/lib/hbc/container/seven_zip.rb index c9092713a1..3a492572b3 100644 --- a/lib/hbc/container/seven_zip.rb +++ b/lib/hbc/container/seven_zip.rb @@ -1,11 +1,7 @@ class Hbc::Container::SevenZip < Hbc::Container::GenericUnar def self.me?(criteria) # TODO: cover self-extracting archives - criteria.extension("7z") && - criteria.file.include?("application/octet-stream;") && - criteria.magic_number(2, "7z".unpack("C*")) && - !criteria.lsar.nil? && - criteria.lsar.split("\n").first.split(":").last.include?("7-Zip") && + criteria.magic_number(%r{^7z}n) && super end end diff --git a/lib/hbc/container/sit.rb b/lib/hbc/container/sit.rb index ba6208da20..fe273c16b5 100644 --- a/lib/hbc/container/sit.rb +++ b/lib/hbc/container/sit.rb @@ -1,8 +1,6 @@ class Hbc::Container::Sit < Hbc::Container::GenericUnar def self.me?(criteria) - criteria.file.include?("application/x-stuffit") && - !criteria.lsar.nil? && - criteria.lsar.split("\n").first.split(":").last.include?("StuffIt") && + criteria.magic_number(%r{^StuffIt}n) && super end end diff --git a/lib/hbc/container/tar.rb b/lib/hbc/container/tar.rb index c63fb44a54..364c1e2e22 100644 --- a/lib/hbc/container/tar.rb +++ b/lib/hbc/container/tar.rb @@ -2,12 +2,14 @@ require "tmpdir" class Hbc::Container::Tar < Hbc::Container::Base def self.me?(criteria) - criteria.file.include? "application/x-tar" + criteria.magic_number(%r{^.{257}ustar}n) || + # or compressed tar (bzip2/gzip/lzma/xz) + IO.popen(["/usr/bin/tar", "-t", "-f", criteria.path.to_s], err: "/dev/null") { |io| !io.read(1).nil? } end def extract Dir.mktmpdir do |unpack_dir| - @command.run!("/usr/bin/tar", args: ["xf", @path, "-C", unpack_dir]) + @command.run!("/usr/bin/tar", args: ["-x", "-f", @path, "-C", unpack_dir]) @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) end end diff --git a/lib/hbc/container/ttf.rb b/lib/hbc/container/ttf.rb index a5da419a6e..a2befc85e9 100644 --- a/lib/hbc/container/ttf.rb +++ b/lib/hbc/container/ttf.rb @@ -1,9 +1,8 @@ class Hbc::Container::Ttf < Hbc::Container::Naked def self.me?(criteria) - (criteria.extension("ttf") && - (criteria.file.include?("application/x-font-ttf") || - criteria.magic_number(4, "true".unpack("C*")))) || - (criteria.extension("ttc") && - criteria.magic_number(4, "ttcf".unpack("C*"))) + # TrueType Font + criteria.magic_number(%r{^\000\001\000\000\000}n) || + # Truetype Font Collection + criteria.magic_number(%r{^ttcf}n) end end diff --git a/lib/hbc/container/xar.rb b/lib/hbc/container/xar.rb index 59bf4451f9..3c83b7501b 100644 --- a/lib/hbc/container/xar.rb +++ b/lib/hbc/container/xar.rb @@ -2,12 +2,12 @@ require "tmpdir" class Hbc::Container::Xar < Hbc::Container::Base def self.me?(criteria) - criteria.magic_number(4, "xar!".unpack("C*")) + criteria.magic_number(%r{^xar!}n) end def extract Dir.mktmpdir do |unpack_dir| - @command.run!("/usr/bin/xar", args: ["-xf", @path, "-C", unpack_dir]) + @command.run!("/usr/bin/xar", args: ["-x", "-f", @path, "-C", unpack_dir]) @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) end end diff --git a/lib/hbc/container/xz.rb b/lib/hbc/container/xz.rb new file mode 100644 index 0000000000..fb6c3f2985 --- /dev/null +++ b/lib/hbc/container/xz.rb @@ -0,0 +1,21 @@ +require "tmpdir" + +class Hbc::Container::Xz < Hbc::Container::Base + def self.me?(criteria) + criteria.magic_number(%r{^\xFD7zXZ\x00}n) + end + + def extract + unxz = Hbc.homebrew_prefix.join("bin", "unxz") + + unless unxz.exist? + raise Hbc::CaskError, "Expected to find unxz executable. Cask '#{@cask}' must add: depends_on formula: 'xz'" + end + + Dir.mktmpdir do |unpack_dir| + @command.run!("/usr/bin/ditto", args: ["--", @path, unpack_dir]) + @command.run!(unxz, args: ["-q", "--", Pathname(unpack_dir).join(@path.basename)]) + @command.run!("/usr/bin/ditto", args: ["--", unpack_dir, @cask.staged_path]) + end + end +end diff --git a/lib/hbc/container/zip.rb b/lib/hbc/container/zip.rb index 8118f9ccf7..e57e2f077f 100644 --- a/lib/hbc/container/zip.rb +++ b/lib/hbc/container/zip.rb @@ -1,9 +1,9 @@ class Hbc::Container::Zip < Hbc::Container::Base def self.me?(criteria) - criteria.file.include? "compressed-encoding=application/zip;" + criteria.magic_number(%r{^PK(\003\004|\005\006)}n) end def extract - @command.run!("/usr/bin/ditto", args: ["-xk", "--", @path, @cask.staged_path]) + @command.run!("/usr/bin/ditto", args: ["-x", "-k", "--", @path, @cask.staged_path]) end end diff --git a/test/cask/installer_test.rb b/test/cask/installer_test.rb index 3dbbfe6e6a..db861b8da3 100644 --- a/test/cask/installer_test.rb +++ b/test/cask/installer_test.rb @@ -158,6 +158,38 @@ describe Hbc::Installer do file.must_be :file? end + it "works with xz-based Casks" do + skip("unxz not installed") unless Hbc.homebrew_prefix.join("bin", "unxz").exist? + asset = Hbc.load("xzipped-asset") + empty = stub(formula: [], cask: [], macos: nil, arch: nil, x11: nil) + asset.stubs(:depends_on).returns(empty) + + shutup do + Hbc::Installer.new(asset).install + end + + dest_path = Hbc.caskroom.join("xzipped-asset", asset.version) + dest_path.must_be :directory? + file = Hbc.appdir.join("xzipped-asset-#{asset.version}") + file.must_be :file? + end + + it "works with lzma-based Casks" do + skip("unlzma not installed") unless Hbc.homebrew_prefix.join("bin", "unlzma").exist? + asset = Hbc.load("lzma-asset") + empty = stub(formula: [], cask: [], macos: nil, arch: nil, x11: nil) + asset.stubs(:depends_on).returns(empty) + + shutup do + Hbc::Installer.new(asset).install + end + + dest_path = Hbc.caskroom.join("lzma-asset", asset.version) + dest_path.must_be :directory? + file = Hbc.appdir.join("lzma-asset-#{asset.version}") + file.must_be :file? + end + it "blows up on a bad checksum" do bad_checksum = Hbc.load("bad-checksum") lambda { diff --git a/test/support/Casks/lzma-asset.rb b/test/support/Casks/lzma-asset.rb new file mode 100644 index 0000000000..b70f9c0023 --- /dev/null +++ b/test/support/Casks/lzma-asset.rb @@ -0,0 +1,11 @@ +test_cask 'lzma-asset' do + version '1.2.3' + sha256 '9d7edb32d02ab9bd9749a5bde8756595ea4cfcb1da02ca11c30fb591d4c1ed85' + + url TestHelper.local_binary_url('lzma-asset.lzma') + homepage 'http://example.com/xzipped-asset' + + depends_on formula: 'lzma' + + app 'lzma-asset-1.2.3' +end diff --git a/test/support/Casks/xzipped-asset.rb b/test/support/Casks/xzipped-asset.rb new file mode 100644 index 0000000000..6f5abcce2a --- /dev/null +++ b/test/support/Casks/xzipped-asset.rb @@ -0,0 +1,11 @@ +test_cask 'xzipped-asset' do + version '1.2.3' + sha256 '839263f474edde1d54a9101606e6f0dc9d963acc93f6dcc5af8d10ebc3187c02' + + url TestHelper.local_binary_url('xzipped-asset.xz') + homepage 'http://example.com/xzipped-asset' + + depends_on formula: 'xz' + + app 'xzipped-asset-1.2.3' +end diff --git a/test/support/binaries/lzma-asset.lzma b/test/support/binaries/lzma-asset.lzma new file mode 100644 index 0000000000000000000000000000000000000000..2ff7ccee7f750fdbaec06181353dcbc6267ecc9b GIT binary patch literal 41 rcma!LU}#|Y4+RW@9ZqhxU&Ks`xpq^21Q0O1_p)_{ill=83dFS^^-F5^oujNQY$h`6b!f+7#J8- eYnSa2iutU;z^Ex`#8tp2zwL7^BS?ZJG711PB@^TT literal 0 HcmV?d00001 diff --git a/test/test_helper.rb b/test/test_helper.rb index 9139c7a15d..7748fc3bb7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -160,6 +160,8 @@ class Hbc::TestCask < Hbc::Cask; end # jack in some optional utilities FileUtils.ln_s "/usr/local/bin/cabextract", Hbc.homebrew_prefix.join("bin/cabextract") FileUtils.ln_s "/usr/local/bin/unar", Hbc.homebrew_prefix.join("bin/unar") +FileUtils.ln_s "/usr/local/bin/unlzma", Hbc.homebrew_prefix.join("bin/unlzma") +FileUtils.ln_s "/usr/local/bin/unxz", Hbc.homebrew_prefix.join("bin/unxz") FileUtils.ln_s "/usr/local/bin/lsar", Hbc.homebrew_prefix.join("bin/lsar") # also jack in some test Casks