diff options
| author | Vlad Shablinsky | 2015-08-09 14:57:15 +0300 |
|---|---|---|
| committer | Mike McQuaid | 2015-08-10 13:57:59 +0100 |
| commit | fa8b702c0d1d910ea8ee39f61a31bb1bee66aeef (patch) | |
| tree | 189e421cbe9d51ced35de958d5a76c2af75d2f8a /Library | |
| parent | 6a0dcc83240d51f3f8473031cea6c571c5021130 (diff) | |
| download | brew-fa8b702c0d1d910ea8ee39f61a31bb1bee66aeef.tar.bz2 | |
uninstall: change logic to handle renames
Diffstat (limited to 'Library')
| -rw-r--r-- | Library/Homebrew/cmd/uninstall.rb | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/Library/Homebrew/cmd/uninstall.rb b/Library/Homebrew/cmd/uninstall.rb index ab2938c75..5987cae09 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})" |
