From 17953f2b83ba764c5cd5dc679d98c82fb6cc4b77 Mon Sep 17 00:00:00 2001 From: Misty De Meo Date: Sun, 22 Jul 2012 10:49:50 -0500 Subject: [PATCH] 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. --- Library/Homebrew/cmd/unlink.rb | 1 - Library/Homebrew/keg.rb | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/cmd/unlink.rb b/Library/Homebrew/cmd/unlink.rb index 692278fb0d..12b0377815 100644 --- a/Library/Homebrew/cmd/unlink.rb +++ b/Library/Homebrew/cmd/unlink.rb @@ -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 diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 1e12d712e1..0d9a12cc6e 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -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