diff --git a/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb b/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb index d5e63d8efc0df81068070b49ff578451d84d7c63..2f34814aba66d9339ed7564cfb20aed4f7f20920 100644 --- a/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb +++ b/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb @@ -2,6 +2,8 @@ require "hbc/artifact/base" require "hbc/utils/hash_validator" +require "vendor/plist/plist" + module Hbc module Artifact class Pkg < Base @@ -16,7 +18,7 @@ module Hbc @pkg_install_opts = pkg_description.shift begin if @pkg_install_opts.respond_to?(:keys) - @pkg_install_opts.extend(HashValidator).assert_valid_keys(:allow_untrusted) + @pkg_install_opts.extend(HashValidator).assert_valid_keys(:allow_untrusted, :choices) elsif @pkg_install_opts raise end @@ -52,8 +54,21 @@ module Hbc ] args << "-verboseR" if Hbc.verbose args << "-allowUntrusted" if pkg_install_opts :allow_untrusted + if pkg_install_opts :choices + args << "-applyChoiceChangesXML" + args << choices_xml + end @command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true) end + + def choices_xml + path = @cask.staged_path.join("Choices.xml") + unless File.exist? path + choices = pkg_install_opts :choices + IO.write path, Plist::Emit.dump(choices) + end + path + end end end end diff --git a/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb b/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb index e87db7a7ab0b1f1515f640dc2e21eb311833072f..8ee4e0a3c419a3408d5955d2f6151457a1513f2a 100644 --- a/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb +++ b/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb @@ -30,4 +30,41 @@ describe Hbc::Artifact::Pkg do end end end + + describe "choices" do + before do + @cask = Hbc.load("with-choices") + shutup do + TestHelper.install_without_artifacts(@cask) + end + end + + it "passes the choice changes xml to the system installer" do + pkg = Hbc::Artifact::Pkg.new(@cask, + command: Hbc::FakeSystemCommand) + + Hbc::FakeSystemCommand.expects_command(["/usr/bin/sudo", "-E", "--", "/usr/sbin/installer", "-pkg", @cask.staged_path.join("MyFancyPkg", "Fancy.pkg"), "-target", "/", "-applyChoiceChangesXML", @cask.staged_path.join("Choices.xml")]) + + shutup do + pkg.install_phase + end + + IO.read(@cask.staged_path.join("Choices.xml")).must_equal <<-EOS.undent + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + <array> + <dict> + <key>attributeSetting</key> + <integer>1</integer> + <key>choiceAttribute</key> + <string>selected</string> + <key>choiceIdentifier</key> + <string>choice1</string> + </dict> + </array> + </plist> + EOS + end + end end diff --git a/Library/Homebrew/cask/test/support/Casks/with-choices.rb b/Library/Homebrew/cask/test/support/Casks/with-choices.rb new file mode 100644 index 0000000000000000000000000000000000000000..1871efab307a4a0da8b029464c2d2ae120b6dddc --- /dev/null +++ b/Library/Homebrew/cask/test/support/Casks/with-choices.rb @@ -0,0 +1,16 @@ +test_cask 'with-choices' do + version '1.2.3' + sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b' + + url "file://#{TEST_FIXTURE_DIR}/cask/MyFancyPkg.zip" + homepage 'http://example.com/fancy-pkg' + + pkg 'MyFancyPkg/Fancy.pkg', + choices: [ + { + 'choiceIdentifier' => 'choice1', + 'choiceAttribute' => 'selected', + 'attributeSetting' => 1, + }, + ] +end