From a1f6f590d2f6c52d98d0a469300320cabf85ac3a Mon Sep 17 00:00:00 2001 From: Misty De Meo Date: Thu, 4 Oct 2012 08:52:48 -0500 Subject: Keg#unlink: check file comes from the right keg For real this time. This makes sure that files won't be unlinked if they resolve into other kegs. For example: if fish and fishfish are both installed, with fishfish linked and fish unlinked, `brew unlink fish` would unlink some files that resolve into fishfish's keg. --- Library/Homebrew/keg.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'Library') diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 3bae92605..76e02b629 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -34,7 +34,12 @@ class Keg < Pathname 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 != dst.resolved_path + next + end + dst.uninstall_info if dst.to_s =~ INFOFILE_RX and ENV['HOMEBREW_KEEP_INFO'] dst.unlink dst.parent.rmdir_if_possible @@ -79,6 +84,8 @@ class Keg < Pathname def link mode=nil raise "Cannot link #{fname}\nAnother version is already linked: #{linked_keg_record.realpath}" if linked_keg_record.directory? + # these are used by the ObserverPathnameExtension to count the number + # of files and directories linked $n=0 $d=0 -- cgit v1.2.3