diff --git a/Library/Homebrew/cleanup.rb b/Library/Homebrew/cleanup.rb index bbdf2710b38598..eca71f1538e934 100644 --- a/Library/Homebrew/cleanup.rb +++ b/Library/Homebrew/cleanup.rb @@ -630,6 +630,20 @@ def prune_prefix_symlinks_and_directories end end + require "cask/caskroom" + if Cask::Caskroom.path.directory? + Cask::Caskroom.path.each_child do |path| + path.extend(ObserverPathnameExtension) + next if !path.symlink? || path.resolved_path_exists? + + if dry_run? + puts "Would remove (broken link): #{path}" + else + path.unlink + end + end + end + return if dry_run? return if ObserverPathnameExtension.total.zero? diff --git a/Library/Homebrew/test/cleanup_spec.rb b/Library/Homebrew/test/cleanup_spec.rb index b4a09a8721d1c7..acd1fa9a580dbd 100644 --- a/Library/Homebrew/test/cleanup_spec.rb +++ b/Library/Homebrew/test/cleanup_spec.rb @@ -95,6 +95,22 @@ end end + describe "::prune_prefix_symlinks_and_directories" do + it "removes broken symlinks for uninstalled migrated Casks" do + caskroom = Cask::Caskroom.path + old_cask_dir = caskroom/"old" + new_cask_dir = caskroom/"new" + unrelated_cask_dir = caskroom/"other" + unrelated_cask_dir.mkpath + FileUtils.ln_s new_cask_dir, old_cask_dir + + cleanup.prune_prefix_symlinks_and_directories + expect(unrelated_cask_dir).to exist + expect(old_cask_dir).not_to be_a_symlink + expect(old_cask_dir).not_to exist + end + end + specify "::cleanup_formula" do f1 = Class.new(Testball) do version "1.0"