aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Vandenberg2009-11-12 11:09:20 -0800
committerAdam Vandenberg2009-11-12 12:47:17 -0800
commit034337ec5e09f128ecea9f89ff06bbb5b26195ad (patch)
tree44129f43903c48da5f8b2f7cbeda9a7c6ea8e25f
parent7e0502495fdff7686015802a1c436851f8c876c6 (diff)
downloadhomebrew-034337ec5e09f128ecea9f89ff06bbb5b26195ad.tar.bz2
Compare against HOMEBREW_CELLAR using real paths.
The code in Keg.self.for path uses "path = path.parent.realpath" to walk up subfolders looking for a Keg. Because 'realpath' is in there, and the path is checked against HOMEBREW_CELLAR, which may be a symlink, we need to do realpath-to-realpath comparisons in Keg. Otherwise, we will hit equivalent but symlinked folders, not see that they are the same, and walk all the way up to / and then error out.
-rw-r--r--Library/Homebrew/keg.rb5
1 files changed, 3 insertions, 2 deletions
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb
index b9ca83953..8fdc78b4e 100644
--- a/Library/Homebrew/keg.rb
+++ b/Library/Homebrew/keg.rb
@@ -24,14 +24,15 @@
class Keg <Pathname
def initialize path
super path
- raise "#{to_s} is not a valid keg" unless parent.parent == HOMEBREW_CELLAR
+ raise "#{to_s} is not a valid keg" unless parent.parent.realpath == HOMEBREW_CELLAR.realpath
raise "#{to_s} is not a directory" unless directory?
end
# if path is a file in a keg then this will return the containing Keg object
def self.for path
+ path = path.realpath
while not path.root?
- return Keg.new(path) if path.parent.parent == HOMEBREW_CELLAR
+ return Keg.new(path) if path.parent.parent == HOMEBREW_CELLAR.realpath
path = path.parent.realpath # realpath() prevents root? failing
end
raise "#{path} is not inside a keg"