From fa8b702c0d1d910ea8ee39f61a31bb1bee66aeef Mon Sep 17 00:00:00 2001 From: Vlad Shablinsky Date: Sun, 9 Aug 2015 14:57:15 +0300 Subject: [PATCH] uninstall: change logic to handle renames --- Library/Homebrew/cmd/uninstall.rb | 40 +++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index ab2938c759..5987cae096 100644 --- a/Library/Homebrew/cmd/uninstall.rb +++ b/Library/Homebrew/cmd/uninstall.rb @@ -1,30 +1,66 @@ require "keg" require "formula" +require "migrator" module Homebrew def uninstall raise KegUnspecifiedError if ARGV.named.empty? + # Find symlinks that can point to keg.rack + links = HOMEBREW_CELLAR.subdirs.select(&:symlink?) + if !ARGV.force? ARGV.kegs.each do |keg| keg.lock do puts "Uninstalling #{keg}... (#{keg.abv})" + + old_cellars = [] + # Remove every symlink that links to keg, because it can + # be left by migrator + links.each do |link| + old_opt = HOMEBREW_PREFIX/"opt/#{link.basename}" + if link.exist? && link.realpath == keg.rack.realpath + old_cellars << link + end + + if old_opt.symlink? && old_opt.realpath.to_s == keg.to_s + old_opt.unlink + old_opt.parent.rmdir_if_possible + end + end + keg.unlink keg.uninstall rack = keg.rack rm_pin rack + if rack.directory? versions = rack.subdirs.map(&:basename) verb = versions.length == 1 ? "is" : "are" puts "#{keg.name} #{versions.join(", ")} #{verb} still installed." puts "Remove them all with `brew uninstall --force #{keg.name}`." + else + # If we delete Cellar/newname, then Cellar/oldname symlink + # can become broken and we have to remove it. + old_cellars.each(&:unlink) end end end else ARGV.named.each do |name| - name = Formulary.canonical_name(name) - rack = HOMEBREW_CELLAR/name + rack = Formulary.to_rack(name) + name = rack.basename + + links.each do |link| + old_opt = HOMEBREW_PREFIX/"opt/#{link.basename}" + if old_opt.symlink? && old_opt.exist? \ + && old_opt.realpath.parent == rack.realpath + old_opt.unlink + old_opt.parent.rmdir_if_possible + end + + lnk.unlink if lnk.exist? && lnk.realpath == rack.realpath + end if rack.directory? puts "Uninstalling #{name}... (#{rack.abv})"