brew/Library/Homebrew/cmd/uninstall.rb
Vlad Shablinsky d3037f7044 update opt for renamed formula
After the formula gets renamed oldname opt is created and
it points to the linked keg. However if we then upgrade newname
oldname opt still points to the same keg it pointed before upgrade.
The commit fixes this behaviour thus that oldname opt links at the
same keg opt point.
2015-08-17 01:53:58 +08:00

73 lines
1.9 KiB
Ruby

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|
if link.exist? && link.realpath == keg.rack.realpath
old_cellars << link
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|
rack = Formulary.to_rack(name)
name = rack.basename
links.each do |link|
link.unlink if link.exist? && link.realpath == rack.realpath
end
if rack.directory?
puts "Uninstalling #{name}... (#{rack.abv})"
rack.subdirs.each do |d|
keg = Keg.new(d)
keg.unlink
keg.uninstall
end
end
rm_pin rack
end
end
rescue MultipleVersionsInstalledError => e
ofail e
puts "Use `brew remove --force #{e.name}` to remove all versions."
end
def rm_pin(rack)
Formulary.from_rack(rack).unpin rescue nil
end
end