aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorVlad Shablinsky2015-08-09 14:57:15 +0300
committerMike McQuaid2015-08-10 13:57:59 +0100
commitfa8b702c0d1d910ea8ee39f61a31bb1bee66aeef (patch)
tree189e421cbe9d51ced35de958d5a76c2af75d2f8a /Library
parent6a0dcc83240d51f3f8473031cea6c571c5021130 (diff)
downloadbrew-fa8b702c0d1d910ea8ee39f61a31bb1bee66aeef.tar.bz2
uninstall: change logic to handle renames
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/cmd/uninstall.rb40
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})"