Keg#unlink: check destination before unlinking

Rather than skip unlinking if there's no linked keg record, check to
see whether the destination's realpath is the same as the source file
in the keg being unlinked.
This commit is contained in:
Misty De Meo 2012-07-22 10:49:50 -05:00
parent d2a8df71ce
commit 17953f2b83
2 changed files with 6 additions and 3 deletions

View File

@ -3,7 +3,6 @@ module Homebrew extend self
raise KegUnspecifiedError if ARGV.named.empty?
ARGV.kegs.each do |keg|
return if !keg.linked?
print "Unlinking #{keg}... "
puts "#{keg.unlink} links removed"
end

View File

@ -29,14 +29,18 @@ class Keg < Pathname
def unlink
n=0
return n if !linked?
%w[bin etc lib include sbin share var].map{ |d| self/d }.each do |src|
next unless src.exist?
src.find do |src|
next if src == self
dst=HOMEBREW_PREFIX+src.relative_path_from(self)
next unless dst.symlink?
# check whether the file to be unlinked is from the current keg first
if !dst.symlink? || !dst.exist? || src.expand_path != dst.realpath
next
end
dst.uninstall_info if dst.to_s =~ INFOFILE_RX and ENV['HOMEBREW_KEEP_INFO']
dst.unlink
dst.parent.rmdir_if_possible