diff --git a/Library/Homebrew/cask/artifact/abstract_uninstall.rb b/Library/Homebrew/cask/artifact/abstract_uninstall.rb index a58552f786..32d958f069 100644 --- a/Library/Homebrew/cask/artifact/abstract_uninstall.rb +++ b/Library/Homebrew/cask/artifact/abstract_uninstall.rb @@ -385,20 +385,37 @@ module Cask [trashed, untrashable] end - def uninstall_rmdir(*directories, command: nil, **_) - return if directories.empty? + def all_dirs?(*directories) + directories.all?(&:directory?) + end + + def recursive_rmdir(*directories, command: nil, **_) + success = true + each_resolved_path(:rmdir, directories) do |_path, resolved_paths| + resolved_paths.select(&method(:all_dirs?)).each do |resolved_path| + puts resolved_path.sub(Dir.home, "~") - ohai "Removing directories if empty:" - each_resolved_path(:rmdir, directories) do |path, resolved_paths| - puts path - resolved_paths.select(&:directory?).each do |resolved_path| if (ds_store = resolved_path.join(".DS_Store")).exist? command.run!("/bin/rm", args: ["-f", "--", ds_store], sudo: true, print_stderr: false) end - command.run("/bin/rmdir", args: ["--", resolved_path], sudo: true, print_stderr: false) + unless recursive_rmdir(*resolved_path.children, command: command) + success = false + next + end + + status = command.run("/bin/rmdir", args: ["--", resolved_path], sudo: true, print_stderr: false).success? + success &= status end end + success + end + + def uninstall_rmdir(*args) + return if args.empty? + + ohai "Removing directories if empty:" + recursive_rmdir(*args) end end end diff --git a/Library/Homebrew/test/cask/artifact/uninstall_spec.rb b/Library/Homebrew/test/cask/artifact/uninstall_spec.rb index 8996884ff7..cd50589dc6 100644 --- a/Library/Homebrew/test/cask/artifact/uninstall_spec.rb +++ b/Library/Homebrew/test/cask/artifact/uninstall_spec.rb @@ -14,10 +14,11 @@ describe Cask::Artifact::Uninstall, :cask do let(:fake_system_command) { NeverSudoSystemCommand } let(:cask) { Cask::CaskLoader.load(cask_path("with-uninstall-rmdir")) } let(:empty_directory) { Pathname.new("#{TEST_TMPDIR}/empty_directory_path") } + let(:empty_directory_tree) { empty_directory.join("nested", "empty_directory_path") } let(:ds_store) { empty_directory.join(".DS_Store") } before do - empty_directory.mkdir + empty_directory_tree.mkpath FileUtils.touch ds_store end @@ -26,7 +27,7 @@ describe Cask::Artifact::Uninstall, :cask do end it "is supported" do - expect(empty_directory).to exist + expect(empty_directory_tree).to exist expect(ds_store).to exist artifact.post_uninstall_phase(command: fake_system_command) diff --git a/Library/Homebrew/test/cask/artifact/zap_spec.rb b/Library/Homebrew/test/cask/artifact/zap_spec.rb index 3c942ef57a..0f1e7da7da 100644 --- a/Library/Homebrew/test/cask/artifact/zap_spec.rb +++ b/Library/Homebrew/test/cask/artifact/zap_spec.rb @@ -12,10 +12,11 @@ describe Cask::Artifact::Zap, :cask do let(:fake_system_command) { NeverSudoSystemCommand } let(:cask) { Cask::CaskLoader.load(cask_path("with-zap-rmdir")) } let(:empty_directory) { Pathname.new("#{TEST_TMPDIR}/empty_directory_path") } + let(:empty_directory_tree) { empty_directory.join("nested", "empty_directory_path") } let(:ds_store) { empty_directory.join(".DS_Store") } before do - empty_directory.mkdir + empty_directory_tree.mkpath FileUtils.touch ds_store end @@ -24,7 +25,7 @@ describe Cask::Artifact::Zap, :cask do end it "is supported" do - expect(empty_directory).to exist + expect(empty_directory_tree).to exist expect(ds_store).to exist artifact.zap_phase(command: fake_system_command)