From 36ce20a4eef5e573eefe462096b9edfe833b7899 Mon Sep 17 00:00:00 2001 From: Roland Walker Date: Sat, 1 Feb 2014 12:20:28 -0500 Subject: [PATCH] support CAB archives --- .travis.yml | 4 +++- lib/cask/container.rb | 2 ++ lib/cask/container/cab.rb | 20 ++++++++++++++++++++ lib/cask/container/criteria.rb | 9 +++++++++ test/cask/installer_test.rb | 19 +++++++++++++++++++ test/support/Casks/cab-container.rb | 8 ++++++++ test/support/binaries/cabcontainer.cab | Bin 0 -> 139 bytes test/test_helper.rb | 5 +++++ 8 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 lib/cask/container/cab.rb create mode 100644 test/support/Casks/cab-container.rb create mode 100644 test/support/binaries/cabcontainer.cab diff --git a/.travis.yml b/.travis.yml index 4ee36a29f1b1..0a95568b7cd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: objective-c -before_install: brew update +before_install: + - brew update + - brew install cabextract install: bundle script: bundle exec rake test notifications: diff --git a/lib/cask/container.rb b/lib/cask/container.rb index c7d50b96d62a..5dd05a9a9ed2 100644 --- a/lib/cask/container.rb +++ b/lib/cask/container.rb @@ -1,6 +1,7 @@ class Cask::Container; end require 'cask/container/base' +require 'cask/container/cab' require 'cask/container/criteria' require 'cask/container/dmg' require 'cask/container/naked' @@ -10,6 +11,7 @@ class Cask::Container; end class Cask::Container def self.containers [ + Cask::Container::Cab, Cask::Container::Dmg, Cask::Container::Tar, Cask::Container::Zip, diff --git a/lib/cask/container/cab.rb b/lib/cask/container/cab.rb new file mode 100644 index 000000000000..4bc354f84305 --- /dev/null +++ b/lib/cask/container/cab.rb @@ -0,0 +1,20 @@ +require 'tmpdir' + +class Cask::Container::Cab < Cask::Container::Base + def self.me?(criteria) + (criteria.file.include? 'application/octet-stream;' or + criteria.file.include? 'application/vnd.ms-cab-compressed;') and + criteria.cabextract.include? 'All done, no errors' + end + + def extract + cabextract = HOMEBREW_PREFIX.join('bin/cabextract') + if ! Pathname.new(cabextract).exist? + raise "Expected to find cabextract executable. Cask #{@cask} must add 'depends_on_formula'" + end + Dir.mktmpdir do |staging_dir| + @command.run!(cabextract, :args => ['-d', staging_dir, '--', @path]) + @command.run!('/usr/bin/ditto', :args => ['--', staging_dir, @cask.destination_path]) + end + end +end diff --git a/lib/cask/container/criteria.rb b/lib/cask/container/criteria.rb index 701eac1a4e2d..ccfc3c2fe1e5 100644 --- a/lib/cask/container/criteria.rb +++ b/lib/cask/container/criteria.rb @@ -18,4 +18,13 @@ def imageinfo :print => false ) end + + def cabextract + @cabextract ||= @command.run( + HOMEBREW_PREFIX.join('bin/cabextract'), + :args => ['-t', '--', path], + :stderr => :silence, + :print => false + ) + end end diff --git a/test/cask/installer_test.rb b/test/cask/installer_test.rb index cfc81b9a37a8..ef612ee51e18 100644 --- a/test/cask/installer_test.rb +++ b/test/cask/installer_test.rb @@ -41,6 +41,25 @@ application.must_be :directory? end + it "works with cab-based casks" do + skip unless HOMEBREW_PREFIX.join('bin/cabextract').exist? + cab_container = Cask.load('cab-container') + + # because I don't know how to do the mocking properly + def cab_container.depends_on_formula + [] + end + + shutup do + Cask::Installer.new(cab_container).install + end + + dest_path = Cask.caskroom/'cab-container'/cab_container.version + dest_path.must_be :directory? + application = dest_path/'cabcontainer/Application.app' + application.must_be :directory? + end + it "blows up on a bad checksum" do bad_checksum = Cask.load('bad-checksum') lambda { diff --git a/test/support/Casks/cab-container.rb b/test/support/Casks/cab-container.rb new file mode 100644 index 000000000000..8d4a7e5c2b77 --- /dev/null +++ b/test/support/Casks/cab-container.rb @@ -0,0 +1,8 @@ +class CabContainer < TestCask + url TestHelper.local_binary('cabcontainer.cab') + homepage 'http://example.com/cab-container' + version '1.2.3' + sha1 '85bfbcfc8887a995ae0e724796a0c242341b3071' + depends_on_formula 'cabextract' + link 'cabcontainer/Application.app' +end diff --git a/test/support/binaries/cabcontainer.cab b/test/support/binaries/cabcontainer.cab new file mode 100644 index 0000000000000000000000000000000000000000..f1dec52dccfacc2ae83f2e1c8ee39d4eb5ef5204 GIT binary patch literal 139 zcmeYbc6MU`f^HB21Ue9kftit!ff35i1=1j%5R}ir;ONp4r@)Y$n3SBKSCW{Sms+In zSWu9YnVeXXnV+YZSWuwv43tUDD=F6Z%uCDH1IiVbFmO+JvRe#jjI;OW&-{TLMWtUp Qc7_yu2`=E_c)-K}0CYbhfB*mh literal 0 HcmV?d00001 diff --git a/test/test_helper.rb b/test/test_helper.rb index 8ed5f3f22a70..c58102c0a6e4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -93,12 +93,17 @@ def self.install_without_artifacts(cask) project_root = Pathname.new(File.expand_path("#{File.dirname(__FILE__)}/../")) taps_dest = HOMEBREW_LIBRARY/"Taps" +# create directories taps_dest.mkdir +HOMEBREW_PREFIX.join('bin').mkdir FileUtils.ln_s project_root, taps_dest/"phinze-cask" # Common superclass for tests casks for when we need to filter them out class TestCask < Cask; end +# jack in some optional utilities +FileUtils.ln_s '/usr/local/bin/cabextract', HOMEBREW_PREFIX.join('bin/cabextract') + # also jack in some test casks FileUtils.ln_s project_root/'test'/'support', taps_dest/"phinze-testcasks"