diff --git a/Library/Homebrew/test/cask/installer_spec.rb b/Library/Homebrew/test/cask/installer_spec.rb index f205bd7074..e9da105157 100644 --- a/Library/Homebrew/test/cask/installer_spec.rb +++ b/Library/Homebrew/test/cask/installer_spec.rb @@ -16,7 +16,7 @@ describe Cask::Installer, :cask do expect(caffeine.config.appdir.join("Caffeine.app")).to be_a_directory end - it "works with dmg-based Casks" do + it "works with HFS+ dmg-based Casks" do asset = Cask::CaskLoader.load(cask_path("container-dmg")) described_class.new(asset).install @@ -25,6 +25,24 @@ describe Cask::Installer, :cask do expect(asset.config.appdir.join("container")).to be_a_file end + it "works with APFS dmg-based Casks" do + asset = Cask::CaskLoader.load(cask_path("container-apfs-dmg")) + diskutil_list_command = "diskutil list | grep '/dev'" + + sleep 5 + original_diskutil_list = `#{diskutil_list_command}` + + described_class.new(asset).install + + expect(Cask::Caskroom.path.join("container-apfs-dmg", asset.version)).to be_a_directory + expect(asset.config.appdir.join("container")).to be_a_file + + sleep 5 + expect { system diskutil_list_command } + .to output(original_diskutil_list) + .to_stdout_from_any_process + end + it "works with tar-gz-based Casks" do asset = Cask::CaskLoader.load(cask_path("container-tar-gz")) diff --git a/Library/Homebrew/test/support/fixtures/cask/Casks/container-apfs-dmg.rb b/Library/Homebrew/test/support/fixtures/cask/Casks/container-apfs-dmg.rb new file mode 100644 index 0000000000..6fc863207b --- /dev/null +++ b/Library/Homebrew/test/support/fixtures/cask/Casks/container-apfs-dmg.rb @@ -0,0 +1,9 @@ +cask "container-apfs-dmg" do + version "1.2.3" + sha256 "0630aa1145e8c3fa77aeb6ec414fee35204e90f224d6d06cb23e18a4d6112a5d" + + url "file://#{TEST_FIXTURE_DIR}/cask/container-apfs.dmg" + homepage "https://brew.sh/container-apfs-dmg" + + app "container" +end diff --git a/Library/Homebrew/test/support/fixtures/cask/container-apfs.dmg b/Library/Homebrew/test/support/fixtures/cask/container-apfs.dmg new file mode 100644 index 0000000000..5ddbd80772 Binary files /dev/null and b/Library/Homebrew/test/support/fixtures/cask/container-apfs.dmg differ diff --git a/Library/Homebrew/unpack_strategy/dmg.rb b/Library/Homebrew/unpack_strategy/dmg.rb index 5f2fea6825..f758c1a78c 100644 --- a/Library/Homebrew/unpack_strategy/dmg.rb +++ b/Library/Homebrew/unpack_strategy/dmg.rb @@ -87,10 +87,27 @@ module UnpackStrategy return unless path.exist? if tries > 1 - system_command! "diskutil", - args: ["eject", path], - print_stderr: false, - verbose: verbose + disk_info = system_command!( + "diskutil", + args: ["info", "-plist", path], + print_stderr: false, + verbose: verbose, + ) + + # For HFS, just use + # For APFS, find the corresponding to + eject_paths = disk_info.plist + .fetch("APFSPhysicalStores", []) + .map { |store| store["APFSPhysicalStore"] } + .compact + .presence || [path] + + eject_paths.each do |eject_path| + system_command! "diskutil", + args: ["eject", eject_path], + print_stderr: false, + verbose: verbose + end else system_command! "diskutil", args: ["unmount", "force", path],