diff --git a/Library/Homebrew/cleanup.rb b/Library/Homebrew/cleanup.rb index 8d0c9e9f4426d..77db17afcc80f 100644 --- a/Library/Homebrew/cleanup.rb +++ b/Library/Homebrew/cleanup.rb @@ -634,6 +634,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 b166364594fb1..e622a1d8be1c3 100644 --- a/Library/Homebrew/test/cleanup_spec.rb +++ b/Library/Homebrew/test/cleanup_spec.rb @@ -163,6 +163,20 @@ expect(grandchild_dir).to exist end end + + 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