diff --git a/.travis.yml b/.travis.yml index 4ee36a29f1b18..0a95568b7cd44 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 c7d50b96d62a1..5dd05a9a9ed21 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 0000000000000..4bc354f843052 --- /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 701eac1a4e2dc..ccfc3c2fe1e55 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 cfc81b9a37a8c..ef612ee51e18e 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 0000000000000..8d4a7e5c2b774 --- /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 0000000000000..f1dec52dccfac Binary files /dev/null and b/test/support/binaries/cabcontainer.cab differ diff --git a/test/test_helper.rb b/test/test_helper.rb index 8ed5f3f22a708..c58102c0a6e41 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"