aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorMisty De Meo2012-10-04 08:52:48 -0500
committerMisty De Meo2012-10-04 21:37:36 -0500
commita1f6f590d2f6c52d98d0a469300320cabf85ac3a (patch)
treee40621c93af09a970560b286777712a1a13dba40 /Library
parent736717cf24247df492dc6939f8279982c5ebcb4b (diff)
downloadbrew-a1f6f590d2f6c52d98d0a469300320cabf85ac3a.tar.bz2
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.
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/keg.rb9
1 files changed, 8 insertions, 1 deletions
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