aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/cask/lib/hbc/artifact/pkg.rb23
-rw-r--r--Library/Homebrew/cask/test/cask/artifact/pkg_test.rb41
-rw-r--r--Library/Homebrew/cask/test/support/Casks/with-choices.rb16
3 files changed, 78 insertions, 2 deletions
diff --git a/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb b/Library/Homebrew/cask/lib/hbc/artifact/pkg.rb
index d5e63d8ef..0569d2a86 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,7 +54,24 @@ module Hbc
]
args << "-verboseR" if Hbc.verbose
args << "-allowUntrusted" if pkg_install_opts :allow_untrusted
- @command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true)
+ with_choices_file do |choices_path|
+ args << "-applyChoiceChangesXML" << choices_path if choices_path
+ @command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true)
+ end
+ end
+
+ def with_choices_file
+ return yield nil unless pkg_install_opts(:choices)
+
+ Tempfile.open(["choices", ".xml"]) do |file|
+ begin
+ file.write Plist::Emit.dump(pkg_install_opts(:choices))
+ file.close
+ yield file.path
+ ensure
+ file.unlink
+ end
+ 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 e87db7a7a..3ed427763 100644
--- a/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb
+++ b/Library/Homebrew/cask/test/cask/artifact/pkg_test.rb
@@ -30,4 +30,45 @@ 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)
+
+ file = mock
+ file.expects(:write).with <<-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>
+ \t<dict>
+ \t\t<key>attributeSetting</key>
+ \t\t<integer>1</integer>
+ \t\t<key>choiceAttribute</key>
+ \t\t<string>selected</string>
+ \t\t<key>choiceIdentifier</key>
+ \t\t<string>choice1</string>
+ \t</dict>
+ </array>
+ </plist>
+ EOS
+ file.stubs path: Pathname.new("/tmp/choices.xml")
+ file.expects(:close)
+ file.expects(:unlink)
+ Tempfile.expects(:open).yields file
+
+ 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("/tmp/choices.xml")])
+
+ shutup do
+ pkg.install_phase
+ end
+ 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 000000000..1871efab3
--- /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