
Rather than having to manually keep track of what version each thing in here is and copy files around by hand on update let's use Bundler's standalone mode and careful use of `.gitignore` to help us do it. This means a `bundle update --standalone` will allow us to update all gems in vendor. We could consider vendoring other gems this way in future but I'd suggest only doing this for gems with no dependencies or at least gems with no native extensions. The only gem this applies to that we currently use is `ruby-prof` and I'm not convinced it's widely used enough to warrant vendoring for everyone. Perhaps that's another criteria: it should be functionality that's used by non-developer commands and/or normal Homebrew usage.
79 lines
2.2 KiB
Ruby
79 lines
2.2 KiB
Ruby
require "plist"
|
|
|
|
require "cask/artifact/abstract_artifact"
|
|
|
|
require "extend/hash_validator"
|
|
using HashValidator
|
|
|
|
module Cask
|
|
module Artifact
|
|
class Pkg < AbstractArtifact
|
|
attr_reader :pkg_relative_path
|
|
|
|
def self.from_args(cask, path, **stanza_options)
|
|
stanza_options.assert_valid_keys!(:allow_untrusted, :choices)
|
|
new(cask, path, **stanza_options)
|
|
end
|
|
|
|
attr_reader :path, :stanza_options
|
|
|
|
def initialize(cask, path, **stanza_options)
|
|
super(cask)
|
|
@path = cask.staged_path.join(path)
|
|
@stanza_options = stanza_options
|
|
end
|
|
|
|
def summarize
|
|
path.relative_path_from(cask.staged_path).to_s
|
|
end
|
|
|
|
def install_phase(**options)
|
|
run_installer(**options)
|
|
end
|
|
|
|
private
|
|
|
|
def run_installer(command: nil, verbose: false, **_options)
|
|
ohai "Running installer for #{cask}; your password may be necessary."
|
|
ohai "Package installers may write to any location; options such as --appdir are ignored."
|
|
unless path.exist?
|
|
raise CaskError, "pkg source file not found: '#{path.relative_path_from(cask.staged_path)}'"
|
|
end
|
|
args = [
|
|
"-pkg", path,
|
|
"-target", "/"
|
|
]
|
|
args << "-verboseR" if verbose
|
|
if stanza_options.fetch(:allow_untrusted, false)
|
|
args << "-allowUntrusted"
|
|
end
|
|
with_choices_file do |choices_path|
|
|
args << "-applyChoiceChangesXML" << choices_path if choices_path
|
|
logged_in_user = Utils.current_user
|
|
env = {
|
|
"LOGNAME" => logged_in_user,
|
|
"USER" => logged_in_user,
|
|
"USERNAME" => logged_in_user,
|
|
}
|
|
command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true, env: env)
|
|
end
|
|
end
|
|
|
|
def with_choices_file
|
|
choices = stanza_options.fetch(:choices, {})
|
|
return yield nil if choices.empty?
|
|
|
|
Tempfile.open(["choices", ".xml"]) do |file|
|
|
begin
|
|
file.write Plist::Emit.dump(choices)
|
|
file.close
|
|
yield file.path
|
|
ensure
|
|
file.unlink
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|