Merge pull request #1535 from umireon/cask-pkg-choice

Cask: Add the choices option to pkg stanza
This commit is contained in:
Markus Reiter 2016-11-21 10:25:30 +01:00 committed by GitHub
commit cc7541cbc4
3 changed files with 78 additions and 2 deletions

View File

@ -2,6 +2,8 @@ require "hbc/artifact/base"
require "hbc/utils/hash_validator" require "hbc/utils/hash_validator"
require "vendor/plist/plist"
module Hbc module Hbc
module Artifact module Artifact
class Pkg < Base class Pkg < Base
@ -16,7 +18,7 @@ module Hbc
@pkg_install_opts = pkg_description.shift @pkg_install_opts = pkg_description.shift
begin begin
if @pkg_install_opts.respond_to?(:keys) 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 elsif @pkg_install_opts
raise raise
end end
@ -52,7 +54,24 @@ module Hbc
] ]
args << "-verboseR" if Hbc.verbose args << "-verboseR" if Hbc.verbose
args << "-allowUntrusted" if pkg_install_opts :allow_untrusted 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 end
end end

View File

@ -30,4 +30,45 @@ describe Hbc::Artifact::Pkg do
end end
end 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 end

View File

@ -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