
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.
73 lines
1.9 KiB
Ruby
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
|