Fix DMG mounting.

This commit is contained in:
Markus Reiter 2017-06-11 03:55:20 +02:00
parent 054ed10cb1
commit 2f0aad5d88
2 changed files with 51 additions and 55 deletions

View File

@ -13,34 +13,38 @@ module Hbc
print_stderr: false).stdout.empty?
end
attr_reader :mounts
def initialize(*args)
super(*args)
@mounts = []
end
def extract
mount!
assert_mounts_found
extract_mounts
mount do |mounts|
begin
raise CaskError, "No mounts found in '#{@path}'; perhaps it is a bad DMG?" if mounts.empty?
mounts.each(&method(:extract_mount))
ensure
eject!
mounts.each(&method(:eject))
end
end
end
def mount!
plist = @command.run!("/usr/bin/hdiutil",
def mount
# realpath is a failsafe against unusual filenames
args: %w[mount -plist -nobrowse -readonly -noidme -mountrandom /tmp] + [Pathname.new(@path).realpath],
input: "y\n")
.plist
@mounts = mounts_from_plist(plist)
path = Pathname.new(@path).realpath
Dir.mktmpdir do |unpack_dir|
cdr_path = Pathname.new(unpack_dir).join("#{path.basename(".dmg")}.cdr")
@command.run!("/usr/bin/hdiutil", args: ["convert", "-quiet", "-format", "UDTO", "-o", cdr_path, path])
plist = @command.run!("/usr/bin/hdiutil",
args: ["attach", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", unpack_dir, cdr_path],
input: "qy\n").plist
yield mounts_from_plist(plist)
end
end
def eject!
@mounts.each do |mount|
def eject(mount)
# realpath is a failsafe against unusual filenames
mountpath = Pathname.new(mount).realpath
next unless mountpath.exist?
return unless mountpath.exist?
begin
tries ||= 3
@ -60,14 +64,9 @@ module Hbc
retry
end
end
end
private
def extract_mounts
@mounts.each(&method(:extract_mount))
end
def extract_mount(mount)
Tempfile.open(["", ".bom"]) do |bomfile|
bomfile.close
@ -124,10 +123,6 @@ module Hbc
return [] unless plist.respond_to?(:fetch)
plist.fetch("system-entities", []).map { |e| e["mount-point"] }.compact
end
def assert_mounts_found
raise CaskError, "No mounts found in '#{@path}'; perhaps it is a bad DMG?" if @mounts.empty?
end
end
end
end

View File

@ -9,11 +9,12 @@ describe Hbc::Container::Dmg, :cask do
Hbc::SystemCommand,
)
dmg.mount do |mounts|
begin
dmg.mount!
expect(dmg.mounts).not_to include nil
expect(mounts).not_to include nil
ensure
dmg.eject!
mounts.each(&dmg.public_method(:eject))
end
end
end
end